0.1.6Updated a month ago
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`);