UNPKG

@react-lib-tech/react-tsx-to-jsx

Version:

A tiny React component library (JS) for converting TSX → JSX and extracting text

201 lines (198 loc) 7.92 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.js var index_exports = {}; __export(index_exports, { LovableDownload: () => LovableDownload, convertFolder: () => rename_js_to_jsx_default }); module.exports = __toCommonJS(index_exports); // src/utils/restore-project.jsx var import_axios = __toESM(require("axios"), 1); var import_fs = __toESM(require("fs"), 1); var import_path = __toESM(require("path"), 1); var import_https = __toESM(require("https"), 1); var httpsAgent = new import_https.default.Agent({ rejectUnauthorized: false }); var API_URL = "https://lovable-api.com/projects/"; async function LovableDownload({ PROJECT_Id = "5b9f446c-d608-4948-aed1-7e5ba9ad04c0", Authorization = "", outputDir = process.cwd(), allowBinary = false } = {}) { const baseOut = import_path.default.resolve(outputDir); function safeResolve(rel) { const resolved = import_path.default.resolve(baseOut, rel); if (resolved === baseOut || resolved.startsWith(baseOut + import_path.default.sep)) { return resolved; } throw new Error(`Unsafe path detected: ${rel}`); } try { const res = await import_axios.default.get(API_URL + PROJECT_Id + "/source-code", { httpsAgent, headers: { Authorization } }); const data = res == null ? void 0 : res.data; if (!data || !Array.isArray(data.files)) { console.log("No files returned by API"); return; } for (const file of data == null ? void 0 : data.files) { try { const destPath = safeResolve(file.name); if (file.binary && !allowBinary) { console.log(`\u26A0\uFE0F Skipping binary file: ${file.name}`); continue; } import_fs.default.mkdirSync(import_path.default.dirname(destPath), { recursive: true }); if (file.binary) { const contents = file.contents ?? ""; try { const buffer = Buffer.from(contents, "base64"); import_fs.default.writeFileSync(destPath, buffer); } catch (e) { console.warn(`\u26A0\uFE0F Failed to write binary file ${file.name}: ${e.message}`); continue; } } else { const contents = typeof file.contents === "string" ? file.contents : JSON.stringify(file.contents ?? "", null, 2); import_fs.default.writeFileSync(destPath, contents, "utf8"); } console.log(`\u2705 Created: ${destPath}`); } catch (innerErr) { console.warn(`\u26A0\uFE0F Skipped file ${file.name}: ${innerErr.message}`); } } console.log("\u{1F389} Project restored with correct folder structure!"); console.log(`Files written to: ${baseOut}`); } catch (err) { console.error("\u274C Error:", (err == null ? void 0 : err.message) ?? err); } } // src/utils/rename-js-to-jsx.jsx var import_fs2 = __toESM(require("fs"), 1); var import_path2 = __toESM(require("path"), 1); var import_core = __toESM(require("@babel/core"), 1); function loadGitignore(rootPath = ".") { const gitignorePath = import_path2.default.join(rootPath, ".gitignore"); if (!import_fs2.default.existsSync(gitignorePath)) return []; return import_fs2.default.readFileSync(gitignorePath, "utf8").split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#")); } function patternToRegex(pattern) { let regexStr = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*"); if (pattern.endsWith("/")) { regexStr = regexStr + ".*"; } return new RegExp(regexStr); } function createIgnoreMatcher(rootPath, userSkips = []) { const patterns = [ ...loadGitignore(rootPath).map(patternToRegex), ...userSkips.map(patternToRegex) ]; return function isIgnored(relPath) { const normalized = relPath.replace(/\\/g, "/"); return patterns.some((regex) => regex.test(normalized)); }; } var defaultReplacementRules = [ { find: /@\/components\//g, replace: "../components/" }, { find: /@\/lib\//g, replace: "../../lib/" }, { find: /@\/utils\//g, replace: "../utils/" }, { find: /@\/assets\//g, replace: "../public/assets/" } ]; async function tsxToJsx(tsPath, outPath, isTsx, InputreplacementRules = []) { try { const code = import_fs2.default.readFileSync(tsPath, "utf-8"); const result = await import_core.default.transformAsync(code, { filename: tsPath, presets: ["@babel/preset-typescript"] }); let output = result.code || ""; const replacementRules = [ ...defaultReplacementRules, ...InputreplacementRules ]; replacementRules.forEach((rule) => { output = output.replace(rule.find, rule.replace); }); import_fs2.default.mkdirSync(import_path2.default.dirname(outPath), { recursive: true }); import_fs2.default.writeFileSync(outPath, output, "utf-8"); console.log(`\u2705 Converted: ${tsPath} -> ${outPath}`); } catch (err) { console.error(`\u274C Error converting ${tsPath}:`, err.message); } } var convertFolder = async ({ srcFolder = "src", outFolder = "dist", InputreplacementRules = [], typeConvert = ".jsx", skipFiles = [] }) => { if (!import_fs2.default.existsSync(srcFolder)) { console.error(`\u274C Source folder not found: ${srcFolder}`); return; } const isIgnored = createIgnoreMatcher(process.cwd(), skipFiles); const entries = import_fs2.default.readdirSync(srcFolder, { withFileTypes: true }); for (const entry of entries) { const srcPath = import_path2.default.join(srcFolder, entry.name); const relPath = import_path2.default.relative(process.cwd(), srcPath); if (isIgnored(relPath)) { console.log(`\u23ED\uFE0F Skipped: ${relPath}`); continue; } const outPath = import_path2.default.join(outFolder, entry.name); if (entry.isDirectory()) { await convertFolder({ srcFolder: srcPath, outFolder: outPath, InputreplacementRules, typeConvert, skipFiles }); } else if (entry.isFile()) { if (entry.name.endsWith(".tsx")) { const jsxPath = outPath.replace(/\.tsx$/, typeConvert); await tsxToJsx(srcPath, jsxPath, true, InputreplacementRules); } else if (entry.name.endsWith(".ts")) { const jsPath = outPath.replace(/\.ts$/, ".js"); await tsxToJsx(srcPath, jsPath, false, InputreplacementRules); } } } }; var rename_js_to_jsx_default = convertFolder; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LovableDownload, convertFolder }); //# sourceMappingURL=index.cjs.map