1.1.1Updated a month ago
import { walkSync } from "$std/fs/walk.ts";
import { join } from "$std/path/mod.ts";
import { Sort } from "$utils/sort_utils.ts";
import { LatestVersionNumber } from "$utils/version_helpers.ts";
import { Package } from "$classes/package.ts";

console.log("======== LEGACY PACKAGE IMPORTER ========\n");

const found_legacy_modules: Package[] = [];

const packages_root = join(Deno.cwd(), 'packages');
for(const namespaceDir of walkSync(packages_root, { includeFiles: false, maxDepth: 1 })) {
  if(namespaceDir.path == packages_root) continue;

  const namespace = namespaceDir.name;

  for(const packageDir of walkSync(namespaceDir.path, { includeFiles: false, maxDepth: 1 })) {
    if(packageDir.path == namespaceDir.path) continue;

    const name = packageDir.name;

    if(await Package.findOne({ namespace, name })) continue;

    for(const versionDir of walkSync(packageDir.path, { includeDirs: false, maxDepth: 1 })) {
      if(versionDir.name !== 'metadata.json') continue;

      const package_metadata: LegacyMetadata = JSON.parse(Deno.readTextFileSync(versionDir.path));

      const versions = Array.from(
        new Set(
          package_metadata.events.map(e => e.event.replace(/^.*?((?:\d+\.){1,3}\d+)$/, '$1'))
        )
      ).sort(Sort.Version.Descending);

      const _package = new Package({
        namespace,
        name,
        tags: [],
        versions: {
          all: versions,
          latest: LatestVersionNumber(versions),
          current: null
        },
        deprecated: package_metadata.deprecated,
        events: package_metadata.events.map(e => ({
          event: e.event,
          version: e.event.replace(/^.*?((?:\d+\.){1,3}\d+)$/, '$1'),
          timestamp: new Date(e.timestamp).valueOf(),
          token: e.token
        }))
      })

      found_legacy_modules.push(_package);

      continue;
    }
  }
}

console.log(`Found ${found_legacy_modules.length} legacy modules to import\n  - ${found_legacy_modules.map(p => p.url.replace(/^\//, '')).join('\n  - ')}\n`);

if(found_legacy_modules.length > 0) {
  console.log('Running imports...');

  await Array.fromAsync(found_legacy_modules.map(lm => lm.save()));

  console.log("Imports completed");
} else {
  console.log("Nothing to import")
}

interface LegacyMetadata {
  events: {
    token: string
    event: string
    timestamp: string
  }[]
  deprecated: boolean
}