Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions generatedsvelte/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"@sveltejs/kit": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@types/eslint": "^9.6.0",
"@types/node": "^22.16.4",
"@types/node": "^22.19.3",
"autoprefixer": "^10.4.20",
"eslint": "^9.7.0",
"eslint-config-prettier": "^9.1.0",
Expand All @@ -34,13 +34,14 @@
"svelte-preprocess-react": "^2.1.0",
"svelte-tiny-slider": "^2.0.2",
"tailwindcss": "^3.4.9",
"typescript": "^5.8.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.0.0",
"vite": "^6.3.0",
"vitest": "^3.1.1"
},
"dependencies": {
"@embeddedchat/ui-elements": "^0.1.3",
"@meet-159/discor-stats-counter": "^0.0.7",
"@sveltestrap/sveltestrap": "^6.2.8",
"moment": "^2.30.1"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export function extractSourcePath(buildPath: string, fileName: string, dataItems
});
dataItems.forEach((item) => {
if (trimmedFiles.includes(item.trim())) {
sourcePath[item.trim()] = '../../../../build';
sourcePath[item.trim()] = '../../../build';
} else if(fileName === 'main') {
sourcePath[item] = '../../../src';
}else{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function installPackages(
console.log(`Installing packages in ${directory}: ${newPackages.join(', ')}`);

try {
execSync(`pnpm install ${newPackages.join(' ')}`, { cwd: directory, stdio: 'inherit' });
execSync(`npm install ${newPackages.join(' ')}`, { cwd: directory, stdio: 'inherit' });
newPackages.forEach((pkg) => installedPackages.add(pkg));
console.log('Packages installed successfully.');
} catch (error) {
Expand Down
183 changes: 179 additions & 4 deletions generatedsvelte/src/compiler/scripts/main.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,194 @@
import * as ts from 'typescript';
import * as fs from 'fs';
import * as path from 'path';
//import { extractPackageNames } from "./extract/extractPackageNames";
import { extractPackageNames } from "./extract/extractPackageNames";
import { extractImportStatements } from './extract/extractImportStatements';
import { extractComponentNames } from './extract/extractComponentNames';
import { findFirstJsxOpeningLikeElementWithName } from './extract/findFirstJsxOpeningLikeElementWithName';
import { generateSvelteComponent } from './transform/generateSvelteComponent';
import { transformImportStatements } from './transform/transformImportStatements';
import { transformDataItems } from './transform/transformDataItems';
import { extractData, extractSourcePath } from './extract/extractData';
//import { installPackages } from "./install/installPackages";
import { installPackages } from "./install/installPackages";

const rootDir = path.resolve(process.cwd(), '../');
const projectRoot = path.resolve(".");
const srcPath = path.join(rootDir, 'src');
const buildPathAppDir = path.join(rootDir, 'generatedsvelte/src/routes');
const FETCHER_FILE = path.join(rootDir, 'generatedsvelte/src/lib/util/main.ts');

// Global Set to keep track of installed packages
//const installedPackages = new Set<string>();
const installedPackages = new Set<string>();

/**
* Recursively find all `.agml` files in a directory.
*/
function getAllAgmlFiles(dir: string): string[] {
const entries = fs.readdirSync(dir, { withFileTypes: true });
return entries.flatMap(entry => {
const res = path.join(dir, entry.name);
if (entry.isDirectory()) return getAllAgmlFiles(res);
if (entry.isFile() && res.endsWith('.agml')) return [res];
return [];
});
}

/**
* Parse AGML files and extract dependency names.
*/
function getDependencies(): string[] {
const dependencies = new Set<string>();
const allFiles = getAllAgmlFiles(srcPath);

allFiles.forEach(file => {
const content = fs.readFileSync(file, 'utf-8');
const sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true);
const deps = extractPackageNames(sourceFile);
deps.forEach(dep => dependencies.add(dep));
});

return Array.from(dependencies);
}

/**
* Read existing main.ts and detect which packages are already imported.
*/
function getExistingImports(): string[] {
if (!fs.existsSync(FETCHER_FILE)) return [];
const fileData = fs.readFileSync(FETCHER_FILE, 'utf-8');
const regex = /from\s+["']([^"']+)["']/g;
const existing: string[] = [];
let match;
while ((match = regex.exec(fileData)) !== null) existing.push(match[1]);
return existing;
}

/**
* Update main.ts to include async fetchDataFunction imports + calls.
*/
function updateFetcherFile(newPackages: string[]) {
let content = '';

if (fs.existsSync(FETCHER_FILE)) {
content = fs.readFileSync(FETCHER_FILE, 'utf-8');
if(content == ""){
content = `import { fetchStats } from './countStats';
import { fetchContributors, fetchLastUpdated } from './fetchContributors';
// import {fetchRcStats} from "./countRcStats"
import { fetchEventData } from './fetchEventData';
import { fetchDiscordStats } from './countDiscordStats';

// Auto-generated imports below

async function main(){
// fetchRcStats();
// fetchStats();
// fetchContributors();
// fetchLastUpdated();
// fetchEventData();

// Auto-generated fetch calls below
}

main();
`;
}
} else {
// If main.ts doesn't exist, create base structure
content = `import { fetchStats } from './countStats';
import { fetchContributors, fetchLastUpdated } from './fetchContributors';
// import {fetchRcStats} from "./countRcStats"
import { fetchEventData } from './fetchEventData';
import { fetchDiscordStats } from './countDiscordStats';

// Auto-generated imports below

async function main(){
// fetchRcStats();
// fetchStats();
// fetchContributors();
// fetchLastUpdated();
// fetchEventData();

// Auto-generated fetch calls below
}

main();
`;
}

// Prepare new imports + calls
let newImports = '';
let newCalls = '';

newPackages.forEach(pkg => {
const alias = pkg.replace(/[^a-zA-Z0-9_]/g, '_');
newImports += `import { fetchDataFunction as fetchData_${alias} } from "${pkg}";\n`;
newCalls += ` await fetchData_${alias}();\n`;
});

// Insert new imports just before async function main()
const asyncMainIndex = content.indexOf('async function main()');
if (asyncMainIndex !== -1) {
content =
content.slice(0, asyncMainIndex) +
'\n' +
newImports +
content.slice(asyncMainIndex);
} else {
content = newImports + '\n' + content;
}

// Insert fetch calls inside main(), before its closing brace
const mainEndIndex = content.lastIndexOf('}');
if (mainEndIndex !== -1) {
content =
content.slice(0, mainEndIndex) +
'\n' +
newCalls +
content.slice(mainEndIndex);
} else {
// fallback if async function not found
content += '\n' + newCalls;
}

fs.mkdirSync(path.dirname(FETCHER_FILE), { recursive: true });
fs.writeFileSync(FETCHER_FILE, content, 'utf-8');
console.log(`Updated ${FETCHER_FILE} with new packages:`, newPackages);
}

/**
* Pre-build logic: install packages and update fetcher file.
*/
function runPreBuildStep() {
console.log('Starting pre-build step...');

const deps = getDependencies();
if (deps.length === 0) {
console.log('No package dependencies found in .agml files.');
return;
}

const existingImports = getExistingImports();
const newPackages = deps.filter(pkg => !existingImports.includes(pkg));

if (newPackages.length === 0) {
console.log('No new packages to add. main.ts is up to date.');
return;
}

// Populate installedPackages with existing imports
existingImports.forEach(pkg => installedPackages.add(pkg));

// Install new packages
installPackages(projectRoot, newPackages, installedPackages);

// Update fetcher file
updateFetcherFile(newPackages);

console.log('Pre-build step completed.');
}


function processFile(filePath: string): void {
const fileName = path.basename(filePath, path.extname(filePath));
Expand Down Expand Up @@ -87,5 +260,7 @@ function walkDirectory(dirPath: string): void {
}
}
}

console.log('Starting build process...');
runPreBuildStep();
walkDirectory(srcPath);
console.log('Build process completed.');
18 changes: 12 additions & 6 deletions generatedsvelte/src/lib/util/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ import { fetchEventData } from './fetchEventData';
import {fetchRcStats} from "../util/countRcStats"
import { fetchAllThreads } from './fetchThreads';

fetchRcStats();
fetchStats();
fetchContributors();
fetchEventData();
fetchLastUpdated();
fetchAllThreads();
async function main(){
fetchRcStats();
fetchStats();
fetchContributors();
fetchEventData();
fetchLastUpdated();
fetchAllThreads();


}

main();