diff --git a/README.md b/README.md deleted file mode 100644 index 6bcf195..0000000 --- a/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Warning - -This version didn't work, this is a work in project, you can use quickmap.db util we finish. - -# Database - -A quick-deploy database server diff --git a/bin/start.js b/bin/start.js deleted file mode 100644 index 908ba84..0000000 --- a/bin/start.js +++ /dev/null @@ -1 +0,0 @@ -#!/usr/bin/env node diff --git a/cm.js b/cm.js deleted file mode 100644 index 3b9a4e3..0000000 --- a/cm.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - 'cc': 'helloworld' -} \ No newline at end of file diff --git a/config.js b/config.js deleted file mode 100644 index 45c25c6..0000000 --- a/config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - port: 4000 -} \ No newline at end of file diff --git a/package.json b/package.json index f387c55..88d9b70 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,25 @@ { - "name": "@thundernetworkrad/mit.db", - "version": "2023.01.26", - "description": "An online server for quickmap.db", - "main": "index.js", + "name": "mit.db", + "version": "2023.02.04", + "description": "An easy and quick database that works", + "main": "build/index.js", + "types": "build/index.d.ts", "scripts": { - "test": "node index.js" + "install": "tsc" }, "repository": { "type": "git", - "url": "git+https://github.com/ThunderNetworkRaD/mit.db.git" + "url": "git+https://github.com/ThunderNetworkRaD/map.db.git" }, - "keywords": [ - "Database" - ], - "author": "Thunder Network RaD | Killer Boss Original", + "author": "Thunder Network Development | Killer Boss Original", "license": "ISC", "bugs": { - "url": "https://github.com/ThunderNetworkRaD/mit.db/issues" - }, - "homepage": "https://github.com/ThunderNetworkRaD/mit.db#readme", - "bin": { - "start": "./bin/start.js", - "version": "" + "url": "https://github.com/ThunderNetworkRaD/map.db/issues" }, + "homepage": "https://github.com/ThunderNetworkRaD/map.db#readme", "dependencies": { - "@thundernetworkrad/colors": "^2023.1.10", - "@thundernetworkrad/map.db": "^2022.12.29", - "@thundernetworkrad/readline-sync": "^2023.1.10", - "express": "^4.18.2", - "yargs": "^17.6.2" + "@types/node": "^18.11.18", + "tslib": "^2.4.1", + "typescript": "^4.9.5" } } diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..ecb0201 --- /dev/null +++ b/readme.md @@ -0,0 +1,63 @@ +# Map.db + +MapDB A Map that stores data locally and loads it at startup. Written in JavaScript + +### How does it work? + +Map.db works just like the JavaScript built-in **Map**, with the same methods and functionalities, and in fact it uses itself a Map, but while the built-in Map only stores data in internal memory, this module **stores data locally in a file and loads it back in the Map at startup**. + +The purpose of this module is to make the JavaScript built-in Map an actual **database**, and there comes the name `map.db`: a Map that can be used as a database. + +The file structure is easily accessible and the data is stored in JSON format, allowing manual editing + +You also have the option to only use local storage without touching internal memory + +### Differences + +Although this module works in fact the same way as a Map, there are still some little differences between them, which are listed below: + +> - `MapDB#set()` and `MapDB#delete()` return **promises** +> - `Map#size` in map.db is a **method** (`MapDB#size()`) +> - When a value is reassigned to a key, it is only saved in the Map but not in the actual save file, so you always have to **set the key/value pair with the new value**. +> Example: + +```js +const { MapDB } = require('quickmap.db'); +const mapdb = new MapDB('file.db'); // this is the save file's name + extension +async function sample() { + // assuming 'somekey' exists in the Map and has a value { cool: false } + const data = mapdb.get('somekey'); + // reassigning the 'cool' property a new value + data.cool = true; + await mapdb.set('somekey', data); + // now 'somekey' has a new value { cool: true } +} +``` + +### Docs + +#### Installation + +With **npm**: + +`npm i quickmap.db` + + +#### Setup + +```js +const { MapDB } = require('quickmap.db') +const db = new MapDB('database.json') // this is the save file's name + extension +``` + +#### set() + +```js +await db.set('what', 'how') +``` + +#### get() + +```js +var answ = db.get('what') // answ = how +``` diff --git a/readmeold.txt b/readmeold.txt new file mode 100644 index 0000000..391517d --- /dev/null +++ b/readmeold.txt @@ -0,0 +1,62 @@ +# Map.db + +MapDB A Map that stores data locally and loads it at startup. Written in JavaScript + +### How does it work? + +Map.db works just like the JavaScript built-in **Map**, with the same methods and functionalities, and in fact it uses itself a Map, but while the built-in Map only stores data in internal memory, this module **stores data locally in a file and loads it back in the Map at startup**. + +The purpose of this module is to make the JavaScript built-in Map an actual **database**, and there comes the name `map.db`: a Map that can be used as a database. + +The file structure is easily accessible and the data is stored in JSON format, allowing manual editing + +You also have the option to only use local storage without touching internal memory + +### Differences + +Although this module works in fact the same way as a Map, there are still some little differences between them, which are listed below: + +> - `MapDB#set()` return **promises** +> - When a value is reassigned to a key, it is only saved in the Map but not in the actual save file, so you always have to **set the key/value pair with the new value**. +> Example: + +```js +const { MapDB } = require('quickmap.db'); +const mapdb = new MapDB('file.db'); // this is the save file's name + extension +async function sample() { + // assuming 'somekey' exists in the Map and has a value { cool: false } + const data = mapdb.get('somekey'); + // reassigning the 'cool' property a new value + data.cool = true; + await mapdb.set('somekey', data); + // now 'somekey' has a new value { cool: true } +} +``` + +### Docs + +#### Installation + +With **npm**: + +`npm i quickmap.db` + + +#### Setup + +```js +const { MapDB } = require('quickmap.db') +const db = new MapDB('database.json') // this is the save file's name + extension +``` + +#### set() + +```js +await db.set('what', 'how') +``` + +#### get() + +```js +var answ = db.get('what') // answ = how +``` diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..aae40b9 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,72 @@ +import fsp from "fs/promises"; +import fs from "fs"; + +let writeDB: any, map: any, filename: string | undefined = 'database.db', dirname: string = './data/', db: any, file: any, data: any; + +writeDB = fsp.writeFile; + +export class MapDB { + /** + * @constructor + * @param filename If not set, MapDB will only use internal memory + * @example 'file.db' + * @param options Options to pass to the constructor + * @param options.dirname + * @example 'data' + */ + constructor(fn: string | undefined, options: any) { + map = new Map(); + + if (fn) filename = fn; + + if (options.dirname) dirname = options.dirname; + + if (!fs.existsSync(dirname)) fs.mkdirSync(dirname); + + db = `./${dirname}/${filename}` + + try { + file = fs.readFileSync(db); + data = JSON.parse(file.toString()); + + for (let i = 0; i < data.length; i++) { + map.set(data[i].key, data[i].value); + } + } catch {} + } + + /** + * @param key + * @param value + */ + async set(key: string | number, value: any) { + try { + file = fs.readFileSync(db); + data = JSON.parse(data); + + let i = data.findIndex((pair: any) => pair.key == key); + !data[i] ? data.push({ key, value }) : data[i] = { key, value }; + + await writeDB(db, JSON.stringify(data)); + } catch { + await await writeDB(db, `[${JSON.stringify({ key, value })}]`) + } + + return map.set(key, value) + } + + /** + * @param key + */ + + get(key: string | number) { + if (map) { + return map.get(key) + } else { + file = fs.readFileSync(db); + data = JSON.parse(file.toString()); + + return data.find((pair: any) => pair.key == key)?.value || undefined; + } + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..56ec083 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,105 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "CommonJS", /* Specify what module code is generated. */ + "rootDir": "./src/", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./build.js", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "build", /* Specify an output folder for all emitted files. */ + "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + "declarationDir": "build", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, +// "include": [], + "exclude": ["node_modules", "logs", "build", "d", "test.js"] +} \ No newline at end of file