Skip to content

Instantly share code, notes, and snippets.

@NullFragment
Last active May 17, 2022 08:54
Show Gist options
  • Save NullFragment/ccb1cfb5fda14d904f82e2f0ce09136d to your computer and use it in GitHub Desktop.
Save NullFragment/ccb1cfb5fda14d904f82e2f0ce09136d to your computer and use it in GitHub Desktop.
Rewriting file scans in typescript.
import chalk from 'chalk'
import {promises as fs} from 'fs'
import dir from "node-dir";
const config = {
extensions: [
'svelte',
'md',
'js',
'ts'],
rename: ['404'],
catch: [
'ENOENT',
'EEXIST']
}
class Logger {
static log(
message: string,
destination: string,
logColor: string
) {
console.log(chalk.dim(new Date().toLocaleTimeString() + ' ')
+ chalk.magentaBright.bold('[urara] ')
+ chalk[logColor](message + ' ')
+ chalk.dim(destination ?? ''))
}
static error(err: Error) {
console.log(chalk.dim(new Date().toLocaleTimeString()
+ ' ')
+ chalk.redBright.bold('[urara] ')
+ chalk.red('error ')
+ chalk.dim(err.message))
if(!config.catch.includes(err.name)) {
throw err
}
}
}
class FileManager {
static scanWithNodeDir(sourceDir: string) {
const structure = dir.files(
'urara',
'all',
null,
{sync: true})
const structureWithDepth = new Map<string, Map<number, Array<string>>>()
structureWithDepth.set(
'dirs',
new Map<number, Array<string>>())
structureWithDepth.set(
'files',
new Map<number, Array<string>>())
this.addDepthContext(
structureWithDepth,
structure.dirs,
'dirs')
this.addDepthContext(
structureWithDepth,
structure.files,
'files')
return structureWithDepth
}
static async scanDirWithDepth(
sourceDir: string,
depth = 0,
currentTree: Map<string, Map<number, Array<string>>>
): Promise<Map<string, Map<number, Array<string>>>> {
Logger.log(
"Currently mapping: " + sourceDir,
null,
'magenta')
if(!currentTree) {
currentTree = new Map<string, Map<number, Array<string>>>();
currentTree.set(
'dirs',
new Map<number, Array<string>>())
currentTree.set(
'files',
new Map<number, Array<string>>())
}
await fs.readdir(
sourceDir,
{withFileTypes: true})
.then(async files => await Promise.all(files.map(async file => {
const entryName = `${sourceDir}/${file.name}`
const key = file.isDirectory()
? 'dirs'
: 'files'
const vals = currentTree.get(key)
if(vals.has(depth)) {
vals.get(depth)
.push(entryName)
} else {
vals.set(
depth,
[entryName])
}
if(file.isDirectory()) {
await this.scanDirWithDepth(
entryName,
depth + 1,
currentTree)
.then(nextTree => currentTree = new Map([
...Array.from(currentTree.entries()),
...Array.from(nextTree.entries())]))
}
})))
return currentTree;
}
private static addDepthContext(
dirStructure: Map<string, Map<number, Array<string>>>,
listToAdd: Array<string>,
key: string
) {
listToAdd.forEach(item => {
const depth: number = item
.split("\\").length - 2
if(dirStructure.get(key)
.has(depth)) {
dirStructure.get(key)
.get(depth)
.push(item)
} else {
dirStructure.get(key)
.set(
depth,
[item])
}
})
}
}
switch(process.argv[2]) {
case 'scan':
await FileManager.scanDirWithDepth(
"urara",
0,
null)
.then(dirStructure => {
let files = 0
let dirs = 0
const blah = dirStructure.get('dirs')
const blah2 = dirStructure.get('files')
blah.forEach(array => dirs += array.length)
blah2.forEach(array => files += array.length)
console.log(dirs)
console.log(files)
})
console.log(FileManager.scanWithNodeDir('urara'))
}
@NullFragment
Copy link
Author

1:45:16 AM [urara] Currently mapping: urara 
1:45:16 AM [urara] Currently mapping: urara/2021 
1:45:16 AM [urara] Currently mapping: urara/2022 
1:45:16 AM [urara] Currently mapping: urara/about 
1:45:16 AM [urara] Currently mapping: urara/archives 
1:45:16 AM [urara] Currently mapping: urara/assets 
1:45:16 AM [urara] Currently mapping: urara/balanced-armature   
1:45:16 AM [urara] Currently mapping: urara/beatsaber-mapping-1 
1:45:16 AM [urara] Currently mapping: urara/daydream 
1:45:16 AM [urara] Currently mapping: urara/docker-proxy        
1:45:16 AM [urara] Currently mapping: urara/example 
1:45:16 AM [urara] Currently mapping: urara/friends 
1:45:16 AM [urara] Currently mapping: urara/giscus-disqus 
1:45:16 AM [urara] Currently mapping: urara/git-commit-gpgsign 
1:45:16 AM [urara] Currently mapping: urara/github-actions-for-hexo 
1:45:16 AM [urara] Currently mapping: urara/grounded-grid 
1:45:16 AM [urara] Currently mapping: urara/hexo-search 
1:45:16 AM [urara] Currently mapping: urara/iem-idea 
1:45:16 AM [urara] Currently mapping: urara/indieweb 
1:45:16 AM [urara] Currently mapping: urara/intro-urara 
1:45:16 AM [urara] Currently mapping: urara/mikuland-2021summer 
1:45:16 AM [urara] Currently mapping: urara/nectar-hive 
1:45:16 AM [urara] Currently mapping: urara/object-storage-workers 
1:45:16 AM [urara] Currently mapping: urara/p 
1:45:16 AM [urara] Currently mapping: urara/pgp 
1:45:16 AM [urara] Currently mapping: urara/pleroma 
1:45:16 AM [urara] Currently mapping: urara/project-1st 
1:45:16 AM [urara] Currently mapping: urara/project-axe 
1:45:16 AM [urara] Currently mapping: urara/project-axe-p8 
1:45:16 AM [urara] Currently mapping: urara/s3rver 
1:45:16 AM [urara] Currently mapping: urara/ssvm-nodejs 
1:45:16 AM [urara] Currently mapping: urara/theme-m 
1:45:16 AM [urara] Currently mapping: urara/ventoy-archlinux 
1:45:16 AM [urara] Currently mapping: urara/2021/ten-update 
1:45:16 AM [urara] Currently mapping: urara/archives/equalizerapo-lr 
1:45:16 AM [urara] Currently mapping: urara/archives/fb2k-tuningrec 
1:45:16 AM [urara] Currently mapping: urara/intro-urara/toc 
36
162
Map(2) {
  'dirs' => Map(2) {
    0 => [
      'urara\\2021',
      'urara\\2022',
      'urara\\about',
      'urara\\archives',
      'urara\\assets',
      'urara\\balanced-armature',
      'urara\\beatsaber-mapping-1',
      'urara\\daydream',
      'urara\\docker-proxy',
      'urara\\example',
      'urara\\friends',
      'urara\\giscus-disqus',
      'urara\\git-commit-gpgsign',
      'urara\\github-actions-for-hexo',
      'urara\\grounded-grid',
      'urara\\hexo-search',
      'urara\\iem-idea',
      'urara\\indieweb',
      'urara\\intro-urara',
      'urara\\mikuland-2021summer',
      'urara\\nectar-hive',
      'urara\\object-storage-workers',
      'urara\\p',
      'urara\\pgp',
      'urara\\pleroma',
      'urara\\project-1st',
      'urara\\project-axe',
      'urara\\project-axe-p8',
      'urara\\s3rver',
      'urara\\ssvm-nodejs',
      'urara\\theme-m',
      'urara\\ventoy-archlinux'
    ],
    1 => [
      'urara\\2021\\ten-update',
      'urara\\archives\\equalizerapo-lr',
      'urara\\archives\\fb2k-tuningrec',
      'urara\\intro-urara\\toc'
    ]
  },
  'files' => Map(3) {
    1 => [
      'urara\\2021\\index.md',
      'urara\\2022\\2022.avif',
      'urara\\2022\\2022.webp',
      'urara\\2022\\index.md',
      'urara\\about\\index.svelte.md',
      'urara\\archives\\index.md',
      'urara\\assets\\any@1024.png',
      'urara\\assets\\any@180.webp',
      'urara\\assets\\any@192.webp',
      'urara\\assets\\any@24.png',
      'urara\\assets\\any@48.png',
      'urara\\assets\\any@48.webp',
      'urara\\assets\\any@512.png',
      'urara\\assets\\any@512.webp',
      'urara\\assets\\bg.avif',
      'urara\\assets\\bg.webp',
      'urara\\assets\\maskable@1024.png',
      'urara\\assets\\maskable@192.webp',
      'urara\\assets\\maskable@512.png',
      'urara\\assets\\maskable@512.webp',
      'urara\\assets\\universe.png',
      'urara\\balanced-armature\\index.md',
      'urara\\beatsaber-mapping-1\\beatsaber.avif',
      'urara\\beatsaber-mapping-1\\beatsaber.jpg',
      'urara\\beatsaber-mapping-1\\beatsaber.webp',
      'urara\\beatsaber-mapping-1\\index.md',
      'urara\\beatsaber-mapping-1\\unityeditor.avif',
      'urara\\beatsaber-mapping-1\\unityeditor.png',
      'urara\\beatsaber-mapping-1\\unityeditor.webp',
      'urara\\beatsaber-mapping-1\\unityhub1.avif',
      'urara\\beatsaber-mapping-1\\unityhub1.png',
      'urara\\beatsaber-mapping-1\\unityhub1.webp',
      'urara\\beatsaber-mapping-1\\unityhub2.avif',
      'urara\\beatsaber-mapping-1\\unityhub2.png',
      'urara\\beatsaber-mapping-1\\unityhub2.webp',
      'urara\\daydream\\index.md',
      'urara\\docker-proxy\\index.md',
      'urara\\example\\.index.md',
      'urara\\friends\\index.svelte',
      'urara\\giscus-disqus\\client_secret.avif',
      'urara\\giscus-disqus\\client_secret.webp',
      'urara\\giscus-disqus\\env.avif',
      'urara\\giscus-disqus\\env.webp',
      'urara\\giscus-disqus\\github_app.avif',
      'urara\\giscus-disqus\\github_app.webp',
      'urara\\giscus-disqus\\index.md',
      'urara\\giscus-disqus\\private_key.avif',
      'urara\\giscus-disqus\\private_key.webp',
      'urara\\git-commit-gpgsign\\cover.avif',
      'urara\\git-commit-gpgsign\\cover.webp',
      'urara\\git-commit-gpgsign\\index.md',
      'urara\\git-commit-gpgsign\\verified.avif',
      'urara\\git-commit-gpgsign\\verified.webp',
      'urara\\github-actions-for-hexo\\index.md',
      'urara\\grounded-grid\\.index.md',
      'urara\\hexo-search\\index.md',
      'urara\\iem-idea\\2nd.avif',
      'urara\\iem-idea\\2nd.webp',
      'urara\\iem-idea\\index.md',
      'urara\\indieweb\\index.md',
      'urara\\intro-urara\\index.svelte.md',
      'urara\\intro-urara\\re.avif',
      'urara\\intro-urara\\re.md',
      'urara\\intro-urara\\re.webp',
      'urara\\mikuland-2021summer\\artgallery-1.avif',
      'urara\\mikuland-2021summer\\artgallery-1.webp',
      'urara\\mikuland-2021summer\\artgallery-2.avif',
      'urara\\mikuland-2021summer\\artgallery-2.webp',
      'urara\\mikuland-2021summer\\artgallery-3.avif',
      'urara\\mikuland-2021summer\\artgallery-3.webp',
      'urara\\mikuland-2021summer\\bonodori-1.avif',
      'urara\\mikuland-2021summer\\bonodori-1.webp',
      'urara\\mikuland-2021summer\\bonodori-2.avif',
      'urara\\mikuland-2021summer\\bonodori-2.webp',
      'urara\\mikuland-2021summer\\bonodori-3.avif',
      'urara\\mikuland-2021summer\\bonodori-3.webp',
      'urara\\mikuland-2021summer\\bonodori-4.avif',
      'urara\\mikuland-2021summer\\bonodori-4.webp',
      'urara\\mikuland-2021summer\\index.md',
      'urara\\mikuland-2021summer\\mermaidstage-1.avif',
      'urara\\mikuland-2021summer\\mermaidstage-1.webp',
      'urara\\mikuland-2021summer\\mermaidstage-2.avif',
      'urara\\mikuland-2021summer\\mermaidstage-2.webp',
      'urara\\mikuland-2021summer\\mermaidstage-3.avif',
      'urara\\mikuland-2021summer\\mermaidstage-3.webp',
      'urara\\mikuland-2021summer\\outdoorshop-1.avif',
      'urara\\mikuland-2021summer\\outdoorshop-1.webp',
      'urara\\mikuland-2021summer\\outdoorshop-2.avif',
      'urara\\mikuland-2021summer\\outdoorshop-2.webp',
      'urara\\mikuland-2021summer\\parasolbeach-1.avif',
      'urara\\mikuland-2021summer\\parasolbeach-1.webp',
      'urara\\mikuland-2021summer\\room-1.avif',
      'urara\\mikuland-2021summer\\room-1.webp',
      'urara\\mikuland-2021summer\\room-2.avif',
      'urara\\mikuland-2021summer\\room-2.webp',
      'urara\\mikuland-2021summer\\snowglobeillumination-1.avif',
      'urara\\mikuland-2021summer\\snowglobeillumination-1.webp',
      'urara\\mikuland-2021summer\\snowglobeillumination-2.avif',
      'urara\\mikuland-2021summer\\snowglobeillumination-2.webp',
      'urara\\mikuland-2021summer\\snowglobeillumination-3.avif',
      ... 46 more items
    ],
    2 => [
      'urara\\2021\\ten-update\\index.md',
      'urara\\archives\\equalizerapo-lr\\1.png',
      'urara\\archives\\equalizerapo-lr\\config.avif',
      'urara\\archives\\equalizerapo-lr\\config.webp',
      'urara\\archives\\equalizerapo-lr\\index.md',
      'urara\\archives\\fb2k-tuningrec\\1.avif',
      'urara\\archives\\fb2k-tuningrec\\1.png',
      'urara\\archives\\fb2k-tuningrec\\1.webp',
      'urara\\archives\\fb2k-tuningrec\\2.avif',
      'urara\\archives\\fb2k-tuningrec\\2.png',
      'urara\\archives\\fb2k-tuningrec\\2.webp',
      'urara\\archives\\fb2k-tuningrec\\index.md',
      'urara\\intro-urara\\toc\\index.md'
    ],
    0 => [ 'urara\\favicon.ico', 'urara\\favicon.png', 'urara\\robots.txt' ]
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment