one
Version:
One is a new React Framework that makes Vite serve both native and web.
121 lines (119 loc) • 4.21 kB
JavaScript
import { existsSync } from "fs";
import { readFile, writeFile } from "fs/promises";
async function injectRouteHelpers(filePath, routePath, mode) {
if (!existsSync(filePath)) return !1;
try {
var content = await readFile(filePath, "utf-8"),
modified = !1,
hasTypeRoute = /^type\s+Route\s*=/m.test(content),
hasConstRoute = /^const\s+route\s*=/m.test(content);
if (mode === "runtime" && !hasConstRoute) {
var {
updatedContent
} = addCreateRouteImport(content);
content = updatedContent;
var routeDeclaration = `const route = createRoute<'${routePath}'>()`;
content = insertAfterImports(content, routeDeclaration), modified = !0;
}
if (mode === "type" && !hasTypeRoute) {
var {
updatedContent: updatedContent1
} = addRouteTypeImport(content);
content = updatedContent1;
var typeDeclaration = `type Route = RouteType<'${routePath}'>`;
content = insertAfterImports(content, typeDeclaration), modified = !0;
}
return modified ? (await writeFile(filePath, content, "utf-8"), !0) : !1;
} catch (error) {
return console.error(`Failed to inject route helpers into ${filePath}:`, error), !1;
}
}
function addCreateRouteImport(content) {
if (/import\s+[^'"]*createRoute[^'"]*from\s+['"]one['"]/m.test(content)) return {
updatedContent: content,
importAdded: !1
};
var oneImportRegex = /import\s+{([^}]*)}\s+from\s+['"]one['"]/m,
match = content.match(oneImportRegex);
if (match) {
var existingImports = match[1].trim(),
newImports = existingImports ? `${existingImports}, createRoute` : "createRoute",
updatedContent = content.replace(oneImportRegex, `import { ${newImports} } from 'one'`);
return {
updatedContent,
importAdded: !0
};
}
var lastImportIndex = findLastImportIndex(content);
if (lastImportIndex >= 0) {
var lines = content.split(`
`);
return lines.splice(lastImportIndex + 1, 0, "import { createRoute } from 'one'"), {
updatedContent: lines.join(`
`),
importAdded: !0
};
}
var newImport = `import { createRoute } from 'one'
`;
return {
updatedContent: newImport + content,
importAdded: !0
};
}
function addRouteTypeImport(content) {
if (/import\s+type\s+[^'"]*RouteType[^'"]*from\s+['"]one['"]/m.test(content)) return {
updatedContent: content,
importAdded: !1
};
var oneTypeImportRegex = /import\s+type\s+{([^}]*)}\s+from\s+['"]one['"]/m,
match = content.match(oneTypeImportRegex);
if (match) {
var existingImports = match[1].trim(),
newImports = existingImports ? `${existingImports}, RouteType` : "RouteType",
updatedContent = content.replace(oneTypeImportRegex, `import type { ${newImports} } from 'one'`);
return {
updatedContent,
importAdded: !0
};
}
var lastImportIndex = findLastImportIndex(content);
if (lastImportIndex >= 0) {
var lines = content.split(`
`);
return lines.splice(lastImportIndex + 1, 0, "import type { RouteType } from 'one'"), {
updatedContent: lines.join(`
`),
importAdded: !0
};
}
var newImport = `import type { RouteType } from 'one'
`;
return {
updatedContent: newImport + content,
importAdded: !0
};
}
function findLastImportIndex(content) {
for (var lines = content.split(`
`), lastImportIndex = -1, i = 0; i < lines.length; i++) {
var line = lines[i].trim();
if (line.startsWith("import ") || lastImportIndex >= 0 && (line.startsWith("from ") || line === "}")) lastImportIndex = i;else if (lastImportIndex >= 0 && line && !line.startsWith("//")) break;
}
return lastImportIndex;
}
function insertAfterImports(content, codeToInsert) {
var lines = content.split(`
`),
lastImportIndex = findLastImportIndex(content);
if (lastImportIndex >= 0) {
var nextLine = lines[lastImportIndex + 1],
hasBlankLine = nextLine === "";
return hasBlankLine ? lines.splice(lastImportIndex + 2, 0, codeToInsert, "") : lines.splice(lastImportIndex + 1, 0, "", codeToInsert, ""), lines.join(`
`);
}
return codeToInsert + `
` + content;
}
export { injectRouteHelpers };
//# sourceMappingURL=injectRouteHelpers.native.js.map