import { join } from "https://deno.land/std@0.224.0/path/join.ts";
import { Viapak } from "https://viapak.xyz/@viamedia/infinity-beyond/modules/viapak.ts";
import { randomUUID } from "node:crypto";
const white = "\u001B[0m";
const blue = "\u001B[34m";
const pink = "\u001B[35m";
const blue_bg = "\u001B[44m";
const banner_color = blue;
const banner_text = ` ${pink}Infinity Beyond${banner_color} v0.1.5 `;
// deno-lint-ignore no-control-regex
const banner_length = banner_text.replace(/\u001b\[\d+m/g, '').length;
const horiz_lines = "─".repeat(banner_length);
console.log(`
${banner_color}┌${horiz_lines}┐
│${banner_text}│
└${horiz_lines}┘${white}`);
console.log(`\nYou are about to create a new Infinity Beyond project.\n\nEnter a human-readable name for your application.\n`);
const app_name = prompt('♾️ Name >');
if(!app_name) Deno.exit(0);
const Sluggify = (input: string) => input
.replace(/([a-z])([A-Z])/g, '$1_$2')
.replace(/[^\w]/g, '_')
.replace(/_{2,}/g, '_')
.replace(/^[\s_]+|[\s_]+$/, '')
.toLowerCase();
const app_slug = Sluggify(app_name);
const write = (path: string, contents: string) => {
contents = contents.replace(/\{\{APP_NAME\}\}/g, app_name);
contents = contents.replace(/\{\{RANDOM_UUID\}\}/g, () => randomUUID());
Deno.writeTextFileSync(join(Deno.cwd(), app_slug, path), contents);
}
console.log(`\nCreating '${app_name}' in ./${app_slug}\n`);
const mkdir = (path: string, { recursive = false } = {}) => {
try { Deno.mkdirSync(path, { recursive }) } catch(_) { /* Ignore existing folders */}
}
mkdir(join(Deno.cwd(), app_slug, 'app/islands/utils'), { recursive: true });
mkdir(join(Deno.cwd(), app_slug, '.infb'));
mkdir(join(Deno.cwd(), app_slug, '.vscode'));
mkdir(join(Deno.cwd(), app_slug, 'classes'));
mkdir(join(Deno.cwd(), app_slug, 'app/components'));
mkdir(join(Deno.cwd(), app_slug, 'app/routes'));
mkdir(join(Deno.cwd(), app_slug, 'app/static'));
console.log(` '- creating directories (7/7)`);
const init_files: string[] = [
'.infb/build.ts',
'.infb/prepare.ts',
'.infb/serve.ts',
'.vscode/settings.json',
'app/custom_nav_items.ts',
'_host.ts',
'_processor.ts',
'.dockerignore',
'.env',
'deno.json',
'Dockerfile',
];
for(const file of init_files) {
write(file, await Viapak.text(`/.viapak/init_resources/${file}`));
}
console.log(` '- spawning template (${init_files.length}/${init_files.length})`);
const prepare = new Deno.Command('deno', {
args: ['task', 'prepare'],
cwd: join(Deno.cwd(), app_slug)
});
console.log(` '- preparing packages`);
await prepare.output();
const install = new Deno.Command('deno', {
args: ['install', '--allow-import'],
cwd: join(Deno.cwd(), app_slug)
});
console.log(` '- installing dependencies`);
await install.output();
console.log(`\n${pink}Infinity Beyond${white} > The [${app_name}] instance has been initialized!\n\nChange the necessary environment variables in ./.env, start the project with:\n\n${blue_bg}> deno task dev${white}\n`);