diff --git a/.talismanrc b/.talismanrc index cb27ca95e..e9dad4ebe 100644 --- a/.talismanrc +++ b/.talismanrc @@ -21,13 +21,13 @@ fileignoreconfig: checksum: d9d3ca95b2f4df855c8811c73b5714e80b31e5e84b46affa0cb514dcfcc145bf - filename: upload-api/migration-wordpress/package-lock.json - checksum: d8cba4136f09e4ce63370e5f48d3292a78fd5f317c186e6f44d4556196a3617e + checksum: 9793f49517fef0e686e6a32cde8c614e4feabe2a613fd0dd281df79852b017ea - filename: upload-api/migration-sitecore/package-lock.json - checksum: 32579e06dde520acbde710f84684f738403a324a1cd0d6b342e21e423f4f8d96 + checksum: fb0f9538bbf60a81caa4ed31f51dff697fe49b9518ef1751dffe13fec5af0c9d - filename: package-lock.json - checksum: 1d74d25f855dec66df83b67b63c0623df8b601c5fea3dd5f6972452558d7badc + checksum: 4dfe369ac7c49071314c21076141521beffe3ef1215d71d30e98e657a8a5f61a - filename: upload-api/src/helper/index.ts checksum: beef34c30cc18c55d66df0124e8bfb69899be9aaef074252afe291c93d4c0f77 @@ -61,7 +61,7 @@ fileignoreconfig: - filename: upload-api/migration-sitecore/package-lock.json checksum: 32579e06dde520acbde710f84684f738403a324a1cd0d6b342e21e423f4f8d96 - filename: upload-api/migration-contentful/package-lock.json - checksum: 1fec859f4d41e1acb5cdab8fdfba7c1978532a7f98f4fd26674153755f926d64 + checksum: 8dfd2594bda249292050535233930acc26eb589d57fff196efb71283c29cf58e - filename: ui/src/components/ContentMapper/index.scss checksum: 46f8fde3b745feba40943f00d8d52714d0f320202c86b62f6c5ded73c2dbcf4c - filename: api/src/services/migration.service.ts @@ -86,9 +86,7 @@ fileignoreconfig: - filename: upload-api/Dockerfile checksum: b26f4860a8c18e1a777ff560b2e33168fba6359b92f5f4eca6aa64d7d83782e0 - filename: ui/package-lock.json - checksum: 00f48c5cca77f80913c0a339c82319564dd7e2cfe4de706ba0756e6aa1053445 - - filename: upload-api/package-lock.json - checksum: 38d2188de3b4df88ed5e195c13b77ad7c469fe5c4d1265f1ffb868dbe3844ae1 + checksum: dbdc4b08f5945e196edd03dd7cf99bde5987f318e9afcfb535ab70390b12cc84 - filename: api/package-lock.json checksum: 09b36877f7e86bb806a9657f852a448dc32fa1dfb350d0fde5fd843c54a27bf0 - filename: ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx @@ -97,5 +95,65 @@ fileignoreconfig: checksum: 4e9bd6dcdb08fab85a3d8200e0dffa0d003743ebbb42d5043228cfd46f7e91da - filename: ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx checksum: dde885393dfdd813f1dace88ce8ce79e3fb438801ee5e7bf19855fe1394cb78c - + + - filename: upload-api/migration-aem/package-lock.json + checksum: c8b13ba2f88b37305486b1a80b9ebef91be21c5e731c8742fac6f306b4cdcc28 + - filename: upload-api/package-lock.json + checksum: 8273f5562dc69deee1c7d660a75dc9765e212d71af52b85fb8fec8c55aa3137c + - filename: upload-api/migration-aem/libs/contentType/types/index.interface.ts + checksum: 82c4da161fd82c68f41012819ae77c375c9238f86c6006f1c270bc08bd8c25c0 + - filename: upload-api/migration-aem/libs/contentType/types/contentTypeMapper.interface.ts + checksum: dbbbfc6790567486f654fe38cce608fd0bba683d02ab1179d4ce0e279891e71b + - filename: upload-api/migration-aem/libs/contentType/components/ButtonComponent.ts + checksum: efec4fadf52f861d84f10a032540a1df66073c921763ee09d856cd2613886531 + - filename: upload-api/migration-aem/libs/contentType/components/TextBannerComponent.ts + checksum: c0dbc67db856464d848373325cadfda125236ad677be6ffbc58c5564efa16ca1 + - filename: upload-api/migration-aem/helper/contentType.flatten.ts + checksum: 68e47b8e4d47e936358c1439b2b39b4ee92447f1d558d71d51646419db796c62 + - filename: api/src/utils/content-type-creator.utils.ts + checksum: e230a263f6eb844e40c2542daf5d6b152c6a1e014b8d6d275bb77ab79845b683 + - filename: upload-api/migration-aem/libs/contentType/components/CarouselComponent.ts + checksum: f914f89a61ab10cb80b0eee912d38dd6c747fe5b605d2e975c4bf0f891de0d93 + - filename: upload-api/migration-aem/libs/contentType/components/CustomEmbedComponent.ts + checksum: 236df713e0cacf43d76fd49f7c729b5f2df1a0f604eab2c6f199655cb2bd263e + - filename: upload-api/migration-aem/libs/contentType/components/ImageComponent.ts + checksum: 3d1375e62caf3363b0a8d38efc9fea747716260630a66758184fbfa4277b0342 + - filename: upload-api/migration-aem/libs/contentType/components/NavigationComponent.ts + checksum: 8d2eb7bd681abcab3b030a643d726943e99cdb5eb2e87ef06498dba2db231730 + - filename: upload-api/migration-aem/libs/contentType/components/NtFolderComponent.ts + checksum: 7025bab1ef5bbdb8b8e48d412995d77a708c415acb74a5f2f9d3644a5ab9c1bf + - filename: upload-api/migration-aem/libs/contentType/components/ProductListingComponent.ts + checksum: d1b6ab95120b46b61e30963029b99c848925d8cc2d537821797eef8b998735d4 + - filename: upload-api/migration-aem/libs/contentType/components/SearchComponent.ts + checksum: e69779e94a72556b06828becfe2f70795e86a736b1b160fb841113ae6f93b1e4 + - filename: upload-api/migration-aem/libs/contentType/components/SeparatorComponent.ts + checksum: dbfe958f88bcf7f1d7641979b95f8af0edcb3517e2407815ab6b1efe25d521ea + - filename: upload-api/migration-aem/libs/contentType/components/SpacerComponent.ts + checksum: cb037902980594de54019ff94a8932bc65dc01a7c7ba8b70301321b79611f9ad + - filename: api/src/services/aem.service.ts + checksum: c74bb5531bc701ab368b639f2cd50c2e809b1caf09ae3f2f9c52de0721865983 + - filename: upload-api/migration-aem/helper/index.ts + checksum: 30b9ada3cb1430df905bfc5bf02c77ff0428e9cda8bca906ca40618986f1687d + - filename: upload-api/migration-aem/libs/contentType/components/TeaserComponent.ts + checksum: 4b71402b994b2bde22b6ca1645fa04b889394fe75296ed7b19e55886ec60aaeb + - filename: upload-api/migration-aem/helper/fieldMappings.merge.ts + checksum: 3afa6e6abcf7128cd7da838501440483109161a60a8df3618ae090bd589d0cb2 + - filename: api/src/services/migration.service.ts + checksum: 99945d57540e20cce2e02dfd782ba6544161a80f1f01f0e7a9d07cd8b22b0a0b + - filename: upload-api/migration-aem/helper/jsonSchema.identifier.ts + checksum: b90687acac3c2b5e719eacc05c3b4f142d55d6bd5c99dc48609422c987cab1c8 + - filename: upload-api/migration-aem/libs/contentType/fragment/index.ts + checksum: 386f63288a333408c55420051e62925dcdf40a7651aa7502e8a0417f4e3db76f + - filename: upload-api/migration-aem/helper/types/index.interface.ts + checksum: 4866ccc42e8ea9d7a89c46ac0c8b4998185da330727fe4019939b213c38ddc94 + - filename: upload-api/migration-aem/libs/contentType/components/BreadcrumbComponent.ts + checksum: ac81e1b00a641a97c1de7dc86c03e818454c91e527d79a17dec340a43448d930 + - filename: upload-api/migration-aem/libs/contentType/index.ts + checksum: a6310acf6da3c61ba43054feb7f3b5ef51ca84d860dd2e86bc39125eb56a7150 + - filename: upload-api/migration-aem/libs/contentType/contentTypeMapper.ts + checksum: 4d5f4099f8ce4bd022e2774d0ed2d015c4dbfec60a0ea4072e3f34bd9c01c280 + - filename: upload-api/migration-aem/libs/contentType/components/TitleComponent.ts + checksum: fd490e48c5a6e5a544ce9bf05a201149acc0f8d836f25c4f742999e8b0c0f2a2 + - filename: upload-api/migration-aem/libs/contentType/createContentTypes.ts + checksum: b9fa07f84933054324a900412d584f561ec7c58e33f294489d7b1d68d54c656b version: "1.0" \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index a6480f9e3..c75ff6019 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -13,7 +13,7 @@ "@contentstack/cli-utilities": "^1.12.0", "@contentstack/json-rte-serializer": "^2.0.7", "@contentstack/marketplace-sdk": "^1.2.4", - "axios": "^1.8.2", + "axios": "^1.12.0", "chokidar": "^3.6.0", "cors": "^2.8.5", "dotenv": "^16.3.1", @@ -4799,12 +4799,12 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", + "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, diff --git a/api/package.json b/api/package.json index dc864e161..7a0c749c8 100644 --- a/api/package.json +++ b/api/package.json @@ -29,7 +29,7 @@ "@contentstack/cli-utilities": "^1.12.0", "@contentstack/json-rte-serializer": "^2.0.7", "@contentstack/marketplace-sdk": "^1.2.4", - "axios": "^1.8.2", + "axios": "^1.12.0", "chokidar": "^3.6.0", "cors": "^2.8.5", "dotenv": "^16.3.1", @@ -78,4 +78,4 @@ "typescript": "^5.4.3" }, "keywords": [] -} \ No newline at end of file +} diff --git a/api/src/constants/index.ts b/api/src/constants/index.ts index f782930ec..f8284c9fc 100644 --- a/api/src/constants/index.ts +++ b/api/src/constants/index.ts @@ -279,6 +279,8 @@ export const MIGRATION_DATA_CONFIG = { GLOBAL_FIELDS_FILE_NAME: "globalfields.json", EXPORT_INFO_FILE: "export-info.json", + + AEM_DAM_DIR: 'dam-downloads' }; export const GET_AUDIT_DATA = { MIGRATION: "migration-v2", diff --git a/api/src/services/aem.service.ts b/api/src/services/aem.service.ts new file mode 100644 index 000000000..84d31c7b9 --- /dev/null +++ b/api/src/services/aem.service.ts @@ -0,0 +1,751 @@ +import fs from 'fs'; +import path from 'path'; +import read from 'fs-readdir-recursive'; +import _ from "lodash"; +import { v4 as uuidv4 } from 'uuid'; +import { JSDOM } from "jsdom"; +import { htmlToJson } from '@contentstack/json-rte-serializer'; +import { buildSchemaTree } from '../utils/content-type-creator.utils.js'; +import { MIGRATION_DATA_CONFIG, LOCALE_MAPPER } from '../constants/index.js'; +import { getLogMessage } from '../utils/index.js'; +import customLogger from '../utils/custom-logger.utils.js'; +import { orgService } from './org.service.js'; +import { Request } from 'express'; + +const baseDirName = MIGRATION_DATA_CONFIG.DATA; +const { + ENTRIES_DIR_NAME, + LOCALE_DIR_NAME, + LOCALE_MASTER_LOCALE, + LOCALE_FILE_NAME, + EXPORT_INFO_FILE, + ASSETS_DIR_NAME, + ASSETS_FILE_NAME, + ASSETS_SCHEMA_FILE, + AEM_DAM_DIR +} = MIGRATION_DATA_CONFIG; + +interface CreateAssetsOptions { + destinationStackId: string; + packagePath: string; + projectId: string; +} + +interface FieldMapping { + uid?: string; + contentstackFieldType?: string; +} + +interface Project { + master_locale?: object; + locales?: object; + // add other properties as needed +} + +interface ContentType { + contentstackUid?: string; + otherCmsUid?: string; + fieldMapping?: FieldMapping[]; +} + +interface CreateEntryOptions { + project?: Project; + packagePath?: string; + contentTypes?: ContentType[]; + master_locale?: string; + destinationStackId: string; + projectId: string; + keyMapper?: unknown; +} + +interface LocaleInfo { + code: string; + fallback_locale: string | null; + uid: string; + name: string; +} + +interface AssetJSON { + urlPath: string; + uid: string; + content_type?: string; + file_size?: number; + tags: string[]; + filename?: string; + is_dir: boolean; + parent_uid: string | null; + title?: string; + publish_details: unknown[]; + assetPath: string; +} + +async function isAssetJsonCreated(assetJsonPath: string): Promise { + try { + await fs.promises.access(assetJsonPath, fs.constants.F_OK); + return true; // File exists + } catch { + return false; // File does not exist + } +} + + +/** + * Finds and returns the asset object from assetJsonData where assetPath matches the given string. + * @param assetJsonData - The asset JSON data object. + * @param assetPathToFind - The asset path string to match. + * @returns The matching AssetJSON object, or undefined if not found. + */ +function findAssetByPath( + assetJsonData: Record, + assetPathToFind: string +): AssetJSON | undefined { + return Object.values(assetJsonData).find( + (asset) => asset.assetPath === assetPathToFind + ); +} + +async function writeOneFile(indexPath: string, fileMeta: any) { + fs.writeFile(indexPath, JSON.stringify(fileMeta), (err) => { + if (err) { + console.error('Error writing file: 3', err); + } + }); +} + +async function writeFiles( + entryPath: string, + fileMeta: any, + entryLocale: any, + locale: string +) { + try { + const indexPath = path.join(entryPath, 'index.json'); + const localePath = path.join(entryPath, `${locale}.json`); + fs.access(entryPath, async (err) => { + if (err) { + fs.mkdir(entryPath, { recursive: true }, async (err) => { + if (err) { + console.error('Error writing file: 2', err); + } else { + await writeOneFile(indexPath, fileMeta); + await writeOneFile(localePath, entryLocale); + } + }); + } else { + await writeOneFile(indexPath, fileMeta); + await writeOneFile(localePath, entryLocale); + } + }); + } catch (error) { + console.error('Error writing files:', error); + } +} + +const getLastKey = (str: string, items = '.') => { + if (!str) return ''; + const parts = str.split(items); + return parts[parts.length - 1]; +}; + +const attachJsonRte = ({ content = "" }: any) => { + const dom = new JSDOM(content); + const htmlDoc = dom.window.document.querySelector("body"); + return htmlToJson(htmlDoc); +} + +function slugify(text: unknown): string { + if (typeof text !== 'string') return ''; + return text + .toLowerCase() + .replace(/\|/g, '') // Remove pipe characters + .replace(/[^\w\s-]/g, '') // Remove non-word, non-space, non-hyphen chars + .replace(/\s+/g, '-') // Replace spaces with hyphens + .replace(/-+/g, '-') // Replace multiple hyphens with one + .replace(/^-+|-+$/g, ''); // Trim leading/trailing hyphens +} + +function addEntryToEntriesData( + entriesData: Record>, + contentTypeUid: string, + entryObj: any, + mappedLocale: string +) { + if (!entriesData[contentTypeUid]) { + entriesData[contentTypeUid] = {}; + } + if (!entriesData[contentTypeUid][mappedLocale]) { + entriesData[contentTypeUid][mappedLocale] = []; + } + entriesData[contentTypeUid][mappedLocale].push(entryObj); +} + +/** + * Extracts the current locale from the given parseData object. + * @param parseData The parsed data object from the JSON file. + * @returns The locale string if found, otherwise undefined. + */ +function getCurrentLocale(parseData: any): string | undefined { + if (parseData.language) { + return parseData.language; + } else if (parseData[":path"]) { + const segments = parseData[":path"].split("/"); + return segments[segments.length - 1]; + } + return undefined; +} + +function getLocaleFromMapper(mapper: Record, locale: string): string | undefined { + return Object.keys(mapper).find(key => mapper[key] === locale); +} + + +const deepFlattenObject = (obj: any, prefix = '', res: any = {}) => { + if (Array.isArray(obj) || (obj && typeof obj === 'object')) { + const entries = Array.isArray(obj) ? obj.map((v, i) => [i, v]) + : Object.entries(obj); + for (const [key, value] of entries) { + const newKey = prefix ? `${prefix}.${key}` : `${key}`; + if (value && typeof value === 'object') { + deepFlattenObject(value, newKey, res); + } else { + res[newKey] = value; + } + } + } else { + res[prefix] = obj; + } + return res; +}; + +export function isImageType(path: string): boolean { + return /\.(jpeg|jpg|png|gif|webp|svg)$/i.test(path); +} + +export function isExperienceFragment(data: any) { + if (data?.templateType && data[':type']) { + // Check templateType starts with 'xf-' + const hasXfTemplate = data?.templateType?.startsWith('xf-'); + + // Check :type contains 'components/xfpage' + const hasXfComponent = data[':type']?.includes('components/xfpage'); + + // Return analysis + return { + isXF: hasXfTemplate || hasXfComponent, + confidence: (hasXfTemplate && hasXfComponent) ? 'high' + : (hasXfTemplate || hasXfComponent) ? 'medium' : 'low', + indicators: { + templateType: hasXfTemplate ? data.templateType : null, + componentType: hasXfComponent ? data[':type'] : null, + } + }; + } + return null; +} + + +/** + * Ensures the directory exists at the given path. + * If it does not exist, creates it recursively. + * @param assetsSave - The relative path to the assets directory. + */ +async function ensureAssetsDirectory(assetsSave: string): Promise { + const fullPath = path.join(process.cwd(), assetsSave); + try { + await fs.promises.access(fullPath); + // Directory exists + console.info(`Directory exists: ${fullPath}`); + } catch (err) { + // Directory does not exist, create it + await fs.promises.mkdir(fullPath, { recursive: true }); + console.info(`Directory created: ${fullPath}`); + } +} + + +/** + * Fetch files from a directory based on a query. + * @param dirPath - The directory to search in. + * @param query - The query string (filename, extension, or regex). + * @returns Array of matching file paths. + */ +export async function fetchFilesByQuery( + dirPath: string, + query: string | RegExp +): Promise { + const files: string[] = []; + const resolvedDir = path.resolve(dirPath); + + for await (const fileName of read(resolvedDir)) { + if ( + (typeof query === 'string' && fileName.includes(query)) || + (query instanceof RegExp && query.test(fileName)) + ) { + files.push(path.join(resolvedDir, fileName)); + } + } + return files; +} + +function addUidToEntryMapping( + entryMapping: Record, + contentType: ContentType | undefined, + uid: string +) { + if (!contentType?.contentstackUid) return; + if (!entryMapping[contentType.contentstackUid]) { + entryMapping[contentType.contentstackUid] = []; + } + entryMapping[contentType.contentstackUid].push(uid); +} + + + +const createAssets = async ({ + destinationStackId, + projectId, + packagePath, +}: CreateAssetsOptions) => { + const srcFunc = 'createAssets'; + const damPath = path.join(packagePath, AEM_DAM_DIR); + const baseDir = path.join(baseDirName, destinationStackId); + const assetsSave = path.join(baseDir, ASSETS_DIR_NAME); + await ensureAssetsDirectory(assetsSave); + const assetsDir = path.resolve(packagePath); + const allAssetJSON: Record = {}; + for await (const fileName of read(assetsDir)) { + const filePath = path.join(assetsDir, fileName); + // Exclude files from dam-downloads directory + if (filePath?.startsWith?.(damPath)) { + continue; + } + const content = await fs.promises.readFile(filePath, 'utf-8'); + if (fileName?.endsWith?.('.json')) { + try { + const parseData = JSON.parse(content); + const flatData = deepFlattenObject(parseData); + for await (const [, value] of Object.entries(flatData)) { + if (typeof value === 'string' && isImageType?.(value)) { + const lastSegment = value?.split?.('/')?.pop?.(); + if (typeof lastSegment === 'string') { + const assetsQueryPath = await fetchFilesByQuery(damPath, lastSegment); + const firstJson = assetsQueryPath.find((filePath: string) => filePath?.endsWith?.('.json')) ?? null; + if (typeof firstJson === 'string' && firstJson?.endsWith('.json')) { + const contentAst = await fs.promises.readFile(firstJson, 'utf-8'); + if (typeof contentAst === 'string') { + const uid = uuidv4?.()?.replace?.(/-/g, ''); + const parseData = JSON.parse(contentAst); + const filename = parseData?.asset?.name; + const nameWithoutExt = typeof filename === 'string' ? filename.split('.').slice(0, -1).join('.') : filename; + allAssetJSON[uid] = { + urlPath: `/assets/${uid}`, + uid: uid, + content_type: parseData?.asset?.mimeType, + file_size: parseData?.download?.downloadedSize, + tags: [], + filename, + is_dir: false, + parent_uid: null, + title: nameWithoutExt, + publish_details: [], + assetPath: value, + }; + try { + const blobPath = firstJson?.replace?.('.metadata.json', ''); + const assets = fs.readFileSync(path.join(blobPath)); + fs.mkdirSync(path.join(assetsSave, 'files', uid), { + recursive: true, + }); + fs.writeFileSync( + path.join( + process.cwd(), + assetsSave, + 'files', + uid, + filename + ), + assets + ); + } catch (err) { + console.error( + '🚀 ~ file: assets.js:52 ~ xml_folder?.forEach ~ err:', + err + ); + const message = getLogMessage( + srcFunc, + `Not able to read the asset"${nameWithoutExt}(${uid})".`, + {}, + err + ); + await customLogger(projectId, destinationStackId, 'error', message); + } + const message = getLogMessage( + srcFunc, + `Asset "${parseData?.asset?.name}" has been successfully transformed.`, + {} + ); + await customLogger(projectId, destinationStackId, 'info', message); + } + } + } + } + } + } catch (err) { + console.error(`❌ Failed to parse JSON in ${fileName}:`, err); + } + } + } + + const fileMeta = { '1': ASSETS_SCHEMA_FILE }; + await fs.promises.writeFile( + path.join(process.cwd(), assetsSave, ASSETS_FILE_NAME), + JSON.stringify(fileMeta) + ); + await fs.promises.writeFile( + path.join(process.cwd(), assetsSave, ASSETS_SCHEMA_FILE), + JSON.stringify(allAssetJSON) + ); +}; + +function processFieldsRecursive(fields: any[], items: any, title: string, assetJsonData: Record) { + if (!fields) return; + const obj: any = {}; + const data: any = []; + for (const field of fields) { + switch (field?.contentstackFieldType) { + case 'modular_blocks': { + const modularData = items?.[field?.uid] ? items?.[field?.uid] : items?.[':items']; + if (Array.isArray(field?.schema)) { + const itemsData = modularData?.[':items'] ?? modularData; + const value = processFieldsRecursive(field.schema, itemsData, title, assetJsonData) + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = value; + } + break; + } + case 'modular_blocks_child': { + for (const [, value] of Object.entries(items)) { + const objData: any = {}; + const typeValue = (value as { [key: string]: string })[':type']; + const getTypeComp = getLastKey(typeValue, '/'); + const uid = getLastKey(field?.contentstackFieldUid); + if (getTypeComp === field?.uid) { + const compValue = processFieldsRecursive(field.schema, value, title, assetJsonData); + if (Object?.keys?.(compValue)?.length) { + objData[uid] = compValue; + data?.push(objData); + } + } + } + break; + } + case 'group': { + const groupData: unknown[] = []; + const groupValue = items?.[field?.uid]?.items ?? items?.[field?.uid]; + const uid = getLastKey(field?.contentstackFieldUid); + if (Array.isArray(groupValue)) { + for (const element of groupValue) { + if (Array.isArray(field?.schema)) { + const value = processFieldsRecursive(field.schema, element, title, assetJsonData); + groupData?.push(value); + } + } + obj[uid] = groupData; + } else { + if (Array.isArray(field?.schema)) { + const value = processFieldsRecursive(field.schema, groupValue, title, assetJsonData); + obj[uid] = value; + } + } + break; + } + case 'boolean': { + const value = items?.[field?.uid]; + const uid = getLastKey(field?.contentstackFieldUid); + if (typeof value === 'boolean' || (typeof value === 'object' && value?.[':type']?.includes('separator'))) { + obj[uid] = typeof value === 'boolean' ? value : true; + } + break; + } + case 'single_line_text': { + const value = items?.[field?.uid]; + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = value ?? ''; + break; + } + case 'text': { + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = title ?? ''; + break; + } + case 'url': { + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = `/${slugify(title)}`; + break; + } + case 'reference': { + for (const [, val] of Object.entries(items) as [string, Record][]) { + if ( + (typeof field?.uid === 'string' && !['title', 'url'].includes(field.uid)) && + field?.contentstackFieldType === "reference" && + (val[':type'] as string) !== 'nt:folder' && + val?.configured + ) { + if (typeof val?.localizedFragmentVariationPath === 'string' && + val.localizedFragmentVariationPath.includes(`/${field?.uid}`)) { + obj[field?.uid as string] = [{ + "uid": val?.id, + "_content_type_uid": field?.uid, + }]; + } + } + } + break; + } + case 'number': { + const value = items?.[field?.uid]; + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = value ?? ''; + break; + } + case 'json': { + const value = items?.[field?.uid]; + const uid = getLastKey(field?.contentstackFieldUid); + const jsonData = attachJsonRte({ content: value }) + obj[uid] = jsonData; + break; + } + case 'link': { + const value = { title: items?.['title'] ?? '', href: items?.['url'] ?? '' }; + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = value; + break; + } + case 'file': { + const uid = getLastKey(field?.contentstackFieldUid); + obj[uid] = null + if (Object.keys(assetJsonData)?.length) { + const match = findAssetByPath(assetJsonData, items?.src); + if (match) { + obj[uid] = match?.uid + } + } + break; + } + case 'app': { + // console.info(items) + break; + } + default: { + console.info("🚀 ~ processFieldsRecursive ~ childItems:", field?.uid, field?.contentstackFieldType) + break; + } + } + } + return data?.length ? data : obj; +} + +const containerCreator = (fieldMapping: any, items: any, title: string, assetJsonData: Record) => { + const fields = buildSchemaTree(fieldMapping); + return processFieldsRecursive(fields, items, title, assetJsonData); +} + +const getTitle = (parseData: any) => { + return parseData?.title ?? parseData?.templateType; +} + +const createEntry = async ({ + packagePath, + contentTypes, + destinationStackId, + projectId, + // keyMapper, + project +}: CreateEntryOptions) => { + const srcFunc = 'createEntry'; + const baseDir = path.join(baseDirName, destinationStackId); + const entrySave = path.join(baseDir, ENTRIES_DIR_NAME); + const assetsSave = path.join(baseDir, ASSETS_DIR_NAME); + const assetJson = path.join(assetsSave, ASSETS_SCHEMA_FILE); + const exists = await isAssetJsonCreated(assetJson); + let assetJsonData: Record = {}; + if (exists) { + const assetData = await fs.promises.readFile(assetJson, 'utf-8'); + if (typeof assetData === 'string') { + assetJsonData = JSON.parse(assetData); + } + } + const entriesDir = path.resolve(packagePath ?? ''); + const damPath = path.join(entriesDir, AEM_DAM_DIR); + const entriesData: Record> = {}; + const allLocales: object = { ...project?.master_locale, ...project?.locales }; + const entryMapping: Record = {}; + for await (const fileName of read(entriesDir)) { + const filePath = path.join(entriesDir, fileName); + if (filePath?.startsWith?.(damPath)) { + continue; + } + const content: unknown = await fs.promises.readFile(filePath, 'utf-8'); + if (typeof content === 'string') { + const uid = uuidv4?.()?.replace?.(/-/g, ''); + const parseData = JSON.parse(content); + const title = getTitle(parseData); + const isEFragment = isExperienceFragment(parseData); + const templateUid = isEFragment?.isXF ? parseData?.title : parseData?.templateName ?? parseData?.templateType; + const contentType = (contentTypes as ContentType[] | undefined)?.find?.((element) => element?.otherCmsUid === templateUid); + const locale = getCurrentLocale(parseData); + const mappedLocale = locale ? getLocaleFromMapper(allLocales as Record, locale) : Object?.keys?.(project?.master_locale ?? {})?.[0]; + const items = parseData?.[':items']?.root?.[':items']; + const data = containerCreator(contentType?.fieldMapping, items, title, assetJsonData); + data.uid = uid; + data.publish_details = []; + if (contentType?.contentstackUid && data && mappedLocale) { + const message = getLogMessage( + srcFunc, + `Entry title "${data?.title}"(${contentType?.contentstackUid} + }) in the ${mappedLocale} locale has been successfully transformed.`, + {} + ); + await customLogger( + projectId, + destinationStackId, + 'info', + message + ); + addEntryToEntriesData(entriesData, contentType.contentstackUid, data, mappedLocale); + addUidToEntryMapping(entryMapping, contentType, uid); + } + } + } + if (Object.keys?.(entriesData)?.length) { + for await (const [ctUid, value] of Object.entries(entriesData)) { + const entriesLocale = Object.entries(value); + if (entriesLocale?.length) { + for await (const [locale, entries] of entriesLocale) { + for (const entry of entries) { + const flatData = deepFlattenObject(entry); + for (const [key, value] of Object.entries(flatData)) { + if (key.endsWith('._content_type_uid')) { + const uidFeild = key.replace('._content_type_uid', ''); + if (uidFeild && typeof value === 'string') { + const refs: string[] = entryMapping?.[value]; + if (refs?.length) { + _.set(entry, `${uidFeild}.uid`, refs?.[0]); + } + } + } + } + } + const fileMeta = { '1': `${locale}.json` }; + const entryPath = path.join( + process.cwd(), + entrySave, + ctUid, + locale + ); + await writeFiles(entryPath, fileMeta, entries, locale); + } + } + } + } +} + + +const createLocale = async ( + req: Request, + destinationStackId: string, + projectId: string, + project: Project +) => { + const srcFunc = 'createLocale'; + try { + const baseDir = path.join(baseDirName, destinationStackId); + const localeSave = path.join(baseDir, LOCALE_DIR_NAME); + const allLocalesResp = await orgService.getLocales(req); + const masterLocale = Object?.keys?.( + project?.master_locale ?? LOCALE_MAPPER?.masterLocale + )?.[0]; + const msLocale: Record = {}; + const uid = uuidv4(); + msLocale[uid] = { + code: masterLocale, + fallback_locale: null, + uid: uid, + name: allLocalesResp?.data?.locales?.[masterLocale] ?? '', + }; + const message = getLogMessage( + srcFunc, + `Master locale ${masterLocale} has been successfully transformed.`, + {} + ); + await customLogger(projectId, destinationStackId, 'info', message); + const allLocales: Record = {}; + for (const [key, value] of Object.entries( + project?.locales ?? LOCALE_MAPPER + )) { + const localeUid = uuidv4(); + if (key !== 'masterLocale' && typeof value === 'string') { + allLocales[localeUid] = { + code: key, + fallback_locale: masterLocale, + uid: localeUid, + name: allLocalesResp?.data?.locales?.[key] ?? '', + }; + const message = getLogMessage( + srcFunc, + `locale ${value} has been successfully transformed.`, + {} + ); + await customLogger(projectId, destinationStackId, 'info', message); + } + } + const masterPath = path.join(localeSave, LOCALE_MASTER_LOCALE); + const allLocalePath = path.join(localeSave, LOCALE_FILE_NAME); + fs.access(localeSave, async (err) => { + if (err) { + fs.mkdir(localeSave, { recursive: true }, async (err) => { + if (!err) { + await writeOneFile(masterPath, msLocale); + await writeOneFile(allLocalePath, allLocales); + } + }); + } else { + await writeOneFile(masterPath, msLocale); + await writeOneFile(allLocalePath, allLocales); + } + }); + } catch (err) { + const message = getLogMessage( + srcFunc, + `error while Creating the locales.`, + {}, + err + ); + await customLogger(projectId, destinationStackId, 'error', message); + } +}; + + +const createVersionFile = async (destinationStackId: string) => { + const baseDir = path.join(baseDirName, destinationStackId); + fs.writeFile( + path?.join?.(baseDir, EXPORT_INFO_FILE), + JSON.stringify({ + contentVersion: 2, + logsPath: '', + }), + (err) => { + if (err) { + console.error('Error writing file: 3', err); + } + } + ); +}; + + +export const aemService = { + createAssets, + createEntry, + createLocale, + createVersionFile +}; \ No newline at end of file diff --git a/api/src/services/migration.service.ts b/api/src/services/migration.service.ts index bb07b5775..187b3b746 100644 --- a/api/src/services/migration.service.ts +++ b/api/src/services/migration.service.ts @@ -35,6 +35,7 @@ import { matchesSearchText } from '../utils/search.util.js'; import { taxonomyService } from './taxonomy.service.js'; import { globalFieldServie } from './globalField.service.js'; import { getSafePath } from '../utils/sanitize-path.utils.js'; +import { aemService } from './aem.service.js'; /** * Creates a test stack. @@ -433,12 +434,38 @@ const startTestMigration = async (req: Request): Promise => { ); break; } + + case CMS.AEM: { + await aemService.createAssets({ projectId, packagePath, destinationStackId: project?.current_test_stack_id }); + await aemService.createEntry({ + packagePath, + contentTypes, + master_locale: project?.stackDetails?.master_locale, + destinationStackId: project?.current_test_stack_id, + projectId, + keyMapper: project?.mapperKeys, + project + }) + await aemService?.createLocale( + req, + project?.current_test_stack_id, + projectId, + project + ); + await aemService?.createVersionFile( + project?.current_test_stack_id + ); + break; + } + default: break; } - await testFolderCreator?.({ - destinationStackId: project?.current_test_stack_id, - }); + if (cms !== CMS.AEM) { + await testFolderCreator?.({ + destinationStackId: project?.current_test_stack_id, + }); + } await utilsCli?.runCli( region, user_id, diff --git a/api/src/utils/content-type-creator.utils.ts b/api/src/utils/content-type-creator.utils.ts index 215d2829d..68d02c3a4 100644 --- a/api/src/utils/content-type-creator.utils.ts +++ b/api/src/utils/content-type-creator.utils.ts @@ -1,6 +1,7 @@ +/* eslint-disable */ import fs from 'fs'; import path from 'path'; -import _ from 'lodash'; +import _, { includes } from 'lodash'; import customLogger from './custom-logger.utils.js'; import { getLogMessage } from './index.js'; import { LIST_EXTENSION_UID, MIGRATION_DATA_CONFIG } from '../constants/index.js'; @@ -17,14 +18,15 @@ const { } = MIGRATION_DATA_CONFIG; interface Group { - data_type: string; + data_type?: string; display_name?: string; // Assuming item?.contentstackField might be undefined - field_metadata: Record; // Assuming it's an object with any properties + field_metadata?: Record; // Assuming it's an object with any properties schema: any[]; // Define the type of elements in the schema array if possible uid?: string; // Assuming item?.contentstackFieldUid might be undefined - multiple: boolean; - mandatory: boolean; - unique: boolean; + multiple?: boolean; + mandatory?: boolean; + unique?: boolean; + title?: string; } interface ContentType { @@ -47,8 +49,6 @@ function extractFieldName(input: string): string { } - - function extractValue(input: string, prefix: string, anoter: string): any { if (input.startsWith(prefix + anoter)) { return input.replace(prefix + anoter, ''); @@ -69,35 +69,224 @@ const uidCorrector = ({ uid }: any) => { return _.replace(uid, new RegExp("[ -]", "g"), '_')?.toLowerCase() } -const arrangGroups = ({ schema, newStack }: any) => { - const dtSchema: any = []; - schema?.forEach((item: any) => { - if (item?.contentstackFieldType === 'group') { - const groupSchema: any = { ...item, schema: [] } - if (item?.contentstackFieldUid?.includes('.')) { - const parts = item?.contentstackFieldUid?.split('.'); - groupSchema.contentstackFieldUid = parts?.[parts?.length - 1]; - } - schema?.forEach((et: any) => { - if (et?.contentstackFieldUid?.includes(`${item?.contentstackFieldUid}.`) || - (newStack === false && et?.uid?.includes(`${item?.uid}.`))) { - const target = groupSchema?.contentstackFieldUid; - const index = et?.contentstackFieldUid?.indexOf(target); - - if (index > 0) { - et.contentstackFieldUid = et?.contentstackFieldUid?.substring?.(index); - } - groupSchema?.schema?.push(et); + +function buildFieldSchema(item: any, marketPlacePath: string, parentUid = ''): any { + if (item?.isDeleted === true) return null; + + const getCleanUid = (uid: string): string => { + if (!uid) return ''; + const segments = uid.split(/[.>]/).map(s => s.trim()); + return segments.filter(s => s).pop() || ''; + }; + + const toSnakeCase = (str: string): string => { + // Remove special characters and handle common patterns + let result = str + .replace(/^[^a-zA-Z]+/, '') // Remove non-alphabetic characters from start + .replace(/[^a-zA-Z0-9]/g, '_') // Replace all special chars with underscore + .replace(/URL/g, 'url') + .replace(/API/g, 'api') + .replace(/ID/g, 'id') + .replace(/UI/g, 'ui') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/_+/g, '_') // Replace multiple underscores with single + .replace(/^_|_$/g, '') // Remove leading/trailing underscores + .toLowerCase(); + + // Ensure it starts with a letter + if (result && !/^[a-z]/.test(result)) { + result = 'field_' + result; + } + if (result === "locale") { + result = 'cm_' + result; + } + return result || 'field'; + }; + + + const rawUid = getCleanUid(item?.contentstackFieldUid || item?.uid); + const itemUid = toSnakeCase(rawUid); // Apply snake_case conversion + const fieldType = item?.contentstackFieldType; + + if (fieldType === 'modular_blocks') { + const blocks: any[] = []; + const schema = item?.schema || []; + + for (const blockItem of schema) { + if (blockItem?.contentstackFieldType !== 'modular_blocks_child') continue; + + const blockRawUid = getCleanUid(blockItem?.contentstackFieldUid || blockItem?.uid); + const blockUid = toSnakeCase(blockRawUid); // Apply snake_case + const blockSchema: any[] = []; + + const blockElements = blockItem?.schema || []; + for (const element of blockElements) { + if (element?.isDeleted === false) { + const fieldSchema = buildFieldSchema(element, marketPlacePath, ''); + if (fieldSchema) blockSchema.push(fieldSchema); } - }) - dtSchema?.push(groupSchema); - } else { - if (!(item?.contentstackField?.includes('>') && item?.contentstackFieldUid?.includes('.'))) { - dtSchema?.push(item); + } + + if (blockSchema.length > 0) { + blocks.push({ + title: blockRawUid, // Keep original for title + uid: blockUid, // Snake case for uid + schema: removeDuplicateFields(blockSchema) + }); + } + } + + if (blocks.length > 0) { + return { + data_type: "blocks", + display_name: item?.display_name || rawUid, // Keep original for display + field_metadata: {}, + uid: itemUid, // Snake case uid + multiple: true, + mandatory: false, + unique: false, + non_localizable: false, + blocks: removeDuplicateFields(blocks) + }; + } + return null; + } + + if (fieldType === 'group') { + const groupSchema: any[] = []; + const elements = item?.schema || []; + + for (const element of elements) { + if (element?.isDeleted === false) { + const fieldSchema = buildFieldSchema(element, marketPlacePath, ''); + if (fieldSchema) groupSchema.push(fieldSchema); } } - }) - return dtSchema; + + return { + data_type: "group", + display_name: item?.display_name || rawUid, // Keep original for display + field_metadata: {}, + schema: groupSchema, + uid: itemUid, // Snake case uid + multiple: item?.advanced?.multiple || false, + mandatory: item?.advanced?.mandatory || false, + unique: false + }; + } + + // For leaf fields + return convertToSchemaFormate({ + field: { + ...item, + title: item?.display_name || rawUid, // Keep original for display + uid: itemUid // Snake case uid + }, + marketPlacePath + }); +} + +function removeDuplicateFields(fields: any[]): any[] { + const seen = new Map(); + return fields.filter(field => { + const key = field.uid || JSON.stringify(field); + if (seen.has(key)) return false; + seen.set(key, true); + return true; + }); +} + + + +function getLastSegmentNew(str: string, separator: string): string { + if (!str) return ''; + const segments = str.split(separator); + return segments[segments.length - 1].trim(); +} + +export function buildSchemaTree(fields: any[], parentUid = '', parentType = ''): any[] { + // Build a lookup map for O(1) access + const fieldMap = new Map(); + fields.forEach(f => { + if (f.contentstackFieldUid) { + fieldMap.set(f.contentstackFieldUid, f); + } + }); + + // Filter direct children of current parent + const directChildren = fields.filter(field => { + const fieldUid = field.contentstackFieldUid || ''; + + if (!parentUid) { + // Root level - only fields without dots + return fieldUid && !fieldUid.includes('.'); + } + + // Check if direct child of parent + if (!fieldUid.startsWith(parentUid + '.')) return false; + + // Verify it's exactly one level deeper + const remainder = fieldUid.substring(parentUid.length + 1); + return remainder && !remainder.includes('.'); + }); + + return directChildren.map(field => { + const uid = getLastSegmentNew(field.contentstackFieldUid, '.'); + const displayName = field.display_name || getLastSegmentNew(field.contentstackField || '', '>').trim(); + + // Base field structure + const result: any = { + ...field, + uid, + display_name: displayName + }; + + // Determine if field should have nested schema + const fieldUid = field.contentstackFieldUid; + const fieldType = field.contentstackFieldType; + + // Check if this field has children + const hasChildren = fields.some(f => + f.contentstackFieldUid && + f.contentstackFieldUid.startsWith(fieldUid + '.') + ); + + if (hasChildren) { + if (fieldType === 'modular_blocks') { + // Get modular block children + const mbChildren = fields.filter(f => { + const fUid = f.contentstackFieldUid || ''; + return f.contentstackFieldType === 'modular_blocks_child' && + fUid.startsWith(fieldUid + '.') && + !fUid.substring(fieldUid.length + 1).includes('.'); + }); + + result.schema = mbChildren.map(child => { + const childUid = getLastSegmentNew(child.contentstackFieldUid, '.'); + const childDisplay = child.display_name || getLastSegmentNew(child.contentstackField || '', '>').trim(); + + return { + ...child, + uid: childUid, + display_name: childDisplay, + schema: buildSchemaTree(fields, child.contentstackFieldUid, 'modular_blocks_child') + }; + }); + } else if (fieldType === 'group' || + (fieldType === 'modular_blocks_child' && hasChildren)) { + // Recursively build schema for groups and modular block children with nested content + result.schema = buildSchemaTree(fields, fieldUid, fieldType); + } + } + + // Preserve existing schema if no children found but schema exists + if (!hasChildren && field.schema && Array.isArray(field.schema)) { + result.schema = field.schema; + } + + return result; + }); } const saveAppMapper = async ({ marketPlacePath, data, fileName }: any) => { @@ -122,7 +311,7 @@ const saveAppMapper = async ({ marketPlacePath, data, fileName }: any) => { } } -const convertToSchemaFormate = ({ field, advanced = true, marketPlacePath, keyMapper }: any) => { +const convertToSchemaFormate = ({ field, advanced = true, marketPlacePath }: any) => { switch (field?.contentstackFieldType) { case 'single_line_text': { return { @@ -445,7 +634,7 @@ const convertToSchemaFormate = ({ field, advanced = true, marketPlacePath, keyMa return { data_type: "reference", display_name: field?.title, - reference_to: field?.refrenceTo?.map((item:string) => keyMapper?.[item] || item) ?? [], + reference_to: field?.refrenceTo ?? [], field_metadata: { ref_multiple: true, ref_multiple_content_types: true @@ -610,7 +799,6 @@ const saveContent = async (ct: any, contentSave: string) => { } - const writeGlobalField = async (schema: any, globalSave: string) => { const filePath = path.join(process.cwd(), globalSave, GLOBAL_FIELDS_FILE_NAME); try { @@ -675,19 +863,7 @@ const mergeArrays = async (a: any[], b: any[]) => { } } return a; -}; - -// Recursive search to find a group by uid anywhere in the schema -const findGroupByUid = (schema: any[], uid: string): any | null => { - for (const field of schema) { - if (field?.data_type === 'group') { - if (field?.uid === uid) return field; - const nested = findGroupByUid(field?.schema ?? [], uid); - if (nested) return nested; - } - } - return null; -}; +} const mergeTwoCts = async (ct: any, mergeCts: any) => { const ctData: any = { @@ -695,31 +871,27 @@ const mergeTwoCts = async (ct: any, mergeCts: any) => { title: mergeCts?.title, uid: mergeCts?.uid, options: { - singleton: false, + "singleton": false, } - }; - - const mergeGroupSchema = async (targetSchema: any[], sourceSchema: any[]) => { - for await (const targetField of targetSchema) { - if (targetField?.data_type === 'group') { - const matchingSourceGroup = findGroupByUid(sourceSchema, targetField?.uid); - if (matchingSourceGroup) { - if (!Array.isArray(targetField?.schema)) targetField.schema = []; - if (!Array.isArray(matchingSourceGroup?.schema)) matchingSourceGroup.schema = []; - - await mergeGroupSchema(targetField?.schema, matchingSourceGroup?.schema); - targetField.schema = await mergeArrays(targetField?.schema, matchingSourceGroup?.schema); + } + for await (const field of ctData?.schema ?? []) { + if (field?.data_type === 'group') { + const currentGroup = mergeCts?.schema?.find((grp: any) => grp?.uid === field?.uid && + grp?.data_type === 'group'); + const group = []; + for await (const fieldGp of currentGroup?.schema ?? []) { + const fieldNst = field?.schema?.find((fld: any) => fld?.uid === fieldGp?.uid && + fld?.data_type === fieldGp?.data_type); + if (fieldNst === undefined) { + group?.push(fieldGp); } } + field.schema = [...field?.schema ?? [], ...group]; } - }; - - await mergeGroupSchema(ctData?.schema ?? [], mergeCts?.schema ?? []); - ctData.schema = await mergeArrays(ctData?.schema, mergeCts?.schema ?? []); - + } + ctData.schema = await mergeArrays(ctData?.schema, mergeCts?.schema) ?? []; return ctData; -}; - +} export const contenTypeMaker = async ({ contentType, destinationStackId, projectId, newStack, keyMapper, region, user_id }: any) => { const marketPlacePath = path.join(process.cwd(), MIGRATION_DATA_CONFIG.DATA, destinationStackId); @@ -735,46 +907,11 @@ export const contenTypeMaker = async ({ contentType, destinationStackId, project keyMapper?.[contentType?.contentstackUid] !== undefined) { currentCt = await existingCtMapper({ keyMapper, contentTypeUid: contentType?.contentstackUid, projectId, region, user_id }); } - const ctData: any = arrangGroups({ schema: contentType?.fieldMapping, newStack }) + const ctData: any = buildSchemaTree(contentType?.fieldMapping); ctData?.forEach((item: any) => { - if (item?.contentstackFieldType === 'group') { - const group: Group = { - "data_type": "group", - "display_name": item?.contentstackField, - "field_metadata": {}, - "schema": [], - "uid": item?.contentstackFieldUid, - "multiple": false, - "mandatory": false, - "unique": false - } - item?.schema?.forEach((element: any) => { - const field: any = { - ...element, - uid: extractValue(element?.contentstackFieldUid, item?.contentstackFieldUid, '.'), - title: extractValue(element?.contentstackField, item?.contentstackField, ' >')?.trim(), - } - const schema: any = convertToSchemaFormate({ field, marketPlacePath ,keyMapper}); - if (typeof schema === 'object' && Array.isArray(group?.schema) && element?.isDeleted === false) { - group.schema.push(schema); - } - }) - ct?.schema?.push(group); - } else { - const dt: any = convertToSchemaFormate({ - field: { - ...item, - title: item?.contentstackField, - uid: item?.contentstackFieldUid - }, - marketPlacePath, - keyMapper - }); - if (dt && item?.isDeleted === false) { - ct?.schema?.push(dt); - } - } - }) + const schemaField = buildFieldSchema(item, marketPlacePath); + if (schemaField) ct?.schema?.push(schemaField); + }); if (currentCt?.uid) { ct = await mergeTwoCts(ct, currentCt); } diff --git a/package-lock.json b/package-lock.json index 1b0684463..f9f3ef2b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,9 +53,9 @@ } }, "node_modules/@contentstack/cli-utilities": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.13.1.tgz", - "integrity": "sha512-ybG+6AycUbVoDhIE9WF+aZkAlv4XA40E1X2B3etbgLk5oOZKRRXaZ3oZjToqF94sd2jFxu96sDDBs50DJcwaYA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.15.0.tgz", + "integrity": "sha512-Q3csEjZk7rdEvbhRyq41jMT9nFduxR7zVpyGAkYdialh4KjMHxJvzVUdmYuA3PA92xoTlFdcY97yXPQJpmptTw==", "dependencies": { "@contentstack/management": "~1.22.0", "@contentstack/marketplace-sdk": "^1.2.8", @@ -464,9 +464,9 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", diff --git a/ui/package-lock.json b/ui/package-lock.json index 7731b4530..9e5bce07b 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@contentstack/json-rte-serializer": "^2.0.12", - "@contentstack/venus-components": "^3.0.0", + "@contentstack/venus-components": "^3.0.2", "@reduxjs/toolkit": "^2.8.2", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^13.4.0", @@ -17,7 +17,7 @@ "@types/react": "^18.3.21", "@types/react-dom": "^18.2.13", "@types/react-redux": "^7.1.33", - "axios": "^1.8.3", + "axios": "^1.12.0", "bootstrap": "^5.3.6", "chokidar": "^3.6.0", "final-form": "^4.20.10", @@ -142,9 +142,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz", - "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -1960,12 +1960,13 @@ } }, "node_modules/@contentstack/venus-components": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@contentstack/venus-components/-/venus-components-3.0.0.tgz", - "integrity": "sha512-BsXmDl15iSKOwNZHI/3F5wA1TrDwleu300I3BOMyOIXjQEsXCV6I6kZ2C1nb1T+dL0bbmbsoaz5g5QncyeqIFg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@contentstack/venus-components/-/venus-components-3.0.2.tgz", + "integrity": "sha512-8FBw066+mmzQE3YZInrjMKEWmf7z2xMg3DxznlsHORQQbQlSJW2AZhDQhUabug95bF4uzrkkUrWfrelBCzOK6A==", "dependencies": { "@emotion/css": "^11.1.3", - "@testing-library/react-hooks": "^8.0.1", + "@mdx-js/react": "^3.1.0", + "@testing-library/react-hooks": "8.0.1", "@tippyjs/react": "^4.1.0", "array-move": "^3.0.1", "axios": "^1.8.4", @@ -1975,6 +1976,7 @@ "clean": "^4.0.2", "detect-browser": "^5.3.0", "dompurify": "^3.2.4", + "formik": "^2.4.6", "is-hotkey": "^0.2.0", "is-url": "^1.2.4", "jest-fetch-mock": "^3.0.3", @@ -1998,7 +2000,7 @@ "react-mentions": "^4.4.7", "react-modal": "^3.11.2", "react-redux": "^7.2.1", - "react-select": "npm:@contentstack/react-select@^3.2.5", + "react-select": "npm:@contentstack/react-select@3.2.5", "react-select-async-paginate": "^0.4.0", "react-simple-code-editor": "^0.11.0", "react-sortable-hoc": "^1.11.0", @@ -2025,10 +2027,11 @@ "systemjs": "^6.10.2", "user-event": "^4.0.0", "uuid": "^8.3.2", - "void-elements": "^3.1.0" + "void-elements": "^3.1.0", + "yup": "^1.6.1" }, "engines": { - "node": ">=18.0.0 <19.0.0", + "node": ">=18.0.0 <23.0.0", "npm": ">=8.19.3" }, "peerDependencies": { @@ -2036,6 +2039,145 @@ "react-dom": "^16.8.6 || ^17 || ^18 || ^19" } }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/cache": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.9.tgz", + "integrity": "sha512-f7MblpE2xoimC4fCMZ9pivmsIn7hyWRIvY75owMDi8pdOSeh+w5tH3r4hBJv/LLrwiMM7cTQURqTPcYoL5pWnw==", + "dependencies": { + "@emotion/sheet": "0.9.2", + "@emotion/stylis": "0.8.3", + "@emotion/utils": "0.11.1", + "@emotion/weak-memoize": "0.2.2" + } + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/core": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.9.tgz", + "integrity": "sha512-v5a77dV+uWGoy9w6R3MXZG01lqHcXgoy/jGmJqPDGhPjmpWg26LWXAphYZxpZffFUwDUlDdYDiX5HtaKphvJnQ==", + "dependencies": { + "@emotion/cache": "^10.0.9", + "@emotion/css": "^10.0.9", + "@emotion/serialize": "^0.11.6", + "@emotion/sheet": "0.9.2", + "@emotion/utils": "0.11.1" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/core/node_modules/@emotion/css": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "dependencies": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + } + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/core/node_modules/@emotion/css/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/serialize/node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/serialize/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/sheet": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.2.tgz", + "integrity": "sha512-pVBLzIbC/QCHDKJF2E82V2H/W/B004mDFQZiyo/MSR+VC4pV5JLG0TF/zgQDFvP3fZL/5RTPGEmXlYJBMUuJ+A==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/stylis": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.3.tgz", + "integrity": "sha512-M3nMfJ6ndJMYloSIbYEBq6G3eqoYD41BpDOxreE8j0cb4fzz/5qvmqU9Mb2hzsXcCnIlGlWhS03PCzVGvTAe0Q==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/utils": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.1.tgz", + "integrity": "sha512-8M3VN0hetwhsJ8dH8VkVy7xo5/1VoBsDOk/T4SJOeXwTO1c4uIqVNx2qyecLFnnUWD5vvUqHQ1gASSeUN6zcTg==" + }, + "node_modules/@contentstack/venus-components/node_modules/@emotion/weak-memoize": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz", + "integrity": "sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA==" + }, + "node_modules/@contentstack/venus-components/node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", + "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, + "node_modules/@contentstack/venus-components/node_modules/@types/react": { + "version": "17.0.89", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.89.tgz", + "integrity": "sha512-I98SaDCar5lvEYl80ClRIUztH/hyWHR+I2f+5yTVp/MQ205HgYkA2b5mVdry/+nsEIrf8I65KA5V/PASx68MsQ==", + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "^0.16", + "csstype": "^3.0.2" + } + }, "node_modules/@contentstack/venus-components/node_modules/immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -2065,6 +2207,11 @@ "node": ">=14" } }, + "node_modules/@contentstack/venus-components/node_modules/memoize-one": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.0.0.tgz", + "integrity": "sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw==" + }, "node_modules/@contentstack/venus-components/node_modules/react-ace": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-9.5.0.tgz", @@ -2110,6 +2257,25 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/@contentstack/venus-components/node_modules/react-select": { + "name": "@contentstack/react-select", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@contentstack/react-select/-/react-select-3.2.5.tgz", + "integrity": "sha512-Q/IE5+BGh4X1/1vFqEaNXdB42JYpewdTs2OyFKeEZ9FemgUWMe/O783cyhrDbXfor4s6J41o9/SLmkzfDD7MjQ==", + "dependencies": { + "@babel/runtime": "7.4.4", + "@emotion/cache": "10.0.9", + "@emotion/core": "10.0.9", + "@emotion/css": "10.0.9", + "memoize-one": "5.0.0", + "react-input-autosize": "3.0.0", + "react-transition-group": "4.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@contentstack/venus-components/node_modules/react-select-async-paginate": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/react-select-async-paginate/-/react-select-async-paginate-0.4.1.tgz", @@ -2148,6 +2314,24 @@ "react-dom": "^16.8.6 || ^17" } }, + "node_modules/@contentstack/venus-components/node_modules/react-select/node_modules/@babel/runtime": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", + "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@contentstack/venus-components/node_modules/react-select/node_modules/@emotion/css": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.9.tgz", + "integrity": "sha512-jtHhUSWw+L7yxYgNtC+KJ3Ory90/jiAtpG1qT+gTQQ/RR5AMiigs9/lDHu/vnwljaq2S48FoKb/FZZMlJcC4bw==", + "dependencies": { + "@emotion/serialize": "^0.11.6", + "@emotion/utils": "0.11.1", + "babel-plugin-emotion": "^10.0.9" + } + }, "node_modules/@contentstack/venus-components/node_modules/react-sortable-hoc": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.11.0.tgz", @@ -2163,6 +2347,21 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@contentstack/venus-components/node_modules/react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/@contentstack/venus-components/node_modules/react-virtualized-auto-sizer": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz", @@ -2200,6 +2399,11 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/@contentstack/venus-components/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/@contentstack/venus-components/node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -2220,6 +2424,28 @@ "tiny-warning": "^1.0.3" } }, + "node_modules/@contentstack/venus-components/node_modules/storybook-addon-whats-new": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/storybook-addon-whats-new/-/storybook-addon-whats-new-1.0.3.tgz", + "integrity": "sha512-5je0qJh2ahPbbS2pwOkgKKmUDJAT0aAn3cSmap0Hp3hzFlu4uaDPiY00T4mPF3BsavBrkPNmy7kKIHTXnmRu5A==", + "peerDependencies": { + "@storybook/addons": "^6.4.0", + "@storybook/api": "^6.4.0", + "@storybook/components": "^6.4.0", + "@storybook/core-events": "^6.4.0", + "@storybook/theming": "^6.4.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/@csstools/normalize.css": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", @@ -3332,6 +3558,22 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3432,25 +3674,6 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", @@ -3470,215 +3693,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3841,6 +3855,14 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/@rollup/plugin-node-resolve/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", @@ -3880,9 +3902,9 @@ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", - "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==" + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.13.0.tgz", + "integrity": "sha512-2ih5qGw5SZJ+2fLZxP6Lr6Na2NTIgPRL/7Kmyuw0uIyBQnuhQ8fi8fzUTd38eIQmqp+GYLC00cI6WgtqHxBwmw==" }, "node_modules/@seznam/compose-react-refs": { "version": "1.0.6", @@ -3952,17 +3974,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/addons/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/addons/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4002,17 +4013,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/api/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/api/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4034,17 +4034,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/channels/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/client-logger": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", @@ -4052,22 +4041,11 @@ "peer": true, "dependencies": { "core-js": "^3.8.2", - "global": "^4.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/client-logger/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, + "global": "^4.4.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/components": { @@ -4094,17 +4072,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/components/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/components/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4124,17 +4091,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-events/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/csf": { "version": "0.0.2--canary.4566f4d.1", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", @@ -4165,17 +4121,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/router/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/router/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4198,17 +4143,6 @@ "node": ">=10" } }, - "node_modules/@storybook/semver/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/theming": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", @@ -4229,17 +4163,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/theming/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@storybook/theming/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4442,6 +4365,14 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/plugin-svgo/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@svgr/webpack": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", @@ -4545,35 +4476,6 @@ "react-dom": "^18.0.0" } }, - "node_modules/@testing-library/react-hooks": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", - "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0", - "react": "^16.9.0 || ^17.0.0", - "react-dom": "^16.9.0 || ^17.0.0", - "react-test-renderer": "^16.9.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } - } - }, "node_modules/@testing-library/react/node_modules/@testing-library/dom": { "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", @@ -4853,9 +4755,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", - "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4864,9 +4766,9 @@ } }, "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -4956,6 +4858,11 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==" }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -4970,9 +4877,9 @@ } }, "node_modules/@types/node-forge": { - "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.13.tgz", - "integrity": "sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==", + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "dependencies": { "@types/node": "*" } @@ -5057,17 +4964,23 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "optional": true, + "peer": true + }, "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==" + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==" }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -5080,13 +4993,22 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, "node_modules/@types/sockjs": { @@ -5173,9 +5095,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -5308,9 +5230,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -5364,9 +5286,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -5712,6 +5634,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", @@ -6091,12 +6024,12 @@ } }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", + "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -6458,6 +6391,14 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz", + "integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -6554,6 +6495,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -6614,15 +6569,22 @@ "core-js": "^2.5.7" } }, + "node_modules/browser-detect/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "funding": [ { "type": "opencollective", @@ -6638,10 +6600,11 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -6782,9 +6745,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001715", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", - "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "funding": [ { "type": "opencollective", @@ -7254,11 +7217,14 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, "node_modules/core-js-compat": { "version": "3.41.0", @@ -7273,9 +7239,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.0.tgz", - "integrity": "sha512-OtwjqcDpY2X/eIIg1ol/n0y/X8A9foliaNt1dSK0gV3J2/zw+89FcNG3mPK+N8YWts4ZFUPxnrAzsxs/lf8yDA==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7431,9 +7397,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -8036,9 +8002,9 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", "engines": { "node": ">=0.10.0" } @@ -8360,9 +8326,9 @@ } }, "node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -8500,9 +8466,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.140", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", - "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==" + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==" }, "node_modules/emittery": { "version": "0.8.1", @@ -9657,6 +9623,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -9707,9 +9687,9 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -10105,6 +10085,14 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -10162,9 +10150,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -10195,6 +10183,35 @@ "node": ">= 6" } }, + "node_modules/formik": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz", + "integrity": "sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/formik/node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -10812,9 +10829,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -11704,9 +11721,9 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -11736,9 +11753,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -11939,6 +11956,14 @@ } } }, + "node_modules/jest-config/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -12343,9 +12368,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -12635,9 +12660,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12649,9 +12674,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "engines": { "node": ">=12" }, @@ -12887,9 +12912,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dependencies": { "universalify": "^2.0.0" }, @@ -13604,9 +13629,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==" }, "node_modules/nopt": { "version": "7.2.1", @@ -13672,9 +13697,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", - "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==" + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -14625,46 +14650,9 @@ } }, "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "funding": [ { "type": "opencollective", @@ -14676,45 +14664,32 @@ } ], "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "camelcase-css": "^2.0.1" }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "engines": { - "node": ">=14" + "node": "^12 || ^14 || >= 16" }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "bin": { - "yaml": "bin.mjs" + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 14.6" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, "node_modules/postcss-loader": { @@ -14739,9 +14714,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -15595,6 +15570,11 @@ "react-is": "^16.13.1" } }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -15655,11 +15635,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "peer": true, "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -15782,16 +15763,6 @@ "node": ">=14" } }, - "node_modules/react-app-polyfill/node_modules/core-js": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", - "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -16343,9 +16314,9 @@ } }, "node_modules/react-scripts/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -16353,159 +16324,6 @@ "node": ">=10" } }, - "node_modules/react-select": { - "name": "@contentstack/react-select", - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@contentstack/react-select/-/react-select-3.2.5.tgz", - "integrity": "sha512-Q/IE5+BGh4X1/1vFqEaNXdB42JYpewdTs2OyFKeEZ9FemgUWMe/O783cyhrDbXfor4s6J41o9/SLmkzfDD7MjQ==", - "dependencies": { - "@babel/runtime": "7.4.4", - "@emotion/cache": "10.0.9", - "@emotion/core": "10.0.9", - "@emotion/css": "10.0.9", - "memoize-one": "5.0.0", - "react-input-autosize": "3.0.0", - "react-transition-group": "4.3.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/react-select/node_modules/@babel/runtime": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz", - "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==", - "dependencies": { - "regenerator-runtime": "^0.13.2" - } - }, - "node_modules/react-select/node_modules/@emotion/cache": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.9.tgz", - "integrity": "sha512-f7MblpE2xoimC4fCMZ9pivmsIn7hyWRIvY75owMDi8pdOSeh+w5tH3r4hBJv/LLrwiMM7cTQURqTPcYoL5pWnw==", - "dependencies": { - "@emotion/sheet": "0.9.2", - "@emotion/stylis": "0.8.3", - "@emotion/utils": "0.11.1", - "@emotion/weak-memoize": "0.2.2" - } - }, - "node_modules/react-select/node_modules/@emotion/core": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.9.tgz", - "integrity": "sha512-v5a77dV+uWGoy9w6R3MXZG01lqHcXgoy/jGmJqPDGhPjmpWg26LWXAphYZxpZffFUwDUlDdYDiX5HtaKphvJnQ==", - "dependencies": { - "@emotion/cache": "^10.0.9", - "@emotion/css": "^10.0.9", - "@emotion/serialize": "^0.11.6", - "@emotion/sheet": "0.9.2", - "@emotion/utils": "0.11.1" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-select/node_modules/@emotion/css": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.9.tgz", - "integrity": "sha512-jtHhUSWw+L7yxYgNtC+KJ3Ory90/jiAtpG1qT+gTQQ/RR5AMiigs9/lDHu/vnwljaq2S48FoKb/FZZMlJcC4bw==", - "dependencies": { - "@emotion/serialize": "^0.11.6", - "@emotion/utils": "0.11.1", - "babel-plugin-emotion": "^10.0.9" - } - }, - "node_modules/react-select/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/react-select/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "node_modules/react-select/node_modules/@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "dependencies": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "node_modules/react-select/node_modules/@emotion/serialize/node_modules/@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "node_modules/react-select/node_modules/@emotion/sheet": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.2.tgz", - "integrity": "sha512-pVBLzIbC/QCHDKJF2E82V2H/W/B004mDFQZiyo/MSR+VC4pV5JLG0TF/zgQDFvP3fZL/5RTPGEmXlYJBMUuJ+A==" - }, - "node_modules/react-select/node_modules/@emotion/stylis": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.3.tgz", - "integrity": "sha512-M3nMfJ6ndJMYloSIbYEBq6G3eqoYD41BpDOxreE8j0cb4fzz/5qvmqU9Mb2hzsXcCnIlGlWhS03PCzVGvTAe0Q==" - }, - "node_modules/react-select/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/react-select/node_modules/@emotion/utils": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.1.tgz", - "integrity": "sha512-8M3VN0hetwhsJ8dH8VkVy7xo5/1VoBsDOk/T4SJOeXwTO1c4uIqVNx2qyecLFnnUWD5vvUqHQ1gASSeUN6zcTg==" - }, - "node_modules/react-select/node_modules/@emotion/weak-memoize": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz", - "integrity": "sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA==" - }, - "node_modules/react-select/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.0.0.tgz", - "integrity": "sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw==" - }, - "node_modules/react-select/node_modules/react-transition-group": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", - "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/react-select/node_modules/react-transition-group/node_modules/@babel/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/react-select/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, "node_modules/react-shallow-renderer": { "version": "16.15.0", "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", @@ -17525,9 +17343,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -18355,28 +18173,6 @@ "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==", "peer": true }, - "node_modules/storybook-addon-whats-new": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/storybook-addon-whats-new/-/storybook-addon-whats-new-1.0.3.tgz", - "integrity": "sha512-5je0qJh2ahPbbS2pwOkgKKmUDJAT0aAn3cSmap0Hp3hzFlu4uaDPiY00T4mPF3BsavBrkPNmy7kKIHTXnmRu5A==", - "peerDependencies": { - "@storybook/addons": "^6.4.0", - "@storybook/api": "^6.4.0", - "@storybook/components": "^6.4.0", - "@storybook/core-events": "^6.4.0", - "@storybook/theming": "^6.4.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -18959,9 +18755,9 @@ "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==" }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -18971,7 +18767,7 @@ "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", + "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", @@ -18980,7 +18776,7 @@ "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", @@ -19016,12 +18812,70 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/telejson": { @@ -19092,12 +18946,12 @@ } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -19221,6 +19075,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -19268,6 +19127,11 @@ "node": ">=0.6" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -19388,11 +19252,11 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19850,9 +19714,9 @@ } }, "node_modules/webpack": { - "version": "5.101.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", - "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -19862,9 +19726,9 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -19874,10 +19738,10 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { @@ -20727,6 +20591,17 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yup": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", + "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } } } } diff --git a/ui/package.json b/ui/package.json index 862210464..bfbe17ae4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@contentstack/json-rte-serializer": "^2.0.12", - "@contentstack/venus-components": "^3.0.0", + "@contentstack/venus-components": "^3.0.2", "@reduxjs/toolkit": "^2.8.2", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^13.4.0", @@ -12,7 +12,7 @@ "@types/react": "^18.3.21", "@types/react-dom": "^18.2.13", "@types/react-redux": "^7.1.33", - "axios": "^1.8.3", + "axios": "^1.12.0", "bootstrap": "^5.3.6", "chokidar": "^3.6.0", "final-form": "^4.20.10", @@ -73,4 +73,4 @@ "overrides": { "http-proxy-middleware": "latest" } -} +} \ No newline at end of file diff --git a/ui/src/cmsData/legacyCms.json b/ui/src/cmsData/legacyCms.json index 9e866e611..38c23d588 100644 --- a/ui/src/cmsData/legacyCms.json +++ b/ui/src/cmsData/legacyCms.json @@ -185,17 +185,17 @@ "title": "https://business.adobe.com/", "href": "https://business.adobe.com/" }, - "parent": "", + "parent": "aem", "isactive": true, "allowed_file_formats": [ { - "fileformat_id": "zip", + "fileformat_id": "directory", "_metadata": { "uid": "cs08dadd206cfa53b4" }, - "title": "Zip", + "title": "Directory", "description": "", - "group_name": "zip", + "group_name": "directory", "isactive": true } ] @@ -377,4 +377,4 @@ "restricted_keyword_checkbox_text": "Please acknowledge that you have referred to the Contentstack restricted keywords", "affix_cta": "Continue", "file_format_cta": "Continue" -} +} \ No newline at end of file diff --git a/ui/src/components/ContentMapper/contentMapper.interface.ts b/ui/src/components/ContentMapper/contentMapper.interface.ts index 0e239a38b..0adaedd79 100644 --- a/ui/src/components/ContentMapper/contentMapper.interface.ts +++ b/ui/src/components/ContentMapper/contentMapper.interface.ts @@ -208,4 +208,5 @@ export interface ModifiedField { parentId: string; uid: string; _canSelect?: boolean; + contentstackFieldType?: string; } diff --git a/ui/src/components/ContentMapper/index.scss b/ui/src/components/ContentMapper/index.scss index c1c3cc8b8..dbc864689 100644 --- a/ui/src/components/ContentMapper/index.scss +++ b/ui/src/components/ContentMapper/index.scss @@ -152,8 +152,20 @@ .Table { border-left: 0 none; min-height: inherit; + .Table__body__row { + // height: auto!important; + // min-height: 80px; + .Table-select-body { + >.checkbox-wrapper { + align-items: flex-start; + } + } + } .Table__body__column { padding: 0 1.25rem; + &:not(:last-of-type) { + display: block; + } } .Table-select-body { width: 68px; @@ -321,4 +333,76 @@ div .table-row { .icon-padding{ padding: 10px 10px; margin-left: 6px; +} +// Parent-child table structure styles +.table-row-content { + &.parent-row { + font-weight: 600; + // margin-left: 16px; + } + + &.child-row { + margin-left: 26px; + } + + &.child-row-level-2 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 36px; + padding-left: 16px; + } + + &.child-row-level-3 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 62px; + padding-left: 16px; + } + + &.child-row-level-4 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 98px; + padding-left: 16px; + } + &.child-row-level-5 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 134px; + padding-left: 16px; + } + &.child-row-level-6 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 164px; + padding-left: 16px; + } + &.child-row-level-7 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 194px; + padding-left: 16px; + } + &.child-row-level-8 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 220px; + padding-left: 16px; + } + &.child-row-level-9 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 248px; + padding-left: 16px; + } + &.child-row-level-10 { + border-left: 1px solid $color-brand-secondary-lightest; + margin-left: 278px; + padding-left: 16px; + } +} +.instruction-text-indent { + margin-left: 26px; +} + +// UID text styling to prevent table column breaking +.uid-text { + word-break: break-all; + // white-space: normal; + overflow-wrap: break-word; + max-width: 230px; + display: inline-flex; + line-height: 1.2!important; } \ No newline at end of file diff --git a/ui/src/components/ContentMapper/index.tsx b/ui/src/components/ContentMapper/index.tsx index e97190064..93da754ad 100644 --- a/ui/src/components/ContentMapper/index.tsx +++ b/ui/src/components/ContentMapper/index.tsx @@ -56,8 +56,7 @@ import { ContentTypeSaveHandles, MouseOrKeyboardEvent, MappingFields, - FieldHistoryObj, - FieldObj + FieldHistoryObj } from './contentMapper.interface'; import { ItemStatusMapProp } from '@contentstack/venus-components/build/components/Table/types'; import { ModalObj } from '../Modal/modal.interface'; @@ -214,8 +213,17 @@ const Fields: MappingFields = { label: 'Extension', options: { 'Extension': 'extension' }, type: '' + }, + 'modular_blocks':{ + label: 'Modular Blocks', + options: {'Modular Blocks':'modular_blocks'}, + type:'' + }, + 'modular_blocks_child':{ + label: 'Block', + options: {'Block':'modular_blocks_child'}, + type:'' } - } type contentMapperProps = { handleStepChange: (currentStep: number) => void; @@ -863,7 +871,7 @@ const ContentMapper = forwardRef(({ handleStepChange }: contentMapperProps, ref: const handleSchemaPreview = async (title: string, contentTypeId: string) => { try { - const { data } = await getFieldMapping(contentTypeId ?? '', 0, 30, searchText ?? '', projectId); + const { data } = await getFieldMapping(contentTypeId ?? '', 0, 1000, searchText ?? '', projectId); return cbModal({ component: (props: ModalObj) => ( { + // Clean field name (remove parent hierarchy) + const cleanFieldName = data?.otherCmsField?.includes(' > ') + ? data.otherCmsField.split(' > ').pop() + : data?.otherCmsField; + + const tooltipContent = data?.otherCmsField?.includes(' > ') + ? `Field: ${cleanFieldName} \nFull path: ${data.otherCmsField}` + : `Field: ${cleanFieldName}`; + + // Simple checks for visual indicators + const isModularBlock = data?.contentstackFieldType === 'modular_blocks'; + const isModularBlockChild = data?.contentstackFieldType === 'modular_blocks_child'; + const isGroup = data?.contentstackFieldType === 'group'; + + // Function to calculate nesting level from UID + const getNestingLevel = (uid: string): number => { + if (!uid || !uid.includes('.')) return 0; + return uid.split('.').length - 1; + }; + + // Function to get nesting class based on level + const getNestingClass = (level: number): string => { + if (level === 0) return ''; + if (level === 1) return 'child-row'; + return `child-row-level-${level}`; + }; + + // Calculate nesting level for proper indentation + const nestingLevel = getNestingLevel(data?.uid || ''); + + // Count children only if this is a modular block parent + const childrenCount = isModularBlockChild ? + tableData?.filter(item => item?.uid?.startsWith(data?.uid + '.'))?.length || 0 : 0; return ( -
-
-
{data?.otherCmsField}
- {(data?.backupFieldType === 'text' || data?.backupFieldType === 'url') && ( - - )} + +
0 ? getNestingClass(nestingLevel) : ''}`} style={isModularBlock || isModularBlockChild || isGroup ? {borderLeft: '0 none'} : {}}> +
+ {/* Indentation for child rows */} + {/* {isBlockChild &&
} */} + + {/* Parent indicator for modular blocks */} + {data?.contentstackFieldType === 'modular_blocks' && } + + {isModularBlockChild && } + {isGroup && } + +
+ {cleanFieldName} +
+ + {(data?.backupFieldType === 'text' || data?.backupFieldType === 'url') && ( + + )} + + {/* Show indicators for parent/child relationship */} + {isModularBlockChild && childrenCount > 0 && ( + + )} + {/* {isBlockChild && ( + + )} */} +
+ +
+ Type: {data?.otherCmsType} +
+ UID: {data?.uid} +
+
- - Type: {data?.otherCmsType} -
- UID: {data?.uid} -
-
+ ); }; @@ -924,36 +989,6 @@ const ContentMapper = forwardRef(({ handleStepChange }: contentMapperProps, ref: } } - // Get the last action of each row - const getLastElements = (obj: FieldHistoryObj) => { - const result: FieldObj = {}; - for (const key in obj) { - if (Array.isArray(obj[key]) && obj[key]?.length > 0) { - // Get the last element of the array - result[key] = obj[key][obj[key]?.length - 1]; - } - } - return result; - } - - // Get the latest action performed on table - const findLatest = (obj: FieldHistoryObj) => { - let latestItem = null; - - for (const key in obj) { - if (Array.isArray(obj[key]) && obj[key]?.length > 0) { - // Get the last element of the array - const lastElement = obj[key][obj[key]?.length - 1]; - - // Compare the 'at' property - if (!latestItem || lastElement?.at > latestItem?.at) { - latestItem = lastElement; - } - } - } - return latestItem; - } - // Update the object on selection or deselection const updateRowHistoryObj = (key: string, checked: boolean) => { const obj = tableData?.find(i => i?.id === key); @@ -966,10 +1001,128 @@ const ContentMapper = forwardRef(({ handleStepChange }: contentMapperProps, ref: } }; + /** + * Recursively gets all descendant row IDs for a given parent UID + * @param parentUid - The UID of the parent + * @param data - The table data array + * @returns Array of all descendant row objects + * @description Recursively gets all descendant row IDs for a given parent UID + */ + const getAllDescendants = (parentUid: string, data: FieldMapType[]): FieldMapType[] => { + const descendants: FieldMapType[] = []; + const parentUidLower = parentUid?.toLowerCase(); + + const children = data?.filter((item) => { + const itemUidLower = item?.uid?.toLowerCase() || ''; + return itemUidLower?.startsWith(parentUidLower + '.') && itemUidLower !== parentUidLower; + }); + + children?.forEach((child) => { + descendants?.push(child); + + if ( + child?.backupFieldType?.toLowerCase() === 'group' || + child?.backupFieldType?.toLowerCase() === 'modular_blocks' || + child?.backupFieldType?.toLowerCase() === 'modular_blocks_child' || + child?.contentstackFieldType?.toLowerCase() === 'modular_blocks' || + child?.contentstackFieldType?.toLowerCase() === 'modular_blocks_child' + ) { + const nestedDescendants = getAllDescendants(child?.uid, data); + descendants?.push(...nestedDescendants); + } + }); + + return descendants; + }; + + /** + * + * @param childUid - The UID of the child + * @param selectedObj - The selected object + * @param data - The table data array + * @returns + * @description Cascade DOWN to uncheck all descendants + */ + const cascadeUncheckParents = ( + childUid: string, + selectedObj: UidMap, + data: FieldMapType[] + ): void => { + const uidParts = childUid?.split('.'); + if (uidParts?.length <= 1) return; + + const parentUid = uidParts?.slice(0, -1)?.join('.'); + const parentItem = data?.find((item) => item?.uid?.toLowerCase() === parentUid?.toLowerCase()); + + if (!parentItem) return; + + const allChildren = data?.filter((item) => { + const itemUid = item?.uid?.toLowerCase() || ''; + const parentUidLower = parentUid?.toLowerCase(); + return ( + itemUid?.startsWith(parentUidLower + '.') && + itemUid?.split('.')?.length === parentUidLower?.split('.')?.length + 1 + ); + }); + + const allChildrenUnchecked = allChildren?.every((child) => !selectedObj?.[child?.id]); + + if (allChildrenUnchecked) { + delete selectedObj[parentItem?.id]; + cascadeUncheckParents(parentItem?.uid, selectedObj, data); + } + }; + + /** + * Cascade UP to check all ancestors + * @param childUid - The UID of the child + * @param selectedObj - The selected object + * @param data - The table data array + * @returns void + * @description Cascade UP to check all ancestors + */ + const cascadeCheckParents = ( + childUid: string, + selectedObj: UidMap, + data: FieldMapType[] + ): void => { + const uidParts = childUid?.split('.'); + + // Check all ancestors + for (let i = 1; i < uidParts?.length; i++) { + const ancestorUid = uidParts?.slice(0, i)?.join('.'); + const ancestorItem = data?.find( + (item) => item?.uid?.toLowerCase() === ancestorUid?.toLowerCase() + ); + if (ancestorItem) { + selectedObj[ancestorItem?.id] = true; + } + } + }; + + /** + * Check if an item is a leaf node + * @param item - The item to check + * @returns true if the item is a leaf node, false otherwise + */ + const isLeafNode = (item: FieldMapType): boolean => { + const type = item?.backupFieldType?.toLowerCase(); + return ( + type !== 'group' && + type !== 'modular_blocks' && + type !== 'modular_blocks_child' + ); + }; + + /** + * Handle the selected entries + * @param singleSelectedRowIds - The single selected row IDs + * @returns void + */ const handleSelectedEntries = (singleSelectedRowIds: string[]) => { const selectedObj: UidMap = {}; + const previousRowIds: UidMap = { ...rowIds as UidMap }; - setIsAllCheck(false); singleSelectedRowIds?.forEach((uid: string) => { const isId = selectedEntries?.some((item) => item?.id === uid); if (isId) { @@ -977,91 +1130,84 @@ const ContentMapper = forwardRef(({ handleStepChange }: contentMapperProps, ref: } }); - // updates rowHistoryObj based on selectedObj - for (const key in rowHistoryObj) { - if (Object.hasOwn(selectedObj, key)) { - if (!rowHistoryObj[key][rowHistoryObj[key]?.length - 1]?.checked) { - updateRowHistoryObj(key, true); - } - } else if (rowHistoryObj[key][rowHistoryObj[key]?.length - 1]?.checked) { - updateRowHistoryObj(key, false); - } + // Find all items that changed state + const changedItems = tableData.filter((item) => { + const wasSelected = !!previousRowIds[item?.id]; + const isSelected = !!selectedObj[item?.id]; + return wasSelected !== isSelected; + }); + + if (changedItems?.length === 0) { + const updatedTableData = tableData?.map((tableItem) => ({ + ...tableItem, + isDeleted: tableItem?._canSelect ? !selectedObj[tableItem?.id] : tableItem?.isDeleted + })); + setRowIds(selectedObj); + setSelectedEntries(updatedTableData); + return; } - // Get the latest action performed row - const latestRow = findLatest(rowHistoryObj); - - if (latestRow?.backupFieldType?.toLowerCase() === "group" && latestRow?.parentId === '') { - // get all child rows of group - const groupUid = latestRow?.uid?.toLowerCase(); - const childItems = tableData?.filter((entry) => entry?.uid?.toLowerCase()?.startsWith(groupUid + '.')); - if (childItems && validateArray(childItems)) { - if (latestRow?.checked) { - const lastEle = getLastElements(rowHistoryObj) - let isChildChecked = false - childItems?.forEach((child) => { - if (lastEle[child?.id]?.checked) { - isChildChecked = true - } - }) + // Find the leaf node that changed (if any) - this is likely what user clicked + let userClickedItem = changedItems?.find(item => isLeafNode(item)); + + // If no leaf node changed, use the deepest changed item + if (!userClickedItem) { + changedItems?.sort((a, b) => { + const depthA = a?.uid?.split('.')?.length; + const depthB = b?.uid?.split('.')?.length; + return depthB - depthA; // Deepest first + }); + userClickedItem = changedItems?.[0]; + } - if (isChildChecked) { - if (!selectedObj[latestRow?.id]) { - selectedObj[latestRow?.id] = true - } - } else { - childItems.forEach((child) => { - if (!selectedObj[child?.id]) { - selectedObj[child?.id] = true - } - }) - } + const wasChecked = !!previousRowIds[userClickedItem?.id]; + const isNowChecked = !wasChecked; - } else { - childItems?.forEach((child) => { - delete selectedObj[child?.id || '']; - }) - } + // Update history + updateRowHistoryObj(userClickedItem?.id, isNowChecked); + + // Check if this is a parent container + const isParentContainer = + (userClickedItem?.contentstackFieldType?.toLowerCase() === 'group') || + userClickedItem?.contentstackFieldType?.toLowerCase() === 'modular_blocks' || + userClickedItem?.contentstackFieldType?.toLowerCase() === 'modular_blocks_child'; + + if (isParentContainer) { + const allDescendants = getAllDescendants(userClickedItem?.uid, tableData); + + if (isNowChecked) { + // Parent checked - cascade DOWN to children AND UP to ancestors + selectedObj[userClickedItem?.id] = true; + allDescendants?.forEach((descendant) => { + selectedObj[descendant?.id] = true; + }); + + cascadeCheckParents(userClickedItem?.uid, selectedObj, tableData); + } else { + delete selectedObj[userClickedItem?.id]; + allDescendants?.forEach((descendant) => { + delete selectedObj?.[descendant?.id]; + }); + cascadeUncheckParents(userClickedItem?.uid, selectedObj, tableData); } - } else if (latestRow?.parentId && latestRow?._canSelect === true) { - // Extract the group UID if item is child of any group - const uidBeforeDot = latestRow?.uid?.split?.('.')?.[0]?.toLowerCase(); - const groupItem = tableData?.find((entry) => entry?.uid?.toLowerCase() === uidBeforeDot); - const childItems = tableData?.filter((entry) => entry?.uid?.toLowerCase()?.startsWith(groupItem?.uid?.toLowerCase() + '.')); - - if (latestRow?.checked) { - if (!selectedObj[latestRow?.parentId]) { - selectedObj[latestRow?.parentId] = true - } - if (!selectedObj[latestRow?.id]) { - selectedObj[latestRow?.id] = true - } + } else { + if (isNowChecked) { + selectedObj[userClickedItem?.id] = true; + + // Cascade UP to ancestors + cascadeCheckParents(userClickedItem?.uid, selectedObj, tableData); } else { - const lastEle = getLastElements(rowHistoryObj); - - let allChildFalse = 0 - childItems?.forEach((child) => { - if (!lastEle[child?.id]?.checked) { - allChildFalse++ - } - }) - if (childItems?.length === allChildFalse) { - if (selectedObj[latestRow?.parentId]) { - delete selectedObj[latestRow?.parentId] - } - } else if (selectedObj[latestRow?.id]) { - delete selectedObj[latestRow?.id] - } + // Leaf unchecked + delete selectedObj[userClickedItem?.id]; + cascadeUncheckParents(userClickedItem?.uid, selectedObj, tableData); } } - const updatedTableData = selectedEntries?.map?.((tableItem) => { - // Mark the item as deleted if not found in selectedData - return { - ...tableItem, - isDeleted: (tableItem?._canSelect) ? !selectedObj[tableItem?.id] : tableItem?.isDeleted //!found ? true : false, - }; - }); + // Update table data + const updatedTableData = tableData?.map((tableItem) => ({ + ...tableItem, + isDeleted: tableItem?._canSelect ? !selectedObj[tableItem?.id] : tableItem?.isDeleted + })); setRowIds(selectedObj); setSelectedEntries(updatedTableData); diff --git a/ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx b/ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx index b1b4a99a1..d0864a6ae 100644 --- a/ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx +++ b/ui/src/components/DestinationStack/Actions/LoadLanguageMapper.tsx @@ -659,7 +659,7 @@ const LanguageMapper = ({stack, uid} :{ stack : IDropDown, uid : string}) => { + } rowComponent={ { } - setFileIcon(fileFormat === 'zip' ? fileFormat?.charAt?.(0).toUpperCase() + fileFormat?.slice?.(1) : fileFormat?.toUpperCase()); + setFileIcon(fileFormat === 'zip' ? fileFormat?.charAt?.(0).toUpperCase() + fileFormat?.slice?.(1) : fileFormat === 'directory' ? 'Folder' : fileFormat?.toUpperCase()); } } catch (error) { @@ -116,7 +116,7 @@ const LoadFileFormat = (props: LoadFileFormatProps) => {
- {isError &&

{error}

} + {isError &&

{error}

}
); diff --git a/ui/src/components/LegacyCms/Actions/LoadPrefix.tsx b/ui/src/components/LegacyCms/Actions/LoadPrefix.tsx index 34f6db61e..0b0a736c2 100644 --- a/ui/src/components/LegacyCms/Actions/LoadPrefix.tsx +++ b/ui/src/components/LegacyCms/Actions/LoadPrefix.tsx @@ -119,7 +119,7 @@ const LoadPreFix = (props: LoadSelectCmsProps) => { /**** ALL USEEffects HERE ****/ const { restricted_keyword_link = DEFAULT_URL_TYPE } = migrationData.legacyCMSData; - + return (
@@ -127,7 +127,7 @@ const LoadPreFix = (props: LoadSelectCmsProps) => { onChange={(e: React.ChangeEvent) => { handleOnChange(e); }} - value={prefix} + value={prefix?.replace(/\s+/g, '')?.length > 0 ? prefix?.replace(/\s+/g, '') : prefix} autoFocus={true} width="large" placeholder={'Add Affix'} @@ -158,4 +158,4 @@ const LoadPreFix = (props: LoadSelectCmsProps) => { ); }; -export default LoadPreFix; +export default LoadPreFix; \ No newline at end of file diff --git a/ui/src/components/LegacyCms/Actions/LoadSelectCms.tsx b/ui/src/components/LegacyCms/Actions/LoadSelectCms.tsx index 7a01428ae..cb5f37c15 100644 --- a/ui/src/components/LegacyCms/Actions/LoadSelectCms.tsx +++ b/ui/src/components/LegacyCms/Actions/LoadSelectCms.tsx @@ -50,6 +50,7 @@ const LoadSelectCms = (props: LoadSelectCmsProps) => { //const [setErrorMessage] = useState(''); const [isError, setIsError] = useState(false); const [isLoading, setIsLoading] = useState(false); + const [errorMessage, setErrorMessage] = useState(''); /**** ALL METHODS HERE ****/ @@ -91,10 +92,29 @@ const LoadSelectCms = (props: LoadSelectCmsProps) => { const cmstype = !isEmptyString(cmsType?.cms_id) ? cmsType?.parent : cms; // Fetch the specific CMS type let filteredCmsData = all_cms; - if (cmstype) { + // Check if cmstype is empty + if (isEmptyString(cmstype)) { + setIsError(true); + setErrorMessage('No CMS found! Please add the correct CMS'); + setCmsData([]); + } else { + // cmstype is not empty, apply filter filteredCmsData = all_cms.filter( (cms: ICMSType) => cms?.parent?.toLowerCase() === cmstype?.toLowerCase() ); + setIsLoading(false); + + + // Check if filter returned any results + if (filteredCmsData?.length > 0) { + setCmsData(filteredCmsData); + setIsError(false); + } else { + // cmstype is not empty but no matches found + setIsError(true); + setErrorMessage('Please add the correct CMS'); + setCmsData([]); + } } const newMigrationDataObj = { ...newMigrationData, @@ -106,7 +126,7 @@ const LoadSelectCms = (props: LoadSelectCmsProps) => { //dispatch(updateNewMigrationData(newMigrationDataObj)); - setCmsData(filteredCmsData); + // setCmsData(filteredCmsData); //Normal Search const _filterCmsData = validateArray(all_cms) @@ -180,13 +200,8 @@ const LoadSelectCms = (props: LoadSelectCmsProps) => { return (
- {isError && ( -
- No matching CMS found!
} - img={SEARCH_ICON} - /> -
+ {isError && ( +
{errorMessage}
)} {isLoading ? (
diff --git a/ui/src/components/LegacyCms/Actions/LoadUploadFile.tsx b/ui/src/components/LegacyCms/Actions/LoadUploadFile.tsx index 817219684..ddff5e82a 100644 --- a/ui/src/components/LegacyCms/Actions/LoadUploadFile.tsx +++ b/ui/src/components/LegacyCms/Actions/LoadUploadFile.tsx @@ -405,10 +405,7 @@ const LoadUploadFile = (props: LoadUploadFileProps) => { //
) : ( - //
-
- -
+
No file added. Please add the file to validate.
)} {showMessage && !showProgress && (
diff --git a/ui/src/components/SchemaModal/index.scss b/ui/src/components/SchemaModal/index.scss index 0cc017a9d..dde903573 100644 --- a/ui/src/components/SchemaModal/index.scss +++ b/ui/src/components/SchemaModal/index.scss @@ -17,6 +17,9 @@ font-weight: $font-weight-medium; padding: 0; white-space: nowrap; + &.nested-child { + padding-left: 1.125rem; + } .iconsholder { align-items: center; display: flex; diff --git a/ui/src/components/SchemaModal/index.tsx b/ui/src/components/SchemaModal/index.tsx index ee537c2b3..9f3bae88e 100644 --- a/ui/src/components/SchemaModal/index.tsx +++ b/ui/src/components/SchemaModal/index.tsx @@ -90,7 +90,7 @@ const getTopLevelIcons = (field: FieldMapType) => { return icons['boolean']; } - if (field?.contentstackFieldType === 'Reference' || field?.contentstackFieldType === 'refernce') { + if (field?.contentstackFieldType === 'Reference' || field?.contentstackFieldType === 'reference') { return icons['reference']; } @@ -106,6 +106,10 @@ const getTopLevelIcons = (field: FieldMapType) => { return icons['extension']; } + if (field?.contentstackFieldType === 'modular_blocks' || field?.contentstackFieldType === 'modular_blocks_child') { + return icons['blocks']; + } + return icons[field?.contentstackFieldType as keyof Icons]; }; @@ -113,23 +117,51 @@ const TreeView = ({ schema = [] }: schemaType) => { const [nestedList, setNestedList] = useState([]); useEffect(() => { - let groupId = ''; const data: FieldMapType[] = []; - schema?.forEach((field) => { - if (field?.contentstackFieldType === 'group') { - groupId = field?.uid; - data?.push({ ...field, child: [] }); - } else if (field?.uid?.startsWith(groupId + '.')) { - const obj = data[data?.length - 1]; - if (Object.hasOwn(obj, 'child')) { - obj?.child?.push(field); - } else { - obj.child = [field]; + // Helper function to find the correct parent for a field + const findParentInData = (targetUid: string, dataArray: FieldMapType[]): FieldMapType | null => { + for (const item of dataArray) { + if (targetUid.startsWith(item.uid + '.')) { + // Check if this is an immediate child (no additional dots after parent uid) + const remainingPath = targetUid.substring(item.uid.length + 1); + if (!remainingPath.includes('.')) { + return item; // This is the immediate parent + } + // Check in children recursively + if (item.child && item.child.length > 0) { + const foundInChild = findParentInData(targetUid, item.child); + if (foundInChild) return foundInChild; + } } - } else { + } + return null; + }; + + // First pass: Add all root level fields (no dots in UID) + schema?.forEach((field, index) => { + if (!field?.uid?.includes('.')) { data.push({ ...field, child: [] }); } }); + + // Second pass: Add nested fields (with dots in UID) + schema?.forEach((field, index) => { + + // Check if this field has a parent (contains dots in UID) + if (field?.uid?.includes('.')) { + + const parentField = findParentInData(field.uid, data); + if (parentField) { + if (!parentField.child) { + parentField.child = []; + } + parentField.child.push({ ...field, child: [] }); + } else { + // If no parent found, add to root level + data.push({ ...field, child: [] }); + } + } + }); setNestedList(data); }, [schema]); @@ -185,7 +217,7 @@ const TreeView = ({ schema = [] }: schemaType) => { > {hasNestedValue(field) && ( - + )} diff --git a/ui/src/pages/Migration/index.tsx b/ui/src/pages/Migration/index.tsx index b9d20c5e0..4ff1fadc0 100644 --- a/ui/src/pages/Migration/index.tsx +++ b/ui/src/pages/Migration/index.tsx @@ -226,11 +226,15 @@ const Migration = () => { // Use regex to extract the file extension const match = normalizedPath?.match(/\.([a-zA-Z0-9]+)$/); - const ext = match ? match?.[1]?.toLowerCase() : ""; + + // Check if it has a file extension (dot followed by 1-5 alphanumeric characters at the end) + const isDirectory = !/\.[a-zA-Z0-9]{1,5}$/.test(normalizedPath); + + const ext = match ? match?.[1]?.toLowerCase() : isDirectory ? "directory" : ""; // const fileName = filePath?.split('/')?.pop(); //const ext = fileName?.split('.')?.pop(); - const validExtensionRegex = /\.(pdf|zip|xml|json)$/i; + const validExtensionRegex = /\.(pdf|zip|xml|json|directory|sql)$/i; return ext && validExtensionRegex?.test(`.${ext}`) ? `${ext}` : ''; }; diff --git a/ui/src/utilities/constants.ts b/ui/src/utilities/constants.ts index 3083c77f3..ec14d5a57 100644 --- a/ui/src/utilities/constants.ts +++ b/ui/src/utilities/constants.ts @@ -117,7 +117,8 @@ export const VALIDATION_DOCUMENTATION_URL: { [key: string]: string } = { contentful: 'https://assets.contentstack.io/v3/assets/bltc09cefc19ddf033f/bltb14c2df7c5e202ba/67ee3fcdb509b76f5f308ac4/contentful.pdf', wordpress: '', - drupal: '' + drupal: '', + aem: '' }; diff --git a/upload-api/.gitignore b/upload-api/.gitignore index 51a0f4087..1d855fe25 100644 --- a/upload-api/.gitignore +++ b/upload-api/.gitignore @@ -15,3 +15,4 @@ data error.log combine.log +tmp \ No newline at end of file diff --git a/upload-api/migration-aem/componentMaker/componentHandler/index.interfaces.ts b/upload-api/migration-aem/componentMaker/componentHandler/index.interfaces.ts new file mode 100644 index 000000000..219b7933f --- /dev/null +++ b/upload-api/migration-aem/componentMaker/componentHandler/index.interfaces.ts @@ -0,0 +1,16 @@ +export interface ComponentData { + component: string; + props: Record; +} + + +export interface SetSchemaComponent { + (data: Record, componentName: string): void +} + +export interface ComponentHandler { + handle(component: Record, componentName: string, count: number, setSchemaComponent: SetSchemaComponent): void; +} + + + diff --git a/upload-api/migration-aem/componentMaker/componentHandler/index.ts b/upload-api/migration-aem/componentMaker/componentHandler/index.ts new file mode 100644 index 000000000..cc4bb1701 --- /dev/null +++ b/upload-api/migration-aem/componentMaker/componentHandler/index.ts @@ -0,0 +1,23 @@ +import { isContainerComponent, parseXFPath } from "../../helper/component.identifier"; +import { createSchemaTypes } from "../../helper/jsonSchema.identifier"; +import { ComponentHandler, SetSchemaComponent } from "./index.interfaces"; + +class LoggerHandler implements ComponentHandler { + handle(component: Record, componentName: string, count: number, setSchemaComponent: SetSchemaComponent): void { + const { [':type']: componentType, [':itemsOrder']: itemsOrder } = component?.props || {}; + + const containerSchema = isContainerComponent(componentType); + const isExperienceFragment = parseXFPath(componentType); + + const shouldProcess = !itemsOrder || + (containerSchema?.isContainer === false && !isExperienceFragment && itemsOrder?.length); + + if (shouldProcess) { + const schemaTypes = createSchemaTypes(component); + setSchemaComponent(schemaTypes, componentName); + } + } +} + + +export default LoggerHandler; \ No newline at end of file diff --git a/upload-api/migration-aem/componentMaker/componentTracker/index.ts b/upload-api/migration-aem/componentMaker/componentTracker/index.ts new file mode 100644 index 000000000..aa518fb03 --- /dev/null +++ b/upload-api/migration-aem/componentMaker/componentTracker/index.ts @@ -0,0 +1,43 @@ +import { ComponentData, ComponentHandler } from "../componentHandler/index.interfaces"; + + +class ComponentTracker { + private data: ComponentData[] = []; + private countMap: Record = {}; + private handlers: ComponentHandler[]; + private schemaComponent: Record = {}; + + constructor(handlers: ComponentHandler[] = []) { + this.handlers = handlers; + } + + + pushComponent(component: ComponentData): void { + const { component: name } = component; + this.data.push(component); + this.countMap[name] = (this.countMap[name] || 0) + 1; + + const setSchemaComponents = (data: Record, componentName: string) => { + this.schemaComponent[componentName] = data; + } + + for (const handler of this.handlers) { + handler.handle(component, name, this?.countMap?.[name], setSchemaComponents) + } + } + + getCount(componentName: string): number { + return this.countMap[componentName] || 0; + } + + + getAllData(): ComponentData[] { + return this.data; + } + + getAllComponents(): Record { + return this.schemaComponent; + } +} + +export default ComponentTracker; \ No newline at end of file diff --git a/upload-api/migration-aem/constant/index.ts b/upload-api/migration-aem/constant/index.ts new file mode 100644 index 000000000..7ffa59f7f --- /dev/null +++ b/upload-api/migration-aem/constant/index.ts @@ -0,0 +1,8 @@ +// This file contains constants used in the migration process for AEM (Adobe Experience Manager). +export const CONSTANTS = { + TMP_FILE: './tmp/contentstackComponents.json', + FRAGMENT_FILE: './tmp/fragment.json', + CONENT_DATA_FILE: './tmp/contentTypes.json', + arrangeCTGroup: ['templateName', 'title', 'templateType'], + AEM_DAM_DIR: 'dam-downloads' +}; \ No newline at end of file diff --git a/upload-api/migration-aem/helper/component.identifier.ts b/upload-api/migration-aem/helper/component.identifier.ts new file mode 100644 index 000000000..a0f64ac17 --- /dev/null +++ b/upload-api/migration-aem/helper/component.identifier.ts @@ -0,0 +1,61 @@ +export const parseXFPath = (path: string): boolean => { + // Check if path contains "experience-fragments" or "experiencefragment" + return /(experience-fragments|experiencefragment)/.test(path); +}; + + +export function isContainerComponent(path: string) { + // Check for all container patterns and return the type + const patterns = { + responsivegrid: /components\/responsivegrid/, + container: /components\/container/, + parsys: /parsys/, + layoutContainer: /components\/layout-container/ + }; + + for (const [type, pattern] of Object.entries(patterns)) { + if (pattern.test(path)) { + return { + isContainer: true, + type: type, + path: path + }; + } + } + + return { + isContainer: false, + type: null, + path: path + }; +} + + +/** + * Quick Experience Fragment Identifier + * Checks if JSON data represents an Experience Fragment template + */ + +export function isExperienceFragment(data: any) { + if (data?.templateType && data[':type']) { + // Check templateType starts with 'xf-' + const hasXfTemplate = data?.templateType?.startsWith('xf-'); + + // Check :type contains 'components/xfpage' + const hasXfComponent = data[':type']?.includes('components/xfpage'); + + // Return analysis + return { + isXF: hasXfTemplate || hasXfComponent, + confidence: (hasXfTemplate && hasXfComponent) ? 'high' + : (hasXfTemplate || hasXfComponent) ? 'medium' : 'low', + indicators: { + templateType: hasXfTemplate ? data.templateType : null, + componentType: hasXfComponent ? data[':type'] : null, + } + }; + } + return null; +} + + diff --git a/upload-api/migration-aem/helper/contentType.flatten.ts b/upload-api/migration-aem/helper/contentType.flatten.ts new file mode 100644 index 000000000..29b9e20a0 --- /dev/null +++ b/upload-api/migration-aem/helper/contentType.flatten.ts @@ -0,0 +1,158 @@ +interface Field { + id?: string; + uid?: string; + otherCmsField?: string; + otherCmsType?: string; + contentstackField?: string; + contentstackFieldUid?: string; + contentstackFieldType?: string; + backupFieldType?: string; + backupFieldUid?: string; + blocks?: Block[]; + schema?: SchemaField[]; + advanced?: any; + isDeleted?: boolean; + refrenceTo?: string[]; + type?: string; + [key: string]: any; +} + +interface Block { + uid?: string; + otherCmsField?: string; + contentstackField?: string; + contentstackFieldUid?: string; + backupFieldUid?: string; + schema?: SchemaField[]; + [key: string]: any; +} + +interface SchemaField extends Field { + // Schema fields have same structure as Field +} + +interface ContentType { + id: string; + status: number; + otherCmsTitle: string; + otherCmsUid: string; + isUpdated: boolean; + contentstackTitle: string; + contentstackUid: string; + type: string; + fieldMapping: Field[]; + mergedFromIds: string[]; +} + +function flattenContentTypes(contentTypes: ContentType[]): ContentType[] { + return contentTypes.map(contentType => ({ + ...contentType, + fieldMapping: flattenFieldMapping(contentType.fieldMapping) + })); +} + +function flattenFieldMapping(fieldMapping: Field[]): Field[] { + const flattenedFields: Field[] = []; + + fieldMapping.forEach(field => { + processField(field, [], [], flattenedFields); + }); + + return flattenedFields; +} + +function processField( + field: Field, + parentPath: string[], + parentUidPath: string[], + flattenedFields: Field[] +): void { + const currentPath = [...parentPath]; + const currentUidPath = [...parentUidPath]; + + // Add current field to path if it has a uid + if (field.uid) { + currentPath.push(field.uid); + currentUidPath.push(field.contentstackFieldUid || field.uid); + } + + // Create a clean copy of the field without blocks and schema + const flatField: Field = Object.keys(field).reduce((acc, key) => { + if (key !== 'blocks' && key !== 'schema') { + acc[key] = field[key]; + } + return acc; + }, {} as Field); + + // Update the paths for nested fields + if (currentPath.length > 0) { + flatField.uid = currentPath.join('.'); + flatField.otherCmsField = currentPath.join(' > '); + flatField.contentstackField = currentPath.join(' > '); + flatField.contentstackFieldUid = currentUidPath.join('.'); + flatField.backupFieldUid = currentUidPath.join('.'); + } + + // Add the clean field to flattened array + flattenedFields.push(flatField); + + // Process blocks if they exist in the original field + if (field.blocks && Array.isArray(field.blocks)) { + field.blocks.forEach(block => { + processBlock(block, currentPath, currentUidPath, flattenedFields); + }); + } + + // Process schema fields if they exist in the original field + if (field.schema && Array.isArray(field.schema)) { + field.schema.forEach(schemaField => { + processField(schemaField, currentPath, currentUidPath, flattenedFields); + }); + } +} + +function processBlock( + block: Block, + parentPath: string[], + parentUidPath: string[], + flattenedFields: Field[] +): void { + const currentPath = [...parentPath]; + const currentUidPath = [...parentUidPath]; + + // Add block to path if it has a uid + if (block.uid) { + currentPath.push(block.uid); + currentUidPath.push(block.contentstackFieldUid || block.uid); + } + + // Create a clean copy of the block without schema + const blockField: Field = Object.keys(block).reduce((acc, key) => { + if (key !== 'schema') { + acc[key] = block[key]; + } + return acc; + }, {} as Field); + + // Update all path fields + if (currentPath.length > 0) { + blockField.uid = currentPath.join('.'); + blockField.otherCmsField = currentPath.join(' > '); + blockField.contentstackField = currentPath.join(' > '); + blockField.contentstackFieldUid = currentUidPath.join('.'); + blockField.backupFieldUid = currentUidPath.join('.'); + } + + // Add clean block to flattened array + flattenedFields.push(blockField); + + // Process schema if it exists in the original block + if (block.schema && Array.isArray(block.schema)) { + block.schema.forEach(schemaField => { + processField(schemaField, currentPath, currentUidPath, flattenedFields); + }); + } +} + +// Export the main function +export { flattenContentTypes }; \ No newline at end of file diff --git a/upload-api/migration-aem/helper/fieldMappings.merge.ts b/upload-api/migration-aem/helper/fieldMappings.merge.ts new file mode 100644 index 000000000..7c93b8c6c --- /dev/null +++ b/upload-api/migration-aem/helper/fieldMappings.merge.ts @@ -0,0 +1,723 @@ +interface FieldMapping { + id?: string; + uid?: string; + otherCmsField?: string; + otherCmsType?: string; + contentstackField?: string; + contentstackFieldUid?: string; + contentstackFieldType?: string; + backupFieldType?: string; + backupFieldUid?: string; + isDeleted?: boolean; + refrenceTo?: string[]; + blocks?: BlockItem[]; + schema?: any; + advanced?: any; + type?: string; +} + +interface BlockItem { + uid: string; + otherCmsField?: string; + contentstackField?: string; + contentstackFieldUid?: string; + backupFieldUid?: string; + schema?: any; + blocks?: BlockItem[]; +} + +interface ContentModel { + id: string; + status: number; + otherCmsTitle: string; + otherCmsUid: string; + isUpdated: boolean; + contentstackTitle: string; + contentstackUid: string; + type: string; + fieldMapping: (FieldMapping | null)[]; +} + +interface MergedContentModel extends Omit { + fieldMapping: FieldMapping[]; + mergedFromIds: string[]; +} + +// Dynamic type order tracking +let dynamicTypeOrder: string[] = []; + +function trackComponentType(type: string): void { + const cleanType = type.toLowerCase().includes('customembed') ? 'customembed' : type.toLowerCase(); + if (!dynamicTypeOrder.includes(cleanType)) { + dynamicTypeOrder.push(cleanType); + } +} + +/** + * Main entry point for processing content models + */ +export function processContentModels( + jsonData: ContentModel[] | MergedContentModel[] +): MergedContentModel[] { + console.log('=== Starting Content Model Processing ==='); + console.log(`Processing ${jsonData.length} total content models`); + + // Reset dynamic type order for each processing run + dynamicTypeOrder = []; + + // Check if data is already processed + const isAlreadyProcessed = jsonData.length > 0 && 'mergedFromIds' in jsonData[0]; + + if (isAlreadyProcessed) { + console.log('Data appears to be already processed. Applying deep deduplication and container merging.'); + return (jsonData as MergedContentModel[]).map(model => ({ + ...model, + fieldMapping: model.fieldMapping.map(field => processFieldDeep(field)) + })); + } + + const result = mergeContentModels(jsonData as ContentModel[]); + + console.log('\n=== Processing Complete ==='); + console.log(`Result: ${result.length} unique content models`); + console.log(`Dynamic type order discovered: [${dynamicTypeOrder.join(', ')}]`); + + return result; +} + +/** + * Merges content models with the same contentstackUid + */ +function mergeContentModels(models: ContentModel[]): MergedContentModel[] { + const groupedModels = new Map(); + + // Group by contentstackUid + models.forEach(model => { + const key = model.contentstackUid; + if (!groupedModels.has(key)) { + groupedModels.set(key, []); + } + groupedModels.get(key)!.push(model); + }); + + const mergedModels: MergedContentModel[] = []; + + // Process each group + groupedModels.forEach((group, contentstackUid) => { + console.log(`\nProcessing content type: ${contentstackUid} (${group.length} instances)`); + + if (group.length === 1) { + // Single instance - just process blocks + const singleModel = group[0]; + const processedFieldMapping = singleModel.fieldMapping + .filter(f => f !== null) + .map(field => processFieldDeep(field as FieldMapping)); + + mergedModels.push({ + ...singleModel, + fieldMapping: processedFieldMapping, + mergedFromIds: [singleModel.id] + }); + } else { + // Multiple instances - merge them + const merged = mergeMultipleInstances(group); + mergedModels.push(merged); + } + }); + + return mergedModels; +} + +/** + * Process field with deep recursive deduplication and container merging + */ +function processFieldDeep(field: FieldMapping): FieldMapping { + // Process blocks at the top level + if (field.blocks && Array.isArray(field.blocks)) { + console.log(`\n📦 Processing field: ${field.uid || field.contentstackFieldUid}`); + console.log(` Initial blocks: ${field.blocks.length}`); + + const processedBlocks = mergeBlocksWithSameUid(field.blocks); + + console.log(` Final blocks: ${processedBlocks.length}`); + + return { + ...field, + blocks: processedBlocks + }; + } + + return field; +} + +/** + * Merges blocks with the same contentstackFieldUid at the same level in a blocks array + * This function handles all the merging logic for blocks with same UIDs + */ +function mergeBlocksWithSameUid(blocks: any[]): any[] { + if (!blocks || !Array.isArray(blocks) || blocks.length === 0) { + return blocks; + } + + // Track component types as they appear + blocks.forEach(block => { + const type = block.uid || block.contentstackFieldUid || ''; + if (type) { + trackComponentType(type); + } + }); + + // Group blocks by contentstackFieldUid (or uid as fallback) + const blockGroups = new Map(); + const blockOrder: string[] = []; // Track order of first appearance + + blocks.forEach(block => { + // Use contentstackFieldUid as the primary key for grouping, fallback to uid + const key = block.contentstackFieldUid || block.uid || 'unknown'; + + if (!blockGroups.has(key)) { + blockGroups.set(key, []); + blockOrder.push(key); // Track first appearance order + } + + blockGroups.get(key)!.push(block); + }); + + // Result array + const mergedBlocks: any[] = []; + + // Process each unique key in order of first appearance + blockOrder.forEach(key => { + const sameUidBlocks = blockGroups.get(key)!; + + if (sameUidBlocks.length === 1) { + // Only one block with this UID, keep as is but process its nested blocks + const block = deepClone(sameUidBlocks[0]); + + // Recursively process nested blocks if they exist + if (block.blocks && Array.isArray(block.blocks)) { + block.blocks = mergeBlocksWithSameUid(block.blocks); + } + + // Also process schema if it contains blocks + if (block.schema) { + if (Array.isArray(block.schema)) { + // Check if schema array has multiple items with same contentstackFieldUid + block.schema = mergeBlocksWithSameUid(block.schema); + + // Then process each schema item's blocks + block.schema = block.schema.map((schemaItem: any) => { + if (schemaItem.blocks && Array.isArray(schemaItem.blocks)) { + return { + ...schemaItem, + blocks: mergeBlocksWithSameUid(schemaItem.blocks) + }; + } + return schemaItem; + }); + } else if (typeof block.schema === 'object' && block.schema.blocks && Array.isArray(block.schema.blocks)) { + block.schema = { + ...block.schema, + blocks: mergeBlocksWithSameUid(block.schema.blocks) + }; + } + } + + mergedBlocks.push(block); + } else { + // Multiple blocks with same UID - merge them + console.log(` 🔀 Merging ${sameUidBlocks.length} blocks with contentstackFieldUid/uid: "${key}"`); + + // Use first block as base + const mergedBlock = deepClone(sameUidBlocks[0]); + + // Collect all nested blocks from all instances + const allNestedBlocks: any[] = []; + const nestedBlockSignatures = new Set(); + + sameUidBlocks.forEach((block, index) => { + console.log(` Processing block ${index + 1}/${sameUidBlocks.length}`); + + if (block.blocks && Array.isArray(block.blocks)) { + block.blocks.forEach((nestedBlock: any) => { + // Track component type + const nestedType = nestedBlock.uid || nestedBlock.contentstackFieldUid || ''; + if (nestedType) { + trackComponentType(nestedType); + } + + // Create signature to avoid duplicates + const signature = createDetailedBlockSignature(nestedBlock); + + if (!nestedBlockSignatures.has(signature)) { + nestedBlockSignatures.add(signature); + allNestedBlocks.push(deepClone(nestedBlock)); + console.log(` ✓ Added nested block: ${nestedType || 'unknown'}`); + } else { + console.log(` ✗ Skipped duplicate: ${nestedType || 'unknown'}`); + } + }); + } + }); + + // Set the merged blocks array and sort them + if (allNestedBlocks.length > 0) { + // Sort blocks for consistent ordering + const sortedBlocks = sortComponentsByType(allNestedBlocks); + // Recursively process the merged nested blocks + mergedBlock.blocks = mergeBlocksWithSameUid(sortedBlocks); + console.log(` Result: 1 block with ${mergedBlock.blocks.length} unique nested blocks`); + } + + // Also merge schema arrays if they exist + const allSchemaItems: any[] = []; + const schemaSignatures = new Set(); + + sameUidBlocks.forEach(block => { + if (block.schema && Array.isArray(block.schema)) { + block.schema.forEach((schemaItem: any) => { + const itemType = schemaItem.uid || schemaItem.contentstackFieldUid || ''; + if (itemType) { + trackComponentType(itemType); + } + + const signature = createDetailedSchemaSignature(schemaItem); + if (!schemaSignatures.has(signature)) { + schemaSignatures.add(signature); + allSchemaItems.push(deepClone(schemaItem)); + } + }); + } else if (block.schema && typeof block.schema === 'object') { + // For object schema, merge if multiple blocks have it + const signature = createDetailedSchemaSignature(block.schema); + if (!schemaSignatures.has(signature)) { + schemaSignatures.add(signature); + if (!mergedBlock.schema) { + mergedBlock.schema = deepClone(block.schema); + } + } + } + }); + + if (allSchemaItems.length > 0) { + // Sort schema items and process recursively + const sortedSchemaItems = sortSchemaItems(allSchemaItems); + mergedBlock.schema = mergeBlocksWithSameUid(sortedSchemaItems); + + // Process each schema item's blocks + mergedBlock.schema = mergedBlock.schema.map((schemaItem: any) => { + if (schemaItem.blocks && Array.isArray(schemaItem.blocks)) { + return { + ...schemaItem, + blocks: mergeBlocksWithSameUid(schemaItem.blocks) + }; + } + return schemaItem; + }); + } + + mergedBlocks.push(mergedBlock); + } + }); + + return mergedBlocks; +} + +/** + * Process a single block recursively + */ +function processBlockRecursively(block: BlockItem): BlockItem { + const processedBlock = { ...block }; + + // Special handling for blocks with schema containing multiple containers at the same level + if (processedBlock.schema && Array.isArray(processedBlock.schema)) { + console.log(` 🔍 Processing schema array for ${processedBlock.uid || processedBlock.contentstackFieldUid}`); + + // Use mergeBlocksWithSameUid for schema arrays + processedBlock.schema = mergeBlocksWithSameUid(processedBlock.schema); + + // Then process each schema item recursively + processedBlock.schema = processedBlock.schema.map((schemaItem: any) => { + if (schemaItem.blocks && Array.isArray(schemaItem.blocks)) { + return { + ...schemaItem, + blocks: mergeBlocksWithSameUid(schemaItem.blocks) + }; + } + return schemaItem; + }); + } else if (processedBlock.schema && typeof processedBlock.schema === 'object' && processedBlock.schema.blocks) { + // Schema is an object with blocks + const nestedBlocks = processedBlock.schema.blocks; + if (Array.isArray(nestedBlocks)) { + console.log(` 📂 Processing nested blocks in schema object`); + processedBlock.schema = { + ...processedBlock.schema, + blocks: mergeBlocksWithSameUid(nestedBlocks) + }; + } + } + + // If the block itself has blocks (another pattern) + if (processedBlock.blocks && Array.isArray(processedBlock.blocks)) { + console.log(` 📂 Processing blocks array in ${processedBlock.uid}`); + processedBlock.blocks = mergeBlocksWithSameUid(processedBlock.blocks); + } + + return processedBlock; +} + +/** + * Sort components dynamically based on their natural order in the data + */ +function sortComponentsByType(components: any[]): any[] { + // First, ensure all component types are tracked + components.forEach(comp => { + const type = comp.uid || comp.contentstackFieldUid || ''; + if (type) { + trackComponentType(type); + } + }); + + // Sort based on dynamic order + return components.sort((a, b) => { + const aType = (a.uid || a.contentstackFieldUid || '').toLowerCase(); + const bType = (b.uid || b.contentstackFieldUid || '').toLowerCase(); + + const aCleanType = aType.includes('customembed') ? 'customembed' : aType; + const bCleanType = bType.includes('customembed') ? 'customembed' : bType; + + const aIndex = dynamicTypeOrder.indexOf(aCleanType); + const bIndex = dynamicTypeOrder.indexOf(bCleanType); + + // Both found in order - sort by position + if (aIndex !== -1 && bIndex !== -1) { + return aIndex - bIndex; + } + + // Only one found - it comes first + if (aIndex !== -1) return -1; + if (bIndex !== -1) return 1; + + // Neither found - sort alphabetically + return aCleanType.localeCompare(bCleanType); + }); +} + +/** + * Sort schema items dynamically + */ +function sortSchemaItems(items: any[]): any[] { + // Track types as they appear + items.forEach(item => { + const type = item.uid || item.contentstackFieldUid || ''; + if (type) { + trackComponentType(type); + } + }); + + return items.sort((a, b) => { + const aType = (a.uid || a.contentstackFieldUid || '').toLowerCase(); + const bType = (b.uid || b.contentstackFieldUid || '').toLowerCase(); + + const aCleanType = aType.includes('customembed') ? 'customembed' : aType; + const bCleanType = bType.includes('customembed') ? 'customembed' : bType; + + const aIndex = dynamicTypeOrder.indexOf(aCleanType); + const bIndex = dynamicTypeOrder.indexOf(bCleanType); + + if (aIndex !== -1 && bIndex !== -1) { + return aIndex - bIndex; + } + + if (aIndex !== -1) return -1; + if (bIndex !== -1) return 1; + + return aCleanType.localeCompare(bCleanType); + }); +} + +/** + * Create a detailed signature for a block + */ +function createDetailedBlockSignature(block: any): string { + const normalized = normalizeForSignature(block); + return JSON.stringify(normalized); +} + +/** + * Create a detailed signature for schema items + */ +function createDetailedSchemaSignature(schemaItem: any): string { + if (!schemaItem) return ''; + + // For objects with uid or contentstackFieldUid + const uid = schemaItem.uid || schemaItem.contentstackFieldUid || ''; + + // Create a signature based on the structure and content + let signature = uid; + + if (schemaItem.schema) { + if (Array.isArray(schemaItem.schema)) { + // For array schemas, add field structure to signature + const fieldSignatures = schemaItem.schema.map((field: any) => { + const fieldUid = field.uid || field.contentstackFieldUid || ''; + const fieldType = field.contentstackFieldType || field.backupFieldType || ''; + const defaultValue = field.advanced?.default_value || ''; + return `${fieldUid}_${fieldType}_${hashValue(defaultValue)}`; + }).join('|'); + signature += `_${fieldSignatures}`; + } else if (typeof schemaItem.schema === 'object') { + signature += `_${JSON.stringify(schemaItem.schema).substring(0, 50)}`; + } + } + + if (schemaItem.blocks && Array.isArray(schemaItem.blocks)) { + // For items with blocks, add block structure to signature + const blockSignatures = schemaItem.blocks.map((block: any) => + block.uid || block.contentstackFieldUid || '' + ).join('|'); + signature += `_blocks:${blockSignatures}`; + } + + return signature; +} + +/** + * Deduplicate blocks array + */ +function deduplicateBlocks(blocks: BlockItem[]): BlockItem[] { + const uniqueBlocks = new Map(); + + blocks.forEach(block => { + const signature = createDetailedBlockSignature(block); + if (!uniqueBlocks.has(signature)) { + uniqueBlocks.set(signature, block); + } + }); + + return Array.from(uniqueBlocks.values()); +} + +/** + * Normalize object for signature creation + */ +function normalizeForSignature(obj: any): any { + if (obj === null || obj === undefined) return obj; + + if (Array.isArray(obj)) { + return obj.map(item => normalizeForSignature(item)); + } + + if (typeof obj === 'object') { + const normalized: any = {}; + const keys = Object.keys(obj).sort(); + + keys.forEach(key => { + // Skip keys that shouldn't affect uniqueness + if (key === 'id' || key === 'position' || key === 'index') { + return; + } + normalized[key] = normalizeForSignature(obj[key]); + }); + + return normalized; + } + + return obj; +} + +/** + * Hash value helper + */ +function hashValue(value: any): string { + if (value === null || value === undefined) return 'null'; + if (typeof value === 'string') { + return value.substring(0, 10).replace(/[^a-zA-Z0-9]/g, ''); + } + if (typeof value === 'boolean') return value.toString(); + if (typeof value === 'number') return value.toString(); + return 'unknown'; +} + +/** + * Merge multiple instances of the same content model + */ +function mergeMultipleInstances(instances: ContentModel[]): MergedContentModel { + const base = instances[0]; + const mergedFromIds = instances.map(inst => inst.id); + + // Create field position map + const fieldPositionMap = new Map(); + + // Analyze all instances + instances.forEach((instance) => { + instance.fieldMapping.forEach((field, position) => { + if (field === null) { + return; + } + + const fieldKey = getFieldKey(field); + + if (!fieldPositionMap.has(fieldKey)) { + fieldPositionMap.set(fieldKey, { + field: deepClone(field), + positions: [] + }); + } + + fieldPositionMap.get(fieldKey)!.positions.push(position); + + // Merge field properties + const existingField = fieldPositionMap.get(fieldKey)!.field; + mergeFieldProperties(existingField, field); + }); + }); + + // Calculate optimal positions + const fieldsWithOptimalPosition: Array<{ field: FieldMapping, position: number }> = []; + + fieldPositionMap.forEach((data) => { + // Process field with deep deduplication + const processedField = processFieldDeep(data.field); + const optimalPosition = calculateOptimalPosition(data.positions); + + fieldsWithOptimalPosition.push({ + field: processedField, + position: optimalPosition + }); + }); + + // Sort by position + fieldsWithOptimalPosition.sort((a, b) => a.position - b.position); + + const mergedFieldMapping = fieldsWithOptimalPosition.map(item => item.field); + + console.log(` Merged ${instances.length} instances`); + console.log(` Final field count: ${mergedFieldMapping.length}`); + + return { + id: base.id, + status: base.status, + otherCmsTitle: base.otherCmsTitle, + otherCmsUid: base.otherCmsUid, + isUpdated: base.isUpdated, + contentstackTitle: base.contentstackTitle, + contentstackUid: base.contentstackUid, + type: base.type, + fieldMapping: mergedFieldMapping, + mergedFromIds: mergedFromIds + }; +} + +/** + * Get unique key for a field + */ +function getFieldKey(field: FieldMapping): string { + if (field.uid) return `uid:${field.uid}`; + if (field.contentstackFieldUid) return `csuid:${field.contentstackFieldUid}`; + if (field.id) return `id:${field.id}`; + return `composite:${field.otherCmsField || ''}_${field.contentstackField || ''}`; +} + +/** + * Merge field properties + */ +function mergeFieldProperties(target: FieldMapping, source: FieldMapping): void { + Object.keys(source).forEach(key => { + const sourceValue = (source as any)[key]; + const targetValue = (target as any)[key]; + + if (key === 'blocks' && Array.isArray(sourceValue)) { + if (Array.isArray(targetValue)) { + // Concatenate blocks arrays + (target as any)[key] = [...targetValue, ...sourceValue]; + } else { + (target as any)[key] = sourceValue; + } + } else if (sourceValue !== null && sourceValue !== undefined) { + if (targetValue === null || targetValue === undefined) { + (target as any)[key] = sourceValue; + } else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) { + (target as any)[key] = mergeArraysUnique(targetValue, sourceValue); + } else if (typeof sourceValue === 'object' && typeof targetValue === 'object') { + (target as any)[key] = deepMerge(targetValue, sourceValue); + } + } + }); +} + +/** + * Calculate optimal position + */ +function calculateOptimalPosition(positions: number[]): number { + if (positions.length === 0) return 0; + if (positions.length === 1) return positions[0]; + + const sorted = [...positions].sort((a, b) => a - b); + return sorted[Math.floor(sorted.length / 2)]; +} + +/** + * Deep clone an object + */ +function deepClone(obj: T): T { + if (obj === null || typeof obj !== 'object') return obj; + if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T; + if (Array.isArray(obj)) return obj.map(item => deepClone(item)) as unknown as T; + + const cloned = {} as T; + Object.keys(obj).forEach(key => { + (cloned as any)[key] = deepClone((obj as any)[key]); + }); + return cloned; +} + +/** + * Merge arrays removing duplicates + */ +function mergeArraysUnique(arr1: any[], arr2: any[]): any[] { + const merged = [...arr1]; + + arr2.forEach(item => { + const isDuplicate = merged.some(existing => + JSON.stringify(existing) === JSON.stringify(item) + ); + + if (!isDuplicate) { + merged.push(item); + } + }); + + return merged; +} + +/** + * Deep merge objects + */ +function deepMerge(target: any, source: any): any { + const result = { ...target }; + + Object.keys(source).forEach(key => { + if (source[key] === null || source[key] === undefined) { + return; + } + + if (typeof source[key] === 'object' && !Array.isArray(source[key])) { + if (typeof result[key] === 'object' && !Array.isArray(result[key])) { + result[key] = deepMerge(result[key], source[key]); + } else { + result[key] = deepClone(source[key]); + } + } else if (Array.isArray(source[key])) { + result[key] = Array.isArray(result[key]) ? + mergeArraysUnique(result[key], source[key]) : deepClone(source[key]); + } else { + if (result[key] === null || result[key] === undefined) { + result[key] = source[key]; + } + } + }); + + return result; +} \ No newline at end of file diff --git a/upload-api/migration-aem/helper/index.ts b/upload-api/migration-aem/helper/index.ts new file mode 100644 index 000000000..d6a766f90 --- /dev/null +++ b/upload-api/migration-aem/helper/index.ts @@ -0,0 +1,333 @@ +import fs from 'fs'; +import path from 'path'; +import { IReadFiles } from "./types/index.interface"; +import { MergeStrategy } from "./types/index.interface"; +import { v4 as uuidv4 } from "uuid"; + + +/** + * Reads a file from the given file path and parses its content as JSON. + * + * @param {string} filePath - The path to the file to be read. + * @returns {Promise} - A promise that resolves to the parsed JSON content of the file. + * @throws {Error} - Throws an error if the file content is empty, undefined, or invalid JSON. + */ + +export const readFiles: IReadFiles = async (filePath: string) => { + try { + await fs.promises.access(filePath, fs.constants.F_OK); + } catch { + console.info(`File does not exist: ${filePath}`); + return null; + } + const fileData = await fs.promises.readFile(filePath, 'utf8') + if (!fileData) { + console.info('File content is empty or undefined'); + return null; + } + if (typeof fileData === 'string') { + return JSON.parse(fileData); + } + return fileData; +} + + + +/** + * Extracts the last segment of a component path from a given string. + * + * Searches for a substring that matches the pattern `components/...` and returns + * the last path segment after the final `/`. If no such pattern is found, returns `null`. + * + * @param line - The input string to search for a component path. + * @returns The last segment of the matched component path, or `null` if no match is found. + */ + +export const extractComponentPath = (line: string): string | null => { + const match = line.match(/components(?:\/[\w-]+)+/); + if (!match) return line; + + // Get the last element after the last '/' + const parts = match[0].split('/'); + return parts[parts.length - 1]; +} + + +/* + * Interface for merge strategy implementations + * Following Interface Segregation Principle (ISP) + */ +export class SchemaComponentMergeStrategy implements MergeStrategy { + canMerge(key: string, sourceValue: any, targetValue: any): boolean { + return !!sourceValue?.convertedSchema && !!targetValue?.convertedSchema; + } + + merge(key: string, sourceValue: any, targetValue: any): any { + // Keep the most complete schema definition + if (Object.keys(sourceValue.convertedSchema).length > + Object.keys(targetValue.convertedSchema).length) { + return sourceValue; + } + return targetValue; + } +} + +/** + * Default strategy for merging components + */ +export class DefaultMergeStrategy implements MergeStrategy { + canMerge(): boolean { + return true; // This is the fallback strategy + } + + merge(sourceValue: any): any { + return sourceValue; // Default to taking the newer value + } +} + +/** + * Component merger following SOLID principles + * Open/Closed Principle (OCP) - open for extension with new strategies + * Dependency Inversion Principle (DIP) - depends on abstractions not implementations + */ +export class ComponentMerger { + private strategies: MergeStrategy[]; + + constructor(strategies?: MergeStrategy[]) { + // Default strategies if none provided + this.strategies = strategies || [ + new SchemaComponentMergeStrategy(), + new DefaultMergeStrategy() + ]; + } + + /** + * Add a new merge strategy + * OCP - extend functionality without modifying existing code + */ + addStrategy(strategy: MergeStrategy): void { + this.strategies.push(strategy); + } + + /** + * Find the appropriate strategy for merging + */ + private findStrategy(key: string, sourceValue: any, targetValue: any): MergeStrategy { + return this.strategies.find(strategy => + strategy.canMerge(key, sourceValue, targetValue) + ) || this.strategies[this.strategies.length - 1]; // Default to last strategy + } + + /** + * Merge a single key between two objects + * SRP - focused responsibility + */ + private mergeKey(key: string, sourceValue: any, targetObject: any): void { + if (!targetObject[key]) { + // Key doesn't exist in target, simply add it + targetObject[key] = sourceValue; + } else { + // Find and apply the appropriate merge strategy + const strategy = this.findStrategy(key, sourceValue, targetObject[key]); + targetObject[key] = strategy.merge(key, sourceValue, targetObject[key]); + } + } + + /** + * Merge objects together + * Public API for this class + */ + merge(objects: Record[]): Record { + if (!objects.length) return {}; + + const result: Record = {}; + + objects.forEach(obj => { + Object.keys(obj).forEach(key => { + this.mergeKey(key, obj[key], result); + }); + }); + + return result; + } +} + +/** + * Factory function to create a component merger + * Makes using the class easier without exposing implementation details + */ +export function createComponentMerger(strategies?: MergeStrategy[]): ComponentMerger { + return new ComponentMerger(strategies); +} + +/** + * Convenience function that wraps the merger for simple use cases + */ +export function mergeComponentObjects(objects: Record[]): Record { + const merger = createComponentMerger(); + return merger.merge(objects); +} + + + +/** + * Writes the given data to a JSON file at the specified path. + * Ensures the directory exists before writing. + * @param data - The data to write. + * @param filePath - The file path to write to. + */ +export async function writeJsonFile( + data: any, + filePath: string = './contentstackComponents.json' +): Promise { + const dir = path.dirname(filePath); + try { + await fs.promises.mkdir(dir, { recursive: true }); + await fs.promises.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8'); + } catch (error) { + throw new Error(`Failed to write JSON file: ${error}`); + } +} + +/** + * Checks if the provided path is an image type (jpeg, jpg, png, gif, webp, svg). + * @param path - The string path to check. + * @returns True if the path is an image, false otherwise. + */ +export function isImageType(path: string): boolean { + return /\.(jpeg|jpg|png|gif|webp|svg)$/i.test(path); +} + + +export const uidCorrector = (uid: string) => { + // Remove leading colon if present (e.g., ':items' becomes 'items') + let newUid = uid.replace(/^:/, ''); + + // Replace spaces, hyphens, and colons with underscores + newUid = newUid.replace(/[ :-]/g, '_'); + + // Remove all '$' characters + newUid = newUid.replace(/\$/g, ''); + + // Remove any character not alphanumeric or underscore + newUid = newUid.replace(/[^a-zA-Z0-9_]/g, ''); + + // Ensure starts with an alphabet, else prefix with 'a' + if (!/^[a-zA-Z]/.test(newUid)) { + newUid = 'a' + newUid; + } + + return newUid.toLowerCase(); +}; + +export const isUrlPath = (str: string) => /^\/[a-zA-Z0-9\-/.]+$/.test(str); + +export const isHtmlString = (str: string): boolean => /<[a-z][\s\S]*>/i.test(str); + + +export function findComponentByType(contentstackComponents: any, type: string, exclude: string[] = ['nt:folder']) { + return Object.entries(contentstackComponents ?? {}).find( + ([, csValue]: any) => { + const csType = (csValue as { [key: string]: any })['type']; + return csType === type && !exclude.includes(csType); + } + ); +} + + +export function countComponentTypes(component: any, result: Record = {}) { + if (!component || typeof component !== "object") return result; + + // Check for ':type' at current level + const typeField = component[":type"]?.value; + if (typeField) { + result[typeField] = (result[typeField] || 0) + 1; + } + + // Recursively check nested properties + for (const key in component) { + if (component[key] && typeof component[key] === "object") { + countComponentTypes(component[key], result); + } + } + + return result; +} + + +export function findFirstComponentByType(schema: Record, type: string): any | null { + if (!schema || typeof schema !== "object") return null; + + // Check at current level + if (schema[":type"]?.value === type) { + return schema; + } + + // Recursively check nested properties + for (const key in schema) { + if (schema[key] && typeof schema[key] === "object") { + const found = findFirstComponentByType(schema[key], type); + if (found) return found; + } + } + + return null; +} + +/** + * Converts kebab-case or snake_case to a human-readable title. + * Example: "page-content-full-width" => "Page content full width" + */ +export function toHumanTitle(str: string): string { + return str + .replace(/[-_]+/g, ' ') // Replace - and _ with space + .replace(/\s+/g, ' ') // Normalize spaces + .trim() // Remove leading/trailing spaces + .replace(/^./, c => c.toUpperCase()); // Capitalize first letter +} + +export function createContentTypeObject({ + otherCmsTitle, + otherCmsUid, + fieldMapping, + type = "content_type", + status = 1, + isUpdated = false +}: { + otherCmsTitle: string; + otherCmsUid: string; + fieldMapping: any[]; + type?: string; + status?: number; + isUpdated?: boolean; +}) { + return { + id: uuidv4(), + status, + otherCmsTitle: toHumanTitle(otherCmsTitle), + otherCmsUid, + isUpdated, + contentstackTitle: toHumanTitle(otherCmsTitle), + contentstackUid: uidCorrector(otherCmsUid), + type, + fieldMapping, + }; +} + + +/** + * Ensures a field with the given UID exists in the schema array. + * If not present, prepends the provided field config. + */ +export function ensureField( + mainSchema: any[], + fieldConfig: Record, + fieldUid: string +) { + const found = mainSchema?.some( + (item) => item?.contentstackFieldUid?.toLowerCase?.() === fieldUid.toLowerCase() + ); + if (!found) { + mainSchema.unshift(fieldConfig); + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/helper/jsonSchema.identifier.ts b/upload-api/migration-aem/helper/jsonSchema.identifier.ts new file mode 100644 index 000000000..9fa138862 --- /dev/null +++ b/upload-api/migration-aem/helper/jsonSchema.identifier.ts @@ -0,0 +1,75 @@ +import { createSchema } from 'genson-js'; + +/** + * Enhances a JSON schema by adding original values alongside type information + */ +function enhanceSchemaWithValues(schema: any, originalData: any): any { + if (!schema || typeof schema !== 'object') return schema; + + // Create a new object for the enhanced schema + const enhanced: any = { ...schema }; + + // If the schema has properties, process each property + if (schema.properties) { + enhanced.properties = { ...schema.properties }; + + // For each property in the schema + Object.keys(schema.properties).forEach(key => { + // Get the original value if it exists + if (originalData && originalData.hasOwnProperty(key)) { + const originalValue = originalData[key]; + const propertySchema = schema.properties[key]; + + // Add the value to the schema + enhanced.properties[key] = { + ...propertySchema, + value: originalValue + }; + + // Recursively process nested objects + if ( + propertySchema.type === 'object' && + originalValue && + typeof originalValue === 'object' + ) { + enhanced.properties[key] = enhanceSchemaWithValues( + propertySchema, + originalValue + ); + } + + // Handle arrays with nested objects + if ( + propertySchema.type === 'array' && + Array.isArray(originalValue) && + propertySchema.items && + propertySchema.items.type === 'object' + ) { + // Use the first array item as a sample for the schema + const sampleItem = originalValue[0]; + if (sampleItem && typeof sampleItem === 'object') { + enhanced.properties[key].items = enhanceSchemaWithValues( + propertySchema.items, + sampleItem + ); + } + enhanced.properties[key].value = originalValue; + } + } + }); + } + + return enhanced; +} + + +export const createSchemaTypes = (data: Record) => { + const typeSchema = createSchema(data?.props); + // Create a combined schema with both types and values + const enhancedSchema = enhanceSchemaWithValues(typeSchema, data?.props || {}); + return { convertedSchema: enhancedSchema }; +} + + + + diff --git a/upload-api/migration-aem/helper/types/index.interface.ts b/upload-api/migration-aem/helper/types/index.interface.ts new file mode 100644 index 000000000..fc549ae94 --- /dev/null +++ b/upload-api/migration-aem/helper/types/index.interface.ts @@ -0,0 +1,8 @@ +export interface IReadFiles { + (path: string): Promise; +} + +export interface MergeStrategy { + canMerge(key: string, sourceValue: any, targetValue: any): boolean; + merge(key: string, sourceValue: any, targetValue: any): any; +} \ No newline at end of file diff --git a/upload-api/migration-aem/index.ts b/upload-api/migration-aem/index.ts new file mode 100644 index 000000000..f5ccc9d59 --- /dev/null +++ b/upload-api/migration-aem/index.ts @@ -0,0 +1,9 @@ +import contentTypes from './libs/contentType'; +import locales from './libs/locales'; +import validator from './libs/validate' + +export { + contentTypes, + locales, + validator +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/BreadcrumbComponent.ts b/upload-api/migration-aem/libs/contentType/components/BreadcrumbComponent.ts new file mode 100644 index 000000000..10735f12c --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/BreadcrumbComponent.ts @@ -0,0 +1,111 @@ +import { ContentstackComponent } from '../fields'; +import { BooleanField, GroupField, LinkField, TextField } from '../fields/contentstackFields'; +import { SchemaProperty } from './index.interface'; + +const breadcrumbExclude = [ + 'dataLayer', + ':type', + 'path', + 'id' +]; + +export class BreadcrumbComponent extends ContentstackComponent { + static isBreadcrumb(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("components/navigation/breadcrumb")) || + (typeof typeField === "object" && typeField.value?.includes("components/navigation/breadcrumb")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + object: (key, schemaProp) => { + // For breadcrumb, handle the link object + if (schemaProp?.properties?.url?.value !== undefined) { + return new LinkField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp?.properties?.url?.value + }).toContentstack(); + } + return null; + }, + array: (key, schemaProp) => { + if ( + schemaProp?.value?.length && + schemaProp?.type === 'array' && + schemaProp?.items?.properties + ) { + const componentsData: any[] = []; + for (const [itemKey, itemValue] of Object.entries(schemaProp.items.properties)) { + const itemSchemaProp = itemValue as SchemaProperty; + if ( + !breadcrumbExclude.includes(itemKey) && + itemSchemaProp?.type && + BreadcrumbComponent.fieldTypeMap[itemSchemaProp.type] + ) { + componentsData.push( + BreadcrumbComponent.fieldTypeMap[itemSchemaProp.type](itemKey, itemSchemaProp) + ); + } + } + return new GroupField({ + uid: key, + displayName: key, + fields: componentsData, + required: false, + multiple: true + }).toContentstack(); + } + return null; + } + }; + + static mapBreadcrumbToContentstack(component: any, parentKey: any): any { + const breadcrumbItems = component?.convertedSchema?.properties?.breadcrumbLinkItems; + if (breadcrumbItems?.type === 'array' && breadcrumbItems?.items?.properties) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(breadcrumbItems.items.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !breadcrumbExclude.includes(key) && + schemaProp?.type && + BreadcrumbComponent.fieldTypeMap[schemaProp.type] + ) { + componentsData.push( + BreadcrumbComponent.fieldTypeMap[schemaProp.type](key, schemaProp) + ); + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields: componentsData, + required: false, + multiple: true + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/ButtonComponent.ts b/upload-api/migration-aem/libs/contentType/components/ButtonComponent.ts new file mode 100644 index 000000000..2bb78761b --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/ButtonComponent.ts @@ -0,0 +1,108 @@ +import { isImageType, isUrlPath } from "../../../helper"; +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, ImageField, LinkField, TextField } from "../fields/contentstackFields"; +import { SchemaProperty } from "./index.interface"; + +const buttonExclude = [ + 'dataLayer', + ':type', + 'path', + 'id', + 'appliedCssClassNames' +]; + +export class ButtonComponent extends ContentstackComponent { + static isButton(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/button")) || + (typeof typeField === "object" && typeField.value?.includes("/components/button")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp, isImg, isURl = false) => { + if (isURl) { + return new LinkField({ + uid: key, + displayName: key, + description: "", + defaultValue: "", + }).toContentstack(); + } + return isImg ? new ImageField({ + uid: key, + displayName: key, + }).toContentstack() + : new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack() + }, + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: (key, schemaProp) => { + const urlValue = schemaProp?.properties?.url?.value; + if (urlValue !== undefined) { + return new LinkField({ + uid: key, + displayName: key, + description: "", + defaultValue: urlValue + }).toContentstack(); + } + return null; + }, + array: () => null, + }; + + static mapButtonToContentstack(component: any, parentKey: any) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(componentSchema.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !buttonExclude.includes(key) && + schemaProp?.type && + ButtonComponent.fieldTypeMap[schemaProp.type] + ) { + const isImg = isImageType(schemaProp?.value) + const isUrl = isUrlPath(schemaProp?.value) + componentsData.push( + ButtonComponent.fieldTypeMap[schemaProp.type](key, schemaProp, isImg, isUrl) + ); + } + } + return componentsData?.length ? { + ... new GroupField({ + uid: parentKey, + displayName: parentKey, + fields: componentsData, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value, + } : null; + } + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/CarouselComponent.ts b/upload-api/migration-aem/libs/contentType/components/CarouselComponent.ts new file mode 100644 index 000000000..8e04f7234 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/CarouselComponent.ts @@ -0,0 +1,155 @@ +import { countComponentTypes, findFirstComponentByType, uidCorrector } from "../../../helper"; +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, TextField } from "../fields/contentstackFields"; +import { ButtonComponent, TeaserComponent, ImageComponent, TextBannerComponent, TextComponent, TitleComponent, SearchComponent, SpacerComponent, SeparatorComponent } from "./index"; +import { SchemaProperty } from "./index.interface"; + + +const carouselExclude = [ + 'dataLayer', + ':type', + 'id', + ':itemsOrder' +]; + +export class CarouselComponent extends ContentstackComponent { + static isCarousel(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/carousel")) || + (typeof typeField === "object" && typeField.value?.includes("/components/carousel")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: (fieldKey: string, schemaProp: SchemaProperty): any => { + const normalizedUid = uidCorrector(fieldKey) + const countObject = countComponentTypes(schemaProp.properties); + const schema: any[] = []; + + for (const [type, count] of Object.entries(countObject as Record)) { + const data = findFirstComponentByType(schemaProp?.properties, type); + if (!data) continue; // skip if not found + + // Correct way to build the component object + const component = { convertedSchema: { type: 'object', properties: data } }; + const isMultiple = count > 1; + + const componentActions: [ + any, string, (comp: any, isMultiple?: boolean) => void + ][] = [ + [ImageComponent, "isImage", (comp, isMultiple) => { + const imageData = ImageComponent.mapImageToContentstack(comp, "image"); + if (imageData && isMultiple) imageData.advanced.multiple = true; + if (imageData) schema.push(imageData); + }], + [TeaserComponent, "isTeaser", (comp, isMultiple) => { + const teaserData = TeaserComponent.mapTeaserToContentstack(comp, "teaser"); + if (teaserData && isMultiple) teaserData.advanced.multiple = true; + if (teaserData) schema.push(teaserData); + }], + [ButtonComponent, "isButton", (comp, isMultiple) => { + const buttonData = ButtonComponent.mapButtonToContentstack(comp, "button"); + if (buttonData && isMultiple) buttonData.advanced.multiple = true; + if (buttonData) schema.push(buttonData); + }], + [TextBannerComponent, "isTextBanner", (comp, isMultiple) => { + const textBannerData = TextBannerComponent.mapTextBannerToContentstack(comp, "textBanner"); + if (textBannerData && isMultiple) textBannerData.advanced.multiple = true; + if (textBannerData) schema.push(textBannerData); + }], + [TextComponent, "isText", (comp, isMultiple) => { + const textData = TextComponent.mapTextToContentstack(comp); + if (textData && isMultiple) textData.multiple = true; + if (textData) schema.push(textData); + }], + [TitleComponent, "isTitle", (comp, isMultiple) => { + const titleData = TitleComponent.mapTitleToContentstack(comp, "title"); + if (titleData && isMultiple) titleData.multiple = true; + if (titleData) schema.push(titleData); + }], + [SearchComponent, "isSearch", (comp, isMultiple) => { + const searchData = SearchComponent.mapSearchToContentstack(comp, "search"); + if (searchData && isMultiple) searchData.multiple = true; + if (searchData) schema.push(searchData); + }], + [SpacerComponent, "isSpacer", (comp, isMultiple) => { + const spacerData = SpacerComponent.mapSpacerToContentstack(comp, "spacer"); + if (spacerData && isMultiple) spacerData.multiple = true; + if (spacerData) schema.push(spacerData); + }], + [SeparatorComponent, "isSeparator", (comp, isMultiple) => { + const separatorData = SeparatorComponent.mapSeparatorToContentstack(comp, "separator"); + if (separatorData && isMultiple) separatorData.multiple = true; + if (separatorData) schema.push(separatorData); + }], + ]; + + componentActions.forEach(([Comp, method, action]) => { + if (Comp?.[method]?.(component)) { + action(component, isMultiple); + } + }); + } + return new GroupField({ + uid: normalizedUid, + displayName: normalizedUid, + fields: schema, + required: false, + multiple: false + }).toContentstack() + }, + array: () => null, + }; + + static mapCarouselToContentstack(component: any, parentKey: any) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const fields: any[] = []; + for (const [key, value] of Object.entries(componentSchema.properties)) { + if (!carouselExclude.includes(key)) { + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && CarouselComponent.fieldTypeMap[schemaProp.type]) { + fields.push(CarouselComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return null; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/CustomEmbedComponent.ts b/upload-api/migration-aem/libs/contentType/components/CustomEmbedComponent.ts new file mode 100644 index 000000000..9532be6f2 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/CustomEmbedComponent.ts @@ -0,0 +1,69 @@ +// item.name = + + +import { uidCorrector } from '../../../helper'; +import { ContentstackComponent } from '../fields'; + + +export class CustomEmbedComponent extends ContentstackComponent { + /** + * Determines if a component is a custom embed component + */ + static isCustomEmbed(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/customembed")) || + (typeof typeField === "object" && typeField.value?.includes("/components/customembed")) + ) { + return true; + } + } + return false; + } + + /** + * Maps the custom embed component schema to Contentstack fields + */ + static mapCustomEmbedToContentstack(component: any, parentKey: any): any { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object') { + const embedType = componentSchema?.properties?.type?.value; + let appName; + switch (embedType) { + case 'EMBEDDABLE': { + appName = componentSchema?.properties?.embeddableResourceType?.value?.includes('/embeddable/youtube') ? 'Youtube' : null; + break; + } + case 'HTML': { + appName = 'Html'; + break; + } + case 'URL': { + appName = 'Url'; + break; + } + default: + appName = null; + break; + } + if (appName !== null) { + appName = `${parentKey} (${appName}-App)`; + return { + uid: appName, + otherCmsField: appName, + otherCmsType: 'customembed', + contentstackField: appName, + contentstackFieldUid: uidCorrector(parentKey), + contentstackFieldType: 'app', + backupFieldType: 'app', + backupFieldUid: uidCorrector(parentKey), + advanced: {}, + type: component?.convertedSchema?.properties?.[":type"]?.value, + } + } + return null; + } + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/ImageComponent.ts b/upload-api/migration-aem/libs/contentType/components/ImageComponent.ts new file mode 100644 index 000000000..f43f5569a --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/ImageComponent.ts @@ -0,0 +1,100 @@ +import { isImageType } from "../../../helper"; +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, TextField, ImageField } from "../fields/contentstackFields"; +import { SchemaProperty } from "./index.interface"; + +const imageExclude = [ + 'dataLayer', + ':type', + 'id', + //no need for this in contentstack its can handle by api call + 'srcUriTemplate' +]; + +export class ImageComponent extends ContentstackComponent { + static isImage(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/image")) || + (typeof typeField === "object" && typeField.value?.includes("/components/image")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp, isImg) => { + + return isImg ? + new ImageField({ + uid: key, + displayName: key, + }).toContentstack() + : new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack() + }, + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value, + isNumber: true + }).toContentstack(), + object: () => null, + array: () => null + }; + + static mapImageToContentstack(component: any, parentKey: string) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const fields: any[] = []; + + // Add essential image fields first + const essentialFields = ['alt', 'src', 'link']; + + for (const fieldName of essentialFields) { + const schemaProp = componentSchema.properties[fieldName] as SchemaProperty; + const isImg = isImageType(schemaProp?.value) + if (schemaProp?.type && ImageComponent.fieldTypeMap[schemaProp.type]) { + fields.push(ImageComponent.fieldTypeMap[schemaProp.type](fieldName, schemaProp, isImg)); + } + } + + // Add remaining fields + for (const [key, value] of Object.entries(componentSchema.properties)) { + if (!imageExclude.includes(key) && !essentialFields.includes(key)) { + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && ImageComponent.fieldTypeMap[schemaProp.type]) { + fields.push(ImageComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + } + + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return null; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/NavigationComponent.ts b/upload-api/migration-aem/libs/contentType/components/NavigationComponent.ts new file mode 100644 index 000000000..c784d8cde --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/NavigationComponent.ts @@ -0,0 +1,147 @@ +import { ContentstackComponent } from '../fields'; +import { BooleanField, GroupField, LinkField, TextField } from '../fields/contentstackFields'; +import { SchemaProperty } from './index.interface'; + + +const navigationExclude = [ + // Add keys or values you want to exclude from navigation mapping + 'dataLayer', + ':type', + 'path', + 'id' +]; + +export class NavigationComponent extends ContentstackComponent { + /** + * Determines if a component is a text component + */ + static isNavigation(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/navigation")) || + (typeof typeField === "object" && typeField.value?.includes("/components/navigation")) + ) { + return true; + } + } + return false; + } + + /** + * Determines if a component is a language navigation component + */ + static isLanguageNavigation(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/languagenavigation")) || + (typeof typeField === "object" && typeField.value?.includes("/components/languagenavigation")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: (key, schemaProp) => { + const urlValue = schemaProp?.properties?.url?.value; + if (urlValue !== undefined) { + return new LinkField({ + uid: key, + displayName: key, + description: "", + defaultValue: urlValue + }).toContentstack(); + } + return null; + }, + array: (key, schemaProp) => { + if ( + schemaProp?.value?.length && + schemaProp?.type === 'array' && + schemaProp?.items?.properties + ) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(schemaProp.items.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !navigationExclude.includes(key) && + schemaProp?.type && + NavigationComponent.fieldTypeMap[schemaProp.type] + ) { + componentsData.push( + NavigationComponent.fieldTypeMap[schemaProp.type](key, schemaProp) + ); + } + } + return new GroupField({ + uid: key, + displayName: key, + fields: componentsData, + required: false, + multiple: true + }).toContentstack(); + } + return null; + } + }; + + + + /** + * Maps the title property of a navigation component to Contentstack format + */ + static mapNavigationTOContentstack(component: any, parentKey: any): any { + const componentSchema = component?.convertedSchema?.properties?.items; + if (componentSchema?.type === 'array' && componentSchema?.items?.properties) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(componentSchema.items.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !navigationExclude.includes(key) && + schemaProp?.type && + NavigationComponent.fieldTypeMap[schemaProp.type] + ) { + componentsData.push( + NavigationComponent.fieldTypeMap[schemaProp.type](key, schemaProp) + ); + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields: componentsData, + required: false, + multiple: true + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return []; + } + +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/NtFolderComponent.ts b/upload-api/migration-aem/libs/contentType/components/NtFolderComponent.ts new file mode 100644 index 000000000..c21af31a3 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/NtFolderComponent.ts @@ -0,0 +1,43 @@ +import { ContentstackComponent } from '../fields'; +import { ReferenceField } from '../fields/contentstackFields'; + + + +export class NtFolderComponent extends ContentstackComponent { + /** + * Determines if a component is an nt:folder component + */ + static isNtFolder(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField === "nt:folder") || + (typeof typeField === "object" && typeField.value === "nt:folder") + ) { + return true; + } + } + return false; + } + + + /** + * Maps the nt:folder component to Contentstack format + */ + static mapNtFolderToContentstack(component: any, parentKey: any): any { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + componentSchema.properties[':type'] + return { + ...new ReferenceField({ + uid: parentKey, + displayName: parentKey, + refrenceTo: [] + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return []; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/ProductListingComponent.ts b/upload-api/migration-aem/libs/contentType/components/ProductListingComponent.ts new file mode 100644 index 000000000..dfa82f586 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/ProductListingComponent.ts @@ -0,0 +1,87 @@ +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, TextField } from "../fields/contentstackFields"; +import { SchemaProperty } from "./index.interface"; + +const productListingExclude = [ + 'dataLayer', + ':type', + 'id', + 'relativePath' +]; + +export class ProductListingComponent extends ContentstackComponent { + static isProductListing(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && + (typeField.includes("/components/productlisting") || + typeField.includes("/components/productTeaserListConfiguredProducts") || + typeField.includes("/components/productTeaserListConfiguredCategory")) + ) || + (typeof typeField === "object" && + (typeField.value?.includes("/components/productlisting") || + typeField.value?.includes("/components/productTeaserListConfiguredProducts") || + typeField.value?.includes("/components/productTeaserListConfiguredCategory")) + ) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: () => null, + array: () => null + }; + + static mapProductListingToContentstack(component: any, parentKey: any) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(componentSchema.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !productListingExclude.includes(key) && + schemaProp?.type && + ProductListingComponent.fieldTypeMap[schemaProp.type] + ) { + componentsData.push( + ProductListingComponent.fieldTypeMap[schemaProp.type](key, schemaProp) + ); + } + } + return componentsData?.length ? { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields: componentsData, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + } : null; + } + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/SearchComponent.ts b/upload-api/migration-aem/libs/contentType/components/SearchComponent.ts new file mode 100644 index 000000000..c888ca814 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/SearchComponent.ts @@ -0,0 +1,80 @@ +import { ContentstackComponent } from '../fields'; +import { BooleanField, GroupField, TextField } from '../fields/contentstackFields'; +import { SchemaProperty } from './index.interface'; + +const searchExclude = [ + 'dataLayer', + ':type', + 'id', + 'relativePath', + 'searchRootPagePath' +]; + +export class SearchComponent extends ContentstackComponent { + /** + * Determines if a component is a search component + */ + static isSearch(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/search")) || + (typeof typeField === "object" && typeField.value?.includes("/components/search")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: () => null, + array: () => null + }; + + /** + * Maps the search component schema to Contentstack fields + */ + static mapSearchToContentstack(component: any, parentKey: any): any { + const properties = component?.convertedSchema?.properties; + if (!properties) return []; + const fields: any[] = []; + for (const [key, value] of Object.entries(properties)) { + if (searchExclude.includes(key)) continue; + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && SearchComponent.fieldTypeMap[schemaProp.type]) { + fields.push(SearchComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/SeparatorComponent.ts b/upload-api/migration-aem/libs/contentType/components/SeparatorComponent.ts new file mode 100644 index 000000000..b46245ed2 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/SeparatorComponent.ts @@ -0,0 +1,37 @@ +import { ContentstackComponent } from '../fields'; +import { BooleanField } from '../fields/contentstackFields'; + +export class SeparatorComponent extends ContentstackComponent { + /** + * Determines if a component is a separator component + */ + static isSeparator(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/separator")) || + (typeof typeField === "object" && typeField.value?.includes("/components/separator")) + ) { + return true; + } + } + return false; + } + + /** + * Maps the separator component to Contentstack format + */ + static mapSeparatorToContentstack(component: any, parentKey?: any): any { + // You can customize this mapping as needed for your use case + return { + ...new BooleanField({ + uid: parentKey, + displayName: parentKey, + description: "", + defaultValue: true + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/SpacerComponent.ts b/upload-api/migration-aem/libs/contentType/components/SpacerComponent.ts new file mode 100644 index 000000000..4c63e4f34 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/SpacerComponent.ts @@ -0,0 +1,79 @@ +import { ContentstackComponent } from '../fields'; +import { BooleanField, GroupField, TextField } from '../fields/contentstackFields'; +import { SchemaProperty } from './index.interface'; + +const spacerExclude = [ + 'dataLayer', + ':type', + 'id', + 'relativePath' +]; + +export class SpacerComponent extends ContentstackComponent { + /** + * Determines if a component is a spacer component + */ + static isSpacer(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/spacer")) || + (typeof typeField === "object" && typeField.value?.includes("/components/spacer")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: () => null, + array: () => null + }; + + /** + * Maps the spacer component schema to Contentstack fields + */ + static mapSpacerToContentstack(component: any, parentKey: any): any { + const properties = component?.convertedSchema?.properties; + if (!properties) return []; + const fields: any[] = []; + for (const [key, value] of Object.entries(properties)) { + if (spacerExclude.includes(key)) continue; + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && SpacerComponent.fieldTypeMap[schemaProp.type]) { + fields.push(SpacerComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/TeaserComponent.ts b/upload-api/migration-aem/libs/contentType/components/TeaserComponent.ts new file mode 100644 index 000000000..48f56d2a9 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/TeaserComponent.ts @@ -0,0 +1,150 @@ +import { isImageType } from "../../../helper"; +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, ImageField, LinkField, TextField } from "../fields/contentstackFields"; +import { SchemaProperty } from "./index.interface"; + + + +const teaserExclude = [ + // Add keys or values you want to exclude from navigation mapping + 'dataLayer', + ':type', + 'path', + 'id', + 'appliedCssClassNames', + // 'cq:panelTitle' +]; + +function uidContainsNumber(uid: string): boolean { + return /\d/.test(uid); +} + + +export class TeaserComponent extends ContentstackComponent { + static isTeaser(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && + (/\/components\/(teaser|heroTeaser|overlayBoxTeaser)/.test(typeField) || + typeField.includes("/productCategoryTeaserList")) + ) || + (typeof typeField === "object" && + (/\/components\/(teaser|heroTeaser|overlayBoxTeaser)/.test(typeField.value ?? "") || + (typeField.value ?? "").includes("/productCategoryTeaserList")) + ) + ) { + return true; + } + } + return false; + } + + + static fieldTypeMap: Record any> = { + string: (key, schemaProp, isImg) => + isImg ? + new ImageField({ + uid: key, + displayName: key, + }).toContentstack() + : new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: (key, schemaProp) => { + const data = { convertedSchema: schemaProp } + const objectData = this.mapTeaserToContentstack(data, key); + if (objectData?.uid && (uidContainsNumber(objectData?.uid) === false) && objectData?.schema?.length) { + return objectData; + } + const urlValue = schemaProp?.properties?.url?.value; + if (urlValue !== undefined) { + return new LinkField({ + uid: key, + displayName: key, + description: "", + defaultValue: urlValue + }).toContentstack(); + } + return null; + }, + array: (key, schemaProp) => { + if ( + schemaProp?.type === 'array' && + schemaProp?.items?.properties && + Object.keys(schemaProp?.items?.properties)?.length + ) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(schemaProp.items.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !teaserExclude.includes(key) && + schemaProp?.type && + TeaserComponent.fieldTypeMap[schemaProp.type] + ) { + const isImg = isImageType(schemaProp?.value) + componentsData.push( + TeaserComponent.fieldTypeMap[schemaProp.type](key, schemaProp, isImg) + ); + } + } + return componentsData?.length ? new GroupField({ + uid: key, + displayName: key, + fields: componentsData, + required: false, + multiple: true + }).toContentstack() : null; + } + }, + }; + + + + static mapTeaserToContentstack(component: any, parentKey: any) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const componentsData: any[] = []; + for (const [key, value] of Object.entries(componentSchema.properties)) { + const schemaProp = value as SchemaProperty; + if ( + !teaserExclude.includes(key) && + schemaProp?.type && + TeaserComponent.fieldTypeMap[schemaProp.type] + ) { + const isImg = isImageType(schemaProp?.value) + componentsData.push( + TeaserComponent.fieldTypeMap[schemaProp.type](key, schemaProp, isImg) + ); + } + } + return componentsData?.length ? { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields: componentsData, + required: false, + multiple: true + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + } : null; + } + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/TextBannerComponent.ts b/upload-api/migration-aem/libs/contentType/components/TextBannerComponent.ts new file mode 100644 index 000000000..a22d33daf --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/TextBannerComponent.ts @@ -0,0 +1,110 @@ +import { isHtmlString } from "../../../helper"; +import { ContentstackComponent } from "../fields"; +import { BooleanField, GroupField, TextField, JsonField } from "../fields/contentstackFields"; +import { SchemaProperty } from "./index.interface"; + +const textBannerExclude = [ + 'dataLayer', + ':type', + 'id' +]; + +export class TextBannerComponent extends ContentstackComponent { + static isTextBanner(component: any): boolean { + const properties = component?.convertedSchema?.properties; + if (properties && typeof properties === 'object') { + const typeField = properties[":type"]; + if ( + (typeof typeField === "string" && typeField.includes("/components/textbanner")) || + (typeof typeField === "object" && typeField.value?.includes("/components/textbanner")) + ) { + return true; + } + } + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => { + return isHtmlString(schemaProp.value) ? + new JsonField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack() + : new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack() + }, + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: () => null, + array: (key, schemaProp) => { + // For actions array + if ( + schemaProp?.type === 'array' && + schemaProp.items?.type === 'object' && + schemaProp.items?.properties + ) { + const fields: any[] = []; + for (const [itemKey, itemProp] of Object.entries(schemaProp.items.properties)) { + if (!textBannerExclude.includes(itemKey)) { + const prop = itemProp as SchemaProperty; + if (prop?.type && TextBannerComponent.fieldTypeMap[prop.type]) { + fields.push(TextBannerComponent.fieldTypeMap[prop.type](itemKey, prop)); + } + } + } + return new GroupField({ + uid: key, + displayName: key, + fields, + required: false, + multiple: true + }).toContentstack(); + } + return null; + } + }; + + static mapTextBannerToContentstack(component: any, parentKey: any) { + const componentSchema = component?.convertedSchema; + if (componentSchema?.type === 'object' && componentSchema?.properties) { + const fields: any[] = []; + for (const [key, value] of Object.entries(componentSchema.properties)) { + if (!textBannerExclude.includes(key)) { + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && TextBannerComponent.fieldTypeMap[schemaProp.type]) { + fields.push(TextBannerComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + } + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return null; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/TextComponent.ts b/upload-api/migration-aem/libs/contentType/components/TextComponent.ts new file mode 100644 index 000000000..65654b219 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/TextComponent.ts @@ -0,0 +1,89 @@ +import { ContentstackComponent } from '../fields'; +import { v4 as uuidv4 } from 'uuid'; + +export class TextComponent extends ContentstackComponent { + /** + * Determines if a component is a text component + */ + static isText(component: any): boolean { + if (component && typeof component === 'object') { + // Direct properties format + if ( + component[":type"] && + ( + component[":type"].includes("/components/text") || + component[":type"].includes("/components/richText") + ) + ) { + return true; + } + // Properties object format + if ( + component.properties && + ( + component.properties[":type"]?.value?.includes("/components/text") || + component.properties[":type"]?.value?.includes("/components/richText") + ) + ) { + return true; + } + // Handle convertedSchema format + if ( + component.convertedSchema && + component.convertedSchema.properties && + ( + component.convertedSchema.properties[":type"]?.value?.includes("/components/text") || + component.convertedSchema.properties[":type"]?.value?.includes("/components/richText") + ) + ) { + return true; + } + } + return false; + } + + /** + * Extracts the 'richText' property from a text component + */ + static processTextComponents(component: any): boolean | undefined { + if ( + component && + component.convertedSchema && + component.convertedSchema.properties && + component.convertedSchema.properties.richText && + typeof component.convertedSchema.properties.richText.value === "boolean" + ) { + return component.convertedSchema.properties.richText.value; + } + return undefined; + } + + /** + * Maps a text component to Contentstack rich text schema format + */ + static mapTextToContentstack(component: any): any { + const id = uuidv4(); + const name = 'text'; + const type = 'Rich Text'; + const uid = 'text'; + const default_value = component?.convertedSchema?.properties?.text?.value || ''; + + const isRichText = this.processTextComponents(component) ?? this.isText(component); + if (isRichText) { + return { + id, + uid: name, + otherCmsField: name, + otherCmsType: type, + contentstackField: name, + contentstackFieldUid: uid, + contentstackFieldType: 'json', + backupFieldType: 'json', + backupFieldUid: 'json', + advanced: { default_value: default_value !== '' ? default_value : null }, + type: component?.convertedSchema?.properties?.[":type"]?.value + }; + } + return null; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/TitleComponent.ts b/upload-api/migration-aem/libs/contentType/components/TitleComponent.ts new file mode 100644 index 000000000..d946cecc5 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/TitleComponent.ts @@ -0,0 +1,111 @@ +import { ContentstackComponent } from '../fields'; +import { TextField, BooleanField, GroupField } from "../fields/contentstackFields" +import { SchemaProperty } from './index.interface'; + + +const titleExclude = [ + 'dataLayer', + ':type', + 'id', +]; + +export class TitleComponent extends ContentstackComponent { + + /** + * Determines if a component is a title component + */ + static isTitle(component: any): boolean { + // Handle raw component format + if (component && typeof component === 'object') { + // Direct properties format + if (component[":type"] && + component[":type"].includes("/components/title") && + component.type?.match(/^h[1-6]$/)) { + return true; + } + + // Properties object format + if (component.properties && + component.properties[":type"]?.value?.includes("/components/title") && + component.properties.type?.value?.match(/^h[1-6]$/)) { + return true; + } + + // Handle convertedSchema format + if (component.convertedSchema && + component.convertedSchema.properties && + component.convertedSchema.properties[":type"]?.value?.includes("/components/title") && + component.convertedSchema.properties.type?.value?.match(/^h[1-6]$/)) { + return true; + } + } + + return false; + } + + static fieldTypeMap: Record any> = { + string: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + boolean: (key, schemaProp) => new BooleanField({ + uid: key, + displayName: key, + description: "", + defaultValue: schemaProp.value + }).toContentstack(), + integer: (key, schemaProp) => new TextField({ + uid: key, + displayName: key, + description: "", + isNumber: true, + defaultValue: schemaProp.value + }).toContentstack(), + object: () => null, + array: () => null + }; + + /** + * Maps an AEM title component to Contentstack format with grouped properties + */ + static mapTitleToContentstack(component: any, parentKey: any): any { + const properties = component?.convertedSchema?.properties; + if (!properties) return []; + + const fields: any[] = []; + + for (const [key, value] of Object.entries(properties)) { + if (titleExclude.includes(key)) continue; + const schemaProp = value as SchemaProperty; + if (schemaProp?.type && TitleComponent.fieldTypeMap[schemaProp.type]) { + fields.push(TitleComponent.fieldTypeMap[schemaProp.type](key, schemaProp)); + } + } + + const hasTitleOrText = fields.some(f => ['title', 'text'].includes(f.uid)); + if (!hasTitleOrText) { + fields.push( + new TextField({ + uid: "text", + displayName: "text", + description: "", + required: false, + multiline: false + }).toContentstack() + ); + } + + return { + ...new GroupField({ + uid: parentKey, + displayName: parentKey, + fields, + required: false, + multiple: false + }).toContentstack(), + type: component.convertedSchema.properties[":type"]?.value, + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/index.interface.ts b/upload-api/migration-aem/libs/contentType/components/index.interface.ts new file mode 100644 index 000000000..b09ace33b --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/index.interface.ts @@ -0,0 +1,6 @@ +export type SchemaProperty = { + type?: string; + properties?: any; + value?: any; + items?: any; +}; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/components/index.ts b/upload-api/migration-aem/libs/contentType/components/index.ts new file mode 100644 index 000000000..7d4ce79e2 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/components/index.ts @@ -0,0 +1,15 @@ +export { TitleComponent } from './TitleComponent'; +export { TextComponent } from './TextComponent'; +export { NavigationComponent } from './NavigationComponent'; +export { SeparatorComponent } from './SeparatorComponent'; +export { SearchComponent } from './SearchComponent'; +export { NtFolderComponent } from './NtFolderComponent'; +export { TeaserComponent } from './TeaserComponent'; +export { SpacerComponent } from './SpacerComponent'; +export { CustomEmbedComponent } from './CustomEmbedComponent'; +export { ProductListingComponent } from './ProductListingComponent'; +export { ButtonComponent } from './ButtonComponent'; +export { TextBannerComponent } from './TextBannerComponent'; +export { ImageComponent } from './ImageComponent'; +export { CarouselComponent } from './CarouselComponent'; +export { BreadcrumbComponent } from './BreadcrumbComponent'; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/contentTypeMapper.ts b/upload-api/migration-aem/libs/contentType/contentTypeMapper.ts new file mode 100644 index 000000000..47bc94072 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/contentTypeMapper.ts @@ -0,0 +1,34 @@ +import LoggerHandler from "../../componentMaker/componentHandler"; +import ComponentTracker from "../../componentMaker/componentTracker"; +import { extractComponentPath } from "../../helper"; +import { IContentTypeMappers, IcontentTypeProcessor } from "./types/contentTypeMapper.interface"; + + + + + +const contentTypeProcessor: IcontentTypeProcessor = async ({ itemSchema, affix, tracker }) => { + const fieldTypes: string[] | undefined = itemSchema?.[':itemsOrder']; + for await (const field of fieldTypes ?? []) { + const item = itemSchema?.[":items"]?.[field]; + const type = extractComponentPath(item?.[":type"]) ?? null; + await contentTypeProcessor({ itemSchema: item, affix, tracker }); + type && tracker.pushComponent({ component: type, props: item ?? {} }) + } +} + +const contentTypeMappers: IContentTypeMappers = async ({ templateData, affix }) => { + const tracker = new ComponentTracker([ + new LoggerHandler(), + ]); + // The ':itemsOrder' key is from AEM template structure and not a secret + for (const key of templateData?.[':itemsOrder'] ?? []) { + // The ':items' key is from AEM template structure and not a secret + const item = templateData?.[":items"]?.[key] + await contentTypeProcessor({ itemSchema: item, affix, tracker }) + } + return tracker; +} + + +export default contentTypeMappers; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/createContentTypes.ts b/upload-api/migration-aem/libs/contentType/createContentTypes.ts new file mode 100644 index 000000000..6cd859e5c --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/createContentTypes.ts @@ -0,0 +1,126 @@ +import path from "path"; +import { CONSTANTS } from "../../constant"; +import { createContentTypeObject, ensureField, findComponentByType, writeJsonFile } from "../../helper"; +import { isContainerComponent, parseXFPath } from "../../helper/component.identifier"; +import { createFragmentComponent } from "./fragment"; +import { IContentTypeMaker } from "./types/createContentTypes.interface"; +import { ModularBlocksField } from "./fields/contentstackFields"; +import { processContentModels } from "../../helper/fieldMappings.merge"; +import { flattenContentTypes } from "../../helper/contentType.flatten"; + + +async function processTemplateItems(itemsOrder: string[], items: any, contentstackComponents: any) { + const schema = []; + for (const element of itemsOrder) { + const item = items?.[element]; + const type = item?.[':type']; + const isContainerCheck = isContainerComponent(type); + if (parseXFPath(type)) { + const keys = item?.localizedFragmentVariationPath?.split('/'); + const keyElement = element?.split('-'); + const segmentData = keys?.filter((segment: string) => keyElement?.includes(segment)); + const referenceField = await createFragmentComponent(segmentData, item, contentstackComponents); + schema?.push(referenceField); + } else if (isContainerCheck?.isContainer) { + const itemsOrder = item?.[':itemsOrder']; + const items = item?.[':items']; + const conatinerSchema: any = await processTemplateItems(itemsOrder, items, contentstackComponents); + if (conatinerSchema?.length) { + const modularData = new ModularBlocksField({ + uid: element, + displayName: element, + blocks: [], + }).toContentstack(); + for (const object of conatinerSchema) { + if (object?.contentstackFieldType === 'group' || + object?.contentstackFieldType === 'modular_blocks') { + const block: any = { + uid: object?.uid, + otherCmsField: object?.otherCmsField, + contentstackField: object?.contentstackField, + contentstackFieldUid: object?.contentstackFieldUid, + backupFieldUid: object?.backupFieldUid, + contentstackFieldType: 'modular_blocks_child', + backupFieldType: 'modular_blocks_child', + otherCmsType: 'modular_blocks_child', + schema: object?.contentstackFieldType === 'modular_blocks' ? [object] : object?.schema, + } + modularData.blocks?.push(block); + } else if (object) { + const block: any = { + uid: object?.uid, + otherCmsField: object?.otherCmsField, + contentstackField: object?.contentstackField, + contentstackFieldUid: object?.contentstackFieldUid, + backupFieldUid: object?.backupFieldUid, + contentstackFieldType: 'modular_blocks_child', + backupFieldType: 'modular_blocks_child', + otherCmsType: 'modular_blocks_child', + schema: [object], + } + modularData.blocks?.push(block); + } + } + schema?.push(modularData); + } + } else { + const [, csValue] = findComponentByType(contentstackComponents, type) ?? []; + if (csValue && typeof csValue === "object" && "type" in csValue) { + schema?.push(csValue) + } else { + console.info("🚀 ~ processTemplateItems ~ type:", type); + } + } + } + return schema; +} + + + +const contentTypeMaker: IContentTypeMaker = async ({ templateData, affix, contentstackComponents }) => { + const contentData = []; + for await (const [key, value] of Object.entries(templateData ?? {})) { + if (!Array.isArray(value)) return console.warn(`Value for key "${key}" is not an array:`, value); + for await (const template of value) { + const itemsOrder = template?.[':items']?.root?.[':itemsOrder']; + const items = template?.[':items']?.root?.[':items']; + const Schema = await processTemplateItems(itemsOrder, items, contentstackComponents); + const contentTypeObject = createContentTypeObject({ + otherCmsTitle: key, + otherCmsUid: key, + fieldMapping: Schema, + }); + contentData?.push(contentTypeObject); + } + } + const contentDataFilePath = path.resolve(CONSTANTS?.CONENT_DATA_FILE); + const processData = processContentModels(contentData); + const flattenData = flattenContentTypes(processData); + flattenData.forEach((schema: any) => { + ensureField(schema.fieldMapping, { + uid: 'url', + otherCmsField: 'url', + otherCmsType: 'text', + contentstackField: 'Url', + contentstackFieldUid: 'url', + contentstackFieldType: 'url', + backupFieldType: 'url', + backupFieldUid: 'url' + }, 'url'); + ensureField(schema.fieldMapping, { + uid: 'title', + otherCmsField: 'title', + otherCmsType: 'text', + contentstackField: 'Title', + contentstackFieldUid: 'title', + contentstackFieldType: 'text', + backupFieldType: 'text', + backupFieldUid: 'title' + }, 'title'); + }); + await writeJsonFile(flattenData, contentDataFilePath); + return flattenData ?? []; +} + + +export default contentTypeMaker; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/fields/contentstackFields/index.ts b/upload-api/migration-aem/libs/contentType/fields/contentstackFields/index.ts new file mode 100644 index 000000000..a6d00ed88 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/fields/contentstackFields/index.ts @@ -0,0 +1,385 @@ +import { v4 as uuidv4 } from 'uuid'; + + +/** + * Base field class for Contentstack components + */ +export abstract class Field { + uid: string; + displayName: string; + required: boolean; + description?: string; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + }) { + this.uid = config.uid; + this.displayName = config.displayName; + this.required = config.required || false; + this.description = config.description; + } + + abstract toContentstack(): any; + + // Generate a common ID based on the UID + protected generateId(): string { + return uuidv4(); + } +} + +/** + * Text field implementation + */ +export class TextField extends Field { + defaultValue?: string; + multiline: boolean; + isNumber?: boolean; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + defaultValue?: string; + multiline?: boolean; + isNumber?: boolean; + }) { + super(config); + this.defaultValue = config.defaultValue; + this.multiline = config.multiline || false; + this.isNumber = config.isNumber || false; + } + + toContentstack() { + let fieldType: string = this.multiline ? 'multi_line_text' : 'single_line_text'; + if (this.isNumber === true) { + fieldType = 'number'; + } + + return { + id: this.generateId(), + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: 'text', + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: fieldType, + backupFieldType: fieldType, + backupFieldUid: this.uid, + advanced: { + default_value: this.defaultValue !== undefined ? this.defaultValue : null, + description: this.description, + required: this.required + } + }; + } +} + +/** + * Select field implementation + */ +export class SelectField extends Field { + options: Array<{ value: string, displayValue: string }>; + defaultValue?: string; + multiple: boolean; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + options: Array<{ value: string, displayValue: string }>; + defaultValue?: string; + multiple?: boolean; + }) { + super(config); + this.options = config.options; + this.defaultValue = config.defaultValue; + this.multiple = config.multiple || false; + } + + toContentstack() { + return { + id: this.generateId(), + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: 'select', + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: this.multiple ? 'multi_select' : 'select', + backupFieldType: 'select', + backupFieldUid: this.uid, + advanced: { + default_value: this.defaultValue !== undefined ? this.defaultValue : null, + description: this.description, + required: this.required, + options: this.options.map(opt => ({ + value: opt.value, + display_value: opt.displayValue + })) + } + }; + } +} + +/** + * Boolean field implementation + */ +export class BooleanField extends Field { + defaultValue?: boolean; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + defaultValue?: boolean; + }) { + super(config); + this.defaultValue = config.defaultValue; + } + + toContentstack() { + return { + id: this.generateId(), + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: 'boolean', + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: 'boolean', + backupFieldType: 'boolean', + backupFieldUid: this.uid, + advanced: { + default_value: this.defaultValue !== undefined ? this.defaultValue : null, + description: this.description, + required: this.required + } + }; + } +} + + +/** + * Group field implementation + */ +export class GroupField extends Field { + fields: Field[]; + multiple?: boolean; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + fields: Field[]; + multiple?: boolean; + }) { + super(config); + this.fields = config.fields; + this.multiple = config.multiple || false; + } + + toContentstack() { + return { + id: this.generateId(), + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: 'group', + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: 'group', + backupFieldType: 'group', + backupFieldUid: this.uid, + schema: this.fields.filter(Boolean), + advanced: { + mandatory: !!this.required, + multiple: this.multiple, + } + }; + } +} + +export class LinkField extends Field { + defaultValue?: string; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + defaultValue?: string; + }) { + super(config); + this.defaultValue = config.defaultValue; + } + + toContentstack() { + const id = this.generateId(); + const name = this.displayName; + const type = 'link'; + const uid = this.uid; + const default_value = this.defaultValue ?? ''; + + return { + id: id, + uid: uid, + otherCmsField: name, + otherCmsType: type, + contentstackField: name, + contentstackFieldUid: uid, + contentstackFieldType: 'link', + backupFieldType: 'link', + backupFieldUid: uid, + advanced: { default_value: default_value !== '' ? default_value : null } + }; + } +} + +export class ReferenceField extends Field { + refrenceTo: string[]; + isDeleted: boolean; + backupFieldUid?: string; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + refrenceTo: string[]; + isDeleted?: boolean; + backupFieldUid?: string; + }) { + super(config); + this.refrenceTo = config.refrenceTo; + this.isDeleted = config.isDeleted ?? false; + this.backupFieldUid = config.backupFieldUid ?? config.uid; + } + + toContentstack() { + return { + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: this.displayName, + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: 'reference', + isDeleted: this.isDeleted, + backupFieldType: 'reference', + backupFieldUid: this.uid, + refrenceTo: this.refrenceTo + }; + } +} + +export class ImageField extends Field { + defaultValue?: string; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + defaultValue?: string; + }) { + super(config); + this.defaultValue = config.defaultValue; + } + + toContentstack() { + const id = this.generateId(); + const uid = this.uid; + const name = this.displayName; + const type = 'image'; + const default_value = this.defaultValue ?? ''; + + return { + id: id, + uid, + otherCmsField: name, + otherCmsType: type, + contentstackField: name, + contentstackFieldUid: uid, + contentstackFieldType: 'file', + backupFieldType: 'file', + backupFieldUid: uid, + advanced: { default_value: default_value !== '' ? default_value : null } + }; + } +} + +export class JsonField extends Field { + defaultValue?: string; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + defaultValue?: string; + }) { + super(config); + this.defaultValue = config.defaultValue; + } + + toContentstack() { + const id = this.generateId(); + const uid = this.uid; + const name = this.displayName; + const type = 'json'; + const default_value = this.defaultValue ?? ''; + + return { + id: id, + uid: uid, + otherCmsField: name, + otherCmsType: type, + contentstackField: name, + contentstackFieldUid: uid, + contentstackFieldType: 'json', + backupFieldType: 'json', + backupFieldUid: uid, + advanced: { default_value: default_value !== '' ? default_value : null } + }; + } +} + +/** + * Modular Blocks field implementation + */ +export class ModularBlocksField extends Field { + multiple: boolean; + blocks: any[]; + + constructor(config: { + uid: string; + displayName: string; + required?: boolean; + description?: string; + blocks: any[]; + multiple?: boolean; + }) { + super(config); + this.blocks = config.blocks; + this.multiple = config.multiple ?? true; + } + + toContentstack() { + const id = this.generateId(); + return { + id: id, + uid: this.uid, + otherCmsField: this.displayName, + otherCmsType: 'container', + blocks: this.blocks, + contentstackField: this.displayName, + contentstackFieldUid: this.uid, + contentstackFieldType: 'modular_blocks', + backupFieldType: 'modular_blocks', + backupFieldUid: this.uid, + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/fields/index.ts b/upload-api/migration-aem/libs/contentType/fields/index.ts new file mode 100644 index 000000000..fae06d5ad --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/fields/index.ts @@ -0,0 +1,28 @@ +import { Field } from "./contentstackFields/index" + +export abstract class ContentstackComponent { + uid: string; + title: string; + fields: Field[]; + + constructor(config: { + uid: string; + title: string; + fields: Field[]; + }) { + this.uid = config.uid; + this.title = config.title; + this.fields = config.fields; + } + + /** + * Converts component definition to Contentstack schema + */ + toContentstack() { + return { + title: this.title, + uid: this.uid, + schema: this.fields.map(field => field.toContentstack()) + }; + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/fragment/index.ts b/upload-api/migration-aem/libs/contentType/fragment/index.ts new file mode 100644 index 000000000..fdc550f8e --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/fragment/index.ts @@ -0,0 +1,55 @@ +import path from "path"; +import { CONSTANTS } from "../../../constant"; +import { readFiles, writeJsonFile } from "../../../helper"; +import { ReferenceField } from "../fields/contentstackFields"; + +export const createFragmentComponent = async ( + segmentData: string[], + itemData: any, + contentstackComponents: any +) => { + const key = segmentData?.[0]; + if (!key) { + console.info('Fragment key does not exist. itemsOrder:', itemData?.[':itemsOrder']); + return null; + } + + const fragmentPath = path.resolve(CONSTANTS?.FRAGMENT_FILE); + const data: any = (await readFiles(fragmentPath)) ?? {}; + + // Ensure data[key] is an array + if (!Array.isArray(data[key])) { + data[key] = []; + } + + // Iterate over items and push to fragment array, avoiding duplicates + for (const [itemKey, objValue] of Object.entries(itemData?.[':items']?.root?.[':items'] ?? {})) { + const type = (objValue as { [key: string]: any })[':type']; + // Find matching entry in contentstackComponents by type + const foundEntry = Object.entries(contentstackComponents ?? {}).find( + ([, csValue]: any) => (csValue as { [key: string]: any })['type'] === type + ); + if (foundEntry) { + const [, csValue] = foundEntry; + const obj: any = { [itemKey]: csValue }; + if (!data[key].some((existing: any) => JSON.stringify(existing) === JSON.stringify(obj))) { + data[key].push(obj); + } + } + } + + // Remove empty objects from the fragment array + data[key] = data[key].filter((entry: any) => Object.keys(entry).length > 0); + + // Write updated data back to file + await writeJsonFile(data, fragmentPath); + + if (data[key].length) { + return new ReferenceField({ + uid: key, + displayName: key, + refrenceTo: [key] + }).toContentstack(); + } + return null; +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/index.ts b/upload-api/migration-aem/libs/contentType/index.ts new file mode 100644 index 000000000..2f3defee9 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/index.ts @@ -0,0 +1,156 @@ +import path from 'path'; +import read from 'fs-readdir-recursive'; +import { CONSTANTS } from "../../constant/index" +import contentTypeMappers from './contentTypeMapper'; +import contentTypeMaker from './createContentTypes'; +import { + TitleComponent, + TextComponent, + NavigationComponent, + SeparatorComponent, + SearchComponent, + NtFolderComponent, + TeaserComponent, + SpacerComponent, + CustomEmbedComponent, + ProductListingComponent, + ButtonComponent, + TextBannerComponent, + ImageComponent, + CarouselComponent, + BreadcrumbComponent +} from './components'; +import { mergeComponentObjects, readFiles, writeJsonFile } from "../../helper/index"; + + +// Import interface for the content type conversion function +import { GroupKey, IConvertContentType } from "./types/index.interface"; + + +// Update the function signature to accept either format +function processComponents(components: Record | Record[]): Record | Record[] { + // If components is an array, map through it + if (Array.isArray(components)) { + return components.map(component => { + return component; + }); + } + + const result: Record = {}; + for (const key in components) { + const component = components[key]; + const mappingRules = [ + () => BreadcrumbComponent.isBreadcrumb(component) && BreadcrumbComponent.mapBreadcrumbToContentstack(component, key), + () => TitleComponent.isTitle(component) && TitleComponent.mapTitleToContentstack(component, key), + () => TextComponent.isText(component) && TextComponent.mapTextToContentstack(component), + () => NavigationComponent.isNavigation(component) && NavigationComponent.mapNavigationTOContentstack(component, key), + () => NavigationComponent.isLanguageNavigation(component) && NavigationComponent.mapNavigationTOContentstack(component, key), + () => SeparatorComponent.isSeparator(component) && SeparatorComponent.mapSeparatorToContentstack(component, key), + () => SearchComponent.isSearch(component) && SearchComponent.mapSearchToContentstack(component, key), + () => NtFolderComponent.isNtFolder(component) && NtFolderComponent.mapNtFolderToContentstack(component, key), + () => TeaserComponent.isTeaser(component) && TeaserComponent.mapTeaserToContentstack(component, key), + () => SpacerComponent.isSpacer(component) && SpacerComponent.mapSpacerToContentstack(component, key), + () => CustomEmbedComponent.isCustomEmbed(component) && CustomEmbedComponent.mapCustomEmbedToContentstack(component, key), + () => ProductListingComponent.isProductListing(component) && ProductListingComponent.mapProductListingToContentstack(component, key), + () => ButtonComponent.isButton(component) && ButtonComponent.mapButtonToContentstack(component, key), + () => TextBannerComponent.isTextBanner(component) && TextBannerComponent.mapTextBannerToContentstack(component, key), + () => ImageComponent.isImage(component) && ImageComponent.mapImageToContentstack(component, key), + () => CarouselComponent.isCarousel(component) && CarouselComponent.mapCarouselToContentstack(component, key), + + ]; + result[key] = mappingRules.map(fn => fn()).find(Boolean); + } + return result; +} + +const mergeChildComponent = (contentstackComponents: any) => { + for (const [key, value] of Object.entries(contentstackComponents)) { + for (const child of Object.values(contentstackComponents)) { + const childWithType = child as { type: string }; + const valueWithType = value as { type: string, schema: any[] }; + if ( + typeof childWithType?.type === "string" && + typeof valueWithType?.type === "string" + ) { + const childKey = childWithType?.type?.split("/").pop() + if (childWithType?.type === `${valueWithType?.type}/${childKey}`) { + if (valueWithType?.schema) { + contentstackComponents?.[key]?.schema?.push(child) + } + } + } + } + } + return contentstackComponents; +} + + +const convertContentType: IConvertContentType = async (dirPath) => { + const templatesDir = path.resolve(dirPath); + const templateFiles = read(templatesDir); + const damPath = path?.resolve?.(path?.join?.(templatesDir, CONSTANTS.AEM_DAM_DIR)); + const allComponentData: Record[] = []; + for await (const fileName of templateFiles) { + const filePath = path.join(templatesDir, fileName); + if (filePath?.startsWith?.(damPath)) { + continue; + } + const templateData = await readFiles(filePath); + const tracker = await contentTypeMappers({ templateData, affix: "cms" }); + const trackerData = tracker.getAllComponents(); + allComponentData.push(trackerData); + } + const mergedComponents = mergeComponentObjects(allComponentData); + const contentstackComponents: any = processComponents(mergedComponents); + const mergeChildData = mergeChildComponent(contentstackComponents); + await writeJsonFile(mergeChildData, CONSTANTS.TMP_FILE); +} + +const arrangeContentModels = async ( + templatesDir: string, + groupBy: GroupKey[] +) => { + const arrangedCt: Record = {}; + const templateFiles = read(templatesDir); + const damPath = path?.resolve?.(path?.join?.(templatesDir, CONSTANTS.AEM_DAM_DIR)); + + for await (const fileName of templateFiles) { + const filePath = path.join(templatesDir, fileName); + if (filePath?.startsWith?.(damPath)) { + continue; + } + const templateData: any = await readFiles(filePath); + + for (const key of groupBy) { + const groupValue = templateData?.[key]; + if (groupValue) { + if (!arrangedCt[groupValue]) { + arrangedCt[groupValue] = []; + } + arrangedCt[groupValue].push(templateData); + break; // Only group by the first matching key + } + } + } + return arrangedCt; +}; + + +const createContentType: IConvertContentType = async (dirPath) => { + const templatesDir = path.resolve(dirPath); + const grouped = await arrangeContentModels(templatesDir, CONSTANTS.arrangeCTGroup as GroupKey[]); + const componentPath = path.resolve(CONSTANTS?.TMP_FILE); + const contentstackComponents = await readFiles(componentPath); + return await contentTypeMaker({ templateData: grouped, contentstackComponents, affix: "cms" }) +} + +const contentTypes = () => { + return { + convertAndCreate: async (dirPath: string) => { + await convertContentType(dirPath); + return await createContentType(dirPath); + } + }; +} + +export default contentTypes; diff --git a/upload-api/migration-aem/libs/contentType/types/contentTypeMapper.interface.ts b/upload-api/migration-aem/libs/contentType/types/contentTypeMapper.interface.ts new file mode 100644 index 000000000..ed07acdca --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/types/contentTypeMapper.interface.ts @@ -0,0 +1,39 @@ +import ComponentTracker from "../../../componentMaker/componentTracker"; + +interface IContentTypeMappersParams { + templateData: any; + affix: string; +} + + +interface IItemSchema { + ":items"?: { + [key: string]: any; // Replace 'any' with a more specific type if known + }; + ":itemsOrder"?: string[]; + // Add other properties if needed +} + +interface IContentTypeSchemaParams { + type: string; +} + + +interface IContentTypeProcessorParams { + itemSchema: IItemSchema; + affix: string; + tracker: ComponentTracker; +} + +export interface IContentTypeMappers { + (params: IContentTypeMappersParams): any; +} + +export interface IcontentTypeProcessor { + (params: IContentTypeProcessorParams): any; +} + + +export interface IContentTypeSchemaBuilder { + (params: IContentTypeSchemaParams): any; +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/types/createContentTypes.interface.ts b/upload-api/migration-aem/libs/contentType/types/createContentTypes.interface.ts new file mode 100644 index 000000000..5e8501a62 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/types/createContentTypes.interface.ts @@ -0,0 +1,9 @@ +interface IContentTypeMakerParams { + templateData: any; + affix: string; + contentstackComponents: any; +} + +export interface IContentTypeMaker { + (params: IContentTypeMakerParams): any +} \ No newline at end of file diff --git a/upload-api/migration-aem/libs/contentType/types/index.interface.ts b/upload-api/migration-aem/libs/contentType/types/index.interface.ts new file mode 100644 index 000000000..a464f8857 --- /dev/null +++ b/upload-api/migration-aem/libs/contentType/types/index.interface.ts @@ -0,0 +1,6 @@ + +export interface IConvertContentType { + (path: string): unknown; +} + +export type GroupKey = 'templateName' | 'templateType' | 'title'; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/locales/index.ts b/upload-api/migration-aem/libs/locales/index.ts new file mode 100644 index 000000000..1a2f5b080 --- /dev/null +++ b/upload-api/migration-aem/libs/locales/index.ts @@ -0,0 +1,36 @@ +import path from 'path'; +import read from 'fs-readdir-recursive'; +import { readFiles } from '../../helper'; +import { CONSTANTS } from '../../constant'; + +const processLocales = async (dirPath: string) => { + const localesDir = path.resolve(dirPath); + const localeFiles = read(localesDir); + const damPath = path?.resolve?.(path?.join?.(localesDir, CONSTANTS.AEM_DAM_DIR)); + const allLocales: Record[] = []; + for await (const fileName of localeFiles) { + const filePath = path.join(localesDir, fileName); + if (filePath.startsWith(damPath)) { + continue; + } + const localeData: any = await readFiles(filePath); + if (localeData?.language) { + allLocales.push(localeData?.language); + } else if (localeData?.[":path"]) { + const segments = localeData[":path"].split("/"); + const locale = segments[segments.length - 1]; + allLocales.push(locale); + } + } + return Array.from(new Set(allLocales)); +}; + +const locales = () => { + return { + processAndSave: async (dirPath: string) => { + return await processLocales(dirPath); + } + }; +}; + +export default locales; \ No newline at end of file diff --git a/upload-api/migration-aem/libs/validate/index.ts b/upload-api/migration-aem/libs/validate/index.ts new file mode 100644 index 000000000..fbf476aac --- /dev/null +++ b/upload-api/migration-aem/libs/validate/index.ts @@ -0,0 +1,32 @@ +import path from "path"; +import read from 'fs-readdir-recursive'; +import { isExperienceFragment } from "../../helper/component.identifier"; +import { readFiles } from "../../helper"; +import { CONSTANTS } from "../../constant"; + +const validator = async (dirPath: string) => { + const templatesDir = path.resolve(dirPath); + const templateFiles = read(templatesDir); + const damPath = path?.resolve?.(path?.join?.(templatesDir, CONSTANTS.AEM_DAM_DIR)); + + const results = await Promise.all( + templateFiles.map(async (fileName: string) => { + const filePath = path.join(templatesDir, fileName); + if (filePath.startsWith(damPath)) { + return null; // Skip this file + } + console.log("🚀 ~ validator ~ filePath:", filePath); + const templateData: any = await readFiles(filePath); + const isFragment = isExperienceFragment(templateData)?.isXF; + const hasTemplateType = Boolean(templateData?.['templateType']); + const hasTemplateName = Boolean(templateData?.['templateName']); + const hasItems = Boolean(templateData?.[':items']); + return (hasTemplateType || hasTemplateName || isFragment) && hasItems; + }) + ); + + return results; +} + + +export default validator; \ No newline at end of file diff --git a/upload-api/migration-aem/package-lock.json b/upload-api/migration-aem/package-lock.json new file mode 100644 index 000000000..ac0f1fdde --- /dev/null +++ b/upload-api/migration-aem/package-lock.json @@ -0,0 +1,1088 @@ +{ + "name": "migration-aem", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "migration-aem", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "fs-readdir-recursive": "^1.1.0", + "genson-js": "^0.0.8", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/fs-readdir-recursive": "^1.1.3", + "nodemon": "^3.1.10", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/fs-readdir-recursive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/fs-readdir-recursive/-/fs-readdir-recursive-1.1.3.tgz", + "integrity": "sha512-2v5JKYQO+14CfurtdaL1cbLrjBeFjmcLkD35zDkaaytYSY/57jb2Kz6FbfJ1k+Lx2aaS0zpTR1dwCyqLkjo9vQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "dev": true, + "peer": true, + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/genson-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/genson-js/-/genson-js-0.0.8.tgz", + "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==" + }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, + "peer": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/upload-api/migration-aem/package.json b/upload-api/migration-aem/package.json new file mode 100644 index 000000000..ab5e2a817 --- /dev/null +++ b/upload-api/migration-aem/package.json @@ -0,0 +1,28 @@ +{ + "name": "migration-aem", + "version": "1.0.0", + "description": "", + "main": "build/index.js", + "types": "build/index.d.ts", + "scripts": { + "clean": "rimraf dist", + "build": "npm i && npm run clean && tsc --skipLibCheck", + "start": "ts-node index.ts", + "dev": "nodemon --watch './**/*.ts' --exec 'ts-node' index.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/fs-readdir-recursive": "^1.1.3", + "nodemon": "^3.1.10", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + }, + "dependencies": { + "fs-readdir-recursive": "^1.1.0", + "genson-js": "^0.0.8", + "uuid": "^9.0.1" + } +} \ No newline at end of file diff --git a/upload-api/migration-aem/tsconfig.json b/upload-api/migration-aem/tsconfig.json new file mode 100644 index 000000000..f1ae4b685 --- /dev/null +++ b/upload-api/migration-aem/tsconfig.json @@ -0,0 +1,113 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "libReplacement": true, /* Enable lib replacement. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./build" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/upload-api/migration-contentful/package-lock.json b/upload-api/migration-contentful/package-lock.json index 4d911879d..bea625787 100644 --- a/upload-api/migration-contentful/package-lock.json +++ b/upload-api/migration-contentful/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", - "axios": "^1.8.3", + "axios": "^1.12.0", "jsdom": "^19.0.0", "jsonpath": "^1.1.1", "lodash": "^4.17.21", @@ -152,12 +152,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, diff --git a/upload-api/migration-contentful/package.json b/upload-api/migration-contentful/package.json index 8058068b6..116a7247b 100644 --- a/upload-api/migration-contentful/package.json +++ b/upload-api/migration-contentful/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", - "axios": "^1.8.3", + "axios": "^1.12.0", "jsdom": "^19.0.0", "jsonpath": "^1.1.1", "lodash": "^4.17.21", diff --git a/upload-api/migration-sitecore/package-lock.json b/upload-api/migration-sitecore/package-lock.json index acb4accc9..fa63b66ec 100644 --- a/upload-api/migration-sitecore/package-lock.json +++ b/upload-api/migration-sitecore/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.2", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cheerio": "^1.0.0-rc.12", "cli-progress": "^3.11.1", @@ -96,6 +96,15 @@ "node": ">= 10" } }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "peer": true, + "dependencies": { + "undici-types": "~7.14.0" + } + }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -220,12 +229,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -1872,6 +1881,12 @@ "node": ">=18.17" } }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "peer": true + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", diff --git a/upload-api/migration-sitecore/package.json b/upload-api/migration-sitecore/package.json index 4a5e70174..ec6c1bcd9 100644 --- a/upload-api/migration-sitecore/package.json +++ b/upload-api/migration-sitecore/package.json @@ -21,7 +21,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.2", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cheerio": "^1.0.0-rc.12", "cli-progress": "^3.11.1", diff --git a/upload-api/migration-wordpress/package-lock.json b/upload-api/migration-wordpress/package-lock.json index e01935ddb..c7f1eae44 100644 --- a/upload-api/migration-wordpress/package-lock.json +++ b/upload-api/migration-wordpress/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cli-progress": "^3.11.1", "fs-extra": "^11.2.0", @@ -84,6 +84,15 @@ "node": ">= 10" } }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "peer": true, + "dependencies": { + "undici-types": "~7.14.0" + } + }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -208,12 +217,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -1506,6 +1515,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "peer": true + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/upload-api/migration-wordpress/package.json b/upload-api/migration-wordpress/package.json index 74fd005de..c510a8b64 100644 --- a/upload-api/migration-wordpress/package.json +++ b/upload-api/migration-wordpress/package.json @@ -21,7 +21,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cli-progress": "^3.11.1", "fs-extra": "^11.2.0", diff --git a/upload-api/package-lock.json b/upload-api/package-lock.json index 7ae610fed..325dfb014 100644 --- a/upload-api/package-lock.json +++ b/upload-api/package-lock.json @@ -1,34 +1,39 @@ { - "name": "migration-v2-upload", + "name": "migration-upload", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "migration-v2-upload", + "name": "migration-upload", "version": "1.0.0", "license": "ISC", "dependencies": { "@aws-sdk/client-s3": "^3.529.0", - "@contentstack/cli-utilities": "^1.0.3", - "axios": "^1.8.2", + "@contentstack/cli-utilities": "^1.5.12", + "@typescript-eslint/parser": "^7.7.1", + "axios": "^1.12.0", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.12", "cors": "^2.8.5", "dotenv": "^16.3.1", + "eslint": "^8.51.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", "express": "^5.0.0", "express-rate-limit": "^7.2.0", - "inquirer": "^12.9.1", + "inquirer": "^9.2.15", "jszip": "^3.10.1", "lodash.isempty": "^4.4.0", + "migration-aem": "file:migration-aem", "migration-contentful": "file:migration-contentful", "migration-sitecore": "file:migration-sitecore", "migration-wordpress": "file:migration-wordpress", - "multer": "^2.0.0", + "multer": "^2.0.1", "node-fetch": "^2.7.0", "nodemon": "^3.1.9", "prettier": "^3.3.3", - "winston": "^3.17.0", + "uuid": "^9.0.1", "xml2js": "^0.6.2" }, "devDependencies": { @@ -39,21 +44,69 @@ "@types/lodash.isempty": "^4.4.9", "@types/multer": "^1.4.11", "@types/node": "^20.12.12", + "@types/uuid": "^9.0.8", "@types/xml2js": "^0.4.14", - "@typescript-eslint/eslint-plugin": "^8.33.1", + "@typescript-eslint/eslint-plugin": "^7.7.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "helmet": "^7.1.0", "typescript": "^5.3.3" } }, + "migration-aem": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "fs-readdir-recursive": "^1.1.0", + "genson-js": "^0.0.8", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/fs-readdir-recursive": "^1.1.3", + "nodemon": "^3.1.10", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + } + }, + "migration-aem/node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "migration-aem/node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "migration-contentful": { "name": "migration-v2-contentful", "version": "1.0.0", "license": "ISC", "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", - "axios": "^1.8.3", + "axios": "^1.12.0", "jsdom": "^19.0.0", "jsonpath": "^1.1.1", "lodash": "^4.17.21", @@ -81,7 +134,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.2", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cheerio": "^1.0.0-rc.12", "cli-progress": "^3.11.1", @@ -142,7 +195,7 @@ "dependencies": { "@contentstack/json-rte-serializer": "^2.0.0", "ansi-colors": "^4.1.3", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cli-progress": "^3.11.1", "fs-extra": "^11.2.0", @@ -379,65 +432,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.817.0.tgz", - "integrity": "sha512-nZyjhlLMEXDs0ofWbpikI8tKoeKuuSgYcIb6eEZJk90Nt5HkkXn6nkWOs/kp2FdhpoGJyTILOVsDgdm7eutnLA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.901.0.tgz", + "integrity": "sha512-wyKhZ51ur1tFuguZ6PgrUsot9KopqD0Tmxw8O8P/N3suQDxFPr0Yo7Y77ezDRDZQ95Ml3C0jlvx79HCo8VxdWA==", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.816.0", - "@aws-sdk/credential-provider-node": "3.817.0", - "@aws-sdk/middleware-bucket-endpoint": "3.808.0", - "@aws-sdk/middleware-expect-continue": "3.804.0", - "@aws-sdk/middleware-flexible-checksums": "3.816.0", - "@aws-sdk/middleware-host-header": "3.804.0", - "@aws-sdk/middleware-location-constraint": "3.804.0", - "@aws-sdk/middleware-logger": "3.804.0", - "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-sdk-s3": "3.816.0", - "@aws-sdk/middleware-ssec": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.816.0", - "@aws-sdk/region-config-resolver": "3.808.0", - "@aws-sdk/signature-v4-multi-region": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-endpoints": "3.808.0", - "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.816.0", - "@aws-sdk/xml-builder": "3.804.0", - "@smithy/config-resolver": "^4.1.2", - "@smithy/core": "^3.3.3", - "@smithy/eventstream-serde-browser": "^4.0.2", - "@smithy/eventstream-serde-config-resolver": "^4.1.0", - "@smithy/eventstream-serde-node": "^4.0.2", - "@smithy/fetch-http-handler": "^5.0.2", - "@smithy/hash-blob-browser": "^4.0.2", - "@smithy/hash-node": "^4.0.2", - "@smithy/hash-stream-node": "^4.0.2", - "@smithy/invalid-dependency": "^4.0.2", - "@smithy/md5-js": "^4.0.2", - "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.6", - "@smithy/middleware-retry": "^4.1.7", - "@smithy/middleware-serde": "^4.0.5", - "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/node-http-handler": "^4.0.4", - "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/url-parser": "^4.0.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.14", - "@smithy/util-defaults-mode-node": "^4.0.14", - "@smithy/util-endpoints": "^3.0.4", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.3", - "@smithy/util-stream": "^4.2.0", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.3", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/middleware-bucket-endpoint": "3.901.0", + "@aws-sdk/middleware-expect-continue": "3.901.0", + "@aws-sdk/middleware-flexible-checksums": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-location-constraint": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/middleware-ssec": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/signature-v4-multi-region": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/eventstream-serde-browser": "^4.2.0", + "@smithy/eventstream-serde-config-resolver": "^4.3.0", + "@smithy/eventstream-serde-node": "^4.2.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-blob-browser": "^4.2.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/hash-stream-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/md5-js": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -445,47 +499,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.817.0.tgz", - "integrity": "sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.901.0.tgz", + "integrity": "sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.816.0", - "@aws-sdk/middleware-host-header": "3.804.0", - "@aws-sdk/middleware-logger": "3.804.0", - "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.816.0", - "@aws-sdk/region-config-resolver": "3.808.0", - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-endpoints": "3.808.0", - "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.816.0", - "@smithy/config-resolver": "^4.1.2", - "@smithy/core": "^3.3.3", - "@smithy/fetch-http-handler": "^5.0.2", - "@smithy/hash-node": "^4.0.2", - "@smithy/invalid-dependency": "^4.0.2", - "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.6", - "@smithy/middleware-retry": "^4.1.7", - "@smithy/middleware-serde": "^4.0.5", - "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/node-http-handler": "^4.0.4", - "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/url-parser": "^4.0.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.14", - "@smithy/util-defaults-mode-node": "^4.0.14", - "@smithy/util-endpoints": "^3.0.4", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.3", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -493,20 +547,22 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.816.0.tgz", - "integrity": "sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==", - "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/core": "^3.3.3", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/property-provider": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/util-middleware": "^4.0.2", - "fast-xml-parser": "4.4.1", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.901.0.tgz", + "integrity": "sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -514,14 +570,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.816.0.tgz", - "integrity": "sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/property-provider": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.901.0.tgz", + "integrity": "sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -529,19 +585,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.816.0.tgz", - "integrity": "sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/fetch-http-handler": "^5.0.2", - "@smithy/node-http-handler": "^4.0.4", - "@smithy/property-provider": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/util-stream": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.901.0.tgz", + "integrity": "sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" }, "engines": { @@ -549,22 +605,22 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.817.0.tgz", - "integrity": "sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/credential-provider-env": "3.816.0", - "@aws-sdk/credential-provider-http": "3.816.0", - "@aws-sdk/credential-provider-process": "3.816.0", - "@aws-sdk/credential-provider-sso": "3.817.0", - "@aws-sdk/credential-provider-web-identity": "3.817.0", - "@aws-sdk/nested-clients": "3.817.0", - "@aws-sdk/types": "3.804.0", - "@smithy/credential-provider-imds": "^4.0.4", - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.901.0.tgz", + "integrity": "sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -572,21 +628,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.817.0.tgz", - "integrity": "sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.816.0", - "@aws-sdk/credential-provider-http": "3.816.0", - "@aws-sdk/credential-provider-ini": "3.817.0", - "@aws-sdk/credential-provider-process": "3.816.0", - "@aws-sdk/credential-provider-sso": "3.817.0", - "@aws-sdk/credential-provider-web-identity": "3.817.0", - "@aws-sdk/types": "3.804.0", - "@smithy/credential-provider-imds": "^4.0.4", - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.901.0.tgz", + "integrity": "sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-ini": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -594,15 +650,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.816.0.tgz", - "integrity": "sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.901.0.tgz", + "integrity": "sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -610,17 +666,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.817.0.tgz", - "integrity": "sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==", - "dependencies": { - "@aws-sdk/client-sso": "3.817.0", - "@aws-sdk/core": "3.816.0", - "@aws-sdk/token-providers": "3.817.0", - "@aws-sdk/types": "3.804.0", - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.901.0.tgz", + "integrity": "sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==", + "dependencies": { + "@aws-sdk/client-sso": "3.901.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/token-providers": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -628,15 +684,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.817.0.tgz", - "integrity": "sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/nested-clients": "3.817.0", - "@aws-sdk/types": "3.804.0", - "@smithy/property-provider": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.901.0.tgz", + "integrity": "sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -644,16 +701,16 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.808.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.808.0.tgz", - "integrity": "sha512-wEPlNcs8dir9lXbuviEGtSzYSxG/NRKQrJk5ybOc7OpPGHovsN+QhDOdY3lcjOFdwMTiMIG9foUkPz3zBpLB1A==", - "dependencies": { - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", - "@smithy/util-config-provider": "^4.0.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.901.0.tgz", + "integrity": "sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -661,13 +718,13 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.804.0.tgz", - "integrity": "sha512-YW1hySBolALMII6C8y7Z0CRG2UX1dGJjLEBNFeefhO/xP7ZuE1dvnmfJGaEuBMnvc3wkRS63VZ3aqX6sevM1CA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.901.0.tgz", + "integrity": "sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -675,22 +732,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.816.0.tgz", - "integrity": "sha512-kftcwDxB/VoCBsUiRgkm5CIuKbTfCN1WLPbis9LRwX3kQhKgGVxG2gG78SHk4TBB0qviWVAd/t+i/KaUgwiAcA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.901.0.tgz", + "integrity": "sha512-63lcKfggVUFyXhE4SsFXShCTCyh7ZHEqXLyYEL4DwX+VWtxutf9t9m3fF0TNUYDE8eEGWiRXhegj8l4FjuW+wA==", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-stream": "^4.2.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -698,13 +755,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.804.0.tgz", - "integrity": "sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", + "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -712,12 +769,12 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.804.0.tgz", - "integrity": "sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.901.0.tgz", + "integrity": "sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -725,12 +782,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.804.0.tgz", - "integrity": "sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", + "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -738,13 +795,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.804.0.tgz", - "integrity": "sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==", - "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", + "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -752,23 +810,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.816.0.tgz", - "integrity": "sha512-jJ+EAXM7gnOwiCM6rrl4AUNY5urmtIsX7roTkxtb4DevJxcS+wFYRRg3/j33fQbuxQZrvk21HqxyZYx5UH70PA==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.3.3", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-stream": "^4.2.0", - "@smithy/util-utf8": "^4.0.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.901.0.tgz", + "integrity": "sha512-prgjVC3fDT2VIlmQPiw/cLee8r4frTam9GILRUVQyDdNtshNwV3MiaSCLzzQJjKJlLgnBLNUHJCSmvUVtg+3iA==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -776,12 +834,12 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.804.0.tgz", - "integrity": "sha512-Tk8jK0gOIUBvEPTz/wwSlP1V70zVQ3QYqsLPAjQRMO6zfOK9ax31dln3MgKvFDJxBydS2tS3wsn53v+brxDxTA==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.901.0.tgz", + "integrity": "sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -789,16 +847,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.816.0.tgz", - "integrity": "sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-endpoints": "3.808.0", - "@smithy/core": "^3.3.3", - "@smithy/protocol-http": "^5.1.0", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.901.0.tgz", + "integrity": "sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -806,47 +864,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.817.0.tgz", - "integrity": "sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.901.0.tgz", + "integrity": "sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.816.0", - "@aws-sdk/middleware-host-header": "3.804.0", - "@aws-sdk/middleware-logger": "3.804.0", - "@aws-sdk/middleware-recursion-detection": "3.804.0", - "@aws-sdk/middleware-user-agent": "3.816.0", - "@aws-sdk/region-config-resolver": "3.808.0", - "@aws-sdk/types": "3.804.0", - "@aws-sdk/util-endpoints": "3.808.0", - "@aws-sdk/util-user-agent-browser": "3.804.0", - "@aws-sdk/util-user-agent-node": "3.816.0", - "@smithy/config-resolver": "^4.1.2", - "@smithy/core": "^3.3.3", - "@smithy/fetch-http-handler": "^5.0.2", - "@smithy/hash-node": "^4.0.2", - "@smithy/invalid-dependency": "^4.0.2", - "@smithy/middleware-content-length": "^4.0.2", - "@smithy/middleware-endpoint": "^4.1.6", - "@smithy/middleware-retry": "^4.1.7", - "@smithy/middleware-serde": "^4.0.5", - "@smithy/middleware-stack": "^4.0.2", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/node-http-handler": "^4.0.4", - "@smithy/protocol-http": "^5.1.0", - "@smithy/smithy-client": "^4.2.6", - "@smithy/types": "^4.2.0", - "@smithy/url-parser": "^4.0.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.14", - "@smithy/util-defaults-mode-node": "^4.0.14", - "@smithy/util-endpoints": "^3.0.4", - "@smithy/util-middleware": "^4.0.2", - "@smithy/util-retry": "^4.0.3", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -854,15 +912,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.808.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.808.0.tgz", - "integrity": "sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==", - "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/types": "^4.2.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.2", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", + "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -870,15 +928,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.816.0.tgz", - "integrity": "sha512-idcr9NW86sSIXASSej3423Selu6fxlhhJJtMgpAqoCH/HJh1eQrONJwNKuI9huiruPE8+02pwxuePvLW46X2mw==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/protocol-http": "^5.1.0", - "@smithy/signature-v4": "^5.1.0", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.901.0.tgz", + "integrity": "sha512-2IWxbll/pRucp1WQkHi2W5E2SVPGBvk4Is923H7gpNksbVFws18ItjMM8ZpGm44cJEoy1zR5gjhLFklatpuoOw==", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -886,16 +944,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.817.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.817.0.tgz", - "integrity": "sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==", - "dependencies": { - "@aws-sdk/core": "3.816.0", - "@aws-sdk/nested-clients": "3.817.0", - "@aws-sdk/types": "3.804.0", - "@smithy/property-provider": "^4.0.2", - "@smithy/shared-ini-file-loader": "^4.0.2", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.901.0.tgz", + "integrity": "sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -903,11 +961,11 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.804.0.tgz", - "integrity": "sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", + "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -915,9 +973,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", "dependencies": { "tslib": "^2.6.2" }, @@ -926,13 +984,14 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.808.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.808.0.tgz", - "integrity": "sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==", - "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/types": "^4.2.0", - "@smithy/util-endpoints": "^3.0.4", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", + "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -940,9 +999,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", "dependencies": { "tslib": "^2.6.2" }, @@ -951,25 +1010,25 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.804.0.tgz", - "integrity": "sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.901.0.tgz", + "integrity": "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==", "dependencies": { - "@aws-sdk/types": "3.804.0", - "@smithy/types": "^4.2.0", + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.816.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.816.0.tgz", - "integrity": "sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.816.0", - "@aws-sdk/types": "3.804.0", - "@smithy/node-config-provider": "^4.1.1", - "@smithy/types": "^4.2.0", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.901.0.tgz", + "integrity": "sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -985,17 +1044,26 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.804.0.tgz", - "integrity": "sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==", + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", + "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.6.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", + "integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -1005,9 +1073,9 @@ } }, "node_modules/@contentstack/cli-utilities": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.13.1.tgz", - "integrity": "sha512-ybG+6AycUbVoDhIE9WF+aZkAlv4XA40E1X2B3etbgLk5oOZKRRXaZ3oZjToqF94sd2jFxu96sDDBs50DJcwaYA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@contentstack/cli-utilities/-/cli-utilities-1.15.0.tgz", + "integrity": "sha512-Q3csEjZk7rdEvbhRyq41jMT9nFduxR7zVpyGAkYdialh4KjMHxJvzVUdmYuA3PA92xoTlFdcY97yXPQJpmptTw==", "dependencies": { "@contentstack/management": "~1.22.0", "@contentstack/marketplace-sdk": "^1.2.8", @@ -1040,35 +1108,6 @@ "xdg-basedir": "^4.0.0" } }, - "node_modules/@contentstack/cli-utilities/node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/@contentstack/cli-utilities/node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@contentstack/cli-utilities/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@contentstack/cli-utilities/node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -1164,28 +1203,39 @@ } }, "node_modules/@contentstack/marketplace-sdk": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.3.0.tgz", - "integrity": "sha512-zEpAxDeSSFxcE409IqDjepEzROe8zk/sqHhh+KkcwwYra1h5NVdbboQQXZrwjQEDVy4UsW0+Y1Ttnl8avu4w3A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@contentstack/marketplace-sdk/-/marketplace-sdk-1.4.0.tgz", + "integrity": "sha512-vUi9hoSh5ytr2KmuIKx+g7QDJqevIsM7UX12deCsCTdYH1q7eSrYwpv+jFH+TfrDQUYa71T/xrIF0QiTMUMqdA==", "dependencies": { "axios": "^1.11.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1203,84 +1253,19 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "peer": true, + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1288,7 +1273,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1298,8 +1283,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1315,8 +1298,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1325,16 +1306,12 @@ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1343,86 +1320,51 @@ } }, "node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "peer": true, + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "peer": true, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.10.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18.18.0" + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "peer": true, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": "*" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "peer": true, "engines": { "node": ">=12.22" }, @@ -1431,30 +1373,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead" }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.0.tgz", - "integrity": "sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" }, "engines": { "node": ">=18" @@ -1468,318 +1399,154 @@ } } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "20 || >=22" } }, - "node_modules/@inquirer/core/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">= 12" + "node": ">=12" } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@inquirer/editor": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.16.tgz", - "integrity": "sha512-iSzLjT4C6YKp2DU0fr8T7a97FnRRxMO6CushJnW5ktxLNM2iNeuyUuUA5255eOLPORoGYCrVnuDOEBdGkHGkpw==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/external-editor": "^1.0.0", - "@inquirer/type": "^3.0.8" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">=12" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">=12" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.0.tgz", - "integrity": "sha512-5v3YXc5ZMfL6OJqXPrX9csb4l7NlQA2doO1yynUjpUChT9hg4JcuBVP0RbsEJ/3SL/sxWEyFjT2W69ZhtoBWqg==", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/external-editor/node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.1.tgz", - "integrity": "sha512-LpBPeIpyCF1H3C7SK/QxJQG4iV1/SRmJdymfcul8PuwtVhD0JI1CSwqmd83VgRgt1QEsDojQYFSXJSgo81PVMw==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { - "@inquirer/checkbox": "^4.2.0", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.16", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">=12" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", - "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true }, - "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@lukeed/csprng": { @@ -1794,7 +1561,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1807,7 +1573,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1816,7 +1581,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1826,15 +1590,15 @@ } }, "node_modules/@oclif/core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.2.tgz", - "integrity": "sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.4.tgz", + "integrity": "sha512-78YYJls8+KG96tReyUsesKKIKqC0qbFSY1peUSrt0P2uGsrgAuU9axQ0iBQdhAlIwZDcTyaj+XXVQkz2kl/O0w==", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", - "debug": "^4.4.0", + "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", @@ -1870,9 +1634,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" @@ -1882,11 +1646,11 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.3.tgz", - "integrity": "sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.0.tgz", + "integrity": "sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -1894,9 +1658,9 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", "dependencies": { "tslib": "^2.6.2" }, @@ -1905,11 +1669,11 @@ } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.0.tgz", + "integrity": "sha512-HNbGWdyTfSM1nfrZKQjYTvD8k086+M8s1EYkBUdGC++lhxegUp2HgNf5RIt6oOGVvsC26hBCW/11tv8KbwLn/Q==", "dependencies": { - "@smithy/util-base64": "^4.0.0", + "@smithy/util-base64": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1917,14 +1681,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.3.tgz", - "integrity": "sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.0.tgz", + "integrity": "sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==", "dependencies": { - "@smithy/node-config-provider": "^4.1.2", - "@smithy/types": "^4.3.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.3", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1932,17 +1696,19 @@ } }, "node_modules/@smithy/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.4.0.tgz", - "integrity": "sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==", - "dependencies": { - "@smithy/middleware-serde": "^4.0.6", - "@smithy/protocol-http": "^5.1.1", - "@smithy/types": "^4.3.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.3", - "@smithy/util-stream": "^4.2.1", - "@smithy/util-utf8": "^4.0.0", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.14.0.tgz", + "integrity": "sha512-XJ4z5FxvY/t0Dibms/+gLJrI5niRoY0BCmE02fwmPcRYFPI4KI876xaE79YGWIKnEslMbuQPsIEsoU/DXa0DoA==", + "dependencies": { + "@smithy/middleware-serde": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -1950,14 +1716,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.5.tgz", - "integrity": "sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==", - "dependencies": { - "@smithy/node-config-provider": "^4.1.2", - "@smithy/property-provider": "^4.0.3", - "@smithy/types": "^4.3.0", - "@smithy/url-parser": "^4.0.3", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.0.tgz", + "integrity": "sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==", + "dependencies": { + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1965,13 +1731,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.3.tgz", - "integrity": "sha512-V22KIPXZsE2mc4zEgYGANM/7UbL9jWlOACEolyGyMuTY+jjHJ2PQ0FdopOTS1CS7u6PlAkALmypkv2oQ4aftcg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.0.tgz", + "integrity": "sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.0", - "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/types": "^4.6.0", + "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1979,12 +1745,12 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.3.tgz", - "integrity": "sha512-oe1d/tfCGVZBMX8O6HApaM4G+fF9JNdyLP7tWXt00epuL/kLOdp/4o9VqheLFeJaXgao+9IaBgs/q/oM48hxzg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.0.tgz", + "integrity": "sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.3", - "@smithy/types": "^4.3.0", + "@smithy/eventstream-serde-universal": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -1992,11 +1758,11 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.1.tgz", - "integrity": "sha512-XXCPGjRNwpFWHKQJMKIjGLfFKYULYckFnxGcWmBC2mBf3NsrvUKgqHax4NCqc0TfbDAimPDHOc6HOKtzsXK9Gw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.0.tgz", + "integrity": "sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2004,12 +1770,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.3.tgz", - "integrity": "sha512-HOEbRmm9TrikCoFrypYu0J/gC4Lsk8gl5LtOz1G3laD2Jy44+ht2Pd2E9qjNQfhMJIzKDZ/gbuUH0s0v4kWQ0A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.0.tgz", + "integrity": "sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.3", - "@smithy/types": "^4.3.0", + "@smithy/eventstream-serde-universal": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2017,12 +1783,12 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.3.tgz", - "integrity": "sha512-ShOP512CZrYI9n+h64PJ84udzoNHUQtPddyh1j175KNTKsSnMEDNscOWJWyEoLQiuhWWw51lSa+k6ea9ZGXcRg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.0.tgz", + "integrity": "sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==", "dependencies": { - "@smithy/eventstream-codec": "^4.0.3", - "@smithy/types": "^4.3.0", + "@smithy/eventstream-codec": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2030,14 +1796,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.3.tgz", - "integrity": "sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.0.tgz", + "integrity": "sha512-BG3KSmsx9A//KyIfw+sqNmWFr1YBUr+TwpxFT7yPqAk0yyDh7oSNgzfNH7pS6OC099EGx2ltOULvumCFe8bcgw==", "dependencies": { - "@smithy/protocol-http": "^5.1.1", - "@smithy/querystring-builder": "^4.0.3", - "@smithy/types": "^4.3.0", - "@smithy/util-base64": "^4.0.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2045,13 +1811,13 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.3.tgz", - "integrity": "sha512-37wZYU/XI2cOF4hgNDNMzZNAuNtJTkZFWxcpagQrnf6PYU/6sJ6y5Ey9Bp4vzi9nteex/ImxAugfsF3XGLrqWA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.0.tgz", + "integrity": "sha512-MWmrRTPqVKpN8NmxmJPTeQuhewTt8Chf+waB38LXHZoA02+BeWYVQ9ViAwHjug8m7lQb1UWuGqp3JoGDOWvvuA==", "dependencies": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.0", + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2059,13 +1825,13 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.3.tgz", - "integrity": "sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.0.tgz", + "integrity": "sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==", "dependencies": { - "@smithy/types": "^4.3.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.6.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2073,12 +1839,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.3.tgz", - "integrity": "sha512-CAwAvztwGYHHZGGcXtbinNxytaj5FNZChz8V+o7eNUAi5BgVqnF91Z3cJSmaE9O7FYUQVrIzGAB25Aok9T5KHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.0.tgz", + "integrity": "sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==", "dependencies": { - "@smithy/types": "^4.3.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.6.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2086,11 +1852,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.3.tgz", - "integrity": "sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.0.tgz", + "integrity": "sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2098,9 +1864,9 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -2109,12 +1875,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.3.tgz", - "integrity": "sha512-m95Z+1UJFPq4cv/R6TPMLYkoau7cNJYA5GLuuUJjfmF+Zrad4yaupIWeGGzIinf8pD1L+CIAxjh8eowPvyL7Dw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.0.tgz", + "integrity": "sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==", "dependencies": { - "@smithy/types": "^4.3.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.6.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2122,12 +1888,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.3.tgz", - "integrity": "sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.0.tgz", + "integrity": "sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==", "dependencies": { - "@smithy/protocol-http": "^5.1.1", - "@smithy/types": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2135,17 +1901,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.7.tgz", - "integrity": "sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==", - "dependencies": { - "@smithy/core": "^3.4.0", - "@smithy/middleware-serde": "^4.0.6", - "@smithy/node-config-provider": "^4.1.2", - "@smithy/shared-ini-file-loader": "^4.0.3", - "@smithy/types": "^4.3.0", - "@smithy/url-parser": "^4.0.3", - "@smithy/util-middleware": "^4.0.3", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.0.tgz", + "integrity": "sha512-jFVjuQeV8TkxaRlcCNg0GFVgg98tscsmIrIwRFeC74TIUyLE3jmY9xgc1WXrPQYRjQNK3aRoaIk6fhFRGOIoGw==", + "dependencies": { + "@smithy/core": "^3.14.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2153,31 +1919,31 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.8.tgz", - "integrity": "sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==", - "dependencies": { - "@smithy/node-config-provider": "^4.1.2", - "@smithy/protocol-http": "^5.1.1", - "@smithy/service-error-classification": "^4.0.4", - "@smithy/smithy-client": "^4.3.0", - "@smithy/types": "^4.3.0", - "@smithy/util-middleware": "^4.0.3", - "@smithy/util-retry": "^4.0.4", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.0.tgz", + "integrity": "sha512-yaVBR0vQnOnzex45zZ8ZrPzUnX73eUC8kVFaAAbn04+6V7lPtxn56vZEBBAhgS/eqD6Zm86o6sJs6FuQVoX5qg==", + "dependencies": { + "@smithy/node-config-provider": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/service-error-classification": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.6.tgz", - "integrity": "sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.0.tgz", + "integrity": "sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==", "dependencies": { - "@smithy/protocol-http": "^5.1.1", - "@smithy/types": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2185,11 +1951,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.3.tgz", - "integrity": "sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.0.tgz", + "integrity": "sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2197,13 +1963,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.2.tgz", - "integrity": "sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.0.tgz", + "integrity": "sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==", "dependencies": { - "@smithy/property-provider": "^4.0.3", - "@smithy/shared-ini-file-loader": "^4.0.3", - "@smithy/types": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2211,14 +1977,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.5.tgz", - "integrity": "sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==", - "dependencies": { - "@smithy/abort-controller": "^4.0.3", - "@smithy/protocol-http": "^5.1.1", - "@smithy/querystring-builder": "^4.0.3", - "@smithy/types": "^4.3.0", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.3.0.tgz", + "integrity": "sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==", + "dependencies": { + "@smithy/abort-controller": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/querystring-builder": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2226,11 +1992,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.3.tgz", - "integrity": "sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.0.tgz", + "integrity": "sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2238,11 +2004,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.1.tgz", - "integrity": "sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.0.tgz", + "integrity": "sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2250,12 +2016,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.3.tgz", - "integrity": "sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.0.tgz", + "integrity": "sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==", "dependencies": { - "@smithy/types": "^4.3.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/types": "^4.6.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2263,11 +2029,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.3.tgz", - "integrity": "sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.0.tgz", + "integrity": "sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2275,22 +2041,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.4.tgz", - "integrity": "sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.0.tgz", + "integrity": "sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==", "dependencies": { - "@smithy/types": "^4.3.0" + "@smithy/types": "^4.6.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.3.tgz", - "integrity": "sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.0.tgz", + "integrity": "sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2298,17 +2064,17 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.1.tgz", - "integrity": "sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.1", - "@smithy/types": "^4.3.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.3", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.0.tgz", + "integrity": "sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2316,16 +2082,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.3.0.tgz", - "integrity": "sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==", - "dependencies": { - "@smithy/core": "^3.4.0", - "@smithy/middleware-endpoint": "^4.1.7", - "@smithy/middleware-stack": "^4.0.3", - "@smithy/protocol-http": "^5.1.1", - "@smithy/types": "^4.3.0", - "@smithy/util-stream": "^4.2.1", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.7.0.tgz", + "integrity": "sha512-3BDx/aCCPf+kkinYf5QQhdQ9UAGihgOVqI3QO5xQfSaIWvUE4KYLtiGRWsNe1SR7ijXC0QEPqofVp5Sb0zC8xQ==", + "dependencies": { + "@smithy/core": "^3.14.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" }, "engines": { @@ -2333,9 +2099,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.0.tgz", - "integrity": "sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.6.0.tgz", + "integrity": "sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==", "dependencies": { "tslib": "^2.6.2" }, @@ -2344,12 +2110,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.3.tgz", - "integrity": "sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.0.tgz", + "integrity": "sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==", "dependencies": { - "@smithy/querystring-parser": "^4.0.3", - "@smithy/types": "^4.3.0", + "@smithy/querystring-parser": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2357,12 +2123,12 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.2.0.tgz", + "integrity": "sha512-+erInz8WDv5KPe7xCsJCp+1WCjSbah9gWcmUXc9NqmhyPx59tf7jqFz+za1tRG1Y5KM1Cy1rWCcGypylFp4mvA==", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2370,9 +2136,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "dependencies": { "tslib": "^2.6.2" }, @@ -2381,9 +2147,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.0.tgz", + "integrity": "sha512-U8q1WsSZFjXijlD7a4wsDQOvOwV+72iHSfq1q7VD+V75xP/pdtm0WIGuaFJ3gcADDOKj2MIBn4+zisi140HEnQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -2392,11 +2158,11 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2404,9 +2170,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -2415,13 +2181,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.15.tgz", - "integrity": "sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.2.0.tgz", + "integrity": "sha512-qzHp7ZDk1Ba4LDwQVCNp90xPGqSu7kmL7y5toBpccuhi3AH7dcVBIT/pUxYcInK4jOy6FikrcTGq5wxcka8UaQ==", "dependencies": { - "@smithy/property-provider": "^4.0.3", - "@smithy/smithy-client": "^4.3.0", - "@smithy/types": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -2430,16 +2196,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.15.tgz", - "integrity": "sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==", - "dependencies": { - "@smithy/config-resolver": "^4.1.3", - "@smithy/credential-provider-imds": "^4.0.5", - "@smithy/node-config-provider": "^4.1.2", - "@smithy/property-provider": "^4.0.3", - "@smithy/smithy-client": "^4.3.0", - "@smithy/types": "^4.3.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.0.tgz", + "integrity": "sha512-FxUHS3WXgx3bTWR6yQHNHHkQHZm/XKIi/CchTnKvBulN6obWpcbzJ6lDToXn+Wp0QlVKd7uYAz2/CTw1j7m+Kg==", + "dependencies": { + "@smithy/config-resolver": "^4.3.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2447,12 +2213,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.5.tgz", - "integrity": "sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.0.tgz", + "integrity": "sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==", "dependencies": { - "@smithy/node-config-provider": "^4.1.2", - "@smithy/types": "^4.3.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2460,9 +2226,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "dependencies": { "tslib": "^2.6.2" }, @@ -2471,11 +2237,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.3.tgz", - "integrity": "sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.0.tgz", + "integrity": "sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==", "dependencies": { - "@smithy/types": "^4.3.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2483,12 +2249,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.4.tgz", - "integrity": "sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.0.tgz", + "integrity": "sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==", "dependencies": { - "@smithy/service-error-classification": "^4.0.4", - "@smithy/types": "^4.3.0", + "@smithy/service-error-classification": "^4.2.0", + "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "engines": { @@ -2496,17 +2262,17 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.1.tgz", - "integrity": "sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==", - "dependencies": { - "@smithy/fetch-http-handler": "^5.0.3", - "@smithy/node-http-handler": "^4.0.5", - "@smithy/types": "^4.3.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.4.0.tgz", + "integrity": "sha512-vtO7ktbixEcrVzMRmpQDnw/Ehr9UWjBvSJ9fyAbadKkC4w5Cm/4lMO8cHz8Ysb8uflvQUNRcuux/oNHKPXkffg==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2514,9 +2280,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "dependencies": { "tslib": "^2.6.2" }, @@ -2525,11 +2291,11 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -2537,18 +2303,38 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.4.tgz", - "integrity": "sha512-73aeIvHjtSB6fd9I08iFaQIGTICKpLrI3EtlWAkStVENGo1ARMq9qdoD4QwkY0RUp6A409xlgbD9NCCfCF5ieg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.0.tgz", + "integrity": "sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==", + "dependencies": { + "@smithy/abort-controller": "^4.2.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", "dependencies": { - "@smithy/abort-controller": "^4.0.3", - "@smithy/types": "^4.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2557,10 +2343,34 @@ "node": ">= 10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "dependencies": { "@types/connect": "*", @@ -2577,25 +2387,18 @@ } }, "node_modules/@types/cors": { - "version": "2.8.18", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", - "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "dependencies": { "@types/node": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "peer": true - }, "node_modules/@types/express": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", - "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -2605,9 +2408,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "dev": true, "dependencies": { "@types/node": "*", @@ -2616,6 +2419,12 @@ "@types/send": "*" } }, + "node_modules/@types/fs-readdir-recursive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/fs-readdir-recursive/-/fs-readdir-recursive-1.1.3.tgz", + "integrity": "sha512-2v5JKYQO+14CfurtdaL1cbLrjBeFjmcLkD35zDkaaytYSY/57jb2Kz6FbfJ1k+Lx2aaS0zpTR1dwCyqLkjo9vQ==", + "dev": true + }, "node_modules/@types/helmet": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/helmet/-/helmet-4.0.0.tgz", @@ -2627,32 +2436,25 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true }, "node_modules/@types/inquirer": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.8.tgz", - "integrity": "sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", + "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==", "dev": true, "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "node_modules/@types/lodash": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", - "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", "dev": true }, "node_modules/@types/lodash.isempty": { @@ -2671,20 +2473,21 @@ "dev": true }, "node_modules/@types/multer": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.12.tgz", - "integrity": "sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==", + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.13.tgz", + "integrity": "sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/node": { - "version": "20.17.52", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.52.tgz", - "integrity": "sha512-2aj++KfxubvW/Lc0YyXE3OEW7Es8TWn1MsRzYgcOGyTNQxi0L8rxQUCZ7ZbyOBWZQD5I63PV9egZWMsapVaklg==", + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "devOptional": true, "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { @@ -2700,327 +2503,173 @@ "dev": true }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", "dev": true, "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" + "@types/send": "<1" } }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "node_modules/@types/xml2js": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", - "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", "dev": true, "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", - "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/type-utils": "8.33.1", - "@typescript-eslint/utils": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.33.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", - "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", - "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.40.0", - "@typescript-eslint/types": "^8.40.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", - "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", - "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", - "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", - "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@types/xml2js": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/project-service": "8.40.0", - "@typescript-eslint/tsconfig-utils": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", - "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/types": "8.40.0", - "eslint-visitor-keys": "^4.2.1" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", - "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", - "dev": true, - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.33.1", - "@typescript-eslint/types": "^8.33.1", + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", - "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", - "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", - "dev": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", - "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.33.1", - "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", - "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -3028,84 +2677,74 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", - "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dependencies": { - "@typescript-eslint/project-service": "8.33.1", - "@typescript-eslint/tsconfig-utils": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", + "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/typescript-estree": "8.33.1" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", - "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", - "dev": true, + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" }, "node_modules/abab": { "version": "2.0.6", @@ -3160,8 +2799,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3280,22 +2917,17 @@ "node": ">= 8" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3324,6 +2956,54 @@ "node": ">=6.0.0" } }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", @@ -3341,6 +3021,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -3414,9 +3126,9 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", + "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -3523,15 +3235,26 @@ "node": ">=18" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==" }, "node_modules/brace-expansion": { "version": "2.0.2", @@ -3660,8 +3383,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -3701,29 +3422,29 @@ } }, "node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==" }, "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", + "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -3883,12 +3604,15 @@ } }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", + "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^3.0.1", + "color-string": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/color-convert": { @@ -3908,26 +3632,42 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", + "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "engines": { + "node": ">=12.20" } }, "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", + "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", "dependencies": { - "color-name": "1.1.3" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" } }, "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", + "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "engines": { + "node": ">=12.20" + } }, "node_modules/colors": { "version": "1.0.3", @@ -3937,15 +3677,6 @@ "node": ">=0.1.90" } }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4064,12 +3795,16 @@ "node": ">= 0.10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4088,9 +3823,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -4103,9 +3838,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "engines": { "node": ">= 6" }, @@ -4259,9 +3994,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dependencies": { "ms": "^2.1.3" }, @@ -4283,9 +4018,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" }, "node_modules/deep-is": { "version": "0.1.4", @@ -4359,6 +4094,37 @@ "node": ">= 0.8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -4437,9 +4203,9 @@ } }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "engines": { "node": ">=12" }, @@ -4460,6 +4226,12 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4498,9 +4270,9 @@ } }, "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" @@ -4509,6 +4281,17 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -4611,6 +4394,32 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -4708,70 +4517,64 @@ } }, "node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", - "dev": true, - "peer": true, + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", - "@eslint/plugin-kit": "^0.3.5", - "@humanfs/node": "^0.16.6", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -4781,13 +4584,13 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", - "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -4810,18 +4613,97 @@ } } }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "peer": true, + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4831,7 +4713,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4843,8 +4724,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4860,72 +4739,20 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4933,64 +4760,17 @@ "node": "*" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "peer": true, + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "eslint-visitor-keys": "^3.4.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5012,8 +4792,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -5025,8 +4803,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5100,9 +4876,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "engines": { "node": ">= 16" }, @@ -5110,22 +4886,27 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" + "express": ">= 4.11" } }, "node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" }, "engines": { - "node": ">=0.12" + "node": ">=4" } }, + "node_modules/external-editor/node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "node_modules/external-editor/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5152,7 +4933,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5168,7 +4948,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5179,9 +4958,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5189,9 +4966,9 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -5204,21 +4981,17 @@ ] }, "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { - "strnum": "^1.0.5" + "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -5228,24 +5001,10 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -5274,16 +5033,14 @@ } }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "peer": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/filelist": { @@ -5333,37 +5090,92 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "peer": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "peer": true + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" }, "node_modules/fn.name": { "version": "1.1.0", @@ -5371,9 +5183,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -5394,13 +5206,29 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dependencies": { - "is-callable": "^1.2.7" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { @@ -5454,9 +5282,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5532,6 +5360,19 @@ "node": ">= 0.6.0" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/genson-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/genson-js/-/genson-js-0.0.8.tgz", + "integrity": "sha512-4NUusDTwF+lzYh72uKV+Uvpky9iPO+YDIMpGImA5pbHfLV9HwgRCA4hYjGu78V4J4Cx2IZRTFfRERn9aUs74mw==" + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5600,17 +5441,23 @@ } }, "node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5620,8 +5467,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -5630,27 +5475,40 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "peer": true, + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5671,6 +5529,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5695,8 +5572,7 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/has-bigints": { "version": "1.1.0", @@ -5798,6 +5674,17 @@ "node": ">=12" } }, + "node_modules/html-encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -5810,9 +5697,9 @@ } }, "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5823,8 +5710,19 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-errors": { @@ -5842,6 +5740,14 @@ "node": ">= 0.8" } }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -5882,14 +5788,18 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -5915,8 +5825,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "peer": true, "engines": { "node": ">= 4" } @@ -5932,9 +5840,9 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -5944,8 +5852,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5961,8 +5867,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "peer": true, "engines": { "node": ">=0.8.19" } @@ -5975,34 +5879,41 @@ "node": ">=8" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { - "version": "12.9.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.1.tgz", - "integrity": "sha512-G7uXAb9OiLcd+9jmA/7KKrItvFF00kKk/jb6CtG+Tm2zSPWfzzhyJwDhVCy+mBmE32o2zJnB5JnknIIv2Ft+AA==", + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/prompts": "^7.8.1", - "@inquirer/type": "^3.0.8", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", - "mute-stream": "^2.0.0", - "run-async": "^4.0.5", - "rxjs": "^7.8.2" + "cli-width": "^4.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, "node_modules/inquirer-search-checkbox": { @@ -6056,6 +5967,11 @@ "node": ">=4" } }, + "node_modules/inquirer-search-checkbox/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, "node_modules/inquirer-search-checkbox/node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -6093,6 +6009,19 @@ "node": ">=0.8.0" } }, + "node_modules/inquirer-search-checkbox/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/inquirer-search-checkbox/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -6112,6 +6041,17 @@ "node": ">=4" } }, + "node_modules/inquirer-search-checkbox/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/inquirer-search-checkbox/node_modules/inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -6177,6 +6117,11 @@ "node": ">=4" } }, + "node_modules/inquirer-search-checkbox/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/inquirer-search-checkbox/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6262,6 +6207,11 @@ "node": ">=4" } }, + "node_modules/inquirer-search-list/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, "node_modules/inquirer-search-list/node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -6299,6 +6249,19 @@ "node": ">=0.8.0" } }, + "node_modules/inquirer-search-list/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/inquirer-search-list/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -6318,6 +6281,17 @@ "node": ">=4" } }, + "node_modules/inquirer-search-list/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/inquirer-search-list/node_modules/inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -6383,6 +6357,11 @@ "node": ">=4" } }, + "node_modules/inquirer-search-list/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/inquirer-search-list/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6417,18 +6396,26 @@ "node": ">=4" } }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, "node_modules/inquirer/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/inquirer/node_modules/run-async": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", - "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "engines": { "node": ">=0.12.0" } @@ -6485,11 +6472,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -6559,6 +6541,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-data-view": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", @@ -6635,12 +6631,13 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -6738,6 +6735,14 @@ "node": ">=8" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -6924,9 +6929,38 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, - "peer": true + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/jake": { "version": "10.9.4", @@ -6944,6 +6978,11 @@ "node": ">=10" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -7000,6 +7039,17 @@ } } }, + "node_modules/jsdom/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsdom/node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -7027,9 +7077,7 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -7044,14 +7092,12 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dependencies": { "universalify": "^2.0.0" }, @@ -7081,6 +7127,20 @@ "node": ">=0.4.0" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -7096,8 +7156,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -7127,8 +7185,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7155,16 +7211,19 @@ "funding": { "url": "https://github.com/sponsors/antonk52" } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -7216,9 +7275,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -7251,10 +7308,31 @@ "node": ">= 12.0.0" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -7287,7 +7365,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -7296,7 +7373,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7305,17 +7381,9 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "node_modules/migration-aem": { + "resolved": "migration-aem", + "link": true }, "node_modules/migration-contentful": { "resolved": "migration-contentful", @@ -7379,11 +7447,12 @@ } }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mixme": { @@ -7493,8 +7562,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "1.0.0", @@ -7628,9 +7696,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==" + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -7693,6 +7761,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -7762,8 +7878,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -7823,28 +7937,31 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -7855,6 +7972,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -7869,8 +7992,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -7913,9 +8034,9 @@ } }, "node_modules/parse5/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "engines": { "node": ">=0.12" }, @@ -7939,45 +8060,58 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true, "engines": { "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { - "node": ">=16" + "node": ">=8" } }, "node_modules/picocolors": { @@ -7986,11 +8120,11 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -8030,6 +8164,20 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -8061,16 +8209,14 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "bin": { "prettier": "bin/prettier.cjs" }, @@ -8098,6 +8244,16 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -8162,7 +8318,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -8187,19 +8342,24 @@ } }, "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.6.3", + "iconv-lite": "0.7.0", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -8230,17 +8390,6 @@ "node": ">=8.10.0" } }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/recheck": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/recheck/-/recheck-4.4.5.tgz", @@ -8363,12 +8512,26 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -8385,33 +8548,104 @@ "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "node_modules/rimraf/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -8439,7 +8673,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -8587,9 +8820,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "bin": { "semver": "bin/semver.js" }, @@ -8694,8 +8927,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8707,8 +8938,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -8782,16 +9011,15 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/simple-update-notifier": { @@ -8805,6 +9033,14 @@ "node": ">=10" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, "node_modules/slate": { "version": "0.103.0", "resolved": "https://registry.npmjs.org/slate/-/slate-0.103.0.tgz", @@ -8844,6 +9080,54 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/smartwrap/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smartwrap/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/smartwrap/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -8984,9 +9268,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "engines": { "node": ">= 0.8" } @@ -9067,6 +9351,56 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", @@ -9131,12 +9465,23 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -9145,9 +9490,9 @@ } }, "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", "funding": [ { "type": "github", @@ -9169,18 +9514,29 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/synckit": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.6.tgz", - "integrity": "sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, "dependencies": { - "@pkgr/core": "^0.2.4" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9194,6 +9550,11 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9205,12 +9566,12 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -9219,6 +9580,33 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9315,15 +9703,69 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "engines": { - "node": ">=18.12" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "typescript": ">=4.8.4" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/tslib": { @@ -9355,8 +9797,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -9485,10 +9925,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9536,17 +9975,18 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true }, "node_modules/unique-string": { "version": "2.0.0", @@ -9579,8 +10019,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -9623,6 +10061,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9678,6 +10122,17 @@ "node": ">=18" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", @@ -9707,8 +10162,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9822,12 +10275,12 @@ } }, "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", @@ -9907,15 +10360,33 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "engines": { "node": ">=10.0.0" }, @@ -10014,12 +10485,19 @@ "node": ">=12" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -10028,9 +10506,9 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "engines": { "node": ">=18" }, diff --git a/upload-api/package.json b/upload-api/package.json index 99cbd9091..ece343955 100644 --- a/upload-api/package.json +++ b/upload-api/package.json @@ -1,11 +1,13 @@ { - "name": "migration-v2-upload", + "name": "migration-upload", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { + "build": "npm --prefix migration-aem run build && tsc", "test": "echo \"Error: no test specified\" && exit 1", - "start": "tsc && node build/index.js", + "start": "npm run build &&tsc && node build/index.js", + "startNew": "tsc && node build/index.js", "validation": "tsc && node build/main.js", "prettify": "prettier --write .", "lint": "eslint .", @@ -24,8 +26,9 @@ "@types/lodash.isempty": "^4.4.9", "@types/multer": "^1.4.11", "@types/node": "^20.12.12", + "@types/uuid": "^9.0.8", "@types/xml2js": "^0.4.14", - "@typescript-eslint/eslint-plugin": "^8.33.1", + "@typescript-eslint/eslint-plugin": "^7.7.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "helmet": "^7.1.0", @@ -33,25 +36,30 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.529.0", - "@contentstack/cli-utilities": "^1.0.3", - "axios": "^1.8.2", + "@contentstack/cli-utilities": "^1.5.12", + "@typescript-eslint/parser": "^7.7.1", + "axios": "^1.12.0", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.12", "cors": "^2.8.5", "dotenv": "^16.3.1", + "eslint": "^8.51.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", "express": "^5.0.0", "express-rate-limit": "^7.2.0", - "inquirer": "^12.9.1", + "inquirer": "^9.2.15", "jszip": "^3.10.1", "lodash.isempty": "^4.4.0", + "migration-aem": "file:migration-aem", "migration-contentful": "file:migration-contentful", "migration-sitecore": "file:migration-sitecore", "migration-wordpress": "file:migration-wordpress", - "multer": "^2.0.0", + "multer": "^2.0.1", "node-fetch": "^2.7.0", "nodemon": "^3.1.9", "prettier": "^3.3.3", - "winston": "^3.17.0", + "uuid": "^9.0.1", "xml2js": "^0.6.2" } } diff --git a/upload-api/src/controllers/aem/index.ts b/upload-api/src/controllers/aem/index.ts new file mode 100644 index 000000000..9a3f01697 --- /dev/null +++ b/upload-api/src/controllers/aem/index.ts @@ -0,0 +1,133 @@ + +import axios, { AxiosResponse, AxiosError } from "axios"; +import http from 'http'; +import logger from "../../utils/logger"; +import { HTTP_CODES, HTTP_TEXTS } from "../../constants"; +import { contentTypes, locales } from 'migration-aem'; + +interface RequestParams { + payload: any; + projectId: string | string[]; + app_token: string | string[]; + endpoint?: string; +} + + +const sendRequestWithRetry = async (params: RequestParams): Promise> => { + const { payload, projectId, app_token, endpoint = 'mapper/createDummyData' } = params; + const maxRetries = 3; + let retries = 0; + + while (retries < maxRetries) { + try { + const config = { + method: 'post', + maxBodyLength: Infinity, + url: `${process.env.NODE_BACKEND_API}/v2/${endpoint}/${projectId}`, + headers: { + app_token, + 'Content-Type': 'application/json' + }, + data: payload, + timeout: 240000, // 4-minute timeout + httpAgent: new http.Agent({ + keepAlive: true, + maxSockets: 1 + }) + }; + + return await axios.request(config); + } catch (error) { + const axiosError = error as AxiosError; + retries++; + const delay = 2000 * retries; // Progressive backoff: 2s, 4s, 6s + + logger.warn(`API request failed (attempt ${retries}/${maxRetries}): ${axiosError.code || axiosError.message}`, { + status: axiosError.response?.status || 'NETWORK_ERROR' + }); + + if (retries >= maxRetries) { + throw axiosError; + } + + logger.info(`Retrying in ${delay / 1000} seconds...`); + await new Promise(resolve => setTimeout(resolve, delay)); + } + } + + // This line is technically unreachable, but TypeScript requires a return + throw new Error("Maximum retries reached"); +}; + + +const createLocaleSource = async ({ + app_token, + localeData, + projectId, +}: { + app_token: string | string[]; + localeData: any; + projectId: string | string[]; +}) => { + try { + const payload = { + locale: Array?.from?.(localeData) ?? [], + }; + + const { status } = await sendRequestWithRetry({ + payload, + projectId, + app_token, + endpoint: 'migration/localeMapper', + }); + + if (status === 200) { + logger.info('Legacy CMS', { + status: HTTP_CODES?.OK, + message: HTTP_TEXTS?.LOCALE_SAVED, + }); + } else { + logger.warn('Legacy CMS error:', { + status: HTTP_CODES?.UNAUTHORIZED, + message: HTTP_TEXTS?.LOCALE_FAILED, + }); + } + } catch (error) { + logger.error('Legacy CMS error:', { + status: HTTP_CODES?.UNAUTHORIZED, + message: HTTP_TEXTS?.LOCALE_FAILED, + error, + }); + throw error; + } +}; + + +const createAemMapper = async (filePath: string, projectId: string | string[], app_token: string | string[], affix?: string | string[]) => { + try { + const ct = contentTypes(); + const localeData = await locales().processAndSave(filePath); + await createLocaleSource({ app_token, projectId, localeData }); + const ctData = await ct.convertAndCreate(filePath); + const fieldMapping: any = { contentTypes: ctData, extractPath: filePath }; + const { data } = await sendRequestWithRetry({ + payload: fieldMapping, + projectId, + app_token + }); + if (data?.data?.content_mapper?.length) { + logger.info('Validation success:', { + status: HTTP_CODES?.OK, + message: HTTP_TEXTS?.MAPPER_SAVED, + }); + } + } catch (error: any) { + console.error("🚀 ~ createSitecoreMapper ~ err:", error?.response?.data ?? error); + logger.warn('Validation error:', { + status: HTTP_CODES?.UNAUTHORIZED, + message: HTTP_TEXTS?.VALIDATION_ERROR, + }); + } +} + +export { createAemMapper } \ No newline at end of file diff --git a/upload-api/src/routes/index.ts b/upload-api/src/routes/index.ts index 0b87309e6..455c275ab 100644 --- a/upload-api/src/routes/index.ts +++ b/upload-api/src/routes/index.ts @@ -98,80 +98,96 @@ router.get('/validator', express.json(), fileOperationLimiter, async function (r if (config?.isLocalPath) { const fileName = path.basename(config?.localPath || ""); - //const fileName = config?.localPath?.replace(/\/$/, "")?.split?.('/')?.pop?.(); + const isFile = !!path.extname(fileName); if (!fileName) { res.send('Filename could not be determined from the local path.'); } if (fileName) { - const name = fileName?.split?.('.')?.[0]; - const fileExt = fileName?.split('.')?.pop() ?? ''; - const bodyStream = createReadStream(config?.localPath?.replace(/\/$/, "")); - - bodyStream.on('error', (error: any) => { - console.error(error); - return res.status(500).json({ - status: "error", - message: "Error reading file.", - file_details: config - }); - }); - if (fileExt === 'xml') { - let xmlData = ''; - - // Collect the data from the stream as a string - bodyStream.on('data', (chunk) => { - if (typeof chunk !== 'string' && !Buffer.isBuffer(chunk)) { - throw new Error('Expected chunk to be a string or a Buffer'); - } else { - // Convert chunk to string (if it's a Buffer) - xmlData += chunk.toString(); - } + if (isFile) { + const name = fileName?.split?.('.')?.[0]; + const fileExt = fileName?.split('.')?.pop() ?? ''; + const bodyStream = createReadStream(config?.localPath?.replace(/\/$/, "")); + + bodyStream.on('error', (error: any) => { + console.error(error); + return res.status(500).json({ + status: "error", + message: "Error reading file.", + file_details: config + }); }); + if (fileExt === 'xml') { + let xmlData = ''; + // Collect the data from the stream as a string + bodyStream.on('data', (chunk) => { + if (typeof chunk !== 'string' && !Buffer.isBuffer(chunk)) { + throw new Error('Expected chunk to be a string or a Buffer'); + } else { + // Convert chunk to string (if it's a Buffer) + xmlData += chunk.toString(); + } + }); - // When the stream ends, process the XML data - bodyStream.on('end', async () => { - if (!xmlData) { - throw new Error('No data collected from the stream.'); - } - - const data = await handleFileProcessing(fileExt, xmlData, cmsType, name); - res.status(data?.status || 200).json(data); - if (data?.status === 200) { - const filePath = path.join(__dirname, '..', '..', 'extracted_files', `${name}.json`); - createMapper(filePath, projectId, app_token, affix, config); - } - }); - } - else { - // Create a writable stream to save the downloaded zip file - let zipBuffer = Buffer.alloc(0); - - // Collect the data from the stream into a buffer - bodyStream.on('data', (chunk) => { - if (!Buffer.isBuffer(chunk)) { - throw new Error('Expected chunk to be a Buffer'); - } else { - zipBuffer = Buffer.concat([zipBuffer, chunk]); - } - }); + // When the stream ends, process the XML data + bodyStream.on('end', async () => { + if (!xmlData) { + throw new Error('No data collected from the stream.'); + } - //buffer fully stremd - bodyStream.on('end', async () => { - if (!zipBuffer) { - throw new Error('No data collected from the stream.'); - } - const data = await handleFileProcessing(fileExt, zipBuffer, cmsType, name); - res.status(data?.status || 200).json(data); - if (data?.status === 200) { - let filePath = path.join(__dirname, '..', '..', 'extracted_files', name); - if (data?.file !== undefined) { - filePath = path.join(__dirname, '..', '..', 'extracted_files', name, data?.file); + const data = await handleFileProcessing(fileExt, xmlData, cmsType, name); + res.status(data?.status || 200).json(data); + if (data?.status === 200) { + const filePath = path.join(__dirname, '..', '..', 'extracted_files', `${name}.json`); + createMapper(filePath, projectId, app_token, affix, config); } - createMapper(filePath, projectId, app_token, affix, config); - } - }); + }); + } + else { + const chunks: Buffer[] = []; + let totalLength = 0; + + bodyStream.on('data', (chunk) => { + if (!Buffer.isBuffer(chunk)) { + throw new Error('Expected chunk to be a Buffer'); + } + chunks.push(chunk); + totalLength += chunk.length; + }); + + bodyStream.on('end', async () => { + try { + if (chunks.length === 0) { + return res.status(400).json({ error: 'No data collected from the stream.' }); + } + + const zipBuffer = Buffer.concat(chunks, totalLength); + const data = await handleFileProcessing(fileExt, zipBuffer, cmsType, name); + + res.status(data?.status || 200).json(data); + + if (data?.status === 200) { + const filePath = path.join(__dirname, '..', '..', 'extracted_files', name); + createMapper(filePath, projectId, app_token, affix, config); + } + } catch (error) { + console.error('Processing error:', error); + res.status(500).json({ error: 'Failed to process file' }); + } + }); + + bodyStream.on('error', (error) => { + console.error('Stream error:', error); + res.status(500).json({ error: 'Stream processing failed' }); + }); + } + } else { + const data = await handleFileProcessing("folder", config?.localPath, cmsType, fileName); + res.status(data?.status || 200).json(data); + if (data?.status === 200) { + createMapper(config?.localPath, projectId, app_token, affix, config); + } } } } else { @@ -219,11 +235,9 @@ router.get('/validator', express.json(), fileOperationLimiter, async function (r const data = await handleFileProcessing(fileExt, zipBuffer, cmsType, fileName); res.json(data); - res.send('file validated successfully.'); - let filePath = path.join(__dirname, '..', '..', 'extracted_files', fileName); - if (data?.file !== undefined) { - filePath = path.join(__dirname, '..', '..', 'extracted_files', fileName, data?.file); - } + res.send('file valited sucessfully.'); + const filePath = path.join(__dirname, '..', '..', 'extracted_files', fileName); + console.log("🚀 ~ bodyStream.on ~ filePath:", filePath) createMapper(filePath, projectId, app_token, affix, config); }); } diff --git a/upload-api/src/services/createMapper.ts b/upload-api/src/services/createMapper.ts index a8efebfea..d805ab0d2 100644 --- a/upload-api/src/services/createMapper.ts +++ b/upload-api/src/services/createMapper.ts @@ -1,3 +1,4 @@ +import { createAemMapper } from '../controllers/aem'; import createSitecoreMapper from '../controllers/sitecore'; import createWordpressMapper from '../controllers/wordpress'; import { Config } from '../models/types'; @@ -24,9 +25,10 @@ const createMapper = async ( return createWordpressMapper(filePath, projectId, app_token, affix); } - // case 'aem': { - // return createAemMapper({ data }); - // } + case 'aem': { + return createAemMapper(filePath, projectId, app_token, affix); + } + default: return false; diff --git a/upload-api/src/services/fileProcessing.ts b/upload-api/src/services/fileProcessing.ts index 025ef3b66..e5ac5145d 100644 --- a/upload-api/src/services/fileProcessing.ts +++ b/upload-api/src/services/fileProcessing.ts @@ -12,6 +12,7 @@ const handleFileProcessing = async ( cmsType: string, name: string ) => { + console.log("🚀 ~ handleFileProcessing ~ fileExt:", fileExt) if (fileExt === 'zip') { const zip = new JSZip(); await zip.loadAsync(zipBuffer); @@ -68,6 +69,29 @@ const handleFileProcessing = async ( }; } } + } else if (fileExt === 'folder') { + console.log("🚀 ~ handleFileProcessing ~ fileExt:", fileExt) + if (await validator({ data: zipBuffer, type: cmsType, extension: fileExt })) { + logger.info('Validation success:', { + status: HTTP_CODES?.OK, + message: HTTP_TEXTS?.VALIDATION_SUCCESSFULL + }); + return { + status: HTTP_CODES?.OK, + message: HTTP_TEXTS?.VALIDATION_SUCCESSFULL, + file_details: config + } + } else { + logger.warn('Validation error:', { + status: HTTP_CODES?.UNAUTHORIZED, + message: HTTP_TEXTS?.VALIDATION_ERROR + }); + return { + status: HTTP_CODES?.UNAUTHORIZED, + message: HTTP_TEXTS?.VALIDATION_ERROR, + file_details: config + }; + } } else { // if file is not zip // Convert the buffer to a string assuming it's UTF-8 encoded diff --git a/upload-api/src/validators/aem/index.ts b/upload-api/src/validators/aem/index.ts index ba979bf6c..8202c60c1 100644 --- a/upload-api/src/validators/aem/index.ts +++ b/upload-api/src/validators/aem/index.ts @@ -1,38 +1,15 @@ -interface ZipEntry { - dir: boolean; - async( - type: 'string' | 'arraybuffer' | 'uint8array' | 'blob' | 'nodebuffer' | 'base64' - ): Promise; -} - -interface JSZipFiles { - [fileName: string]: ZipEntry; -} +import { validator } from 'migration-aem'; -interface ValidatorProps { - data: { - files: JSZipFiles; - }; -} -async function aemValidator({ data }: ValidatorProps) { +async function aemValidator({ data }: any) { try { - const fileNames = Object.keys(data?.files); - const test = 'jcr:content'; - - for (const fileName of fileNames) { - const file: any = data?.files?.[fileName]; - if (!file?.dir) { - // const content = await file.async('string'); - if (`content.${test}.root`) { - return true; - } - } else { - return false; - } - } - } catch (err) { - console.info('Error : ', err); + const validationReport = await validator(data) + const someValid = Array.isArray(validationReport) && validationReport.some(Boolean); + return someValid; + } + catch (err) { + console.error('Error : ', err); + return false; } } diff --git a/upload-api/src/validators/index.ts b/upload-api/src/validators/index.ts index b3e2d9c94..82560eaba 100644 --- a/upload-api/src/validators/index.ts +++ b/upload-api/src/validators/index.ts @@ -18,7 +18,7 @@ const validator = ({ data, type, extension }: { data: any; type: string; extensi return wordpressValidator(data); } - case 'aem-zip': { + case 'aem-folder': { return aemValidator({ data }); }