diff --git a/.gitignore b/.gitignore index c20ac70..04da9ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +_dist src/wasm/bin # Created by https://www.toptal.com/developers/gitignore/api/git,node,c,c++ diff --git a/package-lock.json b/package-lock.json index 27883fa..c72adae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,466 @@ "": { "name": "osfs-wasm", "version": "1.0.0", - "license": "MPL-2.0" + "license": "MPL-2.0", + "devDependencies": { + "esbuild": "^0.24.0", + "esbuild-copy-files-plugin": "^1.2.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/esbuild-copy-files-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/esbuild-copy-files-plugin/-/esbuild-copy-files-plugin-1.2.1.tgz", + "integrity": "sha512-lTnfQFd66h0D9MaJuLPeWB55CDo5NYREAO0C/UF7uqOqjJGnMehggGb7FmR00mG3QoqPheuCVOdu01neqCyjxw==", + "dev": true, + "license": "MIT" } } } diff --git a/package.json b/package.json index 9490a69..42b544c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "src/index.mjs", "scripts": { "test": "echo \"No tests have been implemented yet\"", - "build": "src/wasm/compile-wasm.sh" + "build": "src/wasm/compile-wasm.sh && ./src/esbuild.mjs" }, "repository": { "type": "git", @@ -18,5 +18,9 @@ "bindings" ], "author": "Starbeamrainbowlabs ", - "license": "MPL-2.0" -} \ No newline at end of file + "license": "MPL-2.0", + "devDependencies": { + "esbuild": "^0.24.0", + "esbuild-copy-files-plugin": "^1.2.1" + } +} diff --git a/src/demo.html b/src/demo.html new file mode 100644 index 0000000..8104d9f --- /dev/null +++ b/src/demo.html @@ -0,0 +1,13 @@ + + + + + OSFS WASM test + + + content here + + + + + \ No newline at end of file diff --git a/src/esbuild.mjs b/src/esbuild.mjs new file mode 100755 index 0000000..4616ed9 --- /dev/null +++ b/src/esbuild.mjs @@ -0,0 +1,70 @@ +#!/usr/bin/env node +"use strict"; + +import crypto from 'crypto'; +import path from 'path'; +import fs from 'fs'; + +import esbuild from 'esbuild'; +import copy_files from 'esbuild-copy-files-plugin'; + +import log from './lib/io/NamespacedLog.mjs'; const l = log("esbuild"); + + +const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf("/")); +const outdir = path.resolve(__dirname, "./_dist"); + +function make_context() { + return { + entryPoints: [ + "./index.mjs", + // "./index.css", + ].map(filepath => path.resolve(__dirname, filepath)), + outdir, + bundle: true, + minify: typeof process.env.NO_MINIFY === "undefined", + sourcemap: true, + treeShaking: true, + loader: { + ".html": "text", + }, + external: ["fs", "path"], + plugins: [ + copy_files({ + source: [ + "src/demo.html" + ], + target: outdir, + copyWithFolder: true + }), + { + name: "print", + setup(build) { + build.onEnd(_result => { + console.log(`${new Date().toISOString()} | Build complete`); + }) + } + } + ] + }; +} + +(async () => { + "use strict"; + switch (process.env.ES_MODE ?? "build") { + case "build": + const result = await esbuild.build(make_context()); + if (result.errors.length > 0 || result.warnings.length > 0) + l.error(result); + break; + + case "watch": + const ctx = await esbuild.context(make_context()); + await ctx.watch(); + l.log(`>>> Watching for changes`); + break; + } + + // l.log(await esbuild.analyzeMetafile(result.metafile)); +})(); + diff --git a/src/lib/io/Ansi.mjs b/src/lib/io/Ansi.mjs new file mode 100644 index 0000000..26415ff --- /dev/null +++ b/src/lib/io/Ansi.mjs @@ -0,0 +1,88 @@ +"use strict"; + +/** + * Generates various VT100 ANSI escape sequences. + * Ported from C#. + * @licence MPL-2.0 + * @source https://gist.github.com/a4edd3204a03f4eedb79785751efb0f3#file-ansi-cs + * @author Starbeamrainbowlabs + * GitHub: @sbrl | Twitter: @SBRLabs | Reddit: u/Starbeamrainbowlabs + ***** Changelog ***** + * 27th March 2019: + * - Initial public release + * 9th March 2020: + * - Add Italics (\u001b[3m]) + * - Export a new instance of it by default (makes it so that there's 1 global instance) + * 5th September 2020: + * - Add support for NO_COLOR environment variable + */ +class Ansi { + constructor() { + /** + * Whether we should *actually* emit ANSI escape codes or not. + * Useful when we want to output to a log file, for example + * @type {Boolean} + */ + this.enabled = true; + + this.escape_codes(); + } + + escape_codes() { + if(typeof process !== "undefined" && typeof process.env.NO_COLOR == "string") { + this.enabled = false; + return; + } + // Solution on how to output ANSI escape codes in C# from here: + // https://www.jerriepelser.com/blog/using-ansi-color-codes-in-net-console-apps + this.reset = this.enabled ? "\u001b[0m" : ""; + this.hicol = this.enabled ? "\u001b[1m" : ""; + this.locol = this.enabled ? "\u001b[2m" : ""; + this.italics = this.enabled ? "\u001b[3m" : ""; + this.underline = this.enabled ? "\u001b[4m" : ""; + this.inverse = this.enabled ? "\u001b[7m" : ""; + this.fblack = this.enabled ? "\u001b[30m" : ""; + this.fred = this.enabled ? "\u001b[31m" : ""; + this.fgreen = this.enabled ? "\u001b[32m" : ""; + this.fyellow = this.enabled ? "\u001b[33m" : ""; + this.fblue = this.enabled ? "\u001b[34m" : ""; + this.fmagenta = this.enabled ? "\u001b[35m" : ""; + this.fcyan = this.enabled ? "\u001b[36m" : ""; + this.fwhite = this.enabled ? "\u001b[37m" : ""; + this.bblack = this.enabled ? "\u001b[40m" : ""; + this.bred = this.enabled ? "\u001b[41m" : ""; + this.bgreen = this.enabled ? "\u001b[42m" : ""; + this.byellow = this.enabled ? "\u001b[43m" : ""; + this.bblue = this.enabled ? "\u001b[44m" : ""; + this.bmagenta = this.enabled ? "\u001b[45m" : ""; + this.bcyan = this.enabled ? "\u001b[46m" : ""; + this.bwhite = this.enabled ? "\u001b[47m" : ""; + } + + // Thanks to http://ascii-table.com/ansi-escape-sequences.php for the following ANSI escape sequences + up(lines = 1) { + return this.enabled ? `\u001b[${lines}A` : ""; + } + down(lines = 1) { + return this.enabled ? `\u001b[${lines}B` : ""; + } + right(lines = 1) { + return this.enabled ? `\u001b[${lines}C` : ""; + } + left(lines = 1) { + return this.enabled ? `\u001b[${lines}D` : ""; + } + + jump_to(x, y) { + return this.enabled ? `\u001b[${y};${x}H` : ""; + } + + cursor_pos_save() { + return this.enabled ? `\u001b[s` : ""; + } + cursor_pos_restore() { + return this.enabled ? `\u001b[u` : ""; + } +} + +export default (new Ansi()); diff --git a/src/lib/io/Log.mjs b/src/lib/io/Log.mjs new file mode 100644 index 0000000..65a48f3 --- /dev/null +++ b/src/lib/io/Log.mjs @@ -0,0 +1,71 @@ +"use strict"; + +import a from './Ansi.mjs'; + +const LOG_LEVELS = { + DEBUG: 0, + INFO: 1, + LOG: 2, + WARN: 4, + ERROR: 8, + NONE: 2048 +}; + +class Log { + constructor() { + this.start = new Date(); + + this.level = LOG_LEVELS.DEBUG; + } + + + debug(...message) { + if(this.level > LOG_LEVELS.DEBUG) return; + this.__do_log("debug", ...message); + } + + info(...message) { + if(this.level > LOG_LEVELS.INFO) return; + this.__do_log("info", ...message); + } + + log(...message) { + if(this.level > LOG_LEVELS.LOG) return; + this.__do_log("log", ...message); + } + + warn(...message) { + if(this.level > LOG_LEVELS.WARN) return; + this.__do_log("warn", ...message); + } + + error(...message) { + if(this.level > LOG_LEVELS.ERROR) return; + this.__do_log("error", ...message); + } + + + __do_log(level, ...message) { + message.unshift(`${a.locol}[ ${((new Date() - this.start) / 1000).toFixed(3)}]${a.reset}`); + let part = `[ ${level} ]`; + switch(level) { + case "debug": + part = a.locol + part; + break; + case "warn": + part = a.fyellow + part; + break; + case "error": + part = a.fred + part; + break; + } + message.unshift(part) + + console.error(...message); + } +} + +// You won't normally need these +export { LOG_LEVELS }; + +export default new Log(); diff --git a/src/lib/io/NamespacedLog.mjs b/src/lib/io/NamespacedLog.mjs new file mode 100644 index 0000000..0b93dd6 --- /dev/null +++ b/src/lib/io/NamespacedLog.mjs @@ -0,0 +1,52 @@ +"use strict"; + +import a from './Ansi.mjs'; +import l from './Log.mjs'; + + +/** + * Hashes a string to a numerical value. + * NOT CRYPTOGRAPHICALLY SECURE! + * @param {string} str The string to hash. + * @return {number} The resulting hashed value as a number. + */ +function hash_numeric(str) { + let hash = 0; + for (let i = 0; i < str.length; i++) { + hash = ((hash << 5) - hash) + str.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + return hash; +} + + + +class NamespacedLog { + constructor(namespace) { + this.namespace = namespace; + + // From https://github.com/debug-js/debug/blob/master/src/node.js#L35 + let colours = [ + 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, + 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, + 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 214, 215, 220, 221 + ]; + this.nscolour = colours[Math.abs(hash_numeric(this.namespace)) % colours.length]; + let colouransi = `\u001b[3${(this.nscolour < 8 ? this.nscolour : '8;5;' + this.nscolour)}m`; + if(!a.enabled) colouransi = ""; + this.ns = `${colouransi}${this.namespace}${a.reset}`; + } + + debug(...msg) { l.debug(this.ns, ...msg); } + info(...msg) { l.info(this.ns, ...msg); } + log(...msg) { l.log(this.ns, ...msg); } + warn(...msg) { l.warn(this.ns, ...msg); } + error(...msg) { l.error(this.ns, ...msg); } +} + +export default function(namespace) { + return new NamespacedLog(namespace); +};