diff --git a/api/package-lock.json b/api/package-lock.json index d7299d6f8..ab9c5f60a 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -13,7 +13,7 @@ "@contentstack/cli-utilities": "^1.7.1", "@contentstack/json-rte-serializer": "^2.0.7", "@contentstack/marketplace-sdk": "^1.2.4", - "axios": "^1.7.8", + "axios": "^1.8.2", "chokidar": "^3.6.0", "cors": "^2.8.5", "dotenv": "^16.3.1", @@ -1638,9 +1638,10 @@ } }, "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", diff --git a/api/package.json b/api/package.json index adc83e7af..f15c1f33e 100644 --- a/api/package.json +++ b/api/package.json @@ -29,7 +29,7 @@ "@contentstack/cli-utilities": "^1.7.1", "@contentstack/json-rte-serializer": "^2.0.7", "@contentstack/marketplace-sdk": "^1.2.4", - "axios": "^1.7.8", + "axios": "^1.8.2", "chokidar": "^3.6.0", "cors": "^2.8.5", "dotenv": "^16.3.1", diff --git a/package-lock.json b/package-lock.json index 1ed2d4fab..ac76a69f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "husky": "^4.3.8", "prettier": "^2.4.1", "rimraf": "^3.0.2", - "validate-branch-name": "^1.3.0" + "validate-branch-name": "^1.3.0", + "xml2js": "^0.5.0" } }, "node_modules/@babel/code-frame": { @@ -121,16 +122,6 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -763,6 +754,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, "node_modules/semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", @@ -838,13 +836,6 @@ "node": ">=8" } }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" - }, "node_modules/validate-branch-name": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/validate-branch-name/-/validate-branch-name-1.3.1.tgz", @@ -912,6 +903,30 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 742eff064..e1feb8a51 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "prettier": "^2.4.1", "rimraf": "^3.0.2", "validate-branch-name": "^1.3.0", - "xml2js":"^0.4.14" + "xml2js": "^0.5.0" }, "husky": { "hooks": {} diff --git a/upload-api/migration-wordpress/index.js b/upload-api/migration-wordpress/index.js index 8afcaa16c..830906da6 100644 --- a/upload-api/migration-wordpress/index.js +++ b/upload-api/migration-wordpress/index.js @@ -1,8 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ const extractContentTypes = require('./libs/content_types.js'); const contentTypeMaker = require('./libs/contenttypemapper.js'); +const extractLocale = require('./libs/extractLocale.js') module.exports = { - extractContentTypes, // - contentTypeMaker // + extractContentTypes, + contentTypeMaker, + extractLocale }; diff --git a/upload-api/migration-wordpress/libs/extractLocale.js b/upload-api/migration-wordpress/libs/extractLocale.js new file mode 100644 index 000000000..c4e73d739 --- /dev/null +++ b/upload-api/migration-wordpress/libs/extractLocale.js @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require('fs'); + +/** + * Extracts unique languages/locales from a WordPress exported JSON file. + * + * @param {string} path - The file path to the WordPress JSON export. + * @returns {string[]} - An array of unique language codes found in the JSON data. + * @throws {Error} - Throws an error if the file cannot be read or parsed. + */ +const extractLocale = (path) => { + try { + const rawData = fs.readFileSync(path, 'utf8'); + const jsonData = JSON.parse(rawData); + const uniqueLanguages = new Set(); + + // Extract global language (if exists) + if (jsonData.rss?.channel?.language) { + uniqueLanguages.add(jsonData.rss.channel.language); + } + + // Extract entry-level languages (if available) + const items = jsonData?.rss?.channel?.item || []; + items.forEach((item) => { + if (item['wp:postmeta']) { + const postMeta = Array.isArray(item['wp:postmeta']) ? item['wp:postmeta'] : [item['wp:postmeta']]; + postMeta.forEach((meta) => { + if (meta['wp:meta_key']?.toLowerCase() === 'language' && meta['wp:meta_value']) { + uniqueLanguages.add(meta['wp:meta_value']); + } + }); + } + }); + + return [...uniqueLanguages]; + } catch (err) { + throw new Error(`Error reading JSON file: ${err.message}`); + } +}; + + +module.exports = extractLocale; diff --git a/upload-api/package-lock.json b/upload-api/package-lock.json index bdbd8b954..253d2c07a 100644 --- a/upload-api/package-lock.json +++ b/upload-api/package-lock.json @@ -12,7 +12,7 @@ "@aws-sdk/client-s3": "^3.529.0", "@contentstack/cli-utilities": "^1.5.12", "@typescript-eslint/parser": "^7.7.1", - "axios": "^1.7.8", + "axios": "^1.8.2", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.12", "cors": "^2.8.5", @@ -2735,7 +2735,6 @@ }, "node_modules/@types/node": { "version": "20.17.9", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -3368,7 +3367,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.7.9", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -9226,7 +9227,6 @@ }, "node_modules/typescript": { "version": "5.7.2", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -9262,7 +9262,6 @@ }, "node_modules/undici-types": { "version": "6.19.8", - "dev": true, "license": "MIT" }, "node_modules/unique-string": { diff --git a/upload-api/package.json b/upload-api/package.json index ffd993239..a554beadc 100644 --- a/upload-api/package.json +++ b/upload-api/package.json @@ -35,7 +35,7 @@ "@aws-sdk/client-s3": "^3.529.0", "@contentstack/cli-utilities": "^1.5.12", "@typescript-eslint/parser": "^7.7.1", - "axios": "^1.7.8", + "axios": "^1.8.2", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.12", "cors": "^2.8.5", diff --git a/upload-api/src/controllers/wordpress/index.ts b/upload-api/src/controllers/wordpress/index.ts index f49afbfc3..bdb388b16 100644 --- a/upload-api/src/controllers/wordpress/index.ts +++ b/upload-api/src/controllers/wordpress/index.ts @@ -2,10 +2,15 @@ import axios from "axios"; import logger from "../../utils/logger"; import { HTTP_CODES, HTTP_TEXTS } from "../../constants"; // eslint-disable-next-line @typescript-eslint/no-var-requires -const { extractContentTypes, contentTypeMaker } = require('migration-wordpress') +const { extractContentTypes, contentTypeMaker, extractLocale } = require('migration-wordpress') + + const createWordpressMapper = async (filePath: string = "", projectId: string | string[], app_token: string | string[], affix: string | string[], config: object) => { try { + + const localeData = await extractLocale(filePath); + await extractContentTypes(affix); const contentTypeData = await contentTypeMaker(affix) if(contentTypeData){ @@ -27,7 +32,27 @@ const createWordpressMapper = async (filePath: string = "", projectId: string | data: JSON.stringify(fieldMapping), }; const response = await axios.request(config) - // console.log(response); + + const mapperConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${process.env.NODE_BACKEND_API}/v2/migration/localeMapper/${projectId}`, + headers: { + app_token, + 'Content-Type': 'application/json' + }, + data: { + locale:Array.from(localeData) + }, + }; + + const mapRes = await axios.request(mapperConfig) + if(mapRes?.status==200){ + logger.info('Legacy CMS', { + status: HTTP_CODES?.OK, + message: HTTP_TEXTS?.LOCALE_SAVED, + }); + } } } catch (err: any) { console.error("🚀 ~ createWordpressMapper ~ err:", err?.response?.data ?? err)