From 087e7894be9b07b39074197205ae3bc116bdbae4 Mon Sep 17 00:00:00 2001 From: segayuu Date: Fri, 5 Jun 2020 22:28:17 +0900 Subject: [PATCH 01/32] Add tsc --- .eslintrc.json | 15 ++++++++++++++- .gitignore | 3 ++- .tsconfig.json | 13 +++++++++++++ package.json | 22 ++++++++++++++++------ 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 .tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index d187d17c..7287de2d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,4 +1,17 @@ { "root": true, - "extends": "hexo" + "parser": "@typescript-eslint/parser", + "plugins": ["node", "@typescript-eslint"], + "extends": ["hexo", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended"], + "ignorePatterns": ["built"], + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "ecmaFeatures": { + "modules": true + } + }, + "rules": { + "node/no-unsupported-features/es-syntax": 0 + } } diff --git a/.gitignore b/.gitignore index 62df31e9..60768cde 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules/ .nyc_output/ *.log docs/ -coverage/ \ No newline at end of file +coverage/ +built \ No newline at end of file diff --git a/.tsconfig.json b/.tsconfig.json new file mode 100644 index 00000000..9a812b1d --- /dev/null +++ b/.tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "outDir": "./built", + "allowJs": true, + "target": "ES2018", + "lib": ["ES2018"], + "module": "commonjs", + "esModuleInterop": true + }, + "include": [ + "./src/**/*" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 12f84394..6e8222e7 100644 --- a/package.json +++ b/package.json @@ -2,18 +2,21 @@ "name": "warehouse", "version": "4.0.1", "description": "Simple JSON-based database", - "main": "lib/database", + "main": "built/database", "directories": { - "lib": "./lib" + "lib": "./built" }, "files": [ - "lib/" + "built/" ], "scripts": { - "eslint": "eslint lib test", + "pretest": "npm run typescript", + "typescript": "tsc --build .tsconfig.json", + "eslint": "eslint src test", "test": "mocha \"test/scripts/**/*.js\"", "test-cov": "nyc --reporter=lcovonly --reporter=text-summary npm test", - "jsdoc": "jsdoc --configure .jsdoc.json" + "jsdoc": "jsdoc --configure .jsdoc.json", + "prepublish": "npm run typescript" }, "repository": "hexojs/warehouse", "keywords": [ @@ -33,6 +36,12 @@ "rfdc": "^1.1.4" }, "devDependencies": { + "@types/bluebird": "^3.5.32", + "@types/graceful-fs": "^4.1.3", + "@types/jsonstream": "^0.8.30", + "@types/node": "^14.0.5", + "@typescript-eslint/eslint-plugin": "^3.0.0", + "@typescript-eslint/parser": "^3.0.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "eslint": "^8.1.0", @@ -42,7 +51,8 @@ "minami": "^1.1.1", "mocha": "^10.0.0", "nyc": "^15.0.0", - "sinon": "^14.0.0" + "sinon": "^14.0.0", + "typescript": "^3.9.3" }, "engines": { "node": ">=14" From 8e8aa310567090aeb43239ebab8c12bfbd0ca970 Mon Sep 17 00:00:00 2001 From: segayuu Date: Sat, 6 Jun 2020 18:26:23 +0900 Subject: [PATCH 02/32] Replace js to ts --- lib/types/index.js | 14 -- lib/util.js | 190 ------------------ lib/database.js => src/database.ts | 67 +++--- lib/document.js => src/document.ts | 12 +- lib/error.js => src/error.ts | 13 +- .../population.js => src/error/population.ts | 6 +- .../validation.js => src/error/validation.ts | 6 +- lib/model.js => src/model.ts | 89 ++++---- lib/mutex.js => src/mutex.ts | 8 +- lib/query.js => src/query.ts | 83 ++++---- lib/schema.js => src/schema.ts | 68 ++++--- lib/schematype.js => src/schematype.ts | 51 ++--- lib/types/array.js => src/types/array.ts | 58 +++--- lib/types/boolean.js => src/types/boolean.ts | 20 +- lib/types/buffer.js => src/types/buffer.ts | 28 ++- lib/types/cuid.js => src/types/cuid.ts | 12 +- lib/types/date.js => src/types/date.ts | 25 +-- lib/types/enum.js => src/types/enum.ts | 11 +- src/types/index.ts | 27 +++ lib/types/integer.js => src/types/integer.ts | 14 +- lib/types/number.js => src/types/number.ts | 14 +- lib/types/object.js => src/types/object.ts | 12 +- lib/types/string.js => src/types/string.ts | 10 +- lib/types/virtual.js => src/types/virtual.ts | 13 +- src/util.ts | 183 +++++++++++++++++ test/fixtures/db.json | 2 +- test/scripts/database.js | 4 +- test/scripts/document.js | 2 +- test/scripts/mutex.js | 2 +- test/scripts/query.js | 2 +- test/scripts/schematype.js | 4 +- test/scripts/types/array.js | 10 +- test/scripts/types/boolean.js | 4 +- test/scripts/types/buffer.js | 4 +- test/scripts/types/cuid.js | 4 +- test/scripts/types/date.js | 4 +- test/scripts/types/enum.js | 4 +- test/scripts/types/integer.js | 4 +- test/scripts/types/number.js | 4 +- test/scripts/types/object.js | 2 +- test/scripts/types/string.js | 4 +- test/scripts/types/virtual.js | 2 +- test/scripts/util.js | 2 +- 43 files changed, 564 insertions(+), 534 deletions(-) delete mode 100644 lib/types/index.js delete mode 100644 lib/util.js rename lib/database.js => src/database.ts (71%) rename lib/document.js => src/document.ts (92%) rename lib/error.js => src/error.ts (56%) rename lib/error/population.js => src/error/population.ts (52%) rename lib/error/validation.js => src/error/validation.ts (52%) rename lib/model.js => src/model.ts (92%) rename lib/mutex.js => src/mutex.ts (76%) rename lib/query.js => src/query.ts (78%) rename lib/schema.js => src/schema.ts (90%) rename lib/schematype.js => src/schematype.ts (81%) rename lib/types/array.js => src/types/array.ts (80%) rename lib/types/boolean.js => src/types/boolean.ts (70%) rename lib/types/buffer.js => src/types/buffer.ts (75%) rename lib/types/cuid.js => src/types/cuid.ts (76%) rename lib/types/date.js => src/types/date.ts (81%) rename lib/types/enum.js => src/types/enum.ts (76%) create mode 100644 src/types/index.ts rename lib/types/integer.js => src/types/integer.ts (69%) rename lib/types/number.js => src/types/number.ts (89%) rename lib/types/object.js => src/types/object.ts (55%) rename lib/types/string.js => src/types/string.ts (90%) rename lib/types/virtual.js => src/types/virtual.ts (80%) create mode 100644 src/util.ts diff --git a/lib/types/index.js b/lib/types/index.js deleted file mode 100644 index d2bb02f6..00000000 --- a/lib/types/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -exports.Mixed = require('../schematype'); -exports.String = require('./string'); -exports.Number = require('./number'); -exports.Boolean = require('./boolean'); -exports.Array = require('./array'); -exports.Object = require('./object'); -exports.Date = require('./date'); -exports.Virtual = require('./virtual'); -exports.CUID = require('./cuid'); -exports.Enum = require('./enum'); -exports.Integer = require('./integer'); -exports.Buffer = require('./buffer'); diff --git a/lib/util.js b/lib/util.js deleted file mode 100644 index 596e2acd..00000000 --- a/lib/util.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict'; - -exports.shuffle = array => { - if (!Array.isArray(array)) throw new TypeError('array must be an Array!'); - const $array = array.slice(); - const { length } = $array; - const { random, floor } = Math; - - for (let i = 0; i < length; i++) { - // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L6718 - // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L3884 - const rand = i + floor(random() * (length - i)); - - const temp = $array[i]; - $array[i] = $array[rand]; - $array[rand] = temp; - } - - return $array; -}; - -function extractPropKey(key) { - return key.split('.'); -} - -exports.getProp = (obj, key) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); - - if (!key.includes('.')) { - return obj[key]; - } - - const token = extractPropKey(key); - let result = obj; - const len = token.length; - - for (let i = 0; i < len; i++) { - result = result[token[i]]; - } - - return result; -}; - -exports.setProp = (obj, key, value) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); - - if (!key.includes('.')) { - obj[key] = value; - return; - } - - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; - - let cursor = obj; - - for (let i = 0; i < len; i++) { - const name = token[i]; - cursor[name] = cursor[name] || {}; - cursor = cursor[name]; - } - - cursor[lastKey] = value; -}; - -exports.delProp = (obj, key) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); - - if (!key.includes('.')) { - delete obj[key]; - return; - } - - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; - - let cursor = obj; - - for (let i = 0; i < len; i++) { - const name = token[i]; - - if (cursor[name]) { - cursor = cursor[name]; - } else { - return; - } - } - - delete cursor[lastKey]; -}; - -exports.setGetter = (obj, key, fn) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); - if (typeof fn !== 'function') throw new TypeError('fn must be a function!'); - - if (!key.includes('.')) { - obj.__defineGetter__(key, fn); - return; - } - - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; - - let cursor = obj; - - for (let i = 0; i < len; i++) { - const name = token[i]; - cursor[name] = cursor[name] || {}; - cursor = cursor[name]; - } - - cursor.__defineGetter__(lastKey, fn); -}; - -exports.arr2obj = (arr, value) => { - if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); - - const obj = {}; - let i = arr.length; - - while (i--) { - obj[arr[i]] = value; - } - - return obj; -}; - -exports.reverse = arr => { - if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); - - const len = arr.length; - - if (!len) return arr; - - for (let left = 0, right = len - 1; left < right; left++, right--) { - const tmp = arr[left]; - arr[left] = arr[right]; - arr[right] = tmp; - } - - return arr; -}; - -function parseArgs(args) { - if (typeof args !== 'string') return args; - - const arr = args.split(' '); - const result = {}; - - for (let i = 0, len = arr.length; i < len; i++) { - const key = arr[i]; - - switch (key[0]) { - case '+': - result[key.slice(1)] = 1; - break; - - case '-': - result[key.slice(1)] = -1; - break; - - default: - result[key] = 1; - } - } - - return result; -} - -exports.parseArgs = (orderby, order) => { - let result; - - if (order) { - result = {}; - result[orderby] = order; - } else if (typeof orderby === 'string') { - result = parseArgs(orderby); - } else { - result = orderby; - } - - return result; -}; diff --git a/lib/database.js b/src/database.ts similarity index 71% rename from lib/database.js rename to src/database.ts index f17b7d45..969c75af 100644 --- a/lib/database.js +++ b/src/database.ts @@ -1,20 +1,20 @@ -'use strict'; - -const JSONStream = require('JSONStream'); -const Promise = require('bluebird'); -const fs = require('graceful-fs'); -const Model = require('./model'); -const Schema = require('./schema'); -const SchemaType = require('./schematype'); -const WarehouseError = require('./error'); +import JSONStream = require('JSONStream'); +import Bluebird = require('bluebird'); +import { writev, promises as fsPromises, createReadStream } from 'graceful-fs'; +import { pipeline, Stream } from 'stream'; +import Model = require('./model'); +import Schema = require('./schema'); +import SchemaType = require('./schematype'); +import WarehouseError = require('./error'); +// eslint-disable-next-line @typescript-eslint/no-var-requires const pkg = require('../package.json'); -const { open } = fs.promises; -const pipeline = Promise.promisify(require('stream').pipeline); const log = require('hexo-log')(); +const { open } = fsPromises; +const pipelineAsync = Bluebird.promisify(pipeline) as (...args: Stream[]) => Bluebird; -let _writev; +let _writev: (handle: fsPromises.FileHandle, buffers: Buffer[]) => Promise; -if (typeof fs.writev === 'function') { +if (typeof writev === 'function') { _writev = (handle, buffers) => handle.writev(buffers); } else { _writev = async (handle, buffers) => { @@ -22,7 +22,7 @@ if (typeof fs.writev === 'function') { }; } -async function exportAsync(database, path) { +async function exportAsync(database: Database, path: string) { const handle = await open(path, 'w'); try { @@ -69,7 +69,17 @@ async function exportAsync(database, path) { } } +type DatabaseOptions = { + version: number, + path: string, + onUpgrade: (...args: any[]) => any, + onDowngrade: (...args: any[]) => any +}; + class Database { + options: DatabaseOptions; + _models: any; + Model: typeof Model; /** * Database constructor. @@ -80,13 +90,15 @@ class Database { * @param {function} [options.onUpgrade] Triggered when the database is upgraded * @param {function} [options.onDowngrade] Triggered when the database is downgraded */ - constructor(options) { - this.options = Object.assign({ + constructor(options: { path: string } & Partial) { + this.options = { version: 0, + // eslint-disable-next-line @typescript-eslint/no-empty-function onUpgrade() {}, - - onDowngrade() {} - }, options); + // eslint-disable-next-line @typescript-eslint/no-empty-function + onDowngrade() {}, + ...options + }; this._models = {}; @@ -104,7 +116,7 @@ class Database { * @param {Schema|object} [schema] * @return {Model} */ - model(name, schema) { + model(name: string, schema?: any) { if (this._models[name]) { return this._models[name]; } @@ -143,9 +155,9 @@ class Database { this.model(data.key)._import(data.value); }); - const rs = fs.createReadStream(path, 'utf8'); + const rs = createReadStream(path, 'utf8'); - return pipeline(rs, parseStream).then(() => { + return pipelineAsync(rs, parseStream).then(() => { if (newVersion > oldVersion) { return onUpgrade(oldVersion, newVersion); } else if (newVersion < oldVersion) { @@ -164,7 +176,7 @@ class Database { const { path } = this.options; if (!path) throw new WarehouseError('options.path is required'); - return Promise.resolve(exportAsync(this, path)).asCallback(callback); + return Bluebird.resolve(exportAsync(this, path)).asCallback(callback); } toJSON() { @@ -182,12 +194,15 @@ class Database { }, models }; } + static Schema = Schema; + Schema: typeof Schema; + static SchemaType = SchemaType; + SchemaType: typeof SchemaType; + static version: number; } Database.prototype.Schema = Schema; -Database.Schema = Database.prototype.Schema; Database.prototype.SchemaType = SchemaType; -Database.SchemaType = Database.prototype.SchemaType; Database.version = pkg.version; -module.exports = Database; +export = Database; diff --git a/lib/document.js b/src/document.ts similarity index 92% rename from lib/document.js rename to src/document.ts index fd8f672b..34fbd074 100644 --- a/lib/document.js +++ b/src/document.ts @@ -1,8 +1,10 @@ -'use strict'; +import rfdc = require('rfdc'); +const cloneDeep = rfdc(); -const cloneDeep = require('rfdc')(); - -class Document { +abstract class Document { + abstract _model; + _id!: any; + abstract _schema; /** * Document constructor. @@ -101,4 +103,4 @@ function isGetter(obj, key) { return Object.getOwnPropertyDescriptor(obj, key).get; } -module.exports = Document; +export = Document; diff --git a/lib/error.js b/src/error.ts similarity index 56% rename from lib/error.js rename to src/error.ts index 1e097423..94bcefa8 100644 --- a/lib/error.js +++ b/src/error.ts @@ -1,6 +1,5 @@ -'use strict'; - class WarehouseError extends Error { + code?: string; /** * WarehouseError constructor @@ -8,18 +7,18 @@ class WarehouseError extends Error { * @param {string} msg * @param {string} code */ - constructor(msg, code) { + constructor(msg: string, code?: string) { super(msg); Error.captureStackTrace(this); this.code = code; } + static ID_EXIST = 'ID_EXIST'; + static ID_NOT_EXIST = 'ID_NOT_EXIST'; + static ID_UNDEFINED = 'ID_UNDEFINED'; } WarehouseError.prototype.name = 'WarehouseError'; -WarehouseError.ID_EXIST = 'ID_EXIST'; -WarehouseError.ID_NOT_EXIST = 'ID_NOT_EXIST'; -WarehouseError.ID_UNDEFINED = 'ID_UNDEFINED'; -module.exports = WarehouseError; +export = WarehouseError; diff --git a/lib/error/population.js b/src/error/population.ts similarity index 52% rename from lib/error/population.js rename to src/error/population.ts index 6e72e928..c97c0fc1 100644 --- a/lib/error/population.js +++ b/src/error/population.ts @@ -1,9 +1,7 @@ -'use strict'; - -const WarehouseError = require('../error'); +import WarehouseError = require('../error'); class PopulationError extends WarehouseError {} PopulationError.prototype.name = 'PopulationError'; -module.exports = PopulationError; +export = PopulationError; diff --git a/lib/error/validation.js b/src/error/validation.ts similarity index 52% rename from lib/error/validation.js rename to src/error/validation.ts index f3f02efe..bdd4ee6b 100644 --- a/lib/error/validation.js +++ b/src/error/validation.ts @@ -1,9 +1,7 @@ -'use strict'; - -const WarehouseError = require('../error'); +import WarehouseError = require('../error'); class ValidationError extends WarehouseError {} ValidationError.prototype.name = 'ValidationError'; -module.exports = ValidationError; +export = ValidationError; diff --git a/lib/model.js b/src/model.ts similarity index 92% rename from lib/model.js rename to src/model.ts index 0e19c4af..072da0f8 100644 --- a/lib/model.js +++ b/src/model.ts @@ -1,18 +1,25 @@ -'use strict'; - -const { EventEmitter } = require('events'); -const cloneDeep = require('rfdc')(); -const Promise = require('bluebird'); -const { parseArgs, getProp, setGetter, shuffle } = require('./util'); -const Document = require('./document'); -const Query = require('./query'); -const Schema = require('./schema'); -const Types = require('./types'); -const WarehouseError = require('./error'); -const PopulationError = require('./error/population'); -const Mutex = require('./mutex'); +import { EventEmitter } from 'events'; +import rfdc = require('rfdc'); +const cloneDeep = rfdc(); +import Promise = require('bluebird'); +import util = require('./util'); +const { parseArgs, getProp, setGetter, shuffle } = util; +import Document = require('./document'); +import Query = require('./query'); +import Schema = require('./schema'); +import Types = require('./types'); +import WarehouseError = require('./error'); +import PopulationError = require('./error/population'); +import Mutex = require('./mutex'); class Model extends EventEmitter { + _mutex = new Mutex(); + data: Record = {}; + schema; + length = 0; + Document; + Query; + _database; /** * Model constructor. @@ -20,7 +27,7 @@ class Model extends EventEmitter { * @param {string} name Model name * @param {Schema|object} [schema] Schema */ - constructor(name, schema_) { + constructor(public name: string, schema_) { super(); let schema; @@ -39,13 +46,11 @@ class Model extends EventEmitter { schema.path('_id', {type: Types.CUID, required: true}); } - this.name = name; - this.data = {}; - this._mutex = new Mutex(); this.schema = schema; - this.length = 0; class _Document extends Document { + _model!: Model; + _schema!: Schema; constructor(data) { super(data); @@ -59,7 +64,10 @@ class Model extends EventEmitter { _Document.prototype._model = this; _Document.prototype._schema = schema; - class _Query extends Query {} + class _Query extends Query { + _model!: Model; + _schema!: Schema; + } this.Query = _Query; @@ -91,7 +99,7 @@ class Model extends EventEmitter { * @param {boolean} [options.lean=false] Returns a plain JavaScript object * @return {Document|object} */ - findById(id, options_) { + findById(id, options_?) { const raw = this.data[id]; if (!raw) return; @@ -116,11 +124,10 @@ class Model extends EventEmitter { /** * Acquires write lock. * - * @param {*} id * @return {Promise} * @private */ - _acquireWriteLock(id) { + _acquireWriteLock(): Promise.Disposer { const mutex = this._mutex; return new Promise((resolve, reject) => { @@ -175,7 +182,7 @@ class Model extends EventEmitter { * @param {function} [callback] * @return {Promise} */ - insertOne(data, callback) { + insertOne(data, callback?) { return Promise.using(this._acquireWriteLock(), () => this._insertOne(data)).asCallback(callback); } @@ -223,7 +230,7 @@ class Model extends EventEmitter { * @return {Promise} * @private */ - _updateWithStack(id, stack) { + _updateWithStack(id, stack): Promise { const schema = this.schema; const data = this.data[id]; @@ -265,7 +272,7 @@ class Model extends EventEmitter { * @param {function} [callback] * @return {Promise} */ - updateById(id, update, callback) { + updateById(id, update, callback?) { return Promise.using(this._acquireWriteLock(), () => { const stack = this.schema._parseUpdate(update); return this._updateWithStack(id, stack); @@ -280,7 +287,7 @@ class Model extends EventEmitter { * @param {function} [callback] * @return {Promise} */ - update(query, data, callback) { + update(query, data, callback?) { return this.find(query).update(data, callback); } @@ -326,7 +333,7 @@ class Model extends EventEmitter { * @param {function} [callback] * @return {Promise} */ - replaceById(id, data, callback) { + replaceById(id, data, callback?) { return Promise.using(this._acquireWriteLock(), () => this._replaceById(id, data)).asCallback(callback); } @@ -338,7 +345,7 @@ class Model extends EventEmitter { * @param {function} [callback] * @return {Promise} */ - replace(query, data, callback) { + replace(query, data, callback?) { return this.find(query).replace(data, callback); } @@ -414,7 +421,7 @@ class Model extends EventEmitter { * @param {function} iterator * @param {object} [options] See {@link Model#findById}. */ - forEach(iterator, options) { + forEach(iterator, options?) { const keys = Object.keys(this.data); let num = 0; @@ -430,7 +437,7 @@ class Model extends EventEmitter { * @param {Object} [options] See {@link Model#findById}. * @return {Array} */ - toArray(options) { + toArray(options?) { const result = new Array(this.length); this.forEach((item, i) => { @@ -450,8 +457,7 @@ class Model extends EventEmitter { * @param {Boolean} [options.lean=false] Returns a plain JavaScript object. * @return {Query|Array} */ - find(query, options_) { - const options = options_ || {}; + find(query, options: { limit?: number; skip?: number; lean?: boolean; } = {}) { const filter = this.schema._execQuery(query); const keys = Object.keys(this.data); const len = keys.length; @@ -486,9 +492,8 @@ class Model extends EventEmitter { * @param {Boolean} [options.lean=false] Returns a plain JavaScript object. * @return {Document|Object} */ - findOne(query, options_) { - const options = options_ || {}; - options.limit = 1; + findOne(query, options_ : { skip?: number; lean?: boolean; } = {}) { + const options = Object.assign(options_, { limit: 1 }); const result = this.find(query, options); return options.lean ? result[0] : result.data[0]; @@ -516,7 +521,7 @@ class Model extends EventEmitter { * @param {Object} [options] See {@link Model#findById}. * @return {Document|Object} */ - eq(i_, options) { + eq(i_, options?) { let index = i_ < 0 ? this.length + i_ : i_; const data = this.data; const keys = Object.keys(data); @@ -562,7 +567,7 @@ class Model extends EventEmitter { * @param {Number} [end] * @return {Query} */ - slice(start_, end_) { + slice(start_: number, end_?: number) { const total = this.length; let start = start_ | 0; @@ -900,7 +905,7 @@ class Model extends EventEmitter { arr[i] = this._populate(item, stack); }); - return new Query(arr); + return new this.Query(arr); } /** @@ -946,12 +951,16 @@ class Model extends EventEmitter { } return result; } + get: Model['findById']; + size: Model['count']; + each: Model['forEach']; + random: Model['shuffle']; } Model.prototype.get = Model.prototype.findById; function execHooks(schema, type, event, data) { - const hooks = schema.hooks[type][event]; + const hooks = schema.hooks[type][event] as ((data: any) => Promise | void)[]; if (!hooks.length) return Promise.resolve(data); return Promise.each(hooks, hook => hook(data)).thenReturn(data); @@ -963,4 +972,4 @@ Model.prototype.each = Model.prototype.forEach; Model.prototype.random = Model.prototype.shuffle; -module.exports = Model; +export = Model; diff --git a/lib/mutex.js b/src/mutex.ts similarity index 76% rename from lib/mutex.js rename to src/mutex.ts index 87725b34..bfb1f358 100644 --- a/lib/mutex.js +++ b/src/mutex.ts @@ -1,12 +1,12 @@ -'use strict'; - class Mutex { + private _locked: boolean; + private readonly _queue: (() => void)[]; constructor() { this._locked = false; this._queue = []; } - lock(fn) { + lock(fn: () => void) { if (this._locked) { this._queue.push(fn); return; @@ -29,4 +29,4 @@ class Mutex { } } -module.exports = Mutex; +export = Mutex; diff --git a/lib/query.js b/src/query.ts similarity index 78% rename from lib/query.js rename to src/query.ts index 53b94881..f547e2f1 100644 --- a/lib/query.js +++ b/src/query.ts @@ -1,17 +1,18 @@ -'use strict'; +import Promise = require('bluebird'); +import util = require('./util'); +const { parseArgs, shuffle } = util; -const Promise = require('bluebird'); -const { parseArgs, shuffle } = require('./util'); - -class Query { +abstract class Query { + length: number; + abstract _model; + abstract _schema; /** * Query constructor. * * @param {Array} data */ - constructor(data) { - this.data = data; + constructor(private data: any[]) { this.length = data.length; } @@ -20,7 +21,7 @@ class Query { * * @return Number */ - count() { + count(): number { return this.length; } @@ -29,7 +30,7 @@ class Query { * * @param {Function} iterator */ - forEach(iterator) { + forEach(iterator: (item: any, index: number) => void): void { const { data, length } = this; for (let i = 0; i < length; i++) { @@ -42,7 +43,7 @@ class Query { * * @return {Array} */ - toArray() { + toArray(): any[] { return this.data; } @@ -53,7 +54,7 @@ class Query { * @param {Number} i * @return {Document|Object} */ - eq(i) { + eq(i: number) { const index = i < 0 ? this.length + i : i; return this.data[index]; } @@ -83,8 +84,8 @@ class Query { * @param {Number} [end] * @return {Query} */ - slice(start, end) { - return new this.constructor(this.data.slice(start, end)); + slice(start: number, end?: number): Query { + return Reflect.construct(this.constructor, [this.data.slice(start, end)]); } /** @@ -93,7 +94,7 @@ class Query { * @param {Number} i * @return {Query} */ - limit(i) { + limit(i: number): Query { return this.slice(0, i); } @@ -103,7 +104,7 @@ class Query { * @param {Number} i * @return {Query} */ - skip(i) { + skip(i: number): Query { return this.slice(i); } @@ -112,8 +113,8 @@ class Query { * * @return {Query} */ - reverse() { - return new this.constructor(this.data.slice().reverse()); + reverse(): Query { + return Reflect.construct(this.constructor, [this.data.slice().reverse()]); } /** @@ -121,8 +122,8 @@ class Query { * * @return {Query} */ - shuffle() { - return new this.constructor(shuffle(this.data)); + shuffle(): Query { + return Reflect.construct(this.constructor, [shuffle(this.data)]); } /** @@ -135,7 +136,7 @@ class Query { * @param {Boolean} [options.lean=false] Returns a plain JavaScript object. * @return {Query|Array} */ - find(query, options = {}) { + find(query: any, options: { limit?: number; skip?: number; lean?: boolean; } = {}): any[] | Query { const filter = this._schema._execQuery(query); const { data, length } = this; const { lean = false } = options; @@ -155,7 +156,7 @@ class Query { } } - return lean ? arr : new this.constructor(arr); + return lean ? arr : Reflect.construct(this.constructor, [arr]); } /** @@ -167,11 +168,11 @@ class Query { * @param {Boolean} [options.lean=false] Returns a plain JavaScript object. * @return {Document|Object} */ - findOne(query, options = {}) { - options.limit = 1; + findOne(query: any, options: { skip?: number; lean?: boolean; } = {}): any { + const _options = Object.assign(options, { limit: 1 }); - const result = this.find(query, options); - return options.lean ? result[0] : result.data[0]; + const result = this.find(query, _options); + return Array.isArray(result) ? result[0] : result.data[0]; } /** @@ -192,11 +193,11 @@ class Query { * @param {String|Number} [order] * @return {Query} */ - sort(orderby, order) { + sort(orderby, order): Query { const sort = parseArgs(orderby, order); const fn = this._schema._execSort(sort); - return new this.constructor(this.data.slice().sort(fn)); + return Reflect.construct(this.constructor, [this.data.slice().sort(fn)]); } /** @@ -205,9 +206,9 @@ class Query { * @param {Function} iterator * @return {Array} */ - map(iterator) { + map(iterator: (item: any, index: number) => T): T[] { const { data, length } = this; - const result = new Array(length); + const result: T[] = new Array(length); for (let i = 0; i < length; i++) { result[i] = iterator(data[i], i); @@ -224,7 +225,7 @@ class Query { * @param {*} [initial] By default, the initial value is the first document. * @return {*} */ - reduce(iterator, initial) { + reduce(iterator, initial?) { const { data, length } = this; let result, i; @@ -251,7 +252,7 @@ class Query { * @param {*} [initial] By default, the initial value is the last document. * @return {*} */ - reduceRight(iterator, initial) { + reduceRight(iterator, initial?) { const { data, length } = this; let result, i; @@ -277,7 +278,7 @@ class Query { * @param {Function} iterator * @return {Query} */ - filter(iterator) { + filter(iterator: (item: any, index: number) => boolean): Query { const { data, length } = this; const arr = []; @@ -286,7 +287,7 @@ class Query { if (iterator(item, i)) arr.push(item); } - return new this.constructor(arr); + return Reflect.construct(this.constructor, [arr]); } /** @@ -296,7 +297,7 @@ class Query { * @param {Function} iterator * @return {Boolean} */ - every(iterator) { + every(iterator: (item: any, index: number) => boolean): boolean { const { data, length } = this; for (let i = 0; i < length; i++) { @@ -313,7 +314,7 @@ class Query { * @param {Function} iterator * @return {Boolean} */ - some(iterator) { + some(iterator: (item: any, index: number) => boolean): boolean { const { data, length } = this; for (let i = 0; i < length; i++) { @@ -330,7 +331,7 @@ class Query { * @param {Function} [callback] * @return {Promise} */ - update(data, callback) { + update(data: any, callback?: (err?: any) => void): Promise { const model = this._model; const stack = this._schema._parseUpdate(data); @@ -344,7 +345,7 @@ class Query { * @param {Function} [callback] * @return {Promise} */ - replace(data, callback) { + replace(data: any, callback?: (err?: any) => void): Promise { const model = this._model; return Promise.map(this.data, item => model.replaceById(item._id, data)).asCallback(callback); @@ -368,7 +369,7 @@ class Query { * @param {String|Object} expr * @return {Query} */ - populate(expr) { + populate(expr: any): Query { const stack = this._schema._parsePopulate(expr); const { data, length } = this; const model = this._model; @@ -379,6 +380,10 @@ class Query { return this; } + + size: Query['count']; + each: Query['forEach']; + random: Query['shuffle']; } Query.prototype.size = Query.prototype.count; @@ -387,4 +392,4 @@ Query.prototype.each = Query.prototype.forEach; Query.prototype.random = Query.prototype.shuffle; -module.exports = Query; +export = Query; diff --git a/lib/schema.js b/src/schema.ts similarity index 90% rename from lib/schema.js rename to src/schema.ts index a683d8d5..5c5a1ddc 100644 --- a/lib/schema.js +++ b/src/schema.ts @@ -1,11 +1,12 @@ -'use strict'; - -const SchemaType = require('./schematype'); -const Types = require('./types'); -const Promise = require('bluebird'); -const { getProp, setProp, delProp } = require('./util'); -const PopulationError = require('./error/population'); -const { isPlainObject } = require('is-plain-object'); +import SchemaType = require('./schematype'); +import Types = require('./types'); +import Promise = require('bluebird'); +import util = require('./util'); +const { getProp, setProp, delProp } = util; +import PopulationError = require('./error/population'); +import SchemaTypeVirtual = require('./types/virtual'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const isPlainObject: (o: any) => boolean = require('is-plain-object'); /** * @callback queryFilterCallback @@ -101,9 +102,8 @@ class UpdateParser { }; } - constructor(paths) { - this.paths = paths; - } + // eslint-disable-next-line no-useless-constructor + constructor(private paths) {} /** * Parses updating expressions and returns a stack. @@ -159,9 +159,8 @@ class UpdateParser { * @private */ class QueryParser { - constructor(paths) { - this.paths = paths; - } + // eslint-disable-next-line no-useless-constructor + constructor(private paths) {} /** * @@ -384,17 +383,18 @@ class QueryParser { } class Schema { + paths: Record> = {}; + statics: Record = {}; + methods: Record = {}; + hooks; + stacks; /** * Schema constructor. * - * @param {Object} schema + * @param {Object} [schema] */ - constructor(schema) { - this.paths = {}; - this.statics = {}; - this.methods = {}; - + constructor(schema?) { this.hooks = { pre: { save: [], @@ -424,7 +424,7 @@ class Schema { * @param {Object} schema * @param {String} prefix */ - add(schema, prefix = '') { + add(schema: Record, prefix = ''): void { const keys = Object.keys(schema); const len = keys.length; @@ -445,7 +445,9 @@ class Schema { * @param {*} obj * @return {SchemaType | undefined} */ - path(name, obj) { + path(name: string): SchemaType; + path(name: string, obj: SchemaType | ((...args: any[]) => any) | { type: any; } | Record | any[]): void; + path(name: string, obj?: SchemaType | ((...args: any[]) => any) | { type: any; } | Record | any[]): SchemaType | void { if (obj == null) { return this.paths[name]; } @@ -462,12 +464,12 @@ class Schema { break; case 'object': - if (obj.type) { - type = getSchemaType(name, obj); - } else if (Array.isArray(obj)) { + if (Array.isArray(obj)) { type = new Types.Array(name, { child: obj.length ? getSchemaType(name, obj[0]) : new SchemaType(name) }); + } else if (obj.type) { + type = getSchemaType(name, obj); } else { type = new Types.Object(); nested = Object.keys(obj).length > 0; @@ -493,7 +495,7 @@ class Schema { * @param {SchemaType} type * @private */ - _updateStack(name, type) { + _updateStack(name: string, type: SchemaType) { const { stacks } = this; stacks.getter.push(data => { @@ -518,7 +520,7 @@ class Schema { stacks.import.push(data => { const value = getProp(data, name); - const result = type.parse(value, data); + const result = type.parse(value); if (result !== undefined) { setProp(data, name, result); @@ -544,7 +546,7 @@ class Schema { * @param {Function} [getter] * @return {SchemaType.Virtual} */ - virtual(name, getter) { + virtual(name: string, getter?: () => any): SchemaTypeVirtual { const virtual = new Types.Virtual(name, {}); if (getter) virtual.get(getter); @@ -601,7 +603,7 @@ class Schema { * @param {String} name * @param {Function} fn */ - static(name, fn) { + static(name: string, fn) { if (!name) throw new TypeError('Method name is required!'); if (typeof fn !== 'function') { @@ -745,6 +747,7 @@ class Schema { * @return {PopulateResult[]} * @private */ + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types _parsePopulate(expr) { const { paths } = this; const arr = []; @@ -775,6 +778,8 @@ class Schema { if (!item.model) { const path = paths[key]; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore const ref = path.child ? path.child.options.ref : path.options.ref; if (!ref) { @@ -787,9 +792,10 @@ class Schema { return arr; } + Types: typeof Types; + static Types = Types; } Schema.prototype.Types = Types; -Schema.Types = Schema.prototype.Types; -module.exports = Schema; +export = Schema; diff --git a/lib/schematype.js b/src/schematype.ts similarity index 81% rename from lib/schematype.js rename to src/schematype.ts index 06192a30..1c8136cd 100644 --- a/lib/schematype.js +++ b/src/schematype.ts @@ -1,7 +1,6 @@ -'use strict'; - -const { setProp } = require('./util'); -const ValidationError = require('./error/validation'); +import util = require('./util'); +const { setProp } = util; +import ValidationError = require('./error/validation'); /** * This is the basic schema type. @@ -46,7 +45,9 @@ const ValidationError = require('./error/validation'); * * The return value will replace the original data. */ -class SchemaType { +class SchemaType { + options: { required: boolean; default?: (() => T) | T; } + default: () => T; /** * SchemaType constructor. @@ -56,9 +57,7 @@ class SchemaType { * @param {Boolean} [options.required=false] * @param {*} [options.default] */ - constructor(name, options) { - this.name = name || ''; - + constructor(public name = '', options?: { required?: boolean; default?: (() => T) | T; }) { this.options = Object.assign({ required: false }, options); @@ -66,7 +65,7 @@ class SchemaType { const default_ = this.options.default; if (typeof default_ === 'function') { - this.default = default_; + this.default = default_ as unknown as () => T; } else { this.default = () => default_; } @@ -80,7 +79,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - cast(value, data) { + cast(value: unknown, data: unknown): unknown { if (value == null) { return this.default(); } @@ -95,7 +94,7 @@ class SchemaType { * @param {Object} data * @return {*|Error} */ - validate(value, data) { + validate(value: unknown, data: unknown): unknown { if (this.options.required && value == null) { throw new ValidationError(`\`${this.name}\` is required!`); } @@ -110,7 +109,7 @@ class SchemaType { * @param {*} b * @return {Number} */ - compare(a, b) { + compare(a: unknown, b: unknown): number { if (a > b) { return 1; } else if (a < b) { @@ -127,7 +126,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - parse(value, data) { + parse(value: unknown): any { return value; } @@ -138,7 +137,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - value(value, data) { + value(value: unknown, data: unknown): any { return value; } @@ -150,7 +149,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - match(value, query, data) { + match(value: T, query: unknown, data: unknown): boolean { return value === query; } @@ -162,7 +161,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$exist(value, query, data) { + q$exist(value: unknown, query: unknown, data: unknown): boolean { return (value != null) === query; } @@ -174,7 +173,7 @@ class SchemaType { * @param {Object} data * @return {boolean} */ - q$ne(value, query, data) { + q$ne(value: T, query: unknown, data: unknown): boolean { return !this.match(value, query, data); } @@ -186,7 +185,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$lt(value, query, data) { + q$lt(value: unknown, query: unknown, data: unknown): boolean { return value < query; } @@ -198,7 +197,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$lte(value, query, data) { + q$lte(value: unknown, query: unknown, data: unknown): boolean { return value <= query; } @@ -210,7 +209,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$gt(value, query, data) { + q$gt(value: unknown, query: unknown, data: unknown): boolean { return value > query; } @@ -222,7 +221,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$gte(value, query, data) { + q$gte(value: unknown, query: unknown, data: unknown): boolean { return value >= query; } @@ -234,7 +233,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$in(value, query, data) { + q$in(value: unknown, query: unknown[], data: unknown): boolean { return query.includes(value); } @@ -280,10 +279,14 @@ class SchemaType { * @param {Object} data * @return {*} */ - u$rename(value, update, data) { + u$rename(value, update, data): void { if (value !== undefined) setProp(data, update, value); return undefined; } + + q$exists: SchemaType['q$exist']; + q$max: SchemaType['q$lte']; + q$min: SchemaType['q$gte']; } SchemaType.prototype.q$exists = SchemaType.prototype.q$exist; @@ -292,4 +295,4 @@ SchemaType.prototype.q$max = SchemaType.prototype.q$lte; SchemaType.prototype.q$min = SchemaType.prototype.q$gte; -module.exports = SchemaType; +export = SchemaType; diff --git a/lib/types/array.js b/src/types/array.ts similarity index 80% rename from lib/types/array.js rename to src/types/array.ts index 9c7b08ab..3f7354ff 100644 --- a/lib/types/array.js +++ b/src/types/array.ts @@ -1,14 +1,14 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); const { isArray } = Array; /** * Array schema type. */ -class SchemaTypeArray extends SchemaType { +class SchemaTypeArray> extends SchemaType { + options: SchemaType['options'] & { child?: T; }; + child: T; /** * @@ -18,12 +18,12 @@ class SchemaTypeArray extends SchemaType { * @param {Array|Function} [options.default=[]] * @param {SchemaType} [options.child] */ - constructor(name, options) { + constructor(name: string, options?: Partial['options']> & { child?: T; }) { super(name, Object.assign({ default: [] }, options)); - this.child = this.options.child || new SchemaType(name); + this.child = this.options.child || new SchemaType(name) as T; } /** @@ -33,11 +33,11 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - cast(value_, data) { - let value = super.cast(value_, data); - if (value == null) return value; + cast(value_: unknown, data: unknown): I[] | null | undefined { + value_ = super.cast(value_, data); + if (value_ == null) return value_ as null | undefined; - if (!isArray(value)) value = [value]; + const value = isArray(value_) ? value_ : value_ = [value_]; if (!value.length) return value; const child = this.child; @@ -56,7 +56,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array|Error} */ - validate(value_, data) { + validate(value_: unknown, data: unknown): I[] { const value = super.validate(value_, data); if (!isArray(value)) { @@ -68,7 +68,7 @@ class SchemaTypeArray extends SchemaType { const child = this.child; for (let i = 0, len = value.length; i < len; i++) { - value[i] = child.validate(value[i], data); + value[i] = child.validate(value[i], data) as I; } return value; @@ -81,7 +81,7 @@ class SchemaTypeArray extends SchemaType { * @param {Array} b * @return {Number} */ - compare(a, b) { + compare(a: I[], b: I[]): number { if (a) { if (!b) return 1; } else { @@ -105,10 +105,9 @@ class SchemaTypeArray extends SchemaType { * Parses data. * * @param {Array} value - * @param {Object} data * @return {Array} */ - parse(value, data) { + parse(value: unknown[]) { if (!value) return value; const len = value.length; @@ -118,7 +117,7 @@ class SchemaTypeArray extends SchemaType { const child = this.child; for (let i = 0; i < len; i++) { - result[i] = child.parse(value[i], data); + result[i] = child.parse(value[i]); } return result; @@ -131,7 +130,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - value(value, data) { + value(value: unknown[], data: unknown): any[] { if (!value) return value; const len = value.length; @@ -155,7 +154,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Boolean} */ - match(value, query, data) { + match(value: I[], query: unknown[], data: unknown): boolean { if (!value || !query) { return value === query; } @@ -182,7 +181,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$size(value, query, data) { + q$size(value: unknown[], query: unknown, data: unknown): boolean { return (value ? value.length : 0) === query; } @@ -194,7 +193,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$in(value, query, data) { + q$in(value: unknown[], query: unknown[], data: unknown): boolean { if (!value) return false; for (let i = 0, len = query.length; i < len; i++) { @@ -212,7 +211,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$nin(value, query, data) { + q$nin(value: unknown[], query: unknown[], data: unknown): boolean { if (!value) return true; for (let i = 0, len = query.length; i < len; i++) { @@ -230,7 +229,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$all(value, query, data) { + q$all(value: unknown[], query: unknown[], data: unknown): boolean { if (!value) return false; for (let i = 0, len = query.length; i < len; i++) { @@ -248,7 +247,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - u$push(value, update, data) { + u$push(value: T[], update: T, data: unknown): T[] { if (isArray(update)) { return value ? value.concat(update) : update; } @@ -269,7 +268,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - u$unshift(value, update, data) { + u$unshift(value: unknown[], update: unknown, data: unknown): any[] { if (isArray(update)) { return value ? update.concat(value) : update; } @@ -290,7 +289,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - u$pull(value, update, data) { + u$pull(value: unknown[], update: unknown, data: unknown): any[] { if (!value) return value; if (isArray(update)) { @@ -350,7 +349,7 @@ class SchemaTypeArray extends SchemaType { * @param {Object} data * @return {Array} */ - u$addToSet(value, update, data) { + u$addToSet(value: any[], update, data) { if (isArray(update)) { if (!value) return update; @@ -370,6 +369,9 @@ class SchemaTypeArray extends SchemaType { return value; } + q$length: SchemaTypeArray['q$size']; + u$append: SchemaTypeArray['u$push']; + u$prepend: SchemaTypeArray['u$unshift']; } SchemaTypeArray.prototype.q$length = SchemaTypeArray.prototype.q$size; @@ -378,4 +380,4 @@ SchemaTypeArray.prototype.u$append = SchemaTypeArray.prototype.u$push; SchemaTypeArray.prototype.u$prepend = SchemaTypeArray.prototype.u$unshift; -module.exports = SchemaTypeArray; +export = SchemaTypeArray; diff --git a/lib/types/boolean.js b/src/types/boolean.ts similarity index 70% rename from lib/types/boolean.js rename to src/types/boolean.ts index 16148b1c..e45ce74c 100644 --- a/lib/types/boolean.js +++ b/src/types/boolean.ts @@ -1,12 +1,10 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * Boolean schema type. */ -class SchemaTypeBoolean extends SchemaType { +class SchemaTypeBoolean extends SchemaType { /** * Casts a boolean. @@ -15,7 +13,7 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Boolean} */ - cast(value_, data) { + cast(value_: unknown, data: unknown): boolean { const value = super.cast(value_, data); if (value === 'false' || value === '0') return false; @@ -30,14 +28,14 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Boolean|Error} */ - validate(value_, data) { + validate(value_: unknown, data: unknown): boolean { const value = super.validate(value_, data); if (value != null && typeof value !== 'boolean') { throw new ValidationError(`\`${value}\` is not a boolean!`); } - return value; + return value as boolean; } /** @@ -47,7 +45,7 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Boolean} */ - parse(value, data) { + parse(value: unknown): boolean { return Boolean(value); } @@ -58,9 +56,9 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Number} */ - value(value, data) { + value(value: unknown, data: unknown): number { return +value; } } -module.exports = SchemaTypeBoolean; +export = SchemaTypeBoolean; diff --git a/lib/types/buffer.js b/src/types/buffer.ts similarity index 75% rename from lib/types/buffer.js rename to src/types/buffer.ts index 20df46b5..6b2cb9aa 100644 --- a/lib/types/buffer.js +++ b/src/types/buffer.ts @@ -1,12 +1,11 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * Boolean schema type. */ -class SchemaTypeBuffer extends SchemaType { +class SchemaTypeBuffer extends SchemaType { + options: SchemaType['options'] & { encoding: BufferEncoding; }; /** * @param {string} name @@ -15,7 +14,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {boolean|Function} [options.default] * @param {string} [options.encoding=hex] */ - constructor(name, options) { + constructor(name: string, options) { super(name, Object.assign({ encoding: 'hex' }, options)); @@ -28,10 +27,10 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Buffer} */ - cast(value_, data) { + cast(value_: unknown, data): Buffer | null | undefined { const value = super.cast(value_, data); - if (value == null || Buffer.isBuffer(value)) return value; + if (value == null || Buffer.isBuffer(value)) return value as Buffer | null | undefined; if (typeof value === 'string') return Buffer.from(value, this.options.encoding); if (Array.isArray(value)) return Buffer.from(value); } @@ -43,7 +42,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Buffer} */ - validate(value_, data) { + validate(value_: unknown, data): Buffer { const value = super.validate(value_, data); if (!Buffer.isBuffer(value)) { @@ -60,7 +59,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Buffer} b * @return {Number} */ - compare(a, b) { + compare(a: Buffer, b: Buffer): number { if (Buffer.isBuffer(a)) { return Buffer.isBuffer(b) ? a.compare(b) : 1; } @@ -72,10 +71,9 @@ class SchemaTypeBuffer extends SchemaType { * Parses data and transform them into buffer values. * * @param {*} value - * @param {Object} data * @return {Boolean} */ - parse(value, data) { + parse(value) { return value ? Buffer.from(value, this.options.encoding) : value; } @@ -86,7 +84,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Number} */ - value(value, data) { + value(value: Buffer, data) { return Buffer.isBuffer(value) ? value.toString(this.options.encoding) : value; } @@ -98,7 +96,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Boolean} */ - match(value, query, data) { + match(value: Buffer, query: Buffer, data): boolean { if (Buffer.isBuffer(value) && Buffer.isBuffer(query)) { return value.equals(query); } @@ -107,4 +105,4 @@ class SchemaTypeBuffer extends SchemaType { } } -module.exports = SchemaTypeBuffer; +export = SchemaTypeBuffer; diff --git a/lib/types/cuid.js b/src/types/cuid.ts similarity index 76% rename from lib/types/cuid.js rename to src/types/cuid.ts index 4e723e89..51b300c5 100644 --- a/lib/types/cuid.js +++ b/src/types/cuid.ts @@ -1,13 +1,11 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const cuid = require('cuid'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import cuid = require('cuid'); +import ValidationError = require('../error/validation'); /** * [CUID](https://github.com/ericelliott/cuid) schema type. */ -class SchemaTypeCUID extends SchemaType { +class SchemaTypeCUID extends SchemaType { /** * Casts data. Returns a new CUID only if value is null and the field is @@ -41,4 +39,4 @@ class SchemaTypeCUID extends SchemaType { } } -module.exports = SchemaTypeCUID; +export = SchemaTypeCUID; diff --git a/lib/types/date.js b/src/types/date.ts similarity index 81% rename from lib/types/date.js rename to src/types/date.ts index a17e7c05..ee4dc6b2 100644 --- a/lib/types/date.js +++ b/src/types/date.ts @@ -1,12 +1,10 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * Date schema type. */ -class SchemaTypeDate extends SchemaType { +class SchemaTypeDate extends SchemaType { /** * Casts data. @@ -15,12 +13,16 @@ class SchemaTypeDate extends SchemaType { * @param {Object} data * @return {Date} */ - cast(value_, data) { + cast(value: Date, data): Date; + cast(value: null, data): Date | null; + cast(value: undefined, data): Date | undefined; + cast(value: unknown, data): Date | null | undefined; + cast(value_, data): Date | null | undefined { const value = super.cast(value_, data); - if (value == null || value instanceof Date) return value; + if (value == null || value instanceof Date) return value as Date | null | undefined; - return new Date(value); + return new Date(value as any); } /** @@ -48,7 +50,7 @@ class SchemaTypeDate extends SchemaType { * @param {Object} data * @return {Boolean} */ - match(value, query, data) { + match(value: Date, query: Date, data): boolean { if (!value || !query) { return value === query; } @@ -75,10 +77,9 @@ class SchemaTypeDate extends SchemaType { * Parses data and transforms it into a date object. * * @param {*} value - * @param {Object} data * @return {Date} */ - parse(value, data) { + parse(value) { if (value) return new Date(value); } @@ -154,4 +155,4 @@ class SchemaTypeDate extends SchemaType { } } -module.exports = SchemaTypeDate; +export = SchemaTypeDate; diff --git a/lib/types/enum.js b/src/types/enum.ts similarity index 76% rename from lib/types/enum.js rename to src/types/enum.ts index e720507b..df736c0d 100644 --- a/lib/types/enum.js +++ b/src/types/enum.ts @@ -1,12 +1,11 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * Enum schema type. */ -class SchemaTypeEnum extends SchemaType { +class SchemaTypeEnum extends SchemaType { + options: SchemaType['options'] & { elements: any[] }; /** * @@ -41,4 +40,4 @@ class SchemaTypeEnum extends SchemaType { } } -module.exports = SchemaTypeEnum; +export = SchemaTypeEnum; diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 00000000..b6ded3e9 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,27 @@ +import Mixed = require('../schematype'); +import String = require('./string'); +import Number = require('./number'); +import Boolean = require('./boolean'); +import Array = require('./array'); +import Object = require('./object'); +import Date = require('./date'); +import Virtual = require('./virtual'); +import CUID = require('./cuid'); +import Enum = require('./enum'); +import Integer = require('./integer'); +import Buffer = require('./buffer'); + +export = { + Mixed, + String, + Number, + Boolean, + Array, + Object, + Date, + Virtual, + CUID, + Enum, + Integer, + Buffer +}; diff --git a/lib/types/integer.js b/src/types/integer.ts similarity index 69% rename from lib/types/integer.js rename to src/types/integer.ts index 2c855042..1767ec20 100644 --- a/lib/types/integer.js +++ b/src/types/integer.ts @@ -1,7 +1,5 @@ -'use strict'; - -const SchemaTypeNumber = require('./number'); -const ValidationError = require('../error/validation'); +import SchemaTypeNumber = require('./number'); +import ValidationError = require('../error/validation'); /** * Integer schema type. @@ -15,10 +13,10 @@ class SchemaTypeInteger extends SchemaTypeNumber { * @param {Object} data * @return {Number} */ - cast(value_, data) { + cast(value_, data): number { const value = super.cast(value_, data); - return parseInt(value, 10); + return parseInt(value as any, 10); } /** @@ -28,7 +26,7 @@ class SchemaTypeInteger extends SchemaTypeNumber { * @param {Object} data * @return {Number|Error} */ - validate(value_, data) { + validate(value_, data): number { const value = super.validate(value_, data); if (value % 1 !== 0) { @@ -39,4 +37,4 @@ class SchemaTypeInteger extends SchemaTypeNumber { } } -module.exports = SchemaTypeInteger; +export = SchemaTypeInteger; diff --git a/lib/types/number.js b/src/types/number.ts similarity index 89% rename from lib/types/number.js rename to src/types/number.ts index 90dbffa5..90ffaa6d 100644 --- a/lib/types/number.js +++ b/src/types/number.ts @@ -1,12 +1,10 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * Number schema type. */ -class SchemaTypeNumber extends SchemaType { +class SchemaTypeNumber extends SchemaType { /** * Casts a number. @@ -15,10 +13,10 @@ class SchemaTypeNumber extends SchemaType { * @param {Object} data * @return {Number} */ - cast(value_, data) { + cast(value_, data): number | null | undefined { const value = super.cast(value_, data); - if (value == null || typeof value === 'number') return value; + if (value == null || typeof value === 'number') return value as number | null | undefined; return +value; } @@ -125,4 +123,4 @@ class SchemaTypeNumber extends SchemaType { } } -module.exports = SchemaTypeNumber; +export = SchemaTypeNumber; diff --git a/lib/types/object.js b/src/types/object.ts similarity index 55% rename from lib/types/object.js rename to src/types/object.ts index ff2eb391..9bd88ea3 100644 --- a/lib/types/object.js +++ b/src/types/object.ts @@ -1,22 +1,20 @@ -'use strict'; - -const SchemaType = require('../schematype'); +import SchemaType = require('../schematype'); /** * Object schema type. */ -class SchemaTypeObject extends SchemaType { +class SchemaTypeObject extends SchemaType> { /** * - * @param {String} name + * @param {String} [name] * @param {Object} [options] * @param {Boolean} [options.required=false] * @param {Object|Function} [options.default={}] */ - constructor(name, options) { + constructor(name?, options?) { super(name, Object.assign({ default: {} }, options)); } } -module.exports = SchemaTypeObject; +export = SchemaTypeObject; diff --git a/lib/types/string.js b/src/types/string.ts similarity index 90% rename from lib/types/string.js rename to src/types/string.ts index ac42f089..225f5fe6 100644 --- a/lib/types/string.js +++ b/src/types/string.ts @@ -1,12 +1,10 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const ValidationError = require('../error/validation'); +import SchemaType = require('../schematype'); +import ValidationError = require('../error/validation'); /** * String schema type. */ -class SchemaTypeString extends SchemaType { +class SchemaTypeString extends SchemaType { /** * Casts a string. @@ -100,4 +98,4 @@ class SchemaTypeString extends SchemaType { } } -module.exports = SchemaTypeString; +export = SchemaTypeString; diff --git a/lib/types/virtual.js b/src/types/virtual.ts similarity index 80% rename from lib/types/virtual.js rename to src/types/virtual.ts index adf8748f..fb886f01 100644 --- a/lib/types/virtual.js +++ b/src/types/virtual.ts @@ -1,12 +1,13 @@ -'use strict'; - -const SchemaType = require('../schematype'); -const { setGetter } = require('../util'); +import SchemaType = require('../schematype'); +import util = require('../util'); +const { setGetter } = util; /** * Virtual schema type. */ -class SchemaTypeVirtual extends SchemaType { +class SchemaTypeVirtual extends SchemaType { + getter: (() => any) | undefined; + setter: ((value: any) => void) | undefined; /** * Add a getter. @@ -77,4 +78,4 @@ class SchemaTypeVirtual extends SchemaType { } } -module.exports = SchemaTypeVirtual; +export = SchemaTypeVirtual; diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 00000000..ec613c48 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,183 @@ +function extractPropKey(key) { + return key.split('.'); +} + +function parseArgs(args) { + if (typeof args !== 'string') return args; + + const arr = args.split(' '); + const result = {}; + + for (let i = 0, len = arr.length; i < len; i++) { + const key = arr[i]; + + switch (key[0]) { + case '+': + result[key.slice(1)] = 1; + break; + + case '-': + result[key.slice(1)] = -1; + break; + + default: + result[key] = 1; + } + } + + return result; +} + +export = { + shuffle: array => { + if (!Array.isArray(array)) throw new TypeError('array must be an Array!'); + const $array = array.slice(); + const { length } = $array; + const { random, floor } = Math; + + for (let i = 0; i < length; i++) { + // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L6718 + // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L3884 + const rand = i + floor(random() * (length - i)); + + const temp = $array[i]; + $array[i] = $array[rand]; + $array[rand] = temp; + } + + return $array; + }, + getProp: (obj, key) => { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); + + if (!key.includes('.')) { + return obj[key]; + } + + const token = extractPropKey(key); + let result = obj; + const len = token.length; + + for (let i = 0; i < len; i++) { + result = result[token[i]]; + } + + return result; + }, + setProp: (obj, key, value) => { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); + + if (!key.includes('.')) { + obj[key] = value; + return; + } + + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; + + let cursor = obj; + + for (let i = 0; i < len; i++) { + const name = token[i]; + cursor[name] = cursor[name] || {}; + cursor = cursor[name]; + } + + cursor[lastKey] = value; + }, + delProp: (obj, key) => { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); + + if (!key.includes('.')) { + delete obj[key]; + return; + } + + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; + + let cursor = obj; + + for (let i = 0; i < len; i++) { + const name = token[i]; + + if (cursor[name]) { + cursor = cursor[name]; + } else { + return; + } + } + + delete cursor[lastKey]; + }, + setGetter: (obj, key, fn) => { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); + if (typeof fn !== 'function') throw new TypeError('fn must be a function!'); + + if (!key.includes('.')) { + obj.__defineGetter__(key, fn); + return; + } + + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; + + let cursor = obj; + + for (let i = 0; i < len; i++) { + const name = token[i]; + cursor[name] = cursor[name] || {}; + cursor = cursor[name]; + } + + cursor.__defineGetter__(lastKey, fn); + }, + arr2obj: (arr, value) => { + if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); + + const obj = {}; + let i = arr.length; + + while (i--) { + obj[arr[i]] = value; + } + + return obj; + }, + reverse: arr => { + if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); + + const len = arr.length; + + if (!len) return arr; + + for (let left = 0, right = len - 1; left < right; left++, right--) { + const tmp = arr[left]; + arr[left] = arr[right]; + arr[right] = tmp; + } + + return arr; + }, + parseArgs: (orderby, order) => { + let result; + + if (order) { + result = {}; + result[orderby] = order; + } else if (typeof orderby === 'string') { + result = parseArgs(orderby); + } else { + result = orderby; + } + + return result; + } +} diff --git a/test/fixtures/db.json b/test/fixtures/db.json index 5a796455..32e13d6e 100644 --- a/test/fixtures/db.json +++ b/test/fixtures/db.json @@ -1 +1 @@ -{"meta":{"version":1,"warehouse":"3.0.1"},"models":{"Test":[{"_id":"A"},{"_id":"B"},{"_id":"C"}]}} \ No newline at end of file +{"meta":{"version":1,"warehouse":"4.0.0"},"models":{"Test":[{"_id":"A"},{"_id":"B"},{"_id":"C"}]}} \ No newline at end of file diff --git a/test/scripts/database.js b/test/scripts/database.js index 30001e87..a7b518a5 100644 --- a/test/scripts/database.js +++ b/test/scripts/database.js @@ -10,8 +10,8 @@ const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json'); const DB_VERSION = 1; describe('Database', () => { - const Database = require('../..'); - const Model = require('../../lib/model'); + const Database = require('../../built/database'); + const Model = require('../../built/model'); const Schema = Database.Schema; const db = new Database({path: DB_PATH, version: DB_VERSION}); diff --git a/test/scripts/document.js b/test/scripts/document.js index ba9d359c..0a7f680d 100644 --- a/test/scripts/document.js +++ b/test/scripts/document.js @@ -4,7 +4,7 @@ const should = require('chai').should(); // eslint-disable-line describe('Document', () => { const Database = require('../..'); - const Document = require('../../lib/document'); + const Document = require('../../built/document'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/mutex.js b/test/scripts/mutex.js index 4df3c5af..cf8b1e19 100644 --- a/test/scripts/mutex.js +++ b/test/scripts/mutex.js @@ -1,7 +1,7 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const Mutex = require('../../lib/mutex'); +const Mutex = require('../../built/mutex'); const sinon = require('sinon'); describe('Mutex', () => { diff --git a/test/scripts/query.js b/test/scripts/query.js index 06a99af6..3af8f565 100644 --- a/test/scripts/query.js +++ b/test/scripts/query.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line const sortBy = require('lodash/sortBy'); const Promise = require('bluebird'); -const Document = require('../../lib/document'); +const Document = require('../../built/document'); describe('Query', () => { const Database = require('../..'); diff --git a/test/scripts/schematype.js b/test/scripts/schematype.js index 6ed1bf25..b086d00a 100644 --- a/test/scripts/schematype.js +++ b/test/scripts/schematype.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../lib/error/validation'); +const ValidationError = require('../../built/error/validation'); describe('SchemaType', () => { - const SchemaType = require('../../lib/schematype'); + const SchemaType = require('../../built/schematype'); const type = new SchemaType('test'); it('cast()', () => { diff --git a/test/scripts/types/array.js b/test/scripts/types/array.js index 7228343d..2f08cb3a 100644 --- a/test/scripts/types/array.js +++ b/test/scripts/types/array.js @@ -1,13 +1,13 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeArray', () => { - const SchemaTypeArray = require('../../../lib/types/array'); - const SchemaTypeString = require('../../../lib/types/string'); - const SchemaTypeDate = require('../../../lib/types/date'); - const SchemaTypeBoolean = require('../../../lib/types/boolean'); + const SchemaTypeArray = require('../../../built/types/array'); + const SchemaTypeString = require('../../../built/types/string'); + const SchemaTypeDate = require('../../../built/types/date'); + const SchemaTypeBoolean = require('../../../built/types/boolean'); const type = new SchemaTypeArray('test'); it('cast()', () => { diff --git a/test/scripts/types/boolean.js b/test/scripts/types/boolean.js index 07be269f..2a51dae2 100644 --- a/test/scripts/types/boolean.js +++ b/test/scripts/types/boolean.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeBoolean', () => { - const SchemaTypeBoolean = require('../../../lib/types/boolean'); + const SchemaTypeBoolean = require('../../../built/types/boolean'); const type = new SchemaTypeBoolean('test'); it('cast()', () => { diff --git a/test/scripts/types/buffer.js b/test/scripts/types/buffer.js index 3c6c62d9..7263b5b0 100644 --- a/test/scripts/types/buffer.js +++ b/test/scripts/types/buffer.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeBuffer', () => { - const SchemaTypeBuffer = require('../../../lib/types/buffer'); + const SchemaTypeBuffer = require('../../../built/types/buffer'); const type = new SchemaTypeBuffer('test'); it('cast()', () => { diff --git a/test/scripts/types/cuid.js b/test/scripts/types/cuid.js index f17cd89c..c70830f8 100644 --- a/test/scripts/types/cuid.js +++ b/test/scripts/types/cuid.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeCUID', () => { - const SchemaTypeCUID = require('../../../lib/types/cuid'); + const SchemaTypeCUID = require('../../../built/types/cuid'); const type = new SchemaTypeCUID('test'); it('cast()', () => { diff --git a/test/scripts/types/date.js b/test/scripts/types/date.js index 912bec84..b366398d 100644 --- a/test/scripts/types/date.js +++ b/test/scripts/types/date.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeDate', () => { - const SchemaTypeDate = require('../../../lib/types/date'); + const SchemaTypeDate = require('../../../built/types/date'); const type = new SchemaTypeDate('test'); it('cast()', () => { diff --git a/test/scripts/types/enum.js b/test/scripts/types/enum.js index 166c3888..94522209 100644 --- a/test/scripts/types/enum.js +++ b/test/scripts/types/enum.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeEnum', () => { - const SchemaTypeEnum = require('../../../lib/types/enum'); + const SchemaTypeEnum = require('../../../built/types/enum'); it('validate()', () => { const type = new SchemaTypeEnum('test', {elements: ['foo', 'bar', 'baz']}); diff --git a/test/scripts/types/integer.js b/test/scripts/types/integer.js index 9589fad1..60f22d80 100644 --- a/test/scripts/types/integer.js +++ b/test/scripts/types/integer.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeInteger', () => { - const SchemaTypeInteger = require('../../../lib/types/integer'); + const SchemaTypeInteger = require('../../../built/types/integer'); const type = new SchemaTypeInteger('test'); it('cast()', () => { diff --git a/test/scripts/types/number.js b/test/scripts/types/number.js index 6442196e..107b1f64 100644 --- a/test/scripts/types/number.js +++ b/test/scripts/types/number.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeNumber', () => { - const SchemaTypeNumber = require('../../../lib/types/number'); + const SchemaTypeNumber = require('../../../built/types/number'); const type = new SchemaTypeNumber('type'); it('cast()', () => { diff --git a/test/scripts/types/object.js b/test/scripts/types/object.js index a5cd9c74..d6ef04e0 100644 --- a/test/scripts/types/object.js +++ b/test/scripts/types/object.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeObject', () => { - const SchemaTypeObject = require('../../../lib/types/object'); + const SchemaTypeObject = require('../../../built/types/object'); const type = new SchemaTypeObject('test'); it('cast() - default', () => { diff --git a/test/scripts/types/string.js b/test/scripts/types/string.js index 2425d012..cbb601f1 100644 --- a/test/scripts/types/string.js +++ b/test/scripts/types/string.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../lib/error/validation'); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeString', () => { - const SchemaTypeString = require('../../../lib/types/string'); + const SchemaTypeString = require('../../../built/types/string'); const type = new SchemaTypeString('test'); it('cast()', () => { diff --git a/test/scripts/types/virtual.js b/test/scripts/types/virtual.js index 515cbbcb..23671158 100644 --- a/test/scripts/types/virtual.js +++ b/test/scripts/types/virtual.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeVirtual', () => { - const SchemaTypeVirtual = require('../../../lib/types/virtual'); + const SchemaTypeVirtual = require('../../../built/types/virtual'); const type = new SchemaTypeVirtual('test'); it('get()', () => { diff --git a/test/scripts/util.js b/test/scripts/util.js index 5a23df2a..9a67c0e2 100644 --- a/test/scripts/util.js +++ b/test/scripts/util.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('util', () => { - const util = require('../../lib/util'); + const util = require('../../built/util'); it('shuffle()', () => { const src = Array(100).fill(0).map((_, i) => i); From d73908838d14cd66d8b31772322a147290d39f34 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Thu, 16 Jun 2022 18:20:01 +0900 Subject: [PATCH 03/32] chore(deps): update devDependencies --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6e8222e7..9f23b26d 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,12 @@ "rfdc": "^1.1.4" }, "devDependencies": { - "@types/bluebird": "^3.5.32", - "@types/graceful-fs": "^4.1.3", + "@types/bluebird": "^3.5.36", + "@types/graceful-fs": "^4.1.5", "@types/jsonstream": "^0.8.30", - "@types/node": "^14.0.5", - "@typescript-eslint/eslint-plugin": "^3.0.0", - "@typescript-eslint/parser": "^3.0.0", + "@types/node": "^18.0.0", + "@typescript-eslint/eslint-plugin": "^5.28.0", + "@typescript-eslint/parser": "^5.28.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "eslint": "^8.1.0", @@ -52,7 +52,7 @@ "mocha": "^10.0.0", "nyc": "^15.0.0", "sinon": "^14.0.0", - "typescript": "^3.9.3" + "typescript": "^4.7.3" }, "engines": { "node": ">=14" From b1a4c57b9b6fea26fc839e94b7f1d5ef94697291 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:02:49 +0900 Subject: [PATCH 04/32] refactor: use import syntax --- src/database.ts | 16 ++++++++-------- src/error/population.ts | 2 +- src/error/validation.ts | 4 ++-- src/model.ts | 20 ++++++++++---------- src/query.ts | 4 ++-- src/schema.ts | 12 ++++++------ src/schematype.ts | 4 ++-- src/types/array.ts | 4 ++-- src/types/boolean.ts | 4 ++-- src/types/buffer.ts | 4 ++-- src/types/cuid.ts | 6 +++--- src/types/date.ts | 4 ++-- src/types/enum.ts | 4 ++-- src/types/integer.ts | 4 ++-- src/types/number.ts | 4 ++-- src/types/object.ts | 2 +- src/types/string.ts | 4 ++-- src/types/virtual.ts | 4 ++-- test/scripts/database.js | 25 ++++++++++++++----------- test/scripts/document.js | 9 ++++----- test/scripts/model.js | 17 +++++++++-------- test/scripts/mutex.js | 9 ++++----- test/scripts/query.js | 15 ++++++++------- test/scripts/schema.js | 7 +++---- test/scripts/schematype.js | 9 ++++----- test/scripts/types/array.js | 16 ++++++++-------- test/scripts/types/boolean.js | 9 ++++----- test/scripts/types/buffer.js | 9 ++++----- test/scripts/types/cuid.js | 9 ++++----- test/scripts/types/date.js | 9 ++++----- test/scripts/types/enum.js | 10 ++++------ test/scripts/types/integer.js | 9 ++++----- test/scripts/types/number.js | 9 ++++----- test/scripts/types/object.js | 7 +++---- test/scripts/types/string.js | 9 ++++----- test/scripts/types/virtual.js | 7 +++---- test/scripts/util.js | 8 +++----- 37 files changed, 148 insertions(+), 160 deletions(-) diff --git a/src/database.ts b/src/database.ts index 969c75af..babccd26 100644 --- a/src/database.ts +++ b/src/database.ts @@ -1,14 +1,14 @@ -import JSONStream = require('JSONStream'); -import Bluebird = require('bluebird'); +import JSONStream from 'JSONStream'; +import Bluebird from 'bluebird'; import { writev, promises as fsPromises, createReadStream } from 'graceful-fs'; import { pipeline, Stream } from 'stream'; -import Model = require('./model'); -import Schema = require('./schema'); -import SchemaType = require('./schematype'); -import WarehouseError = require('./error'); -// eslint-disable-next-line @typescript-eslint/no-var-requires +import Model from './model'; +import Schema from './schema'; +import SchemaType from './schematype'; +import WarehouseError from './error'; +import log from 'hexo-log'; + const pkg = require('../package.json'); -const log = require('hexo-log')(); const { open } = fsPromises; const pipelineAsync = Bluebird.promisify(pipeline) as (...args: Stream[]) => Bluebird; diff --git a/src/error/population.ts b/src/error/population.ts index c97c0fc1..ad882011 100644 --- a/src/error/population.ts +++ b/src/error/population.ts @@ -1,4 +1,4 @@ -import WarehouseError = require('../error'); +import WarehouseError from '../error'; class PopulationError extends WarehouseError {} diff --git a/src/error/validation.ts b/src/error/validation.ts index bdd4ee6b..287d61af 100644 --- a/src/error/validation.ts +++ b/src/error/validation.ts @@ -1,7 +1,7 @@ -import WarehouseError = require('../error'); +import WarehouseError from '../error'; class ValidationError extends WarehouseError {} ValidationError.prototype.name = 'ValidationError'; -export = ValidationError; +export = ValidationError; \ No newline at end of file diff --git a/src/model.ts b/src/model.ts index 072da0f8..85f4d827 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1,16 +1,16 @@ import { EventEmitter } from 'events'; -import rfdc = require('rfdc'); +import rfdc from 'rfdc'; const cloneDeep = rfdc(); -import Promise = require('bluebird'); -import util = require('./util'); +import Promise from 'bluebird'; +import util from './util'; const { parseArgs, getProp, setGetter, shuffle } = util; -import Document = require('./document'); -import Query = require('./query'); -import Schema = require('./schema'); -import Types = require('./types'); -import WarehouseError = require('./error'); -import PopulationError = require('./error/population'); -import Mutex = require('./mutex'); +import Document from './document'; +import Query from './query'; +import Schema from './schema'; +import Types from './types/index'; +import WarehouseError from './error'; +import PopulationError from './error/population'; +import Mutex from './mutex'; class Model extends EventEmitter { _mutex = new Mutex(); diff --git a/src/query.ts b/src/query.ts index f547e2f1..07bf2dfb 100644 --- a/src/query.ts +++ b/src/query.ts @@ -1,5 +1,5 @@ -import Promise = require('bluebird'); -import util = require('./util'); +import Promise from 'bluebird'; +import util from './util'; const { parseArgs, shuffle } = util; abstract class Query { diff --git a/src/schema.ts b/src/schema.ts index 5c5a1ddc..ba304005 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,10 +1,10 @@ -import SchemaType = require('./schematype'); -import Types = require('./types'); -import Promise = require('bluebird'); -import util = require('./util'); +import SchemaType from './schematype'; +import Types from './types/index'; +import Promise from 'bluebird'; +import util from './util'; const { getProp, setProp, delProp } = util; -import PopulationError = require('./error/population'); -import SchemaTypeVirtual = require('./types/virtual'); +import PopulationError from './error/population'; +import SchemaTypeVirtual from './types/virtual'; // eslint-disable-next-line @typescript-eslint/no-var-requires const isPlainObject: (o: any) => boolean = require('is-plain-object'); diff --git a/src/schematype.ts b/src/schematype.ts index 1c8136cd..b21db202 100644 --- a/src/schematype.ts +++ b/src/schematype.ts @@ -1,6 +1,6 @@ -import util = require('./util'); +import util from './util'; const { setProp } = util; -import ValidationError = require('./error/validation'); +import ValidationError from './error/validation'; /** * This is the basic schema type. diff --git a/src/types/array.ts b/src/types/array.ts index 3f7354ff..746fb8bb 100644 --- a/src/types/array.ts +++ b/src/types/array.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; const { isArray } = Array; diff --git a/src/types/boolean.ts b/src/types/boolean.ts index e45ce74c..aafef2d5 100644 --- a/src/types/boolean.ts +++ b/src/types/boolean.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * Boolean schema type. diff --git a/src/types/buffer.ts b/src/types/buffer.ts index 6b2cb9aa..95d14bf5 100644 --- a/src/types/buffer.ts +++ b/src/types/buffer.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * Boolean schema type. diff --git a/src/types/cuid.ts b/src/types/cuid.ts index 51b300c5..4678c85f 100644 --- a/src/types/cuid.ts +++ b/src/types/cuid.ts @@ -1,6 +1,6 @@ -import SchemaType = require('../schematype'); -import cuid = require('cuid'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import cuid from 'cuid'; +import ValidationError from '../error/validation'; /** * [CUID](https://github.com/ericelliott/cuid) schema type. diff --git a/src/types/date.ts b/src/types/date.ts index ee4dc6b2..9f86af3a 100644 --- a/src/types/date.ts +++ b/src/types/date.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * Date schema type. diff --git a/src/types/enum.ts b/src/types/enum.ts index df736c0d..18e69345 100644 --- a/src/types/enum.ts +++ b/src/types/enum.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * Enum schema type. diff --git a/src/types/integer.ts b/src/types/integer.ts index 1767ec20..f5919d94 100644 --- a/src/types/integer.ts +++ b/src/types/integer.ts @@ -1,5 +1,5 @@ -import SchemaTypeNumber = require('./number'); -import ValidationError = require('../error/validation'); +import SchemaTypeNumber from './number'; +import ValidationError from '../error/validation'; /** * Integer schema type. diff --git a/src/types/number.ts b/src/types/number.ts index 90ffaa6d..9a0ccc45 100644 --- a/src/types/number.ts +++ b/src/types/number.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * Number schema type. diff --git a/src/types/object.ts b/src/types/object.ts index 9bd88ea3..d7695731 100644 --- a/src/types/object.ts +++ b/src/types/object.ts @@ -1,4 +1,4 @@ -import SchemaType = require('../schematype'); +import SchemaType from '../schematype'; /** * Object schema type. diff --git a/src/types/string.ts b/src/types/string.ts index 225f5fe6..730c777c 100644 --- a/src/types/string.ts +++ b/src/types/string.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import ValidationError = require('../error/validation'); +import SchemaType from '../schematype'; +import ValidationError from '../error/validation'; /** * String schema type. diff --git a/src/types/virtual.ts b/src/types/virtual.ts index fb886f01..fac2cb7d 100644 --- a/src/types/virtual.ts +++ b/src/types/virtual.ts @@ -1,5 +1,5 @@ -import SchemaType = require('../schematype'); -import util = require('../util'); +import SchemaType from '../schematype'; +import util from '../util'; const { setGetter } = util; /** diff --git a/test/scripts/database.js b/test/scripts/database.js index a7b518a5..25bc6f61 100644 --- a/test/scripts/database.js +++ b/test/scripts/database.js @@ -1,17 +1,20 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const path = require('path'); -const Promise = require('bluebird'); -const sinon = require('sinon'); -const fs = Promise.promisifyAll(require('fs')); - +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import path from 'path'; +import Promise from 'bluebird'; +import sinon from 'sinon'; +import Database from '../../lib/database'; +import Model from '../../lib/model'; +import fs from 'fs'; +const promisifyFs = Promise.promisifyAll(fs); + +import url from "url"; +const __filename = url.fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json'); const DB_VERSION = 1; describe('Database', () => { - const Database = require('../../built/database'); - const Model = require('../../built/model'); const Schema = Database.Schema; const db = new Database({path: DB_PATH, version: DB_VERSION}); @@ -85,7 +88,7 @@ describe('Database', () => { }); }); - it('save()', () => db.save().then(() => fs.readFileAsync(DB_PATH, 'utf8')).then(data => { + it('save()', () => db.save().then(() => promisifyFs.readFileAsync(DB_PATH, 'utf8')).then(data => { const json = JSON.parse(data); json.meta.should.eql({ diff --git a/test/scripts/document.js b/test/scripts/document.js index 0a7f680d..51d70fb2 100644 --- a/test/scripts/document.js +++ b/test/scripts/document.js @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Database from '../../lib/database'; +import Document from '../../lib/document'; describe('Document', () => { - const Database = require('../..'); - const Document = require('../../built/document'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/model.js b/test/scripts/model.js index 075dacf3..3bcb7d51 100644 --- a/test/scripts/model.js +++ b/test/scripts/model.js @@ -1,13 +1,14 @@ -'use strict'; - -const should = require('chai').use(require('chai-as-promised')).should(); -const sortBy = require('lodash/sortBy'); -const Promise = require('bluebird'); -const sinon = require('sinon'); -const cuid = require('cuid'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import lodash from 'lodash'; +const { sortBy } = lodash; +import Promise from 'bluebird'; +import sinon from 'sinon'; +import cuid from 'cuid'; +import Database from '../../lib/database'; describe('Model', () => { - const Database = require('../..'); + const Schema = Database.Schema; const SchemaType = Database.SchemaType; diff --git a/test/scripts/mutex.js b/test/scripts/mutex.js index cf8b1e19..a9df3247 100644 --- a/test/scripts/mutex.js +++ b/test/scripts/mutex.js @@ -1,8 +1,7 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const Mutex = require('../../built/mutex'); -const sinon = require('sinon'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Mutex from '../../lib/mutex'; +import sinon from 'sinon'; describe('Mutex', () => { it('mutex test', callback => { diff --git a/test/scripts/query.js b/test/scripts/query.js index 3af8f565..689befaf 100644 --- a/test/scripts/query.js +++ b/test/scripts/query.js @@ -1,12 +1,13 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const sortBy = require('lodash/sortBy'); -const Promise = require('bluebird'); -const Document = require('../../built/document'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import lodash from 'lodash'; +const { sortBy } = lodash; +import Promise from 'bluebird'; +import Document from '../../lib/document'; +import Database from '../../lib/database'; describe('Query', () => { - const Database = require('../..'); + const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/schema.js b/test/scripts/schema.js index 6d3081b5..e67cf0b0 100644 --- a/test/scripts/schema.js +++ b/test/scripts/schema.js @@ -1,9 +1,8 @@ -'use strict'; - -require('chai').should(); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Database from '../../lib/database'; describe('Schema', () => { - const Database = require('../..'); const Schema = Database.Schema; it('add()', () => { diff --git a/test/scripts/schematype.js b/test/scripts/schematype.js index b086d00a..82dbf1ce 100644 --- a/test/scripts/schematype.js +++ b/test/scripts/schematype.js @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../lib/error/validation'; +import SchemaType from '../../lib/schematype'; describe('SchemaType', () => { - const SchemaType = require('../../built/schematype'); const type = new SchemaType('test'); it('cast()', () => { diff --git a/test/scripts/types/array.js b/test/scripts/types/array.js index 2f08cb3a..df1d661c 100644 --- a/test/scripts/types/array.js +++ b/test/scripts/types/array.js @@ -1,13 +1,13 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeArray from '../../../lib/types/array'; +import SchemaTypeString from '../../../lib/types/string'; +import SchemaTypeDate from '../../../lib/types/date'; +import SchemaTypeBoolean from '../../../lib/types/boolean'; describe('SchemaTypeArray', () => { - const SchemaTypeArray = require('../../../built/types/array'); - const SchemaTypeString = require('../../../built/types/string'); - const SchemaTypeDate = require('../../../built/types/date'); - const SchemaTypeBoolean = require('../../../built/types/boolean'); + const type = new SchemaTypeArray('test'); it('cast()', () => { diff --git a/test/scripts/types/boolean.js b/test/scripts/types/boolean.js index 2a51dae2..c80eb191 100644 --- a/test/scripts/types/boolean.js +++ b/test/scripts/types/boolean.js @@ -1,10 +1,9 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeBoolean from '../../../lib/types/boolean'; describe('SchemaTypeBoolean', () => { - const SchemaTypeBoolean = require('../../../built/types/boolean'); const type = new SchemaTypeBoolean('test'); it('cast()', () => { diff --git a/test/scripts/types/buffer.js b/test/scripts/types/buffer.js index 7263b5b0..b526588f 100644 --- a/test/scripts/types/buffer.js +++ b/test/scripts/types/buffer.js @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeBuffer from '../../../lib/types/buffer'; describe('SchemaTypeBuffer', () => { - const SchemaTypeBuffer = require('../../../built/types/buffer'); const type = new SchemaTypeBuffer('test'); it('cast()', () => { diff --git a/test/scripts/types/cuid.js b/test/scripts/types/cuid.js index c70830f8..34fd29d3 100644 --- a/test/scripts/types/cuid.js +++ b/test/scripts/types/cuid.js @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeCUID from '../../../lib/types/cuid'; describe('SchemaTypeCUID', () => { - const SchemaTypeCUID = require('../../../built/types/cuid'); const type = new SchemaTypeCUID('test'); it('cast()', () => { diff --git a/test/scripts/types/date.js b/test/scripts/types/date.js index b366398d..e5cd34a5 100644 --- a/test/scripts/types/date.js +++ b/test/scripts/types/date.js @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeDate from '../../../lib/types/date'; describe('SchemaTypeDate', () => { - const SchemaTypeDate = require('../../../built/types/date'); const type = new SchemaTypeDate('test'); it('cast()', () => { diff --git a/test/scripts/types/enum.js b/test/scripts/types/enum.js index 94522209..91abcb0a 100644 --- a/test/scripts/types/enum.js +++ b/test/scripts/types/enum.js @@ -1,11 +1,9 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeEnum from '../../../lib/types/enum'; describe('SchemaTypeEnum', () => { - const SchemaTypeEnum = require('../../../built/types/enum'); - it('validate()', () => { const type = new SchemaTypeEnum('test', {elements: ['foo', 'bar', 'baz']}); diff --git a/test/scripts/types/integer.js b/test/scripts/types/integer.js index 60f22d80..1bf10358 100644 --- a/test/scripts/types/integer.js +++ b/test/scripts/types/integer.js @@ -1,10 +1,9 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeInteger from '../../../lib/types/integer'; describe('SchemaTypeInteger', () => { - const SchemaTypeInteger = require('../../../built/types/integer'); const type = new SchemaTypeInteger('test'); it('cast()', () => { diff --git a/test/scripts/types/number.js b/test/scripts/types/number.js index 107b1f64..7aa1707c 100644 --- a/test/scripts/types/number.js +++ b/test/scripts/types/number.js @@ -1,10 +1,9 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeNumber from '../../../lib/types/number'; describe('SchemaTypeNumber', () => { - const SchemaTypeNumber = require('../../../built/types/number'); const type = new SchemaTypeNumber('type'); it('cast()', () => { diff --git a/test/scripts/types/object.js b/test/scripts/types/object.js index d6ef04e0..07963e8e 100644 --- a/test/scripts/types/object.js +++ b/test/scripts/types/object.js @@ -1,9 +1,8 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import SchemaTypeObject from '../../../lib/types/object'; describe('SchemaTypeObject', () => { - const SchemaTypeObject = require('../../../built/types/object'); const type = new SchemaTypeObject('test'); it('cast() - default', () => { diff --git a/test/scripts/types/string.js b/test/scripts/types/string.js index cbb601f1..8f4a9e44 100644 --- a/test/scripts/types/string.js +++ b/test/scripts/types/string.js @@ -1,10 +1,9 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../lib/error/validation'; +import SchemaTypeString from '../../../lib/types/string'; describe('SchemaTypeString', () => { - const SchemaTypeString = require('../../../built/types/string'); const type = new SchemaTypeString('test'); it('cast()', () => { diff --git a/test/scripts/types/virtual.js b/test/scripts/types/virtual.js index 23671158..27a47752 100644 --- a/test/scripts/types/virtual.js +++ b/test/scripts/types/virtual.js @@ -1,9 +1,8 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import SchemaTypeVirtual from '../../../lib/types/virtual'; describe('SchemaTypeVirtual', () => { - const SchemaTypeVirtual = require('../../../built/types/virtual'); const type = new SchemaTypeVirtual('test'); it('get()', () => { diff --git a/test/scripts/util.js b/test/scripts/util.js index 9a67c0e2..dbb65e33 100644 --- a/test/scripts/util.js +++ b/test/scripts/util.js @@ -1,10 +1,8 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import * as util from '../../lib/util'; describe('util', () => { - const util = require('../../built/util'); - it('shuffle()', () => { const src = Array(100).fill(0).map((_, i) => i); const result = util.shuffle(src); From fc5ff42a9777fb708dcef7132f6601e9aa7686aa Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:03:19 +0900 Subject: [PATCH 05/32] chore: format `.tsconfig.json` --- .tsconfig.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.tsconfig.json b/.tsconfig.json index 9a812b1d..696bb6c3 100644 --- a/.tsconfig.json +++ b/.tsconfig.json @@ -1,13 +1,13 @@ { - "compilerOptions": { - "outDir": "./built", - "allowJs": true, - "target": "ES2018", - "lib": ["ES2018"], - "module": "commonjs", - "esModuleInterop": true - }, - "include": [ - "./src/**/*" - ] + "compilerOptions": { + "outDir": "./built", + "allowJs": true, + "target": "ES2018", + "lib": ["ES2018"], + "module": "commonjs", + "esModuleInterop": true + }, + "include": [ + "./src/**/*" + ] } \ No newline at end of file From 9b82a791cbd95f0d97069e221e03593a4e091d20 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:06:12 +0900 Subject: [PATCH 06/32] chore: update `tsconfig.json` --- .tsconfig.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.tsconfig.json b/.tsconfig.json index 696bb6c3..e8f049ff 100644 --- a/.tsconfig.json +++ b/.tsconfig.json @@ -1,13 +1,19 @@ { "compilerOptions": { "outDir": "./built", - "allowJs": true, - "target": "ES2018", - "lib": ["ES2018"], "module": "commonjs", - "esModuleInterop": true + "target": "es6", + "sourceMap": true, + "declaration": true, + "esModuleInterop": true, + "types": [ + "node" + ] }, "include": [ "./src/**/*" + ], + "exclude": [ + "node_modules" ] } \ No newline at end of file From d2787631a2d76b537afdf5bd34b34b97ad429bce Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:08:17 +0900 Subject: [PATCH 07/32] Revert only under the `test` dir: "refactor: use import syntax" This reverts commit b1a4c57b9b6fea26fc839e94b7f1d5ef94697291. --- test/scripts/database.js | 25 +++++++++++-------------- test/scripts/document.js | 9 +++++---- test/scripts/model.js | 17 ++++++++--------- test/scripts/mutex.js | 9 +++++---- test/scripts/query.js | 15 +++++++-------- test/scripts/schema.js | 7 ++++--- test/scripts/schematype.js | 9 +++++---- test/scripts/types/array.js | 16 ++++++++-------- test/scripts/types/boolean.js | 9 +++++---- test/scripts/types/buffer.js | 9 +++++---- test/scripts/types/cuid.js | 9 +++++---- test/scripts/types/date.js | 9 +++++---- test/scripts/types/enum.js | 10 ++++++---- test/scripts/types/integer.js | 9 +++++---- test/scripts/types/number.js | 9 +++++---- test/scripts/types/object.js | 7 ++++--- test/scripts/types/string.js | 9 +++++---- test/scripts/types/virtual.js | 7 ++++--- test/scripts/util.js | 8 +++++--- 19 files changed, 107 insertions(+), 95 deletions(-) diff --git a/test/scripts/database.js b/test/scripts/database.js index 25bc6f61..a7b518a5 100644 --- a/test/scripts/database.js +++ b/test/scripts/database.js @@ -1,20 +1,17 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import path from 'path'; -import Promise from 'bluebird'; -import sinon from 'sinon'; -import Database from '../../lib/database'; -import Model from '../../lib/model'; -import fs from 'fs'; -const promisifyFs = Promise.promisifyAll(fs); - -import url from "url"; -const __filename = url.fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +'use strict'; + +const should = require('chai').should(); // eslint-disable-line +const path = require('path'); +const Promise = require('bluebird'); +const sinon = require('sinon'); +const fs = Promise.promisifyAll(require('fs')); + const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json'); const DB_VERSION = 1; describe('Database', () => { + const Database = require('../../built/database'); + const Model = require('../../built/model'); const Schema = Database.Schema; const db = new Database({path: DB_PATH, version: DB_VERSION}); @@ -88,7 +85,7 @@ describe('Database', () => { }); }); - it('save()', () => db.save().then(() => promisifyFs.readFileAsync(DB_PATH, 'utf8')).then(data => { + it('save()', () => db.save().then(() => fs.readFileAsync(DB_PATH, 'utf8')).then(data => { const json = JSON.parse(data); json.meta.should.eql({ diff --git a/test/scripts/document.js b/test/scripts/document.js index 51d70fb2..0a7f680d 100644 --- a/test/scripts/document.js +++ b/test/scripts/document.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import Database from '../../lib/database'; -import Document from '../../lib/document'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line describe('Document', () => { + const Database = require('../..'); + const Document = require('../../built/document'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/model.js b/test/scripts/model.js index 3bcb7d51..075dacf3 100644 --- a/test/scripts/model.js +++ b/test/scripts/model.js @@ -1,14 +1,13 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import lodash from 'lodash'; -const { sortBy } = lodash; -import Promise from 'bluebird'; -import sinon from 'sinon'; -import cuid from 'cuid'; -import Database from '../../lib/database'; +'use strict'; -describe('Model', () => { +const should = require('chai').use(require('chai-as-promised')).should(); +const sortBy = require('lodash/sortBy'); +const Promise = require('bluebird'); +const sinon = require('sinon'); +const cuid = require('cuid'); +describe('Model', () => { + const Database = require('../..'); const Schema = Database.Schema; const SchemaType = Database.SchemaType; diff --git a/test/scripts/mutex.js b/test/scripts/mutex.js index a9df3247..cf8b1e19 100644 --- a/test/scripts/mutex.js +++ b/test/scripts/mutex.js @@ -1,7 +1,8 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import Mutex from '../../lib/mutex'; -import sinon from 'sinon'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line +const Mutex = require('../../built/mutex'); +const sinon = require('sinon'); describe('Mutex', () => { it('mutex test', callback => { diff --git a/test/scripts/query.js b/test/scripts/query.js index 689befaf..3af8f565 100644 --- a/test/scripts/query.js +++ b/test/scripts/query.js @@ -1,13 +1,12 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import lodash from 'lodash'; -const { sortBy } = lodash; -import Promise from 'bluebird'; -import Document from '../../lib/document'; -import Database from '../../lib/database'; +'use strict'; -describe('Query', () => { +const should = require('chai').should(); // eslint-disable-line +const sortBy = require('lodash/sortBy'); +const Promise = require('bluebird'); +const Document = require('../../built/document'); +describe('Query', () => { + const Database = require('../..'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/schema.js b/test/scripts/schema.js index e67cf0b0..6d3081b5 100644 --- a/test/scripts/schema.js +++ b/test/scripts/schema.js @@ -1,8 +1,9 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import Database from '../../lib/database'; +'use strict'; + +require('chai').should(); describe('Schema', () => { + const Database = require('../..'); const Schema = Database.Schema; it('add()', () => { diff --git a/test/scripts/schematype.js b/test/scripts/schematype.js index 82dbf1ce..b086d00a 100644 --- a/test/scripts/schematype.js +++ b/test/scripts/schematype.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../lib/error/validation'; -import SchemaType from '../../lib/schematype'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line +const ValidationError = require('../../built/error/validation'); describe('SchemaType', () => { + const SchemaType = require('../../built/schematype'); const type = new SchemaType('test'); it('cast()', () => { diff --git a/test/scripts/types/array.js b/test/scripts/types/array.js index df1d661c..2f08cb3a 100644 --- a/test/scripts/types/array.js +++ b/test/scripts/types/array.js @@ -1,13 +1,13 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeArray from '../../../lib/types/array'; -import SchemaTypeString from '../../../lib/types/string'; -import SchemaTypeDate from '../../../lib/types/date'; -import SchemaTypeBoolean from '../../../lib/types/boolean'; +'use strict'; -describe('SchemaTypeArray', () => { +const should = require('chai').should(); // eslint-disable-line +const ValidationError = require('../../../built/error/validation'); +describe('SchemaTypeArray', () => { + const SchemaTypeArray = require('../../../built/types/array'); + const SchemaTypeString = require('../../../built/types/string'); + const SchemaTypeDate = require('../../../built/types/date'); + const SchemaTypeBoolean = require('../../../built/types/boolean'); const type = new SchemaTypeArray('test'); it('cast()', () => { diff --git a/test/scripts/types/boolean.js b/test/scripts/types/boolean.js index c80eb191..2a51dae2 100644 --- a/test/scripts/types/boolean.js +++ b/test/scripts/types/boolean.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeBoolean from '../../../lib/types/boolean'; +'use strict'; + +require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeBoolean', () => { + const SchemaTypeBoolean = require('../../../built/types/boolean'); const type = new SchemaTypeBoolean('test'); it('cast()', () => { diff --git a/test/scripts/types/buffer.js b/test/scripts/types/buffer.js index b526588f..7263b5b0 100644 --- a/test/scripts/types/buffer.js +++ b/test/scripts/types/buffer.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeBuffer from '../../../lib/types/buffer'; +'use strict'; + +const should = require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeBuffer', () => { + const SchemaTypeBuffer = require('../../../built/types/buffer'); const type = new SchemaTypeBuffer('test'); it('cast()', () => { diff --git a/test/scripts/types/cuid.js b/test/scripts/types/cuid.js index 34fd29d3..c70830f8 100644 --- a/test/scripts/types/cuid.js +++ b/test/scripts/types/cuid.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeCUID from '../../../lib/types/cuid'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeCUID', () => { + const SchemaTypeCUID = require('../../../built/types/cuid'); const type = new SchemaTypeCUID('test'); it('cast()', () => { diff --git a/test/scripts/types/date.js b/test/scripts/types/date.js index e5cd34a5..b366398d 100644 --- a/test/scripts/types/date.js +++ b/test/scripts/types/date.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeDate from '../../../lib/types/date'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeDate', () => { + const SchemaTypeDate = require('../../../built/types/date'); const type = new SchemaTypeDate('test'); it('cast()', () => { diff --git a/test/scripts/types/enum.js b/test/scripts/types/enum.js index 91abcb0a..94522209 100644 --- a/test/scripts/types/enum.js +++ b/test/scripts/types/enum.js @@ -1,9 +1,11 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeEnum from '../../../lib/types/enum'; +'use strict'; + +require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeEnum', () => { + const SchemaTypeEnum = require('../../../built/types/enum'); + it('validate()', () => { const type = new SchemaTypeEnum('test', {elements: ['foo', 'bar', 'baz']}); diff --git a/test/scripts/types/integer.js b/test/scripts/types/integer.js index 1bf10358..60f22d80 100644 --- a/test/scripts/types/integer.js +++ b/test/scripts/types/integer.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeInteger from '../../../lib/types/integer'; +'use strict'; + +require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeInteger', () => { + const SchemaTypeInteger = require('../../../built/types/integer'); const type = new SchemaTypeInteger('test'); it('cast()', () => { diff --git a/test/scripts/types/number.js b/test/scripts/types/number.js index 7aa1707c..107b1f64 100644 --- a/test/scripts/types/number.js +++ b/test/scripts/types/number.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeNumber from '../../../lib/types/number'; +'use strict'; + +require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeNumber', () => { + const SchemaTypeNumber = require('../../../built/types/number'); const type = new SchemaTypeNumber('type'); it('cast()', () => { diff --git a/test/scripts/types/object.js b/test/scripts/types/object.js index 07963e8e..d6ef04e0 100644 --- a/test/scripts/types/object.js +++ b/test/scripts/types/object.js @@ -1,8 +1,9 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import SchemaTypeObject from '../../../lib/types/object'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeObject', () => { + const SchemaTypeObject = require('../../../built/types/object'); const type = new SchemaTypeObject('test'); it('cast() - default', () => { diff --git a/test/scripts/types/string.js b/test/scripts/types/string.js index 8f4a9e44..cbb601f1 100644 --- a/test/scripts/types/string.js +++ b/test/scripts/types/string.js @@ -1,9 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import ValidationError from '../../../lib/error/validation'; -import SchemaTypeString from '../../../lib/types/string'; +'use strict'; + +require('chai').should(); +const ValidationError = require('../../../built/error/validation'); describe('SchemaTypeString', () => { + const SchemaTypeString = require('../../../built/types/string'); const type = new SchemaTypeString('test'); it('cast()', () => { diff --git a/test/scripts/types/virtual.js b/test/scripts/types/virtual.js index 27a47752..23671158 100644 --- a/test/scripts/types/virtual.js +++ b/test/scripts/types/virtual.js @@ -1,8 +1,9 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import SchemaTypeVirtual from '../../../lib/types/virtual'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeVirtual', () => { + const SchemaTypeVirtual = require('../../../built/types/virtual'); const type = new SchemaTypeVirtual('test'); it('get()', () => { diff --git a/test/scripts/util.js b/test/scripts/util.js index dbb65e33..9a67c0e2 100644 --- a/test/scripts/util.js +++ b/test/scripts/util.js @@ -1,8 +1,10 @@ -import chai from 'chai'; -const should = chai.should(); // eslint-disable-line -import * as util from '../../lib/util'; +'use strict'; + +const should = require('chai').should(); // eslint-disable-line describe('util', () => { + const util = require('../../built/util'); + it('shuffle()', () => { const src = Array(100).fill(0).map((_, i) => i); const result = util.shuffle(src); From 38e36cb9c711c3d3eed65e091698efc709b712b7 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:10:30 +0900 Subject: [PATCH 08/32] chore: built to dist --- .eslintrc.json | 2 +- .gitignore | 2 +- .tsconfig.json | 2 +- package.json | 6 +++--- test/scripts/database.js | 4 ++-- test/scripts/document.js | 2 +- test/scripts/mutex.js | 2 +- test/scripts/query.js | 2 +- test/scripts/schematype.js | 4 ++-- test/scripts/types/array.js | 10 +++++----- test/scripts/types/boolean.js | 4 ++-- test/scripts/types/buffer.js | 4 ++-- test/scripts/types/cuid.js | 4 ++-- test/scripts/types/date.js | 4 ++-- test/scripts/types/enum.js | 4 ++-- test/scripts/types/integer.js | 4 ++-- test/scripts/types/number.js | 4 ++-- test/scripts/types/object.js | 2 +- test/scripts/types/string.js | 4 ++-- test/scripts/types/virtual.js | 2 +- test/scripts/util.js | 2 +- 21 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 7287de2d..c6ae6b16 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,7 +3,7 @@ "parser": "@typescript-eslint/parser", "plugins": ["node", "@typescript-eslint"], "extends": ["hexo", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended"], - "ignorePatterns": ["built"], + "ignorePatterns": ["dist"], "parserOptions": { "ecmaVersion": 2018, "sourceType": "module", diff --git a/.gitignore b/.gitignore index 60768cde..476e8d29 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ node_modules/ *.log docs/ coverage/ -built \ No newline at end of file +dist \ No newline at end of file diff --git a/.tsconfig.json b/.tsconfig.json index e8f049ff..80370876 100644 --- a/.tsconfig.json +++ b/.tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "outDir": "./built", + "outDir": "./dist", "module": "commonjs", "target": "es6", "sourceMap": true, diff --git a/package.json b/package.json index 9f23b26d..805a02a5 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,12 @@ "name": "warehouse", "version": "4.0.1", "description": "Simple JSON-based database", - "main": "built/database", + "main": "dist/database", "directories": { - "lib": "./built" + "lib": "./dist" }, "files": [ - "built/" + "dist/" ], "scripts": { "pretest": "npm run typescript", diff --git a/test/scripts/database.js b/test/scripts/database.js index a7b518a5..845c18ba 100644 --- a/test/scripts/database.js +++ b/test/scripts/database.js @@ -10,8 +10,8 @@ const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json'); const DB_VERSION = 1; describe('Database', () => { - const Database = require('../../built/database'); - const Model = require('../../built/model'); + const Database = require('../../dist/database'); + const Model = require('../../dist/model'); const Schema = Database.Schema; const db = new Database({path: DB_PATH, version: DB_VERSION}); diff --git a/test/scripts/document.js b/test/scripts/document.js index 0a7f680d..952f1d22 100644 --- a/test/scripts/document.js +++ b/test/scripts/document.js @@ -4,7 +4,7 @@ const should = require('chai').should(); // eslint-disable-line describe('Document', () => { const Database = require('../..'); - const Document = require('../../built/document'); + const Document = require('../../dist/document'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/mutex.js b/test/scripts/mutex.js index cf8b1e19..c48c348e 100644 --- a/test/scripts/mutex.js +++ b/test/scripts/mutex.js @@ -1,7 +1,7 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const Mutex = require('../../built/mutex'); +const Mutex = require('../../dist/mutex'); const sinon = require('sinon'); describe('Mutex', () => { diff --git a/test/scripts/query.js b/test/scripts/query.js index 3af8f565..0e2159be 100644 --- a/test/scripts/query.js +++ b/test/scripts/query.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line const sortBy = require('lodash/sortBy'); const Promise = require('bluebird'); -const Document = require('../../built/document'); +const Document = require('../../dist/document'); describe('Query', () => { const Database = require('../..'); diff --git a/test/scripts/schematype.js b/test/scripts/schematype.js index b086d00a..287a22d0 100644 --- a/test/scripts/schematype.js +++ b/test/scripts/schematype.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../built/error/validation'); +const ValidationError = require('../../dist/error/validation'); describe('SchemaType', () => { - const SchemaType = require('../../built/schematype'); + const SchemaType = require('../../dist/schematype'); const type = new SchemaType('test'); it('cast()', () => { diff --git a/test/scripts/types/array.js b/test/scripts/types/array.js index 2f08cb3a..9c7d845d 100644 --- a/test/scripts/types/array.js +++ b/test/scripts/types/array.js @@ -1,13 +1,13 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeArray', () => { - const SchemaTypeArray = require('../../../built/types/array'); - const SchemaTypeString = require('../../../built/types/string'); - const SchemaTypeDate = require('../../../built/types/date'); - const SchemaTypeBoolean = require('../../../built/types/boolean'); + const SchemaTypeArray = require('../../../dist/types/array'); + const SchemaTypeString = require('../../../dist/types/string'); + const SchemaTypeDate = require('../../../dist/types/date'); + const SchemaTypeBoolean = require('../../../dist/types/boolean'); const type = new SchemaTypeArray('test'); it('cast()', () => { diff --git a/test/scripts/types/boolean.js b/test/scripts/types/boolean.js index 2a51dae2..b59b169a 100644 --- a/test/scripts/types/boolean.js +++ b/test/scripts/types/boolean.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeBoolean', () => { - const SchemaTypeBoolean = require('../../../built/types/boolean'); + const SchemaTypeBoolean = require('../../../dist/types/boolean'); const type = new SchemaTypeBoolean('test'); it('cast()', () => { diff --git a/test/scripts/types/buffer.js b/test/scripts/types/buffer.js index 7263b5b0..10ce7472 100644 --- a/test/scripts/types/buffer.js +++ b/test/scripts/types/buffer.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeBuffer', () => { - const SchemaTypeBuffer = require('../../../built/types/buffer'); + const SchemaTypeBuffer = require('../../../dist/types/buffer'); const type = new SchemaTypeBuffer('test'); it('cast()', () => { diff --git a/test/scripts/types/cuid.js b/test/scripts/types/cuid.js index c70830f8..b61d3946 100644 --- a/test/scripts/types/cuid.js +++ b/test/scripts/types/cuid.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeCUID', () => { - const SchemaTypeCUID = require('../../../built/types/cuid'); + const SchemaTypeCUID = require('../../../dist/types/cuid'); const type = new SchemaTypeCUID('test'); it('cast()', () => { diff --git a/test/scripts/types/date.js b/test/scripts/types/date.js index b366398d..40559bf8 100644 --- a/test/scripts/types/date.js +++ b/test/scripts/types/date.js @@ -1,10 +1,10 @@ 'use strict'; const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeDate', () => { - const SchemaTypeDate = require('../../../built/types/date'); + const SchemaTypeDate = require('../../../dist/types/date'); const type = new SchemaTypeDate('test'); it('cast()', () => { diff --git a/test/scripts/types/enum.js b/test/scripts/types/enum.js index 94522209..918fa337 100644 --- a/test/scripts/types/enum.js +++ b/test/scripts/types/enum.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeEnum', () => { - const SchemaTypeEnum = require('../../../built/types/enum'); + const SchemaTypeEnum = require('../../../dist/types/enum'); it('validate()', () => { const type = new SchemaTypeEnum('test', {elements: ['foo', 'bar', 'baz']}); diff --git a/test/scripts/types/integer.js b/test/scripts/types/integer.js index 60f22d80..462a112b 100644 --- a/test/scripts/types/integer.js +++ b/test/scripts/types/integer.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeInteger', () => { - const SchemaTypeInteger = require('../../../built/types/integer'); + const SchemaTypeInteger = require('../../../dist/types/integer'); const type = new SchemaTypeInteger('test'); it('cast()', () => { diff --git a/test/scripts/types/number.js b/test/scripts/types/number.js index 107b1f64..10176b93 100644 --- a/test/scripts/types/number.js +++ b/test/scripts/types/number.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeNumber', () => { - const SchemaTypeNumber = require('../../../built/types/number'); + const SchemaTypeNumber = require('../../../dist/types/number'); const type = new SchemaTypeNumber('type'); it('cast()', () => { diff --git a/test/scripts/types/object.js b/test/scripts/types/object.js index d6ef04e0..eb9d8358 100644 --- a/test/scripts/types/object.js +++ b/test/scripts/types/object.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeObject', () => { - const SchemaTypeObject = require('../../../built/types/object'); + const SchemaTypeObject = require('../../../dist/types/object'); const type = new SchemaTypeObject('test'); it('cast() - default', () => { diff --git a/test/scripts/types/string.js b/test/scripts/types/string.js index cbb601f1..fd4b09f5 100644 --- a/test/scripts/types/string.js +++ b/test/scripts/types/string.js @@ -1,10 +1,10 @@ 'use strict'; require('chai').should(); -const ValidationError = require('../../../built/error/validation'); +const ValidationError = require('../../../dist/error/validation'); describe('SchemaTypeString', () => { - const SchemaTypeString = require('../../../built/types/string'); + const SchemaTypeString = require('../../../dist/types/string'); const type = new SchemaTypeString('test'); it('cast()', () => { diff --git a/test/scripts/types/virtual.js b/test/scripts/types/virtual.js index 23671158..1fd72451 100644 --- a/test/scripts/types/virtual.js +++ b/test/scripts/types/virtual.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('SchemaTypeVirtual', () => { - const SchemaTypeVirtual = require('../../../built/types/virtual'); + const SchemaTypeVirtual = require('../../../dist/types/virtual'); const type = new SchemaTypeVirtual('test'); it('get()', () => { diff --git a/test/scripts/util.js b/test/scripts/util.js index 9a67c0e2..09cdef22 100644 --- a/test/scripts/util.js +++ b/test/scripts/util.js @@ -3,7 +3,7 @@ const should = require('chai').should(); // eslint-disable-line describe('util', () => { - const util = require('../../built/util'); + const util = require('../../dist/util'); it('shuffle()', () => { const src = Array(100).fill(0).map((_, i) => i); From 7baec353dc8b10ab3f2f7a400608ca5905ddc0df Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:16:08 +0900 Subject: [PATCH 09/32] chore: update `.eslint.json` extends from `hexo/ts.js` --- .eslintrc.json | 17 +++++++---------- src/error/validation.ts | 2 +- src/schematype.ts | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index c6ae6b16..31b0678d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,17 +1,14 @@ { "root": true, - "parser": "@typescript-eslint/parser", - "plugins": ["node", "@typescript-eslint"], - "extends": ["hexo", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended"], - "ignorePatterns": ["dist"], + "extends": "hexo/ts.js", "parserOptions": { - "ecmaVersion": 2018, "sourceType": "module", - "ecmaFeatures": { - "modules": true - } + "ecmaVersion": 2020 }, "rules": { - "node/no-unsupported-features/es-syntax": 0 + "@typescript-eslint/no-unused-vars": 0, + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-var-requires": 0, + "no-use-before-define": 0 } -} +} \ No newline at end of file diff --git a/src/error/validation.ts b/src/error/validation.ts index 287d61af..37f9662b 100644 --- a/src/error/validation.ts +++ b/src/error/validation.ts @@ -4,4 +4,4 @@ class ValidationError extends WarehouseError {} ValidationError.prototype.name = 'ValidationError'; -export = ValidationError; \ No newline at end of file +export = ValidationError; diff --git a/src/schematype.ts b/src/schematype.ts index b21db202..0afd7919 100644 --- a/src/schematype.ts +++ b/src/schematype.ts @@ -46,7 +46,7 @@ import ValidationError from './error/validation'; * The return value will replace the original data. */ class SchemaType { - options: { required: boolean; default?: (() => T) | T; } + options: { required: boolean; default?: (() => T) | T; }; default: () => T; /** From 3abf3059f86b62aff620260af0678017b37e7aed Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:19:21 +0900 Subject: [PATCH 10/32] chore(deps): update dependencies --- package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 805a02a5..d878a315 100644 --- a/package.json +++ b/package.json @@ -27,32 +27,32 @@ "author": "Tommy Chen (http://zespia.tw)", "license": "MIT", "dependencies": { - "bluebird": "^3.2.2", - "cuid": "^2.1.4", - "graceful-fs": "^4.1.3", + "bluebird": "^3.7.2", + "cuid": "^2.1.8", + "graceful-fs": "^4.2.10", "hexo-log": "^3.0.0", "is-plain-object": "^5.0.0", - "JSONStream": "^1.0.7", - "rfdc": "^1.1.4" + "JSONStream": "^1.3.5", + "rfdc": "^1.3.0" }, "devDependencies": { "@types/bluebird": "^3.5.36", "@types/graceful-fs": "^4.1.5", "@types/jsonstream": "^0.8.30", "@types/node": "^18.0.0", - "@typescript-eslint/eslint-plugin": "^5.28.0", - "@typescript-eslint/parser": "^5.28.0", - "chai": "^4.2.0", + "@typescript-eslint/eslint-plugin": "^5.29.0", + "@typescript-eslint/parser": "^5.29.0", + "chai": "^4.3.6", "chai-as-promised": "^7.1.1", - "eslint": "^8.1.0", + "eslint": "^8.18.0", "eslint-config-hexo": "^5.0.0", - "jsdoc": "^3.4.0", - "lodash": "^4.17.15", - "minami": "^1.1.1", + "jsdoc": "^3.6.10", + "lodash": "^4.17.21", + "minami": "^1.2.3", "mocha": "^10.0.0", "nyc": "^15.0.0", "sinon": "^14.0.0", - "typescript": "^4.7.3" + "typescript": "^4.7.4" }, "engines": { "node": ">=14" From 232613a264ae181cd684ed96aae4a187bf4da9c4 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 12:43:57 +0900 Subject: [PATCH 11/32] fix; `rfdc` import --- src/document.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/document.ts b/src/document.ts index 34fbd074..31479377 100644 --- a/src/document.ts +++ b/src/document.ts @@ -1,4 +1,4 @@ -import rfdc = require('rfdc'); +import rfdc from 'rfdc'; const cloneDeep = rfdc(); abstract class Document { From 1786e37ee07c64e83084502157d7c711358f32c4 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 13:42:28 +0900 Subject: [PATCH 12/32] fix: exports of types --- src/model.ts | 2 +- src/schema.ts | 2 +- src/types/index.ts | 50 +++++++++++++++++++++++----------------------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/model.ts b/src/model.ts index 85f4d827..6f818dd1 100644 --- a/src/model.ts +++ b/src/model.ts @@ -7,7 +7,7 @@ const { parseArgs, getProp, setGetter, shuffle } = util; import Document from './document'; import Query from './query'; import Schema from './schema'; -import Types from './types/index'; +import * as Types from './types/index'; import WarehouseError from './error'; import PopulationError from './error/population'; import Mutex from './mutex'; diff --git a/src/schema.ts b/src/schema.ts index ba304005..028324eb 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,5 +1,5 @@ import SchemaType from './schematype'; -import Types from './types/index'; +import * as Types from './types/index'; import Promise from 'bluebird'; import util from './util'; const { getProp, setProp, delProp } = util; diff --git a/src/types/index.ts b/src/types/index.ts index b6ded3e9..69174d03 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,27 +1,27 @@ -import Mixed = require('../schematype'); -import String = require('./string'); -import Number = require('./number'); -import Boolean = require('./boolean'); -import Array = require('./array'); -import Object = require('./object'); -import Date = require('./date'); -import Virtual = require('./virtual'); -import CUID = require('./cuid'); -import Enum = require('./enum'); -import Integer = require('./integer'); -import Buffer = require('./buffer'); +import SchemaType from '../schematype'; +import SchemaTypeString from './string'; +import SchemaTypeNumber from './number'; +import SchemaTypeBoolean from './boolean'; +import SchemaTypeArray from './array'; +import SchemaTypeObject from './object'; +import SchemaTypeDate from './date'; +import SchemaTypeVirtual from './virtual'; +import SchemaTypeCUID from './cuid'; +import SchemaTypeEnum from './enum'; +import SchemaTypeInteger from './integer'; +import SchemaTypeBuffer from './buffer'; -export = { - Mixed, - String, - Number, - Boolean, - Array, - Object, - Date, - Virtual, - CUID, - Enum, - Integer, - Buffer +export { + SchemaType as Mixed, + SchemaTypeString as String, + SchemaTypeNumber as Number, + SchemaTypeBoolean as Boolean, + SchemaTypeArray as Array, + SchemaTypeObject as Object, + SchemaTypeDate as Date, + SchemaTypeVirtual as Virtual, + SchemaTypeCUID as CUID, + SchemaTypeEnum as Enum, + SchemaTypeInteger as Integer, + SchemaTypeBuffer as Buffer }; From 989a7df161f20f6e5b89a192d110ed0996525888 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 15:08:11 +0900 Subject: [PATCH 13/32] test: `js` to `ts` --- package.json | 6 ++++- test/scripts/{database.js => database.ts} | 23 +++++++++++-------- test/scripts/{document.js => document.ts} | 10 ++++---- test/scripts/{model.js => model.ts} | 23 ++++++++++++------- test/scripts/{mutex.js => mutex.ts} | 10 ++++---- test/scripts/{query.js => query.ts} | 16 +++++++------ test/scripts/{schema.js => schema.ts} | 8 +++---- test/scripts/{schematype.js => schematype.ts} | 10 ++++---- test/scripts/types/{array.js => array.ts} | 16 ++++++------- test/scripts/types/{boolean.js => boolean.ts} | 10 ++++---- test/scripts/types/{buffer.js => buffer.ts} | 10 ++++---- test/scripts/types/{cuid.js => cuid.ts} | 10 ++++---- test/scripts/types/{date.js => date.ts} | 10 ++++---- test/scripts/types/{enum.js => enum.ts} | 11 ++++----- test/scripts/types/{integer.js => integer.ts} | 10 ++++---- test/scripts/types/{number.js => number.ts} | 10 ++++---- test/scripts/types/{object.js => object.ts} | 8 +++---- test/scripts/types/{string.js => string.ts} | 10 ++++---- test/scripts/types/{virtual.js => virtual.ts} | 8 +++---- test/scripts/{util.js => util.ts} | 9 ++++---- 20 files changed, 121 insertions(+), 107 deletions(-) rename test/scripts/{database.js => database.ts} (81%) rename test/scripts/{document.js => document.ts} (94%) rename test/scripts/{model.js => model.ts} (98%) rename test/scripts/{mutex.js => mutex.ts} (76%) rename test/scripts/{query.js => query.ts} (98%) rename test/scripts/{schema.js => schema.ts} (96%) rename test/scripts/{schematype.js => schematype.ts} (94%) rename test/scripts/types/{array.js => array.ts} (93%) rename test/scripts/types/{boolean.js => boolean.ts} (86%) rename test/scripts/types/{buffer.js => buffer.ts} (92%) rename test/scripts/types/{cuid.js => cuid.ts} (71%) rename test/scripts/types/{date.js => date.ts} (93%) rename test/scripts/types/{enum.js => enum.ts} (70%) rename test/scripts/types/{integer.js => integer.ts} (84%) rename test/scripts/types/{number.js => number.ts} (89%) rename test/scripts/types/{object.js => object.ts} (51%) rename test/scripts/types/{string.js => string.ts} (91%) rename test/scripts/types/{virtual.js => virtual.ts} (86%) rename test/scripts/{util.js => util.ts} (96%) diff --git a/package.json b/package.json index d878a315..e0a38f24 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "pretest": "npm run typescript", "typescript": "tsc --build .tsconfig.json", "eslint": "eslint src test", - "test": "mocha \"test/scripts/**/*.js\"", + "test": "mocha -r ts-node/register 'test/scripts/**/*.ts'", "test-cov": "nyc --reporter=lcovonly --reporter=text-summary npm test", "jsdoc": "jsdoc --configure .jsdoc.json", "prepublish": "npm run typescript" @@ -37,9 +37,12 @@ }, "devDependencies": { "@types/bluebird": "^3.5.36", + "@types/chai": "^4.3.1", "@types/graceful-fs": "^4.1.5", "@types/jsonstream": "^0.8.30", + "@types/mocha": "^9.1.1", "@types/node": "^18.0.0", + "@types/sinon": "^10.0.11", "@typescript-eslint/eslint-plugin": "^5.29.0", "@typescript-eslint/parser": "^5.29.0", "chai": "^4.3.6", @@ -52,6 +55,7 @@ "mocha": "^10.0.0", "nyc": "^15.0.0", "sinon": "^14.0.0", + "ts-node": "^10.8.1", "typescript": "^4.7.4" }, "engines": { diff --git a/test/scripts/database.js b/test/scripts/database.ts similarity index 81% rename from test/scripts/database.js rename to test/scripts/database.ts index 845c18ba..0d842137 100644 --- a/test/scripts/database.js +++ b/test/scripts/database.ts @@ -1,17 +1,18 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const path = require('path'); -const Promise = require('bluebird'); -const sinon = require('sinon'); -const fs = Promise.promisifyAll(require('fs')); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import path from 'path'; +import Promise from 'bluebird'; +import sinon from 'sinon'; +import Database from '../../dist/database'; +import Model from '../../dist/model'; +import fs from 'fs'; +const promisifyFs = Promise.promisifyAll(fs); const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json'); const DB_VERSION = 1; describe('Database', () => { - const Database = require('../../dist/database'); - const Model = require('../../dist/model'); const Schema = Database.Schema; const db = new Database({path: DB_PATH, version: DB_VERSION}); @@ -85,7 +86,9 @@ describe('Database', () => { }); }); - it('save()', () => db.save().then(() => fs.readFileAsync(DB_PATH, 'utf8')).then(data => { + it('save()', () => db.save().then(() => promisifyFs.readFileAsync(DB_PATH)).then(data => { + // TODO: fix + // @ts-ignore const json = JSON.parse(data); json.meta.should.eql({ diff --git a/test/scripts/document.js b/test/scripts/document.ts similarity index 94% rename from test/scripts/document.js rename to test/scripts/document.ts index 952f1d22..dc20e871 100644 --- a/test/scripts/document.js +++ b/test/scripts/document.ts @@ -1,10 +1,10 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Database from '../../dist/database'; +import Document from '../../dist/document'; describe('Document', () => { - const Database = require('../..'); - const Document = require('../../dist/document'); const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/model.js b/test/scripts/model.ts similarity index 98% rename from test/scripts/model.js rename to test/scripts/model.ts index 075dacf3..2bda612f 100644 --- a/test/scripts/model.js +++ b/test/scripts/model.ts @@ -1,13 +1,18 @@ -'use strict'; - -const should = require('chai').use(require('chai-as-promised')).should(); -const sortBy = require('lodash/sortBy'); -const Promise = require('bluebird'); -const sinon = require('sinon'); -const cuid = require('cuid'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import chaiAsPromised from 'chai-as-promised'; +chai.use(chaiAsPromised ); // eslint-disable-line + +import lodash from 'lodash'; +const { sortBy } = lodash; +import Promise from 'bluebird'; +import sinon from 'sinon'; +import cuid from 'cuid'; +import Database from '../../dist/database'; describe('Model', () => { - const Database = require('../..'); + const Schema = Database.Schema; const SchemaType = Database.SchemaType; @@ -163,6 +168,7 @@ describe('Model', () => { return Promise.all([ Test.insert({id: 1}), Test.insert({id: 1}) + // @ts-ignore ]).should.eventually.be.rejected; }); @@ -1249,6 +1255,7 @@ describe('Model', () => { }); it('_export() - should not save undefined value', () => { + // @ts-ignore class CacheType extends SchemaType { value() {} } diff --git a/test/scripts/mutex.js b/test/scripts/mutex.ts similarity index 76% rename from test/scripts/mutex.js rename to test/scripts/mutex.ts index c48c348e..77b78855 100644 --- a/test/scripts/mutex.js +++ b/test/scripts/mutex.ts @@ -1,8 +1,8 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const Mutex = require('../../dist/mutex'); -const sinon = require('sinon'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Mutex from '../../dist/mutex'; +import sinon from 'sinon'; describe('Mutex', () => { it('mutex test', callback => { diff --git a/test/scripts/query.js b/test/scripts/query.ts similarity index 98% rename from test/scripts/query.js rename to test/scripts/query.ts index 0e2159be..a2402e2b 100644 --- a/test/scripts/query.js +++ b/test/scripts/query.ts @@ -1,12 +1,14 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const sortBy = require('lodash/sortBy'); -const Promise = require('bluebird'); -const Document = require('../../dist/document'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import lodash from 'lodash'; +const { sortBy } = lodash; +import Promise from 'bluebird'; +import Document from '../../dist/document'; +import Database from '../../dist/database'; describe('Query', () => { - const Database = require('../..'); + const db = new Database(); const Schema = Database.Schema; diff --git a/test/scripts/schema.js b/test/scripts/schema.ts similarity index 96% rename from test/scripts/schema.js rename to test/scripts/schema.ts index 6d3081b5..7cfb0d8b 100644 --- a/test/scripts/schema.js +++ b/test/scripts/schema.ts @@ -1,9 +1,9 @@ -'use strict'; - -require('chai').should(); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import Database from '../../dist/database'; describe('Schema', () => { - const Database = require('../..'); const Schema = Database.Schema; it('add()', () => { diff --git a/test/scripts/schematype.js b/test/scripts/schematype.ts similarity index 94% rename from test/scripts/schematype.js rename to test/scripts/schematype.ts index 287a22d0..fd453ee5 100644 --- a/test/scripts/schematype.js +++ b/test/scripts/schematype.ts @@ -1,10 +1,10 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../dist/error/validation'; +import SchemaType from '../../dist/schematype'; describe('SchemaType', () => { - const SchemaType = require('../../dist/schematype'); const type = new SchemaType('test'); it('cast()', () => { diff --git a/test/scripts/types/array.js b/test/scripts/types/array.ts similarity index 93% rename from test/scripts/types/array.js rename to test/scripts/types/array.ts index 9c7d845d..682de202 100644 --- a/test/scripts/types/array.js +++ b/test/scripts/types/array.ts @@ -1,13 +1,13 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeArray from '../../../dist/types/array'; +import SchemaTypeString from '../../../dist/types/string'; +import SchemaTypeDate from '../../../dist/types/date'; +import SchemaTypeBoolean from '../../../dist/types/boolean'; describe('SchemaTypeArray', () => { - const SchemaTypeArray = require('../../../dist/types/array'); - const SchemaTypeString = require('../../../dist/types/string'); - const SchemaTypeDate = require('../../../dist/types/date'); - const SchemaTypeBoolean = require('../../../dist/types/boolean'); const type = new SchemaTypeArray('test'); it('cast()', () => { diff --git a/test/scripts/types/boolean.js b/test/scripts/types/boolean.ts similarity index 86% rename from test/scripts/types/boolean.js rename to test/scripts/types/boolean.ts index b59b169a..28f3dc0b 100644 --- a/test/scripts/types/boolean.js +++ b/test/scripts/types/boolean.ts @@ -1,10 +1,10 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeBoolean from '../../../dist/types/boolean'; describe('SchemaTypeBoolean', () => { - const SchemaTypeBoolean = require('../../../dist/types/boolean'); const type = new SchemaTypeBoolean('test'); it('cast()', () => { diff --git a/test/scripts/types/buffer.js b/test/scripts/types/buffer.ts similarity index 92% rename from test/scripts/types/buffer.js rename to test/scripts/types/buffer.ts index 10ce7472..db58351f 100644 --- a/test/scripts/types/buffer.js +++ b/test/scripts/types/buffer.ts @@ -1,10 +1,10 @@ -'use strict'; - -const should = require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeBuffer from '../../../dist/types/buffer'; describe('SchemaTypeBuffer', () => { - const SchemaTypeBuffer = require('../../../dist/types/buffer'); const type = new SchemaTypeBuffer('test'); it('cast()', () => { diff --git a/test/scripts/types/cuid.js b/test/scripts/types/cuid.ts similarity index 71% rename from test/scripts/types/cuid.js rename to test/scripts/types/cuid.ts index b61d3946..d68975cd 100644 --- a/test/scripts/types/cuid.js +++ b/test/scripts/types/cuid.ts @@ -1,10 +1,10 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeCUID from '../../../dist/types/cuid'; describe('SchemaTypeCUID', () => { - const SchemaTypeCUID = require('../../../dist/types/cuid'); const type = new SchemaTypeCUID('test'); it('cast()', () => { diff --git a/test/scripts/types/date.js b/test/scripts/types/date.ts similarity index 93% rename from test/scripts/types/date.js rename to test/scripts/types/date.ts index 40559bf8..d1762442 100644 --- a/test/scripts/types/date.js +++ b/test/scripts/types/date.ts @@ -1,10 +1,10 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeDate from '../../../dist/types/date'; describe('SchemaTypeDate', () => { - const SchemaTypeDate = require('../../../dist/types/date'); const type = new SchemaTypeDate('test'); it('cast()', () => { diff --git a/test/scripts/types/enum.js b/test/scripts/types/enum.ts similarity index 70% rename from test/scripts/types/enum.js rename to test/scripts/types/enum.ts index 918fa337..dabd881d 100644 --- a/test/scripts/types/enum.js +++ b/test/scripts/types/enum.ts @@ -1,11 +1,10 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeEnum from '../../../dist/types/enum'; describe('SchemaTypeEnum', () => { - const SchemaTypeEnum = require('../../../dist/types/enum'); - it('validate()', () => { const type = new SchemaTypeEnum('test', {elements: ['foo', 'bar', 'baz']}); diff --git a/test/scripts/types/integer.js b/test/scripts/types/integer.ts similarity index 84% rename from test/scripts/types/integer.js rename to test/scripts/types/integer.ts index 462a112b..e4ed62d8 100644 --- a/test/scripts/types/integer.js +++ b/test/scripts/types/integer.ts @@ -1,10 +1,10 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeInteger from '../../../dist/types/integer'; describe('SchemaTypeInteger', () => { - const SchemaTypeInteger = require('../../../dist/types/integer'); const type = new SchemaTypeInteger('test'); it('cast()', () => { diff --git a/test/scripts/types/number.js b/test/scripts/types/number.ts similarity index 89% rename from test/scripts/types/number.js rename to test/scripts/types/number.ts index 10176b93..c4eff523 100644 --- a/test/scripts/types/number.js +++ b/test/scripts/types/number.ts @@ -1,10 +1,10 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeNumber from '../../../dist/types/number'; describe('SchemaTypeNumber', () => { - const SchemaTypeNumber = require('../../../dist/types/number'); const type = new SchemaTypeNumber('type'); it('cast()', () => { diff --git a/test/scripts/types/object.js b/test/scripts/types/object.ts similarity index 51% rename from test/scripts/types/object.js rename to test/scripts/types/object.ts index eb9d8358..73d215ff 100644 --- a/test/scripts/types/object.js +++ b/test/scripts/types/object.ts @@ -1,9 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import SchemaTypeObject from '../../../dist/types/object'; describe('SchemaTypeObject', () => { - const SchemaTypeObject = require('../../../dist/types/object'); const type = new SchemaTypeObject('test'); it('cast() - default', () => { diff --git a/test/scripts/types/string.js b/test/scripts/types/string.ts similarity index 91% rename from test/scripts/types/string.js rename to test/scripts/types/string.ts index fd4b09f5..07fdea0c 100644 --- a/test/scripts/types/string.js +++ b/test/scripts/types/string.ts @@ -1,10 +1,10 @@ -'use strict'; - -require('chai').should(); -const ValidationError = require('../../../dist/error/validation'); +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import ValidationError from '../../../dist/error/validation'; +import SchemaTypeString from '../../../dist/types/string'; describe('SchemaTypeString', () => { - const SchemaTypeString = require('../../../dist/types/string'); const type = new SchemaTypeString('test'); it('cast()', () => { diff --git a/test/scripts/types/virtual.js b/test/scripts/types/virtual.ts similarity index 86% rename from test/scripts/types/virtual.js rename to test/scripts/types/virtual.ts index 1fd72451..2dca42a0 100644 --- a/test/scripts/types/virtual.js +++ b/test/scripts/types/virtual.ts @@ -1,9 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import SchemaTypeVirtual from '../../../dist/types/virtual'; describe('SchemaTypeVirtual', () => { - const SchemaTypeVirtual = require('../../../dist/types/virtual'); const type = new SchemaTypeVirtual('test'); it('get()', () => { diff --git a/test/scripts/util.js b/test/scripts/util.ts similarity index 96% rename from test/scripts/util.js rename to test/scripts/util.ts index 09cdef22..6c6af2b8 100644 --- a/test/scripts/util.js +++ b/test/scripts/util.ts @@ -1,10 +1,9 @@ -'use strict'; - -const should = require('chai').should(); // eslint-disable-line +// @ts-nocheck +import chai from 'chai'; +const should = chai.should(); // eslint-disable-line +import * as util from '../../dist/util'; describe('util', () => { - const util = require('../../dist/util'); - it('shuffle()', () => { const src = Array(100).fill(0).map((_, i) => i); const result = util.shuffle(src); From 4c4037c83b81f3a0db545a971a1968de4318495b Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 15:08:45 +0900 Subject: [PATCH 14/32] fix: allow empty argument for Database constructor and some methods --- src/database.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/database.ts b/src/database.ts index babccd26..9692a31b 100644 --- a/src/database.ts +++ b/src/database.ts @@ -90,7 +90,7 @@ class Database { * @param {function} [options.onUpgrade] Triggered when the database is upgraded * @param {function} [options.onDowngrade] Triggered when the database is downgraded */ - constructor(options: { path: string } & Partial) { + constructor(options?: { path: string } & Partial) { this.options = { version: 0, // eslint-disable-next-line @typescript-eslint/no-empty-function @@ -132,7 +132,7 @@ class Database { * @param {function} [callback] * @return {Promise} */ - load(callback) { + load(callback?) { const { path, onUpgrade, onDowngrade, version: newVersion } = this.options; if (!path) throw new WarehouseError('options.path is required'); @@ -172,7 +172,7 @@ class Database { * @param {function} [callback] * @return {Promise} */ - save(callback) { + save(callback?) { const { path } = this.options; if (!path) throw new WarehouseError('options.path is required'); From c2fbe6384218711cf7a1ee511b26d3e5ef83a4d5 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 15:12:55 +0900 Subject: [PATCH 15/32] refactor: `export` to `export default` --- src/database.ts | 2 +- src/document.ts | 2 +- src/error.ts | 2 +- src/error/population.ts | 2 +- src/error/validation.ts | 2 +- src/model.ts | 2 +- src/mutex.ts | 2 +- src/query.ts | 2 +- src/schema.ts | 2 +- src/schematype.ts | 2 +- src/types/array.ts | 2 +- src/types/boolean.ts | 2 +- src/types/buffer.ts | 2 +- src/types/cuid.ts | 2 +- src/types/date.ts | 2 +- src/types/enum.ts | 2 +- src/types/integer.ts | 2 +- src/types/number.ts | 2 +- src/types/object.ts | 2 +- src/types/string.ts | 2 +- src/types/virtual.ts | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/database.ts b/src/database.ts index 9692a31b..597c2897 100644 --- a/src/database.ts +++ b/src/database.ts @@ -205,4 +205,4 @@ Database.prototype.Schema = Schema; Database.prototype.SchemaType = SchemaType; Database.version = pkg.version; -export = Database; +export default Database; diff --git a/src/document.ts b/src/document.ts index 31479377..2c23b2e5 100644 --- a/src/document.ts +++ b/src/document.ts @@ -103,4 +103,4 @@ function isGetter(obj, key) { return Object.getOwnPropertyDescriptor(obj, key).get; } -export = Document; +export default Document; diff --git a/src/error.ts b/src/error.ts index 94bcefa8..23d4f41e 100644 --- a/src/error.ts +++ b/src/error.ts @@ -21,4 +21,4 @@ class WarehouseError extends Error { WarehouseError.prototype.name = 'WarehouseError'; -export = WarehouseError; +export default WarehouseError; diff --git a/src/error/population.ts b/src/error/population.ts index ad882011..66e864a0 100644 --- a/src/error/population.ts +++ b/src/error/population.ts @@ -4,4 +4,4 @@ class PopulationError extends WarehouseError {} PopulationError.prototype.name = 'PopulationError'; -export = PopulationError; +export default PopulationError; diff --git a/src/error/validation.ts b/src/error/validation.ts index 37f9662b..f76e1fc1 100644 --- a/src/error/validation.ts +++ b/src/error/validation.ts @@ -4,4 +4,4 @@ class ValidationError extends WarehouseError {} ValidationError.prototype.name = 'ValidationError'; -export = ValidationError; +export default ValidationError; diff --git a/src/model.ts b/src/model.ts index 6f818dd1..2813257b 100644 --- a/src/model.ts +++ b/src/model.ts @@ -972,4 +972,4 @@ Model.prototype.each = Model.prototype.forEach; Model.prototype.random = Model.prototype.shuffle; -export = Model; +export default Model; diff --git a/src/mutex.ts b/src/mutex.ts index bfb1f358..6eaa0ab4 100644 --- a/src/mutex.ts +++ b/src/mutex.ts @@ -29,4 +29,4 @@ class Mutex { } } -export = Mutex; +export default Mutex; diff --git a/src/query.ts b/src/query.ts index 07bf2dfb..daffcdd1 100644 --- a/src/query.ts +++ b/src/query.ts @@ -392,4 +392,4 @@ Query.prototype.each = Query.prototype.forEach; Query.prototype.random = Query.prototype.shuffle; -export = Query; +export default Query; diff --git a/src/schema.ts b/src/schema.ts index 028324eb..f76acd90 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -798,4 +798,4 @@ class Schema { Schema.prototype.Types = Types; -export = Schema; +export default Schema; diff --git a/src/schematype.ts b/src/schematype.ts index 0afd7919..7eeafea5 100644 --- a/src/schematype.ts +++ b/src/schematype.ts @@ -295,4 +295,4 @@ SchemaType.prototype.q$max = SchemaType.prototype.q$lte; SchemaType.prototype.q$min = SchemaType.prototype.q$gte; -export = SchemaType; +export default SchemaType; diff --git a/src/types/array.ts b/src/types/array.ts index 746fb8bb..11bd5646 100644 --- a/src/types/array.ts +++ b/src/types/array.ts @@ -380,4 +380,4 @@ SchemaTypeArray.prototype.u$append = SchemaTypeArray.prototype.u$push; SchemaTypeArray.prototype.u$prepend = SchemaTypeArray.prototype.u$unshift; -export = SchemaTypeArray; +export default SchemaTypeArray; diff --git a/src/types/boolean.ts b/src/types/boolean.ts index aafef2d5..6951bea1 100644 --- a/src/types/boolean.ts +++ b/src/types/boolean.ts @@ -61,4 +61,4 @@ class SchemaTypeBoolean extends SchemaType { } } -export = SchemaTypeBoolean; +export default SchemaTypeBoolean; diff --git a/src/types/buffer.ts b/src/types/buffer.ts index 95d14bf5..40907bde 100644 --- a/src/types/buffer.ts +++ b/src/types/buffer.ts @@ -105,4 +105,4 @@ class SchemaTypeBuffer extends SchemaType { } } -export = SchemaTypeBuffer; +export default SchemaTypeBuffer; diff --git a/src/types/cuid.ts b/src/types/cuid.ts index 4678c85f..9c4de0b0 100644 --- a/src/types/cuid.ts +++ b/src/types/cuid.ts @@ -39,4 +39,4 @@ class SchemaTypeCUID extends SchemaType { } } -export = SchemaTypeCUID; +export default SchemaTypeCUID; diff --git a/src/types/date.ts b/src/types/date.ts index 9f86af3a..663263a8 100644 --- a/src/types/date.ts +++ b/src/types/date.ts @@ -155,4 +155,4 @@ class SchemaTypeDate extends SchemaType { } } -export = SchemaTypeDate; +export default SchemaTypeDate; diff --git a/src/types/enum.ts b/src/types/enum.ts index 18e69345..392ad136 100644 --- a/src/types/enum.ts +++ b/src/types/enum.ts @@ -40,4 +40,4 @@ class SchemaTypeEnum extends SchemaType { } } -export = SchemaTypeEnum; +export default SchemaTypeEnum; diff --git a/src/types/integer.ts b/src/types/integer.ts index f5919d94..eaabaa15 100644 --- a/src/types/integer.ts +++ b/src/types/integer.ts @@ -37,4 +37,4 @@ class SchemaTypeInteger extends SchemaTypeNumber { } } -export = SchemaTypeInteger; +export default SchemaTypeInteger; diff --git a/src/types/number.ts b/src/types/number.ts index 9a0ccc45..7cf40a4b 100644 --- a/src/types/number.ts +++ b/src/types/number.ts @@ -123,4 +123,4 @@ class SchemaTypeNumber extends SchemaType { } } -export = SchemaTypeNumber; +export default SchemaTypeNumber; diff --git a/src/types/object.ts b/src/types/object.ts index d7695731..840fa20c 100644 --- a/src/types/object.ts +++ b/src/types/object.ts @@ -17,4 +17,4 @@ class SchemaTypeObject extends SchemaType> { } } -export = SchemaTypeObject; +export default SchemaTypeObject; diff --git a/src/types/string.ts b/src/types/string.ts index 730c777c..0a86603f 100644 --- a/src/types/string.ts +++ b/src/types/string.ts @@ -98,4 +98,4 @@ class SchemaTypeString extends SchemaType { } } -export = SchemaTypeString; +export default SchemaTypeString; diff --git a/src/types/virtual.ts b/src/types/virtual.ts index fac2cb7d..d807adb8 100644 --- a/src/types/virtual.ts +++ b/src/types/virtual.ts @@ -78,4 +78,4 @@ class SchemaTypeVirtual extends SchemaType { } } -export = SchemaTypeVirtual; +export default SchemaTypeVirtual; From 24e23dda6c22b2c0172a0ab49efd15ae5020df71 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 15:28:16 +0900 Subject: [PATCH 16/32] refactor: util export --- src/model.ts | 3 +- src/query.ts | 3 +- src/schema.ts | 3 +- src/schematype.ts | 3 +- src/types/virtual.ts | 3 +- src/util.ts | 246 ++++++++++++++++++++++--------------------- 6 files changed, 131 insertions(+), 130 deletions(-) diff --git a/src/model.ts b/src/model.ts index 2813257b..ea3e4ffa 100644 --- a/src/model.ts +++ b/src/model.ts @@ -2,8 +2,7 @@ import { EventEmitter } from 'events'; import rfdc from 'rfdc'; const cloneDeep = rfdc(); import Promise from 'bluebird'; -import util from './util'; -const { parseArgs, getProp, setGetter, shuffle } = util; +import { parseArgs, getProp, setGetter, shuffle } from './util'; import Document from './document'; import Query from './query'; import Schema from './schema'; diff --git a/src/query.ts b/src/query.ts index daffcdd1..0eb8fae4 100644 --- a/src/query.ts +++ b/src/query.ts @@ -1,6 +1,5 @@ import Promise from 'bluebird'; -import util from './util'; -const { parseArgs, shuffle } = util; +import { parseArgs, shuffle } from './util'; abstract class Query { length: number; diff --git a/src/schema.ts b/src/schema.ts index f76acd90..3f33e651 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,8 +1,7 @@ import SchemaType from './schematype'; import * as Types from './types/index'; import Promise from 'bluebird'; -import util from './util'; -const { getProp, setProp, delProp } = util; +import { getProp, setProp, delProp } from './util'; import PopulationError from './error/population'; import SchemaTypeVirtual from './types/virtual'; // eslint-disable-next-line @typescript-eslint/no-var-requires diff --git a/src/schematype.ts b/src/schematype.ts index 7eeafea5..e236c71a 100644 --- a/src/schematype.ts +++ b/src/schematype.ts @@ -1,5 +1,4 @@ -import util from './util'; -const { setProp } = util; +import { setProp } from './util'; import ValidationError from './error/validation'; /** diff --git a/src/types/virtual.ts b/src/types/virtual.ts index d807adb8..aa333a5a 100644 --- a/src/types/virtual.ts +++ b/src/types/virtual.ts @@ -1,6 +1,5 @@ import SchemaType from '../schematype'; -import util from '../util'; -const { setGetter } = util; +import { setGetter } from '../util'; /** * Virtual schema type. diff --git a/src/util.ts b/src/util.ts index ec613c48..57f395a6 100644 --- a/src/util.ts +++ b/src/util.ts @@ -2,7 +2,7 @@ function extractPropKey(key) { return key.split('.'); } -function parseArgs(args) { +function _parseArgs(args) { if (typeof args !== 'string') return args; const arr = args.split(' '); @@ -28,156 +28,162 @@ function parseArgs(args) { return result; } -export = { - shuffle: array => { - if (!Array.isArray(array)) throw new TypeError('array must be an Array!'); - const $array = array.slice(); - const { length } = $array; - const { random, floor } = Math; - - for (let i = 0; i < length; i++) { - // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L6718 - // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L3884 - const rand = i + floor(random() * (length - i)); - - const temp = $array[i]; - $array[i] = $array[rand]; - $array[rand] = temp; - } - return $array; - }, - getProp: (obj, key) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); +export function shuffle(array) { + if (!Array.isArray(array)) throw new TypeError('array must be an Array!'); + const $array = array.slice(); + const { length } = $array; + const { random, floor } = Math; - if (!key.includes('.')) { - return obj[key]; - } + for (let i = 0; i < length; i++) { + // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L6718 + // @see https://github.com/lodash/lodash/blob/4.17.10/lodash.js#L3884 + const rand = i + floor(random() * (length - i)); - const token = extractPropKey(key); - let result = obj; - const len = token.length; + const temp = $array[i]; + $array[i] = $array[rand]; + $array[rand] = temp; + } - for (let i = 0; i < len; i++) { - result = result[token[i]]; - } + return $array; +} - return result; - }, - setProp: (obj, key, value) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); +export function getProp(obj, key) { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); - if (!key.includes('.')) { - obj[key] = value; - return; - } + if (!key.includes('.')) { + return obj[key]; + } - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; + const token = extractPropKey(key); + let result = obj; + const len = token.length; - let cursor = obj; + for (let i = 0; i < len; i++) { + result = result[token[i]]; + } - for (let i = 0; i < len; i++) { - const name = token[i]; - cursor[name] = cursor[name] || {}; - cursor = cursor[name]; - } + return result; +} - cursor[lastKey] = value; - }, - delProp: (obj, key) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); +export function setProp(obj, key, value) { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); - if (!key.includes('.')) { - delete obj[key]; - return; - } + if (!key.includes('.')) { + obj[key] = value; + return; + } - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; - let cursor = obj; + let cursor = obj; - for (let i = 0; i < len; i++) { - const name = token[i]; + for (let i = 0; i < len; i++) { + const name = token[i]; + cursor[name] = cursor[name] || {}; + cursor = cursor[name]; + } - if (cursor[name]) { - cursor = cursor[name]; - } else { - return; - } - } + cursor[lastKey] = value; +} - delete cursor[lastKey]; - }, - setGetter: (obj, key, fn) => { - if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); - if (!key) throw new TypeError('key is required!'); - if (typeof fn !== 'function') throw new TypeError('fn must be a function!'); +export function delProp(obj, key) { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); - if (!key.includes('.')) { - obj.__defineGetter__(key, fn); - return; - } + if (!key.includes('.')) { + delete obj[key]; + return; + } + + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; - const token = extractPropKey(key); - const lastKey = token.pop(); - const len = token.length; + let cursor = obj; - let cursor = obj; + for (let i = 0; i < len; i++) { + const name = token[i]; - for (let i = 0; i < len; i++) { - const name = token[i]; - cursor[name] = cursor[name] || {}; + if (cursor[name]) { cursor = cursor[name]; + } else { + return; } + } + + delete cursor[lastKey]; +} - cursor.__defineGetter__(lastKey, fn); - }, - arr2obj: (arr, value) => { - if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); +export function setGetter(obj, key, fn) { + if (typeof obj !== 'object') throw new TypeError('obj must be an object!'); + if (!key) throw new TypeError('key is required!'); + if (typeof fn !== 'function') throw new TypeError('fn must be a function!'); - const obj = {}; - let i = arr.length; + if (!key.includes('.')) { + obj.__defineGetter__(key, fn); + return; + } - while (i--) { - obj[arr[i]] = value; - } + const token = extractPropKey(key); + const lastKey = token.pop(); + const len = token.length; - return obj; - }, - reverse: arr => { - if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); + let cursor = obj; - const len = arr.length; + for (let i = 0; i < len; i++) { + const name = token[i]; + cursor[name] = cursor[name] || {}; + cursor = cursor[name]; + } - if (!len) return arr; + cursor.__defineGetter__(lastKey, fn); +} - for (let left = 0, right = len - 1; left < right; left++, right--) { - const tmp = arr[left]; - arr[left] = arr[right]; - arr[right] = tmp; - } +export function arr2obj(arr, value) { + if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); - return arr; - }, - parseArgs: (orderby, order) => { - let result; + const obj = {}; + let i = arr.length; - if (order) { - result = {}; - result[orderby] = order; - } else if (typeof orderby === 'string') { - result = parseArgs(orderby); - } else { - result = orderby; - } + while (i--) { + obj[arr[i]] = value; + } - return result; + return obj; +} + +export function reverse(arr) { + if (!Array.isArray(arr)) throw new TypeError('arr must be an array!'); + + const len = arr.length; + + if (!len) return arr; + + for (let left = 0, right = len - 1; left < right; left++, right--) { + const tmp = arr[left]; + arr[left] = arr[right]; + arr[right] = tmp; + } + + return arr; +} + +export function parseArgs(orderby, order) { + let result; + + if (order) { + result = {}; + result[orderby] = order; + } else if (typeof orderby === 'string') { + result = _parseArgs(orderby); + } else { + result = orderby; } + + return result; } From 8fd8cc2b7e88b0c1eae777bfea92004559fdc940 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 18:21:57 +0900 Subject: [PATCH 17/32] fix: import `isPlainObject` instead of const --- src/schema.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/schema.ts b/src/schema.ts index 3f33e651..f9f81590 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -4,8 +4,7 @@ import Promise from 'bluebird'; import { getProp, setProp, delProp } from './util'; import PopulationError from './error/population'; import SchemaTypeVirtual from './types/virtual'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const isPlainObject: (o: any) => boolean = require('is-plain-object'); +import { isPlainObject } from 'is-plain-object'; /** * @callback queryFilterCallback From 22d2ba7c9249a6a79703a57d753e5c5179a5804b Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 22 Jun 2022 18:26:05 +0900 Subject: [PATCH 18/32] chore: once ignore eslint for test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e0a38f24..e9d8e219 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "scripts": { "pretest": "npm run typescript", "typescript": "tsc --build .tsconfig.json", - "eslint": "eslint src test", + "eslint": "eslint src", "test": "mocha -r ts-node/register 'test/scripts/**/*.ts'", "test-cov": "nyc --reporter=lcovonly --reporter=text-summary npm test", "jsdoc": "jsdoc --configure .jsdoc.json", From 7a92cc1c806e22a2a9b61d1f41dca7eedc83791c Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sat, 23 Jul 2022 12:56:34 +0900 Subject: [PATCH 19/32] chore: add .tsconfig.json for test --- test/.tsconfig.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/.tsconfig.json diff --git a/test/.tsconfig.json b/test/.tsconfig.json new file mode 100644 index 00000000..10d1133f --- /dev/null +++ b/test/.tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../.tsconfig.json", + "compilerOptions": { + "types": [ + "mocha" + ] + }, + "include": [ + "./**/*" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file From 18a21053675d2af232ebf8c2f7df0d8a5f1f52cf Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sat, 23 Jul 2022 12:57:05 +0900 Subject: [PATCH 20/32] chore: .tsconfig.json to tsconfig.json --- package.json | 2 +- test/{.tsconfig.json => tsconfig.json} | 2 +- .tsconfig.json => tsconfig.json | 36 +++++++++++++------------- 3 files changed, 20 insertions(+), 20 deletions(-) rename test/{.tsconfig.json => tsconfig.json} (80%) rename .tsconfig.json => tsconfig.json (94%) diff --git a/package.json b/package.json index e9d8e219..cdded37d 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ ], "scripts": { "pretest": "npm run typescript", - "typescript": "tsc --build .tsconfig.json", "eslint": "eslint src", + "typescript": "tsc --build tsconfig.json", "test": "mocha -r ts-node/register 'test/scripts/**/*.ts'", "test-cov": "nyc --reporter=lcovonly --reporter=text-summary npm test", "jsdoc": "jsdoc --configure .jsdoc.json", diff --git a/test/.tsconfig.json b/test/tsconfig.json similarity index 80% rename from test/.tsconfig.json rename to test/tsconfig.json index 10d1133f..975e2aa7 100644 --- a/test/.tsconfig.json +++ b/test/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../.tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "types": [ "mocha" diff --git a/.tsconfig.json b/tsconfig.json similarity index 94% rename from .tsconfig.json rename to tsconfig.json index 80370876..d6c6dcd4 100644 --- a/.tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,19 @@ -{ - "compilerOptions": { - "outDir": "./dist", - "module": "commonjs", - "target": "es6", - "sourceMap": true, - "declaration": true, - "esModuleInterop": true, - "types": [ - "node" - ] - }, - "include": [ - "./src/**/*" - ], - "exclude": [ - "node_modules" - ] +{ + "compilerOptions": { + "outDir": "./dist", + "module": "commonjs", + "target": "es6", + "sourceMap": true, + "declaration": true, + "esModuleInterop": true, + "types": [ + "node" + ] + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "node_modules" + ] } \ No newline at end of file From 57d207f63f4515c94d40997ab6ea564ea6874245 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sat, 23 Jul 2022 12:58:33 +0900 Subject: [PATCH 21/32] chore: delete tsconfig.json for test --- package.json | 2 +- test/tsconfig.json | 14 -------------- tsconfig.json | 3 ++- 3 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 test/tsconfig.json diff --git a/package.json b/package.json index cdded37d..e7e48d22 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ ], "scripts": { "pretest": "npm run typescript", - "eslint": "eslint src", "typescript": "tsc --build tsconfig.json", + "eslint": "eslint src test", "test": "mocha -r ts-node/register 'test/scripts/**/*.ts'", "test-cov": "nyc --reporter=lcovonly --reporter=text-summary npm test", "jsdoc": "jsdoc --configure .jsdoc.json", diff --git a/test/tsconfig.json b/test/tsconfig.json deleted file mode 100644 index 975e2aa7..00000000 --- a/test/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "types": [ - "mocha" - ] - }, - "include": [ - "./**/*" - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index d6c6dcd4..117e4a71 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,8 @@ "declaration": true, "esModuleInterop": true, "types": [ - "node" + "node", + "mocha" ] }, "include": [ From 3ee2546819512b2632e90d9642d935e6b93ed138 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sun, 24 Jul 2022 05:47:01 +0900 Subject: [PATCH 22/32] update each type functions number of argument --- src/schematype.ts | 28 +++++++++++------------ src/types/array.ts | 32 +++++++++++++------------- src/types/boolean.ts | 8 +++---- src/types/buffer.ts | 16 ++++++------- src/types/cuid.ts | 6 ++--- src/types/date.ts | 42 ++++++++++++++--------------------- src/types/enum.ts | 2 +- src/types/integer.ts | 4 ++-- src/types/number.ts | 25 ++++++++------------- src/types/string.ts | 13 +++++------ src/util.ts | 2 +- test/scripts/database.ts | 1 - test/scripts/document.ts | 1 - test/scripts/model.ts | 1 - test/scripts/mutex.ts | 1 - test/scripts/query.ts | 1 - test/scripts/schema.ts | 12 +++++----- test/scripts/schematype.ts | 2 +- test/scripts/types/array.ts | 1 - test/scripts/types/boolean.ts | 1 - test/scripts/types/buffer.ts | 1 - test/scripts/types/cuid.ts | 1 - test/scripts/types/date.ts | 5 ++--- test/scripts/types/enum.ts | 1 - test/scripts/types/integer.ts | 1 - test/scripts/types/number.ts | 1 - test/scripts/types/object.ts | 1 - test/scripts/types/string.ts | 1 - test/scripts/types/virtual.ts | 3 ++- test/scripts/util.ts | 26 +++++++++++----------- 30 files changed, 103 insertions(+), 137 deletions(-) diff --git a/src/schematype.ts b/src/schematype.ts index e236c71a..22dea735 100644 --- a/src/schematype.ts +++ b/src/schematype.ts @@ -78,7 +78,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - cast(value: unknown, data: unknown): unknown { + cast(value?: unknown, data?: unknown): unknown { if (value == null) { return this.default(); } @@ -93,7 +93,7 @@ class SchemaType { * @param {Object} data * @return {*|Error} */ - validate(value: unknown, data: unknown): unknown { + validate(value: unknown, data?: unknown): unknown { if (this.options.required && value == null) { throw new ValidationError(`\`${this.name}\` is required!`); } @@ -136,7 +136,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - value(value: unknown, data: unknown): any { + value(value: unknown, data?: unknown): any { return value; } @@ -148,7 +148,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - match(value: T, query: unknown, data: unknown): boolean { + match(value: T, query: unknown, data?: unknown): boolean { return value === query; } @@ -160,7 +160,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$exist(value: unknown, query: unknown, data: unknown): boolean { + q$exist(value: unknown, query: unknown, data?: unknown): boolean { return (value != null) === query; } @@ -172,7 +172,7 @@ class SchemaType { * @param {Object} data * @return {boolean} */ - q$ne(value: T, query: unknown, data: unknown): boolean { + q$ne(value: T, query: unknown, data?: unknown): boolean { return !this.match(value, query, data); } @@ -184,7 +184,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$lt(value: unknown, query: unknown, data: unknown): boolean { + q$lt(value: unknown, query: unknown, data?: unknown): boolean { return value < query; } @@ -196,7 +196,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$lte(value: unknown, query: unknown, data: unknown): boolean { + q$lte(value: unknown, query: unknown, data?: unknown): boolean { return value <= query; } @@ -208,7 +208,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$gt(value: unknown, query: unknown, data: unknown): boolean { + q$gt(value: unknown, query: unknown, data?: unknown): boolean { return value > query; } @@ -220,7 +220,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$gte(value: unknown, query: unknown, data: unknown): boolean { + q$gte(value: unknown, query: unknown, data?: unknown): boolean { return value >= query; } @@ -232,7 +232,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$in(value: unknown, query: unknown[], data: unknown): boolean { + q$in(value: unknown, query: unknown[], data?: unknown): boolean { return query.includes(value); } @@ -244,7 +244,7 @@ class SchemaType { * @param {Object} data * @return {Boolean} */ - q$nin(value, query, data) { + q$nin(value, query, data?) { return !query.includes(value); } @@ -256,7 +256,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - u$set(value, update, data) { + u$set(value, update, data?) { return update; } @@ -268,7 +268,7 @@ class SchemaType { * @param {Object} data * @return {*} */ - u$unset(value, update, data) { return update ? undefined : value; } + u$unset(value, update, data?) { return update ? undefined : value; } /** * Renames a field. diff --git a/src/types/array.ts b/src/types/array.ts index 11bd5646..3c51f36f 100644 --- a/src/types/array.ts +++ b/src/types/array.ts @@ -33,7 +33,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - cast(value_: unknown, data: unknown): I[] | null | undefined { + cast(value_?: unknown, data?: unknown): I[] | null | undefined { value_ = super.cast(value_, data); if (value_ == null) return value_ as null | undefined; @@ -56,7 +56,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array|Error} */ - validate(value_: unknown, data: unknown): I[] { + validate(value_?: unknown, data?: unknown): I[] { const value = super.validate(value_, data); if (!isArray(value)) { @@ -81,7 +81,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Array} b * @return {Number} */ - compare(a: I[], b: I[]): number { + compare(a?: I[], b?: I[]): number { if (a) { if (!b) return 1; } else { @@ -107,7 +107,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Array} value * @return {Array} */ - parse(value: unknown[]) { + parse(value?: unknown[]) { if (!value) return value; const len = value.length; @@ -130,7 +130,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - value(value: unknown[], data: unknown): any[] { + value(value?: unknown[], data?: unknown): any[] { if (!value) return value; const len = value.length; @@ -154,7 +154,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Boolean} */ - match(value: I[], query: unknown[], data: unknown): boolean { + match(value?: I[], query?: unknown[], data?: unknown): boolean { if (!value || !query) { return value === query; } @@ -181,7 +181,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$size(value: unknown[], query: unknown, data: unknown): boolean { + q$size(value?: unknown[], query?: unknown, data?: unknown): boolean { return (value ? value.length : 0) === query; } @@ -193,7 +193,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$in(value: unknown[], query: unknown[], data: unknown): boolean { + q$in(value?: unknown[], query?: unknown[], data?: unknown): boolean { if (!value) return false; for (let i = 0, len = query.length; i < len; i++) { @@ -211,7 +211,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$nin(value: unknown[], query: unknown[], data: unknown): boolean { + q$nin(value?: unknown[], query?: unknown[], data?: unknown): boolean { if (!value) return true; for (let i = 0, len = query.length; i < len; i++) { @@ -229,7 +229,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$all(value: unknown[], query: unknown[], data: unknown): boolean { + q$all(value?: unknown[], query?: unknown[], data?: unknown): boolean { if (!value) return false; for (let i = 0, len = query.length; i < len; i++) { @@ -247,7 +247,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$push(value: T[], update: T, data: unknown): T[] { + u$push(value?: T[], update?: T | T[], data?: unknown): T[] { if (isArray(update)) { return value ? value.concat(update) : update; } @@ -268,7 +268,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$unshift(value: unknown[], update: unknown, data: unknown): any[] { + u$unshift(value?: unknown[], update?: unknown, data?: unknown): any[] { if (isArray(update)) { return value ? update.concat(value) : update; } @@ -289,7 +289,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$pull(value: unknown[], update: unknown, data: unknown): any[] { + u$pull(value?: unknown[], update?: unknown, data?: unknown): any[] { if (!value) return value; if (isArray(update)) { @@ -307,7 +307,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$shift(value, update, data) { + u$shift(value?, update?, data?) { if (!value || !update) return value; if (update === true) { @@ -327,7 +327,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$pop(value, update, data) { + u$pop(value?, update?, data?) { if (!value || !update) return value; const length = value.length; @@ -349,7 +349,7 @@ class SchemaTypeArray> extends SchemaType { * @param {Object} data * @return {Array} */ - u$addToSet(value: any[], update, data) { + u$addToSet(value?: any[], update?, data?) { if (isArray(update)) { if (!value) return update; diff --git a/src/types/boolean.ts b/src/types/boolean.ts index 6951bea1..55330fde 100644 --- a/src/types/boolean.ts +++ b/src/types/boolean.ts @@ -13,7 +13,7 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Boolean} */ - cast(value_: unknown, data: unknown): boolean { + cast(value_?: unknown, data?: unknown): boolean { const value = super.cast(value_, data); if (value === 'false' || value === '0') return false; @@ -28,7 +28,7 @@ class SchemaTypeBoolean extends SchemaType { * @param {Object} data * @return {Boolean|Error} */ - validate(value_: unknown, data: unknown): boolean { + validate(value_: unknown, data?: unknown): boolean { const value = super.validate(value_, data); if (value != null && typeof value !== 'boolean') { @@ -42,7 +42,6 @@ class SchemaTypeBoolean extends SchemaType { * Parses data and transform them into boolean values. * * @param {*} value - * @param {Object} data * @return {Boolean} */ parse(value: unknown): boolean { @@ -53,10 +52,9 @@ class SchemaTypeBoolean extends SchemaType { * Transforms data into number to compress the size of database files. * * @param {Boolean} value - * @param {Object} data * @return {Number} */ - value(value: unknown, data: unknown): number { + value(value: unknown): number { return +value; } } diff --git a/src/types/buffer.ts b/src/types/buffer.ts index 40907bde..73cc157e 100644 --- a/src/types/buffer.ts +++ b/src/types/buffer.ts @@ -14,7 +14,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {boolean|Function} [options.default] * @param {string} [options.encoding=hex] */ - constructor(name: string, options) { + constructor(name: string, options?) { super(name, Object.assign({ encoding: 'hex' }, options)); @@ -27,7 +27,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Buffer} */ - cast(value_: unknown, data): Buffer | null | undefined { + cast(value_?: unknown, data?): Buffer | null | undefined { const value = super.cast(value_, data); if (value == null || Buffer.isBuffer(value)) return value as Buffer | null | undefined; @@ -42,7 +42,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Object} data * @return {Buffer} */ - validate(value_: unknown, data): Buffer { + validate(value_: unknown, data?): Buffer { const value = super.validate(value_, data); if (!Buffer.isBuffer(value)) { @@ -59,7 +59,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {Buffer} b * @return {Number} */ - compare(a: Buffer, b: Buffer): number { + compare(a?: Buffer, b?: Buffer): number { if (Buffer.isBuffer(a)) { return Buffer.isBuffer(b) ? a.compare(b) : 1; } @@ -73,7 +73,7 @@ class SchemaTypeBuffer extends SchemaType { * @param {*} value * @return {Boolean} */ - parse(value) { + parse(value?) { return value ? Buffer.from(value, this.options.encoding) : value; } @@ -81,10 +81,9 @@ class SchemaTypeBuffer extends SchemaType { * Transforms data into number to compress the size of database files. * * @param {Buffer} value - * @param {Object} data * @return {Number} */ - value(value: Buffer, data) { + value(value?: Buffer) { return Buffer.isBuffer(value) ? value.toString(this.options.encoding) : value; } @@ -93,10 +92,9 @@ class SchemaTypeBuffer extends SchemaType { * * @param {Buffer} value * @param {Buffer} query - * @param {Object} data * @return {Boolean} */ - match(value: Buffer, query: Buffer, data): boolean { + match(value: Buffer, query: Buffer): boolean { if (Buffer.isBuffer(value) && Buffer.isBuffer(query)) { return value.equals(query); } diff --git a/src/types/cuid.ts b/src/types/cuid.ts index 9c4de0b0..49b057c6 100644 --- a/src/types/cuid.ts +++ b/src/types/cuid.ts @@ -12,10 +12,9 @@ class SchemaTypeCUID extends SchemaType { * required. * * @param {String} value - * @param {Object} data * @return {String} */ - cast(value, data) { + cast(value?) { if (value == null && this.options.required) { return cuid(); } @@ -27,10 +26,9 @@ class SchemaTypeCUID extends SchemaType { * Validates data. A valid CUID must be started with `c` and 25 in length. * * @param {*} value - * @param {Object} data * @return {String|Error} */ - validate(value, data) { + validate(value?) { if (value && (value[0] !== 'c' || value.length !== 25)) { throw new ValidationError(`\`${value}\` is not a valid CUID`); } diff --git a/src/types/date.ts b/src/types/date.ts index 663263a8..40727b87 100644 --- a/src/types/date.ts +++ b/src/types/date.ts @@ -10,15 +10,14 @@ class SchemaTypeDate extends SchemaType { * Casts data. * * @param {*} value - * @param {Object} data - * @return {Date} + * @return {Date | null | undefined} */ - cast(value: Date, data): Date; - cast(value: null, data): Date | null; - cast(value: undefined, data): Date | undefined; - cast(value: unknown, data): Date | null | undefined; - cast(value_, data): Date | null | undefined { - const value = super.cast(value_, data); + cast(value_?): Date | null | undefined; + cast(value_: Date): Date; + cast(value_: null): Date | null; + cast(value_: undefined): Date | undefined; + cast(value_: unknown): Date | null | undefined { + const value = super.cast(value_, null); if (value == null || value instanceof Date) return value as Date | null | undefined; @@ -32,7 +31,7 @@ class SchemaTypeDate extends SchemaType { * @param {Object} data * @return {Date|Error} */ - validate(value_, data) { + validate(value_, data?) { const value = super.validate(value_, data); if (value != null && (!(value instanceof Date) || isNaN(value.getTime()))) { @@ -47,10 +46,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Date} query - * @param {Object} data * @return {Boolean} */ - match(value: Date, query: Date, data): boolean { + match(value: Date, query: Date): boolean { if (!value || !query) { return value === query; } @@ -65,7 +63,7 @@ class SchemaTypeDate extends SchemaType { * @param {Date} b * @return {Number} */ - compare(a, b) { + compare(a?, b?) { if (a) { return b ? a - b : 1; } @@ -79,7 +77,7 @@ class SchemaTypeDate extends SchemaType { * @param {*} value * @return {Date} */ - parse(value) { + parse(value?) { if (value) return new Date(value); } @@ -87,10 +85,9 @@ class SchemaTypeDate extends SchemaType { * Transforms a date object to a string. * * @param {Date} value - * @param {Object} data * @return {String} */ - value(value, data) { + value(value?) { return value ? value.toISOString() : value; } @@ -99,10 +96,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Number} query - * @param {Object} data * @return {Boolean} */ - q$day(value, query, data) { + q$day(value, query) { return value ? value.getDate() === query : false; } @@ -111,10 +107,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Number} query - * @param {Object} data * @return {Boolean} */ - q$month(value, query, data) { + q$month(value, query) { return value ? value.getMonth() === query : false; } @@ -123,10 +118,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Number} query - * @param {Object} data * @return {Boolean} */ - q$year(value, query, data) { + q$year(value, query) { return value ? value.getFullYear() === query : false; } @@ -135,10 +129,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Number} update - * @param {Object} data * @return {Date} */ - u$inc(value, update, data) { + u$inc(value, update) { if (value) return new Date(value.getTime() + update); } @@ -147,10 +140,9 @@ class SchemaTypeDate extends SchemaType { * * @param {Date} value * @param {Number} update - * @param {Object} data * @return {Date} */ - u$dec(value, update, data) { + u$dec(value, update) { if (value) return new Date(value.getTime() - update); } } diff --git a/src/types/enum.ts b/src/types/enum.ts index 392ad136..1a96d88c 100644 --- a/src/types/enum.ts +++ b/src/types/enum.ts @@ -28,7 +28,7 @@ class SchemaTypeEnum extends SchemaType { * @param {Object} data * @return {*} */ - validate(value_, data) { + validate(value_, data?) { const value = super.validate(value_, data); const elements = this.options.elements; diff --git a/src/types/integer.ts b/src/types/integer.ts index eaabaa15..5eaea23e 100644 --- a/src/types/integer.ts +++ b/src/types/integer.ts @@ -13,7 +13,7 @@ class SchemaTypeInteger extends SchemaTypeNumber { * @param {Object} data * @return {Number} */ - cast(value_, data): number { + cast(value_?, data?): number { const value = super.cast(value_, data); return parseInt(value as any, 10); @@ -26,7 +26,7 @@ class SchemaTypeInteger extends SchemaTypeNumber { * @param {Object} data * @return {Number|Error} */ - validate(value_, data): number { + validate(value_?, data?): number { const value = super.validate(value_, data); if (value % 1 !== 0) { diff --git a/src/types/number.ts b/src/types/number.ts index 7cf40a4b..83dcbe2c 100644 --- a/src/types/number.ts +++ b/src/types/number.ts @@ -13,7 +13,7 @@ class SchemaTypeNumber extends SchemaType { * @param {Object} data * @return {Number} */ - cast(value_, data): number | null | undefined { + cast(value_?, data?): number | null | undefined { const value = super.cast(value_, data); if (value == null || typeof value === 'number') return value as number | null | undefined; @@ -28,7 +28,7 @@ class SchemaTypeNumber extends SchemaType { * @param {Object} data * @return {Number|Error} */ - validate(value_, data) { + validate(value_?, data?) { const value = super.validate(value_, data); if (value !== undefined && (typeof value !== 'number' || isNaN(value))) { @@ -43,10 +43,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$inc(value, update, data) { + u$inc(value, update) { return value ? value + update : update; } @@ -55,10 +54,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$dec(value, update, data) { + u$dec(value, update) { return value ? value - update : -update; } @@ -67,10 +65,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$mul(value, update, data) { + u$mul(value, update) { return value ? value * update : 0; } @@ -79,10 +76,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$div(value, update, data) { + u$div(value, update) { return value ? value / update : 0; } @@ -91,10 +87,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$mod(value, update, data) { + u$mod(value, update) { return value ? value % update : 0; } @@ -103,10 +98,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$max(value, update, data) { + u$max(value, update) { return update > value ? update : value; } @@ -115,10 +109,9 @@ class SchemaTypeNumber extends SchemaType { * * @param {Number} value * @param {Number} update - * @param {Object} data * @return {Number} */ - u$min(value, update, data) { + u$min(value, update) { return update < value ? update : value; } } diff --git a/src/types/string.ts b/src/types/string.ts index 0a86603f..589ee085 100644 --- a/src/types/string.ts +++ b/src/types/string.ts @@ -13,7 +13,7 @@ class SchemaTypeString extends SchemaType { * @param {Object} data * @return {String} */ - cast(value_, data) { + cast(value_?, data?) { const value = super.cast(value_, data); if (value == null || typeof value === 'string') return value; @@ -27,7 +27,7 @@ class SchemaTypeString extends SchemaType { * @param {Object} data * @return {String|Error} */ - validate(value_, data) { + validate(value_?, data?) { const value = super.validate(value_, data); if (value !== undefined && typeof value !== 'string') { @@ -45,7 +45,7 @@ class SchemaTypeString extends SchemaType { * @param {Object} data * @return {Boolean} */ - match(value, query, data) { + match(value, query, data?) { if (!value || !query) { return value === query; } @@ -65,7 +65,7 @@ class SchemaTypeString extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$in(value, query, data) { + q$in(value, query, data?) { for (let i = 0, len = query.length; i < len; i++) { if (this.match(value, query[i], data)) return true; } @@ -81,7 +81,7 @@ class SchemaTypeString extends SchemaType { * @param {Object} data * @return {Boolean} */ - q$nin(value, query, data) { + q$nin(value, query, data?) { return !this.q$in(value, query, data); } @@ -90,10 +90,9 @@ class SchemaTypeString extends SchemaType { * * @param {String} value * @param {Number} query - * @param {Object} data * @return {Boolean} */ - q$length(value, query, data) { + q$length(value, query) { return (value ? value.length : 0) === query; } } diff --git a/src/util.ts b/src/util.ts index 57f395a6..62cef092 100644 --- a/src/util.ts +++ b/src/util.ts @@ -173,7 +173,7 @@ export function reverse(arr) { return arr; } -export function parseArgs(orderby, order) { +export function parseArgs(orderby, order?) { let result; if (order) { diff --git a/test/scripts/database.ts b/test/scripts/database.ts index 0d842137..16be4655 100644 --- a/test/scripts/database.ts +++ b/test/scripts/database.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import path from 'path'; diff --git a/test/scripts/document.ts b/test/scripts/document.ts index dc20e871..abac13a4 100644 --- a/test/scripts/document.ts +++ b/test/scripts/document.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import Database from '../../dist/database'; diff --git a/test/scripts/model.ts b/test/scripts/model.ts index 2bda612f..87cfead4 100644 --- a/test/scripts/model.ts +++ b/test/scripts/model.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import chaiAsPromised from 'chai-as-promised'; diff --git a/test/scripts/mutex.ts b/test/scripts/mutex.ts index 77b78855..7157285a 100644 --- a/test/scripts/mutex.ts +++ b/test/scripts/mutex.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import Mutex from '../../dist/mutex'; diff --git a/test/scripts/query.ts b/test/scripts/query.ts index a2402e2b..b448882d 100644 --- a/test/scripts/query.ts +++ b/test/scripts/query.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import lodash from 'lodash'; diff --git a/test/scripts/schema.ts b/test/scripts/schema.ts index 7cfb0d8b..2a4f9a70 100644 --- a/test/scripts/schema.ts +++ b/test/scripts/schema.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import Database from '../../dist/database'; @@ -49,10 +48,13 @@ describe('Schema', () => { // array schema.paths.arr1.should.be.an.instanceOf(Schema.Types.Array); + // @ts-ignore schema.paths.arr1.child.should.be.an.instanceOf(Schema.Types.Mixed); schema.paths.arr2.should.be.an.instanceOf(Schema.Types.Array); + // @ts-ignore schema.paths.arr2.child.should.be.an.instanceOf(Schema.Types.String); schema.paths.arr3.should.be.an.instanceOf(Schema.Types.Array); + // @ts-ignore schema.paths.arr3.child.should.be.an.instanceOf(Schema.Types.String); // object @@ -101,7 +103,7 @@ describe('Schema', () => { (() => schema.pre('wtf', () => {})).should.to.throw(TypeError, 'Hook type must be `save` or `remove`!'); // hook is not a function - (() => schema.pre('save')).should.to.throw(TypeError, 'Hook must be a function!'); + (() => schema.pre('save', {})).should.to.throw(TypeError, 'Hook must be a function!'); }); it('post()', () => { @@ -121,7 +123,7 @@ describe('Schema', () => { (() => schema.post('wtf', () => {})).should.throw(TypeError, 'Hook type must be `save` or `remove`!'); // hook is not a function - (() => schema.post('save')).should.to.throw(TypeError, 'Hook must be a function!'); + (() => schema.post('save', {})).should.to.throw(TypeError, 'Hook must be a function!'); }); it('method()', () => { @@ -135,7 +137,7 @@ describe('Schema', () => { schema.method.should.to.throw(TypeError, 'Method name is required!'); // without function - (() => schema.method('wtf')).should.to.throw(TypeError, 'Instance method must be a function!'); + (() => schema.method('wtf', {})).should.to.throw(TypeError, 'Instance method must be a function!'); }); it('static()', () => { @@ -149,6 +151,6 @@ describe('Schema', () => { schema.static.should.to.throw(TypeError, 'Method name is required!'); // without function - (() => schema.static('wtf')).should.to.throw(TypeError, 'Static method must be a function!'); + (() => schema.static('wtf', {})).should.to.throw(TypeError, 'Static method must be a function!'); }); }); diff --git a/test/scripts/schematype.ts b/test/scripts/schematype.ts index fd453ee5..a935779f 100644 --- a/test/scripts/schematype.ts +++ b/test/scripts/schematype.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../dist/error/validation'; @@ -134,6 +133,7 @@ describe('SchemaType', () => { it('u$rename', () => { const obj = {a: 1}; should.not.exist(type.u$rename(1, 'b', obj)); + // @ts-ignore obj.b.should.eql(1); }); }); diff --git a/test/scripts/types/array.ts b/test/scripts/types/array.ts index 682de202..19ba5313 100644 --- a/test/scripts/types/array.ts +++ b/test/scripts/types/array.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/boolean.ts b/test/scripts/types/boolean.ts index 28f3dc0b..bf84920c 100644 --- a/test/scripts/types/boolean.ts +++ b/test/scripts/types/boolean.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/buffer.ts b/test/scripts/types/buffer.ts index db58351f..9bae4b19 100644 --- a/test/scripts/types/buffer.ts +++ b/test/scripts/types/buffer.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/cuid.ts b/test/scripts/types/cuid.ts index d68975cd..9023eb8a 100644 --- a/test/scripts/types/cuid.ts +++ b/test/scripts/types/cuid.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/date.ts b/test/scripts/types/date.ts index d1762442..adecba91 100644 --- a/test/scripts/types/date.ts +++ b/test/scripts/types/date.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; @@ -86,11 +85,11 @@ describe('SchemaTypeDate', () => { it('u$inc()', () => { type.u$inc(new Date(1e8), 1).should.eql(new Date(1e8 + 1)); - should.not.exist(undefined, 1); + should.not.exist(undefined, "1"); }); it('u$dec()', () => { type.u$dec(new Date(1e8), 1).should.eql(new Date(1e8 - 1)); - should.not.exist(undefined, 1); + should.not.exist(undefined, "1"); }); }); diff --git a/test/scripts/types/enum.ts b/test/scripts/types/enum.ts index dabd881d..ded35ace 100644 --- a/test/scripts/types/enum.ts +++ b/test/scripts/types/enum.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/integer.ts b/test/scripts/types/integer.ts index e4ed62d8..ffe341f2 100644 --- a/test/scripts/types/integer.ts +++ b/test/scripts/types/integer.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/number.ts b/test/scripts/types/number.ts index c4eff523..ae56afbf 100644 --- a/test/scripts/types/number.ts +++ b/test/scripts/types/number.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/object.ts b/test/scripts/types/object.ts index 73d215ff..e29b6473 100644 --- a/test/scripts/types/object.ts +++ b/test/scripts/types/object.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import SchemaTypeObject from '../../../dist/types/object'; diff --git a/test/scripts/types/string.ts b/test/scripts/types/string.ts index 07fdea0c..b2572c8c 100644 --- a/test/scripts/types/string.ts +++ b/test/scripts/types/string.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import ValidationError from '../../../dist/error/validation'; diff --git a/test/scripts/types/virtual.ts b/test/scripts/types/virtual.ts index 2dca42a0..ddbc83c5 100644 --- a/test/scripts/types/virtual.ts +++ b/test/scripts/types/virtual.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import SchemaTypeVirtual from '../../../dist/types/virtual'; @@ -38,6 +37,7 @@ describe('SchemaTypeVirtual', () => { }); type.cast(undefined, obj); + // @ts-ignore obj.test.should.eql('FOO'); }); @@ -49,6 +49,7 @@ describe('SchemaTypeVirtual', () => { }); type.validate('FOO', obj); + // @ts-ignore obj.name.should.eql('foo'); }); }); diff --git a/test/scripts/util.ts b/test/scripts/util.ts index 6c6af2b8..d284e2a8 100644 --- a/test/scripts/util.ts +++ b/test/scripts/util.ts @@ -1,4 +1,3 @@ -// @ts-nocheck import chai from 'chai'; const should = chai.should(); // eslint-disable-line import * as util from '../../dist/util'; @@ -16,7 +15,7 @@ describe('util', () => { }); it('shuffle() - array must be an array', () => { - (() => util.shuffle()).should.to.throw('array must be an Array!'); + (() => util.shuffle({})).should.to.throw('array must be an Array!'); }); it('getProp()', () => { @@ -38,11 +37,11 @@ describe('util', () => { }); it('getProp() - obj must be an object', () => { - (() => util.getProp()).should.to.throw('obj must be an object!'); + (() => util.getProp("", "")).should.to.throw('obj must be an object!'); }); it('getProp() - key is required', () => { - (() => util.getProp({})).should.to.throw('key is required!'); + (() => util.getProp({}, null)).should.to.throw('key is required!'); }); it('setProp()', () => { @@ -69,11 +68,11 @@ describe('util', () => { }); it('setProp() - obj must be an object', () => { - (() => util.setProp()).should.to.throw('obj must be an object!'); + (() => util.setProp("", "", "")).should.to.throw('obj must be an object!'); }); it('setProp() - key is required', () => { - (() => util.setProp({})).should.to.throw('key is required!'); + (() => util.setProp({}, null, null)).should.to.throw('key is required!'); }); it('delProp()', () => { @@ -100,11 +99,11 @@ describe('util', () => { }); it('delProp() - obj must be an object', () => { - (() => util.delProp()).should.to.throw('obj must be an object!'); + (() => util.delProp("", null)).should.to.throw('obj must be an object!'); }); it('delProp() - key is required', () => { - (() => util.delProp({})).should.to.throw('key is required!'); + (() => util.delProp({}, null)).should.to.throw('key is required!'); }); it('setGetter()', () => { @@ -134,19 +133,20 @@ describe('util', () => { util.setGetter(obj, 'a.c.h', () => 'ach'); + // @ts-ignore obj.a.c.h.should.eql('ach'); }); it('setGetter() - obj must be an object', () => { - (() => util.setGetter()).should.to.throw('obj must be an object!'); + (() => util.setGetter("", null, null)).should.to.throw('obj must be an object!'); }); it('setGetter() - key is required', () => { - (() => util.setGetter({})).should.to.throw('key is required!'); + (() => util.setGetter({}, null, null)).should.to.throw('key is required!'); }); it('setGetter() - fn must be a function', () => { - (() => util.setGetter({}, 'test')).should.to.throw('fn must be a function!'); + (() => util.setGetter({}, 'test', {})).should.to.throw('fn must be a function!'); }); it('arr2obj()', () => { @@ -154,7 +154,7 @@ describe('util', () => { }); it('arr2obj() - arr must be an array', () => { - (() => util.arr2obj()).should.to.throw('arr must be an array!'); + (() => util.arr2obj({}, null)).should.to.throw('arr must be an array!'); }); it('reverse()', () => { @@ -164,7 +164,7 @@ describe('util', () => { }); it('reverse() - arr must be an array', () => { - (() => util.reverse()).should.to.throw('arr must be an array!'); + (() => util.reverse({})).should.to.throw('arr must be an array!'); }); it('parseArgs()', () => { From 935fa4d9c95e01cd5a16249a8452d099b1bdd3c7 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sun, 24 Jul 2022 06:00:43 +0900 Subject: [PATCH 23/32] test(eslint): fix and ignore eslint some rules --- test/.eslintrc.json | 10 ++++++++-- test/scripts/types/date.ts | 4 ++-- test/scripts/util.ts | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/test/.eslintrc.json b/test/.eslintrc.json index d7729e79..28b8a26d 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -1,4 +1,10 @@ { - "root": true, - "extends": "hexo/test" + "extends": "hexo/test", + "rules": { + "strict": 0, + "node/no-unsupported-features/es-syntax": 0, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-comment": 0, + "@typescript-eslint/no-empty-function": 0 + } } diff --git a/test/scripts/types/date.ts b/test/scripts/types/date.ts index adecba91..da80826b 100644 --- a/test/scripts/types/date.ts +++ b/test/scripts/types/date.ts @@ -85,11 +85,11 @@ describe('SchemaTypeDate', () => { it('u$inc()', () => { type.u$inc(new Date(1e8), 1).should.eql(new Date(1e8 + 1)); - should.not.exist(undefined, "1"); + should.not.exist(undefined, '1'); }); it('u$dec()', () => { type.u$dec(new Date(1e8), 1).should.eql(new Date(1e8 - 1)); - should.not.exist(undefined, "1"); + should.not.exist(undefined, '1'); }); }); diff --git a/test/scripts/util.ts b/test/scripts/util.ts index d284e2a8..f823a0a8 100644 --- a/test/scripts/util.ts +++ b/test/scripts/util.ts @@ -37,7 +37,7 @@ describe('util', () => { }); it('getProp() - obj must be an object', () => { - (() => util.getProp("", "")).should.to.throw('obj must be an object!'); + (() => util.getProp('', null)).should.to.throw('obj must be an object!'); }); it('getProp() - key is required', () => { @@ -68,7 +68,7 @@ describe('util', () => { }); it('setProp() - obj must be an object', () => { - (() => util.setProp("", "", "")).should.to.throw('obj must be an object!'); + (() => util.setProp('', null, null)).should.to.throw('obj must be an object!'); }); it('setProp() - key is required', () => { @@ -99,7 +99,7 @@ describe('util', () => { }); it('delProp() - obj must be an object', () => { - (() => util.delProp("", null)).should.to.throw('obj must be an object!'); + (() => util.delProp('', null)).should.to.throw('obj must be an object!'); }); it('delProp() - key is required', () => { @@ -138,7 +138,7 @@ describe('util', () => { }); it('setGetter() - obj must be an object', () => { - (() => util.setGetter("", null, null)).should.to.throw('obj must be an object!'); + (() => util.setGetter('', null, null)).should.to.throw('obj must be an object!'); }); it('setGetter() - key is required', () => { From aa58e2708b86249c5ff9b4feaceffc9f1c561a54 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sun, 24 Jul 2022 06:18:07 +0900 Subject: [PATCH 24/32] chore: specify node 18.4 in ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5cb12cca..bcfbc768 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: ['14.x', '16.x', '18.x'] + node-version: ['14.x', '16.x', '18.4'] fail-fast: false steps: - uses: actions/checkout@v2 From 418c334547637dd5d89c61947defd2527bdbc073 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Sun, 24 Jul 2022 06:24:35 +0900 Subject: [PATCH 25/32] chore: workaround for `Error [ERR_STREAM_PREMATURE_CLOSE]` in node 18.6 --- .github/workflows/ci.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcfbc768..2cf726cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] + # NOTE: The `Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close` error occurs with Node 18.6 (current latest version). node-version: ['14.x', '16.x', '18.4'] fail-fast: false steps: diff --git a/package.json b/package.json index e7e48d22..9c62553c 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,6 @@ "typescript": "^4.7.4" }, "engines": { - "node": ">=14" + "node": ">=14 <18.5" } } From 8a2e372701f46ffbd60328b7df3c93ba8561c738 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Fri, 29 Jul 2022 01:05:23 +0900 Subject: [PATCH 26/32] chore: delete require nodejs`<18.5` --- .github/workflows/ci.yml | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2cf726cf..5cb12cca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,8 +24,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - # NOTE: The `Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close` error occurs with Node 18.6 (current latest version). - node-version: ['14.x', '16.x', '18.4'] + node-version: ['14.x', '16.x', '18.x'] fail-fast: false steps: - uses: actions/checkout@v2 diff --git a/package.json b/package.json index b04e9b15..4b135308 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,6 @@ "typescript": "^4.7.4" }, "engines": { - "node": ">=14 <18.5" + "node": ">=14" } } From 64e134d6b75a4be270a5d396b98228834497982d Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 10 Aug 2022 19:27:09 +0900 Subject: [PATCH 27/32] migrate jsonstream from js to ts --- src/database.ts | 2 +- lib/jsonstream/index.js => src/lib/jsonstream/index.ts | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) rename lib/jsonstream/index.js => src/lib/jsonstream/index.ts (96%) diff --git a/src/database.ts b/src/database.ts index 66072ede..d6b395ee 100644 --- a/src/database.ts +++ b/src/database.ts @@ -1,4 +1,4 @@ -const { parse: createJsonParseStream } = require('./jsonstream'); +import { parse as createJsonParseStream } from './lib/jsonstream'; import Bluebird from 'bluebird'; import { writev, promises as fsPromises, createReadStream } from 'graceful-fs'; import { pipeline, Stream } from 'stream'; diff --git a/lib/jsonstream/index.js b/src/lib/jsonstream/index.ts similarity index 96% rename from lib/jsonstream/index.js rename to src/lib/jsonstream/index.ts index 7a6d26bd..8c6e9375 100644 --- a/lib/jsonstream/index.js +++ b/src/lib/jsonstream/index.ts @@ -1,7 +1,5 @@ -'use strict'; - -const through2 = require('through2'); -const Parser = require('jsonparse'); +import through2 from 'through2'; +import Parser from 'jsonparse'; /** * Check whether a x and y are equal, or x matches y, or x(y) is truthy. @@ -29,7 +27,7 @@ const check = (x, y) => { return false; }; -module.exports.parse = function(path, map) { +export function parse(path, map = null) { let header, footer; const parser = new Parser(); From fa1eb2a5b4e5e7c1514ae8cb422b532d7176c98d Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Wed, 10 Aug 2022 19:30:23 +0900 Subject: [PATCH 28/32] fix lint --- src/lib/jsonstream/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/jsonstream/index.ts b/src/lib/jsonstream/index.ts index 8c6e9375..c6cd596a 100644 --- a/src/lib/jsonstream/index.ts +++ b/src/lib/jsonstream/index.ts @@ -197,4 +197,4 @@ export function parse(path, map = null) { footer[key] = value; } } -}; +} From 984b4c5b2b1e00ad2b8c18ba26042fd954137ae7 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Thu, 11 Aug 2022 15:35:23 +0900 Subject: [PATCH 29/32] Update src/database.ts Co-authored-by: Sukka --- src/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/database.ts b/src/database.ts index d6b395ee..6e4edf80 100644 --- a/src/database.ts +++ b/src/database.ts @@ -69,12 +69,12 @@ async function exportAsync(database: Database, path: string) { } } -type DatabaseOptions = { +interface DatabaseOptions { version: number, path: string, onUpgrade: (...args: any[]) => any, onDowngrade: (...args: any[]) => any -}; +} class Database { options: DatabaseOptions; From 76599f21a7d7b2cadfc434ec1d4e22d2c04aa849 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Thu, 11 Aug 2022 15:55:36 +0900 Subject: [PATCH 30/32] chore(deps): add `@types/through2` --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 4b135308..e8a298df 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "author": "Tommy Chen (http://zespia.tw)", "license": "MIT", "dependencies": { + "@types/through2": "^2.0.36", "bluebird": "^3.7.2", "cuid": "^2.1.8", "graceful-fs": "^4.2.10", From e5f66c523456e806631d5e3e6f1a323ab1ecf77a Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Fri, 12 Aug 2022 11:59:48 +0900 Subject: [PATCH 31/32] chore: add ts-ignore --- src/lib/jsonstream/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/jsonstream/index.ts b/src/lib/jsonstream/index.ts index c6cd596a..e028660b 100644 --- a/src/lib/jsonstream/index.ts +++ b/src/lib/jsonstream/index.ts @@ -48,6 +48,7 @@ export function parse(path, map = null) { } if (parser.tState !== Parser.C.START || parser.stack.length > 0) { + // @ts-ignore cb(new Error('Incomplete JSON')); return; } @@ -78,6 +79,7 @@ export function parse(path, map = null) { } parser.onValue = function(value) { + // @ts-ignore if (!this.root) { stream.root = value; } if (!path) return; @@ -167,9 +169,12 @@ export function parse(path, map = null) { parser.onToken = function(token, value) { parser._onToken(token, value); if (this.stack.length === 0) { + // @ts-ignore if (stream.root) { + // @ts-ignore if (!path) { stream.push(stream.root); } + // @ts-ignore stream.root = null; } } From 0e231087205184a0dc047eba0476b7e7d50b6337 Mon Sep 17 00:00:00 2001 From: yoshinorin Date: Fri, 12 Aug 2022 12:03:03 +0900 Subject: [PATCH 32/32] chore: allow ts-ignore --- .eslintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.json b/.eslintrc.json index 31b0678d..4d4b2f52 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,6 +9,7 @@ "@typescript-eslint/no-unused-vars": 0, "@typescript-eslint/no-explicit-any": 0, "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-comment": 0, "no-use-before-define": 0 } } \ No newline at end of file