init
This commit is contained in:
commit
c30b36b3f6
32
.editorconfig
Normal file
32
.editorconfig
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
; http://editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.txt]
|
||||||
|
insert_final_newline = false
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[*.py]
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.m]
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 8
|
||||||
|
|
||||||
|
[*.{js,json,ts}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
72
.eslintrc.json
Normal file
72
.eslintrc.json
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2020,
|
||||||
|
"sourceType": "module",
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"jsx": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": true,
|
||||||
|
"es2020": true,
|
||||||
|
"mocha": true
|
||||||
|
},
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"extends": ["eslint:recommended"],
|
||||||
|
"rules": {
|
||||||
|
"no-console": 2,
|
||||||
|
"no-with": 2,
|
||||||
|
"brace-style": [
|
||||||
|
2,
|
||||||
|
"1tbs",
|
||||||
|
{
|
||||||
|
"allowSingleLine": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-mixed-spaces-and-tabs": 2,
|
||||||
|
"one-var": [
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"uninitialized": "always",
|
||||||
|
"initialized": "never"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quote-props": [2, "as-needed"],
|
||||||
|
"key-spacing": [
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"beforeColon": false,
|
||||||
|
"afterColon": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"space-unary-ops": [
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"nonwords": false,
|
||||||
|
"overrides": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"space-before-function-paren": [2, "never"],
|
||||||
|
"space-in-parens": [2, "never"],
|
||||||
|
"no-trailing-spaces": 2,
|
||||||
|
"max-len": [2, 160],
|
||||||
|
"camelcase": 0,
|
||||||
|
"curly": [2, "all"],
|
||||||
|
"keyword-spacing": [2, {}],
|
||||||
|
"spaced-comment": [2, "always"],
|
||||||
|
"space-infix-ops": 2,
|
||||||
|
"space-before-blocks": [2, "always"],
|
||||||
|
"comma-dangle": 0,
|
||||||
|
"no-else-return": 0,
|
||||||
|
"indent": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"SwitchCase": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"linebreak-style": [2, "unix"],
|
||||||
|
"quotes": [2, "single"]
|
||||||
|
}
|
||||||
|
}
|
182
.gitignore
vendored
Normal file
182
.gitignore
vendored
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Archives template
|
||||||
|
# It's better to unpack these files and commit the raw source because
|
||||||
|
# git has its own built in compression methods.
|
||||||
|
*.7z
|
||||||
|
*.jar
|
||||||
|
*.rar
|
||||||
|
*.zip
|
||||||
|
*.gz
|
||||||
|
*.bzip
|
||||||
|
*.bz2
|
||||||
|
*.xz
|
||||||
|
*.lzma
|
||||||
|
*.cab
|
||||||
|
|
||||||
|
#packing-only formats
|
||||||
|
*.iso
|
||||||
|
*.tar
|
||||||
|
|
||||||
|
#package management formats
|
||||||
|
*.dmg
|
||||||
|
*.xpi
|
||||||
|
*.gem
|
||||||
|
*.egg
|
||||||
|
*.deb
|
||||||
|
*.rpm
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
### Windows template
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
### OSX template
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
## Directory-based project format:
|
||||||
|
.idea/
|
||||||
|
# if you remove the above rule, at least ignore the following:
|
||||||
|
|
||||||
|
# User-specific stuff:
|
||||||
|
# .idea/workspace.xml
|
||||||
|
# .idea/tasks.xml
|
||||||
|
# .idea/dictionaries
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
# .idea/dataSources.ids
|
||||||
|
# .idea/dataSources.xml
|
||||||
|
# .idea/sqlDataSources.xml
|
||||||
|
# .idea/dynamic.xml
|
||||||
|
# .idea/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
# .idea/gradle.xml
|
||||||
|
# .idea/libraries
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
# .idea/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
### Node template
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directory
|
||||||
|
# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
|
||||||
|
node_modules
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
### VisualStudioCode template
|
||||||
|
.settings
|
||||||
|
|
||||||
|
### Xcode template
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
||||||
|
|
||||||
|
## Build generated
|
||||||
|
build/
|
||||||
|
DerivedData
|
||||||
|
|
||||||
|
## Various settings
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
|
||||||
|
## Other
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
*.xcuserstate
|
||||||
|
|
||||||
|
dist
|
||||||
|
.nyc_output
|
||||||
|
.prettierc
|
6
.prettierrc
Normal file
6
.prettierrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"singleQuote": true,
|
||||||
|
"printWidth": 120
|
||||||
|
}
|
6468
package-lock.json
generated
Normal file
6468
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
57
package.json
Normal file
57
package.json
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"name": "@rakh/utils",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"main": "dist/commonjs/index.js",
|
||||||
|
"module": "dist/es/index.js",
|
||||||
|
"jsnext:main": "dist/es/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"release": "vik patch -t",
|
||||||
|
"clean": "rm -rf dist",
|
||||||
|
"prepublish": "npm run clean && npm run compile",
|
||||||
|
"test": "jest --coverage && npm run compile",
|
||||||
|
"compile:es": "tsc --declaration true --declarationMap true --module esnext --outDir './dist/es'",
|
||||||
|
"compile:commonjs": "tsc --declaration true --declarationMap true --module commonjs --outDir './dist/commonjs'",
|
||||||
|
"compile": "npm run clean && npm run compile:es && npm run compile:commonjs"
|
||||||
|
},
|
||||||
|
"author": "Martin Donnelly",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"save": "^2.4.0",
|
||||||
|
"typedoc": "^0.19.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "^26.0.15",
|
||||||
|
"@types/sinon": "^9.0.8",
|
||||||
|
"jest": "^26.6.3",
|
||||||
|
"marked": "^1.2.4",
|
||||||
|
"prettier": "^2.1.2",
|
||||||
|
"sinon": "^9.2.1",
|
||||||
|
"ts-jest": "^26.4.4",
|
||||||
|
"ts-node": "^9.0.0",
|
||||||
|
"typescript": "^4.0.5",
|
||||||
|
"vik": "^0.4.0"
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"jest": {
|
||||||
|
"transform": {
|
||||||
|
"^.+\\.tsx?$": "ts-jest"
|
||||||
|
},
|
||||||
|
"testRegex": "/ts-src/.*.test.(jsx?|tsx?)$",
|
||||||
|
"testPathIgnorePatterns": [
|
||||||
|
"/node_modules/",
|
||||||
|
"/dist/"
|
||||||
|
],
|
||||||
|
"collectCoverageFrom": [
|
||||||
|
"ts-src/**/*.tsx",
|
||||||
|
"ts-src/**/*.ts"
|
||||||
|
],
|
||||||
|
"moduleFileExtensions": [
|
||||||
|
"ts",
|
||||||
|
"tsx",
|
||||||
|
"js",
|
||||||
|
"jsx",
|
||||||
|
"json",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
31
rollup.config.js
Normal file
31
rollup.config.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Created by WebStorm.
|
||||||
|
* User: martin
|
||||||
|
* Date: 01/06/2020
|
||||||
|
* Time: 15:04
|
||||||
|
|
||||||
|
*/
|
||||||
|
import pkg from './package.json';
|
||||||
|
import resolve from "@rollup/plugin-node-resolve";
|
||||||
|
import commonjs from "@rollup/plugin-commonjs";
|
||||||
|
import {terser} from "rollup-plugin-terser";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
input: 'src/index.js',
|
||||||
|
output: [{
|
||||||
|
file: pkg.main,
|
||||||
|
format: 'cjs',
|
||||||
|
name: pkg.name
|
||||||
|
},{
|
||||||
|
file: pkg.module,
|
||||||
|
format: 'es',
|
||||||
|
name: pkg.name
|
||||||
|
}],
|
||||||
|
plugins:[resolve(), commonjs()
|
||||||
|
,terser()
|
||||||
|
],
|
||||||
|
external:[
|
||||||
|
...Object.keys(pkg.dependencies || {}),
|
||||||
|
...Object.keys(pkg.peerDependencies || {}),
|
||||||
|
]
|
||||||
|
};
|
2
scripts/build.sh
Executable file
2
scripts/build.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
tsc --declaration true --declarationMap true --module esnext --outDir '../dist/es'
|
||||||
|
tsc --declaration true --declarationMap true --module commonjs --outDir '../dist/commonjs'
|
12
scripts/create-index.js
Normal file
12
scripts/create-index.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const content = fs
|
||||||
|
.readdirSync(path.join(__dirname, '../ts-src'))
|
||||||
|
.filter((name) => name.endsWith('.ts') && !name.includes('test.ts') && !name.startsWith('_'))
|
||||||
|
.map((name) => name.replace('.ts', ''))
|
||||||
|
.filter((name) => name !== 'index')
|
||||||
|
.map((name) => `export * from './${name}';`)
|
||||||
|
.join('\n');
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(__dirname, '../ts-src/index.ts'), content);
|
364
scripts/def.json
Normal file
364
scripts/def.json
Normal file
@ -0,0 +1,364 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "arrayFromObj",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Create an array from an Object using specified fields</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.arrayFromObj({ a: 1, b: 2 }, ['a', 'b']) // => [1, 2]\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "jsonObj",
|
||||||
|
"description": "The Original object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "wantedFields",
|
||||||
|
"description": "The required fields\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "Array",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "debounce",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Debounce the calling of a function</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.debounce(fn, time)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "fn",
|
||||||
|
"description": "The function to be debounced"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "time",
|
||||||
|
"description": "How long to wait"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "Object",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "distance",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Calculate the distance between two lat long points</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.distance(lat1, long1, lat2, long2)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "distance(1, 1, 2, 2) // => 157.22543203805722;\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "lat1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lon1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lat2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lon2",
|
||||||
|
"description": "\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "number",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.distance(latLong1, latLong2)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "const a: U.LatLong = new LatLong(1, 1)\nconst b: U.LatLong = new LatLong(2, 2)\nU.distance(a, b) // => 157.22543203805722\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "latLong1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "latLong2",
|
||||||
|
"description": "\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "number",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "extractFromObj",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Extract an object from another object using specific fields</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.extractFromObj(jsonObj, wantedFields)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.extractFromObj({ a: 1, b: 2 }, ['a']) // => { a: 1 }\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "jsonObj",
|
||||||
|
"description": "The source object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "wantedFields",
|
||||||
|
"description": "The required fields"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "Object",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hasOwn",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Check if an object has an property</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.hasOwn({ bob: '1' }, 'bob') // => true\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "obj",
|
||||||
|
"description": "The source object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "prop",
|
||||||
|
"description": "The required property"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "boolean",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "hourFloor",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Get the hour floor as a Base 32 string</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.hourFloor(1605532173) // => '1fnp540'\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "timestamp",
|
||||||
|
"description": "The timestamp as a number"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "string",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "isEmpty",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Check if an object is empty</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.isEmpty({}) // => true\nU.isEmpty({ bob: true }) // => false\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "obj",
|
||||||
|
"description": "The object being checked\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "boolean",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "maybePluralize",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Maybe pluralize a count:</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.maybePluralize(number, noun, suffix)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.maybePluralize(1, 'Bag', 's') // => 1 Bag\nU.maybePluralize(5, 'Bag', 's') // => 5 Bags\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "count",
|
||||||
|
"description": "the value counting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "noun",
|
||||||
|
"description": "the name of the value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "suffix",
|
||||||
|
"description": "the suffix"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "string",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "once",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Trigger a function once and then prevent it from triggering again</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.once(fn)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "fn",
|
||||||
|
"description": "\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "Object",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "partOfDay",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Get a string phrase for the current time of day</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.partOfDay(timeString, today)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.partOfDay('13:00') // => 'Afternoon'\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "timeString"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "today",
|
||||||
|
"description": "\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "string",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "throttle",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Throttle the calling of a function</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.throttle(callback, limit)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "callback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "limit",
|
||||||
|
"description": "\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "Object",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "toHour",
|
||||||
|
"category": "",
|
||||||
|
"description": "<p>Return the number of Milliseconds to the hour for the supplied timestamp</p>\n",
|
||||||
|
"methods": [
|
||||||
|
{
|
||||||
|
"tag": null,
|
||||||
|
"signature": "U.toHour(currentTimsestamp, extra)\n",
|
||||||
|
"category": "",
|
||||||
|
"indexed": false,
|
||||||
|
"pipeable": false,
|
||||||
|
"example": "U.toHour('13:00') // => 1605532173\n",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "currentTimsestamp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "extra"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"returns": {
|
||||||
|
"name": "number",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
119
scripts/generate.ts
Normal file
119
scripts/generate.ts
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
import * as fs from 'fs';
|
||||||
|
import marked from 'marked';
|
||||||
|
import prettier from 'prettier';
|
||||||
|
|
||||||
|
import data from '../out.json';
|
||||||
|
|
||||||
|
export interface MethodDoc {
|
||||||
|
tag: string;
|
||||||
|
signature: string;
|
||||||
|
example: string;
|
||||||
|
args: JsTagProps[];
|
||||||
|
returns: JsTagProps;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FnDocProps {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
category: string;
|
||||||
|
methods: MethodDoc[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface JsTagProps {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getReturnType(signature) {
|
||||||
|
const type = signature.type.type;
|
||||||
|
if (type === 'intrinsic') {
|
||||||
|
return signature.type.name;
|
||||||
|
}
|
||||||
|
if (type === 'array') {
|
||||||
|
return 'Array';
|
||||||
|
}
|
||||||
|
return 'Object';
|
||||||
|
}
|
||||||
|
|
||||||
|
const ret = data.children
|
||||||
|
.map((method: any) => {
|
||||||
|
const target =
|
||||||
|
method.children &&
|
||||||
|
method.children.filter(
|
||||||
|
(item: any) =>
|
||||||
|
(item.kindString === 'Function' || item.kindString === 'Module') &&
|
||||||
|
item.signatures &&
|
||||||
|
item.flags.isExported
|
||||||
|
)[0];
|
||||||
|
if (!target) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('processing', target.name);
|
||||||
|
const signatures = target.signatures.filter(s => s.comment);
|
||||||
|
if (!signatures.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const comment = signatures[0].comment;
|
||||||
|
return {
|
||||||
|
name: target.name,
|
||||||
|
category: '',
|
||||||
|
description: marked(
|
||||||
|
(comment.shortText + '\n' + (comment.text || '')).trim(),
|
||||||
|
{ breaks: true }
|
||||||
|
),
|
||||||
|
methods: signatures.map(signature => {
|
||||||
|
const tags = signature.comment.tags || target.comment.tags || [];
|
||||||
|
const isDataFirst = tags.find(item => item.tag === 'data_first');
|
||||||
|
const isDataLast = tags.find(item => item.tag === 'data_last');
|
||||||
|
const getTag = name =>
|
||||||
|
tags
|
||||||
|
.filter(item => item.tag === name)
|
||||||
|
.map(item => item.text.trim())
|
||||||
|
.join('\n');
|
||||||
|
const hasTag = name => !!tags.find(item => item.tag === name);
|
||||||
|
function getExample() {
|
||||||
|
let str = getTag('example');
|
||||||
|
if (str) {
|
||||||
|
return prettier.format(str, {
|
||||||
|
semi: false,
|
||||||
|
singleQuote: true,
|
||||||
|
parser: 'typescript',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
str = getTag('example-raw');
|
||||||
|
return str
|
||||||
|
.split('\n')
|
||||||
|
.map(str => str.replace(/^ /, ''))
|
||||||
|
.join('\n');
|
||||||
|
}
|
||||||
|
const parameters = signature.parameters || [];
|
||||||
|
return {
|
||||||
|
tag: isDataFirst ? 'Data First' : isDataLast ? 'Data Last' : null,
|
||||||
|
signature: prettier.format(getTag('signature'), {
|
||||||
|
semi: false,
|
||||||
|
singleQuote: true,
|
||||||
|
parser: 'typescript',
|
||||||
|
}),
|
||||||
|
category: getTag('category'),
|
||||||
|
indexed: hasTag('indexed'),
|
||||||
|
pipeable: hasTag('pipeable'),
|
||||||
|
example: getExample(),
|
||||||
|
args: parameters.map((item: any) => ({
|
||||||
|
name: item.name,
|
||||||
|
description: item.comment && item.comment.text,
|
||||||
|
})),
|
||||||
|
returns: {
|
||||||
|
name: getReturnType(signature),
|
||||||
|
description: getTag('returns'),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.filter(item => item)
|
||||||
|
.map(item => {
|
||||||
|
item.category = item.methods[0].category;
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync('./def.json', JSON.stringify(ret, null, 2));
|
7
scripts/readme.js
Normal file
7
scripts/readme.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const marked = require('marked');
|
||||||
|
|
||||||
|
const md = fs.readFileSync(path.join(__dirname, '../README.md'), 'utf8');
|
||||||
|
|
||||||
|
console.log(marked(md));
|
66
scripts/tsconfig.json
Normal file
66
scripts/tsconfig.json
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
|
||||||
|
|
||||||
|
/* Basic Options */
|
||||||
|
"target":
|
||||||
|
"es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
|
||||||
|
"module":
|
||||||
|
"commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
|
||||||
|
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"lib": [
|
||||||
|
"es6",
|
||||||
|
"es2017.object"
|
||||||
|
] /* Specify library files to be included in the compilation. */,
|
||||||
|
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||||
|
// "checkJs": true, /* Report errors in .js files. */
|
||||||
|
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||||
|
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||||
|
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||||
|
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||||
|
// "outDir": "./", /* Redirect output structure to the directory. */
|
||||||
|
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||||
|
// "removeComments": true, /* Do not emit comments to output. */
|
||||||
|
// "noEmit": true, /* Do not emit outputs. */
|
||||||
|
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||||
|
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||||
|
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||||
|
|
||||||
|
/* Strict Type-Checking Options */
|
||||||
|
"strict": true /* Enable all strict type-checking options. */,
|
||||||
|
"noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */,
|
||||||
|
"strictNullChecks": false /* Enable strict null checks. */,
|
||||||
|
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||||
|
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||||
|
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||||
|
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||||
|
|
||||||
|
/* Additional Checks */
|
||||||
|
"noUnusedLocals": true /* Report errors on unused locals. */,
|
||||||
|
"noUnusedParameters": true /* Report errors on unused parameters. */,
|
||||||
|
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||||
|
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
|
||||||
|
|
||||||
|
/* Module Resolution Options */
|
||||||
|
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||||
|
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||||
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
|
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||||
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
|
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||||
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||||
|
|
||||||
|
/* Source Map Options */
|
||||||
|
// "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||||
|
// "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||||
|
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||||
|
|
||||||
|
/* Experimental Options */
|
||||||
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||||
|
}
|
||||||
|
}
|
54
src/LocalStorage.js
Normal file
54
src/LocalStorage.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Created by WebStorm.
|
||||||
|
* User: martin
|
||||||
|
* Date: 01/06/2020
|
||||||
|
* Time: 14:23
|
||||||
|
|
||||||
|
*/
|
||||||
|
function supportsLocalStorage() {
|
||||||
|
try {
|
||||||
|
if (!localStorage)return false;
|
||||||
|
else return true;
|
||||||
|
// May only need the above simple test
|
||||||
|
// - old versions of firefox may cause problem?
|
||||||
|
// return 'localStorage' in window && window['localStorage']!==null;
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let LocalStorage = {};
|
||||||
|
|
||||||
|
if (supportsLocalStorage())
|
||||||
|
LocalStorage = {
|
||||||
|
'set':function ( i, v ) {
|
||||||
|
if (typeof v === 'object' || typeof v === 'array')
|
||||||
|
localStorage[i] = JSON.stringify(v);
|
||||||
|
else
|
||||||
|
localStorage[i] = v;
|
||||||
|
},
|
||||||
|
'get':function ( i ) {
|
||||||
|
return localStorage[i];
|
||||||
|
},
|
||||||
|
'exists':function(i) {
|
||||||
|
return !(typeof(localStorage[i]) === 'undefined');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
else
|
||||||
|
LocalStorage = {
|
||||||
|
'save':function ( i, v ) {
|
||||||
|
document.cookie = `${i }=${ encodeURIComponent(v)}`;
|
||||||
|
},
|
||||||
|
'load':function ( i ) {
|
||||||
|
var s = `; ${ document.cookie };`,
|
||||||
|
p = s.indexOf(`; ${ i }=`);
|
||||||
|
if (p < 0)return '';
|
||||||
|
p = p + i.length + 3;
|
||||||
|
var p2 = s.indexOf(';', p + 1);
|
||||||
|
|
||||||
|
return decodeURIComponent(s.substring(p, p2));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = LocalStorage;
|
82
src/general/array.js
Normal file
82
src/general/array.js
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Array = (_global.Array = _global.Array || {});
|
||||||
|
|
||||||
|
if (typeof Array.prototype.indexOf === "undefined") {
|
||||||
|
Array.prototype.indexOf = function(obj, start) {
|
||||||
|
for (var i = start || 0, j = this.length; i < j; i++) {
|
||||||
|
if (this[i] === obj) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof Array.prototype.indexOfObject === "undefined") {
|
||||||
|
Array.prototype.indexOfObject = function(obj) {
|
||||||
|
var isObject = typeof obj === "object";
|
||||||
|
if (!isObject) {
|
||||||
|
return this.indexOf(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var index = 0; index < this.length; index++) {
|
||||||
|
var valid = true;
|
||||||
|
var _obj = this[index];
|
||||||
|
|
||||||
|
for (var key in obj) {
|
||||||
|
var value = obj[key];
|
||||||
|
var _value = _obj[key];
|
||||||
|
if (value === _value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
valid = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof Array.prototype.isIn === "undefined") {
|
||||||
|
Array.prototype.isIn = function(obj) {
|
||||||
|
return this.indexOf(obj) !== -1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Array: Array
|
||||||
|
};
|
||||||
|
}
|
186
src/general/browser.js
Normal file
186
src/general/browser.js
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var BrowserDetect = (_global.BrowserDetect = _global.BrowserDetect || {});
|
||||||
|
var navigator = (_global.navigator = _global.navigator || {});
|
||||||
|
var frame = _global;
|
||||||
|
|
||||||
|
BrowserDetect = function() {
|
||||||
|
BrowserDetect.browser =
|
||||||
|
BrowserDetect.searchString(BrowserDetect.DATA_BROWSER) || "Unknown browser";
|
||||||
|
BrowserDetect.version =
|
||||||
|
BrowserDetect.searchVersion(navigator.userAgent) ||
|
||||||
|
BrowserDetect.searchVersion(navigator.appVersion) ||
|
||||||
|
"Unknown version";
|
||||||
|
BrowserDetect.os = BrowserDetect.searchString(BrowserDetect.DATA_OS) || "Unknown OS";
|
||||||
|
};
|
||||||
|
|
||||||
|
BrowserDetect.searchString = function(data) {
|
||||||
|
for (var index = 0; index < data.length; index++) {
|
||||||
|
var dataString = data[index].string;
|
||||||
|
var dataProp = data[index].prop;
|
||||||
|
BrowserDetect.versionSearchString = data[index].versionSearch || data[index].identity;
|
||||||
|
if (dataString) {
|
||||||
|
if (dataString.indexOf(data[index].subString) !== -1) {
|
||||||
|
return data[index].identity;
|
||||||
|
}
|
||||||
|
} else if (dataProp) {
|
||||||
|
return data[index].identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BrowserDetect.searchVersion = function(dataString) {
|
||||||
|
// in case the provided data string is not a valid one
|
||||||
|
// returns an invalid value immediately
|
||||||
|
if (!dataString) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// tries to search for the version search string
|
||||||
|
var index = dataString.indexOf(BrowserDetect.versionSearchString);
|
||||||
|
|
||||||
|
// in case the version search string is not found
|
||||||
|
// returns immediately, no version could be detected
|
||||||
|
if (index === -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the float version of the discovered number
|
||||||
|
// string in the "middle" of the data string
|
||||||
|
return parseFloat(dataString.substring(index + BrowserDetect.versionSearchString.length + 1));
|
||||||
|
};
|
||||||
|
|
||||||
|
BrowserDetect.DATA_BROWSER = [
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Edge",
|
||||||
|
subString: "Edge",
|
||||||
|
versionSearch: "Edge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Chrome",
|
||||||
|
subString: "Chrome"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "OmniWeb",
|
||||||
|
subString: "OmniWeb",
|
||||||
|
versionSearch: "OmniWeb/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.vendor,
|
||||||
|
identity: "Safari",
|
||||||
|
subString: "Apple",
|
||||||
|
versionSearch: "Version"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: frame.opera,
|
||||||
|
identity: "Opera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.vendor,
|
||||||
|
identity: "iCab",
|
||||||
|
subString: "iCab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.vendor,
|
||||||
|
identity: "Konqueror",
|
||||||
|
subString: "KDE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Firefox",
|
||||||
|
subString: "Firefox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.vendor,
|
||||||
|
identity: "Camino",
|
||||||
|
subString: "Camino"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Netscape",
|
||||||
|
subString: "Netscape"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Explorer",
|
||||||
|
subString: "MSIE",
|
||||||
|
versionSearch: "MSIE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Explorer",
|
||||||
|
subString: "Trident",
|
||||||
|
versionSearch: "rv"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Mozilla",
|
||||||
|
subString: "Gecko",
|
||||||
|
versionSearch: "rv"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "Netscape",
|
||||||
|
subString: "Mozilla",
|
||||||
|
versionSearch: "Mozilla"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
BrowserDetect.DATA_OS = [
|
||||||
|
{
|
||||||
|
string: navigator.platform,
|
||||||
|
identity: "Windows",
|
||||||
|
subString: "Win"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.platform,
|
||||||
|
identity: "Mac",
|
||||||
|
subString: "Mac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.userAgent,
|
||||||
|
identity: "iPhone/iPod",
|
||||||
|
subString: "iPhone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
string: navigator.platform,
|
||||||
|
identity: "Linux",
|
||||||
|
subString: "Linux"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// initializes the browser detection system
|
||||||
|
BrowserDetect();
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
BrowserDetect: BrowserDetect
|
||||||
|
};
|
||||||
|
}
|
63
src/general/class_reference.js
Normal file
63
src/general/class_reference.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var ClassReference = (_global.ClassReference = _global.ClassReference || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the class reference correspondent to the provided class name.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* className Name of the class.
|
||||||
|
* @return {Class} Class reference.
|
||||||
|
*/
|
||||||
|
ClassReference.getClassReference = function(className) {
|
||||||
|
// splits the class name
|
||||||
|
var nameTokens = className.split(".");
|
||||||
|
|
||||||
|
// retrieves the initial reference (the window)
|
||||||
|
var reference = window;
|
||||||
|
|
||||||
|
// starts the token value
|
||||||
|
var tokenValue = null;
|
||||||
|
|
||||||
|
// iterates over the tokens lenght
|
||||||
|
for (var offset = 0; offset < nameTokens.length; offset++) {
|
||||||
|
// retrieves the current token value
|
||||||
|
tokenValue = nameTokens[offset];
|
||||||
|
|
||||||
|
// updates the current reference
|
||||||
|
reference = reference[tokenValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the reference
|
||||||
|
return reference;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
ClassReference: ClassReference
|
||||||
|
};
|
||||||
|
}
|
213
src/general/cookie.js
Normal file
213
src/general/cookie.js
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Cookie = (_global._Cookie = _global.Cookie || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*/
|
||||||
|
Cookie = function(name) {
|
||||||
|
this.name = name || null;
|
||||||
|
this.value = null;
|
||||||
|
this.timeoutTime = null;
|
||||||
|
this.secure = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the cookie serializing it into the browser native form.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.save = function() {
|
||||||
|
// retrieves the cookie attributes
|
||||||
|
var cookieName = this.name;
|
||||||
|
var cookieValue = this.value;
|
||||||
|
var cookieTimeoutTime = this.timeoutTime;
|
||||||
|
var cookieDomain = this.secure;
|
||||||
|
var cookieSecure = this.secure;
|
||||||
|
|
||||||
|
// creates the cookie final value
|
||||||
|
var cookieFinalValue =
|
||||||
|
cookieName +
|
||||||
|
"=" +
|
||||||
|
escape(cookieValue) +
|
||||||
|
(cookieTimeoutTime ? ";expires=" + new Date(cookieTimeoutTime * 1000).toUTCString() : "") +
|
||||||
|
(cookieDomain ? ";domain=" + cookieDomain : "") +
|
||||||
|
(cookieSecure ? ";secure" : "");
|
||||||
|
|
||||||
|
// sets the cookie final value in the document
|
||||||
|
document.cookie = cookieFinalValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the current cookie from the cookie storage, using the cookie name as
|
||||||
|
* reference for the loading process.
|
||||||
|
*
|
||||||
|
* @param {String} cookie If provided overrides the default provider of the
|
||||||
|
* cookie (from the document).
|
||||||
|
* @return {Boolean} The result of the loading.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.load = function(cookie) {
|
||||||
|
// tries to retrieve the default cookie string value
|
||||||
|
// that is going to be parsed
|
||||||
|
cookie = cookie || document.cookie;
|
||||||
|
|
||||||
|
// retrieves the cookies list, by splitting the
|
||||||
|
// list arround the typical character
|
||||||
|
var cookiesList = cookie.split(";");
|
||||||
|
|
||||||
|
// sets the cookie found flag
|
||||||
|
var cookieFound = false;
|
||||||
|
|
||||||
|
// iterates over all the cookies in the list of
|
||||||
|
// cookies retrieves from the string
|
||||||
|
for (var index = 0; index < cookiesList.length; index++) {
|
||||||
|
// retrives the reference to the current value
|
||||||
|
// (cookie) in iteration
|
||||||
|
var value = cookiesList[index];
|
||||||
|
|
||||||
|
// splits the cookie value to get the name and the value
|
||||||
|
var cookieSplitted = value.split("=");
|
||||||
|
|
||||||
|
// tims left/right whitespace in the cookie name
|
||||||
|
var cookieName = cookieSplitted[0].replace(/^\s+|\s+$/g, "");
|
||||||
|
|
||||||
|
// in case it's the same cookie name
|
||||||
|
if (cookieName === this.name) {
|
||||||
|
// sets the cookie found flag
|
||||||
|
cookieFound = true;
|
||||||
|
|
||||||
|
// in case there is a valid cookie value
|
||||||
|
if (cookieSplitted.length > 1) {
|
||||||
|
this.value = unescape(cookieSplitted[1].replace(/^\s+|\s+$/g, ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
// breaks the current loop
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cookieFound;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the name.
|
||||||
|
*
|
||||||
|
* @return {String} The name.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.getName = function() {
|
||||||
|
return this.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the name.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* name The name.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.setName = function(name) {
|
||||||
|
this.name = name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the value.
|
||||||
|
*
|
||||||
|
* @return {String} The value.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.getValue = function() {
|
||||||
|
return this.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* value The value.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.setValue = function(value) {
|
||||||
|
this.value = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the timeout time.
|
||||||
|
*
|
||||||
|
* @return {Date} The timeout time.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.getTimeoutTime = function() {
|
||||||
|
return this.timeoutTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the timeout time.
|
||||||
|
*
|
||||||
|
* @param {Date}
|
||||||
|
* timeoutTime The timeout time.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.setTimeoutTime = function(timeoutTime) {
|
||||||
|
this.timeoutTime = timeoutTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the domain.
|
||||||
|
*
|
||||||
|
* @return {String} The domain.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.getDomain = function() {
|
||||||
|
return this.domain;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the domain.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* domain The domain.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.setDomain = function(domain) {
|
||||||
|
this.domain = domain;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the secure.
|
||||||
|
*
|
||||||
|
* @return {String} The secure.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.getSecure = function() {
|
||||||
|
return this.secure;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the secure.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* secure The secure.
|
||||||
|
*/
|
||||||
|
Cookie.prototype.setSecure = function(secure) {
|
||||||
|
this.secure = secure;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Cookie: Cookie
|
||||||
|
};
|
||||||
|
}
|
136
src/general/date.js
Normal file
136
src/general/date.js
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Date = (_global.Date = _global.Date || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the given date string (without utc offset) retrieving an utc timestamp
|
||||||
|
* representing the given date.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* dateString The date string (without utc offset) to be parsed for
|
||||||
|
* retrieval of the timestamp.
|
||||||
|
* @return {Integer} The integer representing the utc timestamp in miliseconds.
|
||||||
|
*/
|
||||||
|
Date.parseUtc = function(dateString) {
|
||||||
|
// creats a new date object
|
||||||
|
var date = new Date(dateString);
|
||||||
|
|
||||||
|
// retrieves the time zone name from the date time zone structure
|
||||||
|
var dateTimeZoneStructure = date.getTimeZoneStructure();
|
||||||
|
var timeZoneName = dateTimeZoneStructure.time_zone_name;
|
||||||
|
|
||||||
|
// creates the date string from the date string and the time zone name
|
||||||
|
// or it uses the new date
|
||||||
|
dateString = dateString ? dateString + " " + timeZoneName : date;
|
||||||
|
|
||||||
|
// parses the date string retrieving the timestamp
|
||||||
|
// (in miliseconds) in utc
|
||||||
|
var timestamp = Date.parse(dateString);
|
||||||
|
|
||||||
|
// returns the timestamp (in utc)
|
||||||
|
return timestamp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the time zone structure for the current default time zone.
|
||||||
|
*
|
||||||
|
* @return {Map} The time zone structure for the current default time zone.
|
||||||
|
*/
|
||||||
|
Date.prototype.getTimeZoneStructure = function() {
|
||||||
|
// creates the index variable that is going to be used
|
||||||
|
// in the internal function iteration cycles
|
||||||
|
var index = 0;
|
||||||
|
|
||||||
|
// retrieves the javascript utc offset
|
||||||
|
var javascriptUtcOffset = this.getTimezoneOffset() * -1;
|
||||||
|
|
||||||
|
// calculates the real utc offset from the javascript one
|
||||||
|
var utcOffset = javascriptUtcOffset * 60;
|
||||||
|
|
||||||
|
// calculates the absolute javascript utc offset
|
||||||
|
var absoluteJavascriptUtcOffset = Math.abs(javascriptUtcOffset);
|
||||||
|
|
||||||
|
// calculates the utc offset in hours
|
||||||
|
var utcOffsetHours = Math.floor(absoluteJavascriptUtcOffset / 60);
|
||||||
|
|
||||||
|
// calculates the utc offset in minutes
|
||||||
|
var utcOffsetMinutes = absoluteJavascriptUtcOffset % 60;
|
||||||
|
|
||||||
|
// converts the utc offset in hours to string
|
||||||
|
var utcOffsetHoursString = utcOffsetHours.toString();
|
||||||
|
|
||||||
|
// converts the utc offset in minutes to string
|
||||||
|
var utcOffsetMinutesString = utcOffsetMinutes.toString();
|
||||||
|
|
||||||
|
// retrieves the utc offset in hours string length
|
||||||
|
var utcOffsetHoursStringLength = utcOffsetHoursString.length;
|
||||||
|
|
||||||
|
// retrieves the utc offset in minutes string length
|
||||||
|
var utcOffsetMinutesStringLength = utcOffsetMinutesString.length;
|
||||||
|
|
||||||
|
// iterates over the remaining digits (while less than two)
|
||||||
|
for (index = utcOffsetHoursStringLength; index < 2; index++) {
|
||||||
|
// prepends a zero to the utc offset in hours string
|
||||||
|
utcOffsetHoursString = "0" + utcOffsetHoursString;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterates over the remaining digits (while less than two)
|
||||||
|
for (index = utcOffsetMinutesStringLength; index < 2; index++) {
|
||||||
|
// prepends a zero to the utc offset in minutes string
|
||||||
|
utcOffsetMinutesString = "0" + utcOffsetMinutesString;
|
||||||
|
}
|
||||||
|
|
||||||
|
// in case the utc offset is greater or equal to zero
|
||||||
|
if (utcOffset >= 0) {
|
||||||
|
// prepends the plus operator to the utc offset in hours string
|
||||||
|
utcOffsetHoursString = "+" + utcOffsetHoursString;
|
||||||
|
} else {
|
||||||
|
// prepends the minus operator to the utc offset in hours string
|
||||||
|
utcOffsetHoursString = "-" + utcOffsetHoursString;
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieves the time zone name
|
||||||
|
var timeZoneName = "GMT" + utcOffsetHoursString + utcOffsetMinutesString;
|
||||||
|
|
||||||
|
// creates the time zone structure
|
||||||
|
var timeZoneStructure = {};
|
||||||
|
|
||||||
|
// sets the utc offset value in the time zone structure
|
||||||
|
timeZoneStructure.utc_offset = utcOffset;
|
||||||
|
|
||||||
|
// sets the time zone name in the time zone structure
|
||||||
|
timeZoneStructure.time_zone_name = timeZoneName;
|
||||||
|
|
||||||
|
// returns the time zone structure
|
||||||
|
return timeZoneStructure;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Date: Date
|
||||||
|
};
|
||||||
|
}
|
25
src/general/index.js
Normal file
25
src/general/index.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const array = require("./array");
|
||||||
|
const browser = require("./browser");
|
||||||
|
const classReference = require("./class_reference");
|
||||||
|
const cookie = require("./cookie");
|
||||||
|
const date = require("./date");
|
||||||
|
const math = require("./math");
|
||||||
|
const mobile = require("./mobile");
|
||||||
|
const namespace = require("./namespace");
|
||||||
|
const number = require("./number");
|
||||||
|
const object = require("./object");
|
||||||
|
const root = require("./root");
|
||||||
|
const stackTrace = require("./stack_trace");
|
||||||
|
|
||||||
|
Object.assign(module.exports, array);
|
||||||
|
Object.assign(module.exports, browser);
|
||||||
|
Object.assign(module.exports, classReference);
|
||||||
|
Object.assign(module.exports, cookie);
|
||||||
|
Object.assign(module.exports, date);
|
||||||
|
Object.assign(module.exports, math);
|
||||||
|
Object.assign(module.exports, mobile);
|
||||||
|
Object.assign(module.exports, namespace);
|
||||||
|
Object.assign(module.exports, number);
|
||||||
|
Object.assign(module.exports, object);
|
||||||
|
Object.assign(module.exports, root);
|
||||||
|
Object.assign(module.exports, stackTrace);
|
39
src/general/math.js
Normal file
39
src/general/math.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Math = (_global.Math = _global.Math || {});
|
||||||
|
|
||||||
|
if (typeof Math.log10 === "undefined") {
|
||||||
|
Math.log10 = function(value) {
|
||||||
|
return Math.log(value) / Math.LN10;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Math: Math
|
||||||
|
};
|
||||||
|
}
|
125
src/general/mobile.js
Normal file
125
src/general/mobile.js
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Mobile = (_global.Mobile = _global.Mobile || {});
|
||||||
|
var document = (_global.document = _global.document || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the mobile touch event propagation structure should performed only under
|
||||||
|
* a previous validation of tag naming.
|
||||||
|
*/
|
||||||
|
Mobile.SAFE = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list containing the various tags that are considered to be valid for the
|
||||||
|
* mouse operation events, this is only used in case the safe mode is enabled.
|
||||||
|
*/
|
||||||
|
Mobile.VALID = ["DIV", "IMG", "SPAN", "CANVAS"];
|
||||||
|
|
||||||
|
Mobile.touchHandler = function(event) {
|
||||||
|
// retrieves the complete set of touches and uses
|
||||||
|
// only the first one for type reference
|
||||||
|
var touches = event.changedTouches;
|
||||||
|
var first = touches[0];
|
||||||
|
var type = "";
|
||||||
|
|
||||||
|
// switches over the type of touch event associating
|
||||||
|
// the proper equivalent mouse enve to each of them
|
||||||
|
switch (event.type) {
|
||||||
|
case "touchstart":
|
||||||
|
type = "mousedown";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "touchmove":
|
||||||
|
type = "mousemove";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "touchend":
|
||||||
|
type = "mouseup";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// verifies if the current event is considered to be valid,
|
||||||
|
// this occurs if the target of the type of the target is
|
||||||
|
// considered to be valid according to the current rules
|
||||||
|
var isValid = Mobile.VALID.indexOf(first.target.tagName) === -1;
|
||||||
|
if (Mobile.SAFE && isValid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates the new mouse event that will emulate the
|
||||||
|
// touch event that has just been raised, it should
|
||||||
|
// be completly equivalent to the original touch
|
||||||
|
var mouseEvent = document.createEvent("MouseEvent");
|
||||||
|
mouseEvent.initMouseEvent(
|
||||||
|
type,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
window,
|
||||||
|
1,
|
||||||
|
first.screenX,
|
||||||
|
first.screenY,
|
||||||
|
first.clientX,
|
||||||
|
first.clientY,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
// dispatches the event to the original target of the
|
||||||
|
// touch event (pure emulation)
|
||||||
|
first.target.dispatchEvent(mouseEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
Mobile.init = function() {
|
||||||
|
// verifies if the event listener adding is suported
|
||||||
|
// for the current environment and in case it's not
|
||||||
|
// returns immediately to avoid errors
|
||||||
|
if (!document.addEventListener) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// registers the complete set of touch event in the
|
||||||
|
// document so that proper emulation is possible
|
||||||
|
document.addEventListener("touchstart", Mobile.touchHandler, true);
|
||||||
|
document.addEventListener("touchmove", Mobile.touchHandler, true);
|
||||||
|
document.addEventListener("touchend", Mobile.touchHandler, true);
|
||||||
|
document.addEventListener("touchcancel", Mobile.touchHandler, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
Mobile.init();
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Mobile: Mobile
|
||||||
|
};
|
||||||
|
}
|
53
src/general/namespace.js
Normal file
53
src/general/namespace.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var String = (_global.String = _global.String || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a namespace using the current string and the given separator value.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* separator The separator value to be used for splitting the
|
||||||
|
* namespace.
|
||||||
|
*/
|
||||||
|
String.prototype.namespace = function(separator) {
|
||||||
|
// splits the value arround the separator
|
||||||
|
var splittedValue = this.split(separator || ".");
|
||||||
|
|
||||||
|
splittedValue.inject(window, function(parent, child) {
|
||||||
|
// sets the object value
|
||||||
|
var object = (parent[child] = parent[child] || {});
|
||||||
|
|
||||||
|
// returns the object
|
||||||
|
return object;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
String: String
|
||||||
|
};
|
||||||
|
}
|
145
src/general/number.js
Normal file
145
src/general/number.js
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Number = (_global.Number = _global.Number || {});
|
||||||
|
|
||||||
|
Number.SYMBOLS = {
|
||||||
|
EUR: ["€", 1],
|
||||||
|
USD: ["$", -1],
|
||||||
|
GBP: ["£", -1],
|
||||||
|
BRL: ["R$", -1],
|
||||||
|
CAD: ["$", -1],
|
||||||
|
AUD: ["$", -1],
|
||||||
|
JPY: ["¥", -1],
|
||||||
|
RUB: ["₽", 1],
|
||||||
|
KRW: ["₩", -1],
|
||||||
|
CHF: ["fr.", 1],
|
||||||
|
SGD: ["$", -1],
|
||||||
|
MXN: ["$", -1],
|
||||||
|
DKK: ["kr.", 1],
|
||||||
|
SEK: ["kr.", 1],
|
||||||
|
PLN: ["zł", 1],
|
||||||
|
TWD: ["NT$", -1]
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.DECIMAL_PLACES = {
|
||||||
|
EUR: 2,
|
||||||
|
USD: 2,
|
||||||
|
GBP: 2,
|
||||||
|
BRL: 2,
|
||||||
|
CAD: 2,
|
||||||
|
AUD: 2,
|
||||||
|
JPY: 0,
|
||||||
|
RUB: 2,
|
||||||
|
KRW: 0,
|
||||||
|
CHF: 2,
|
||||||
|
SGD: 2,
|
||||||
|
MXN: 2,
|
||||||
|
DKK: 2,
|
||||||
|
SEK: 2,
|
||||||
|
PLN: 2,
|
||||||
|
TWD: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.SEPARATOR = {
|
||||||
|
EUR: ",",
|
||||||
|
USD: ".",
|
||||||
|
GBP: ".",
|
||||||
|
BRL: ",",
|
||||||
|
CAD: ".",
|
||||||
|
AUD: ".",
|
||||||
|
JPY: ".",
|
||||||
|
RUB: ",",
|
||||||
|
KRW: ".",
|
||||||
|
CHF: ".",
|
||||||
|
SGD: ".",
|
||||||
|
MXN: ".",
|
||||||
|
DKK: ".",
|
||||||
|
SEK: ",",
|
||||||
|
PLN: "."
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.THOUSANDS = {
|
||||||
|
EUR: " ",
|
||||||
|
USD: ",",
|
||||||
|
GBP: ",",
|
||||||
|
BRL: ".",
|
||||||
|
CAD: ",",
|
||||||
|
AUD: ",",
|
||||||
|
JPY: ",",
|
||||||
|
RUB: " ",
|
||||||
|
KRW: ",",
|
||||||
|
CHF: ",",
|
||||||
|
SGD: ",",
|
||||||
|
MXN: ",",
|
||||||
|
DKK: ",",
|
||||||
|
SEK: ".",
|
||||||
|
PLN: " ",
|
||||||
|
TWD: ","
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.prototype.formatMoney = function(places, separator, thousands, currency, useSymbol) {
|
||||||
|
var number = this;
|
||||||
|
var defaultPlaces = Number.DECIMAL_PLACES[currency];
|
||||||
|
var defaultSeparator = Number.SEPARATOR[currency];
|
||||||
|
var defaultThousands = Number.THOUSANDS[currency];
|
||||||
|
defaultPlaces = defaultPlaces === undefined ? 2 : defaultPlaces;
|
||||||
|
defaultSeparator = defaultSeparator === undefined ? "." : defaultSeparator;
|
||||||
|
defaultThousands = defaultThousands === undefined ? "," : defaultThousands;
|
||||||
|
places = isNaN(parseInt(places)) ? defaultPlaces : places;
|
||||||
|
separator = separator === null || separator === undefined ? defaultSeparator : separator;
|
||||||
|
thousands = thousands === null || thousands === undefined ? defaultThousands : thousands;
|
||||||
|
var signal = number < 0 ? "-" : "";
|
||||||
|
var integer = parseInt(Math.abs(+number || 0).toFixed(places)) + "";
|
||||||
|
var remaining = integer.length;
|
||||||
|
remaining = remaining > 3 ? remaining % 3 : 0;
|
||||||
|
var money = signal;
|
||||||
|
money += remaining ? integer.substr(0, remaining) + thousands : "";
|
||||||
|
money += integer.substr(remaining).replace(/(\d{3})(?=\d)/g, "$1" + thousands);
|
||||||
|
money += places
|
||||||
|
? separator +
|
||||||
|
Math.abs(Math.abs(number) - integer)
|
||||||
|
.toFixed(places)
|
||||||
|
.slice(2)
|
||||||
|
: "";
|
||||||
|
money = currency ? Number._formatCurrency(money, currency, useSymbol) : money;
|
||||||
|
return money;
|
||||||
|
};
|
||||||
|
|
||||||
|
Number._formatCurrency = function(money, currency, useSymbol) {
|
||||||
|
var symbol = useSymbol ? Number.SYMBOLS[currency] : null;
|
||||||
|
symbol = symbol || [currency, 1];
|
||||||
|
var position = symbol[1];
|
||||||
|
symbol = symbol[0];
|
||||||
|
money = position === 1 ? money + " " + symbol : symbol + " " + money;
|
||||||
|
return money;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Number: Number
|
||||||
|
};
|
||||||
|
}
|
182
src/general/object.js
Normal file
182
src/general/object.js
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var _Object = (_global._Object = _global._Object || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves an element from the given object for the given key, in case the
|
||||||
|
* element is not found the default value is returned.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* object The object to be used to retrieve the element.
|
||||||
|
* @param {String}
|
||||||
|
* key The index key to be used in the retrieval.
|
||||||
|
* @param {Object}
|
||||||
|
* defaultValue The default value to be returned in case no element
|
||||||
|
* is found.
|
||||||
|
* @return {Object} The retrieved element.
|
||||||
|
*/
|
||||||
|
_Object.get = function(object, key, defaultValue) {
|
||||||
|
// tries to retrieve the value
|
||||||
|
var value = object[key];
|
||||||
|
|
||||||
|
// returns the valid value
|
||||||
|
return value !== null && value !== undefined ? value : defaultValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new constructor for the given base constructor and base class. The
|
||||||
|
* inheritance process changes the given class prototype references.
|
||||||
|
*
|
||||||
|
* @param {Function}
|
||||||
|
* constructorFunction The base constructor function to be used.
|
||||||
|
* @param {Class}
|
||||||
|
* baseClass The base class to inherit from.
|
||||||
|
* @return {Function} The newly created constructor / class.
|
||||||
|
*/
|
||||||
|
_Object.inherit = function(constructorFunction, baseClass) {
|
||||||
|
var targetClass = function() {
|
||||||
|
// creates the base element
|
||||||
|
// eslint-disable-next-line new-cap
|
||||||
|
this.base = new baseClass();
|
||||||
|
|
||||||
|
// call the constructor function
|
||||||
|
constructorFunction.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
// iterates over all the elements of the base class prototype
|
||||||
|
for (var element in baseClass.prototype) {
|
||||||
|
// creates the current element in the target class
|
||||||
|
this.createElement(targetClass, baseClass, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the target class (constructor)
|
||||||
|
return targetClass;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an element in the target class. The new element references the
|
||||||
|
* element in the base class.
|
||||||
|
*
|
||||||
|
* @param {Class}
|
||||||
|
* targetClass The target class to be used.
|
||||||
|
* @param {Class}
|
||||||
|
* baseClass The base class to be used.
|
||||||
|
* @param {String}
|
||||||
|
* element The name of the element to be created.
|
||||||
|
*/
|
||||||
|
_Object.createElement = function(targetClass, baseClass, element) {
|
||||||
|
// in case the element is invalid
|
||||||
|
if (!element || !baseClass.prototype[element]) {
|
||||||
|
// returns immediately
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieves the base fnction for the current element
|
||||||
|
var baseFunction = baseClass.prototype[element];
|
||||||
|
|
||||||
|
targetClass.prototype[element] = function() {
|
||||||
|
return baseFunction.apply(this, arguments);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extends the given object with the given extension object.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* object The base object to be used.
|
||||||
|
* @param {Object}
|
||||||
|
* extensionObject The object ot be used to extend the base one.
|
||||||
|
* @return {Object} The resulting object.
|
||||||
|
*/
|
||||||
|
_Object.extend = function(object, extensionObject) {
|
||||||
|
// allocates the space for the values and for
|
||||||
|
// the keys that are going to be used
|
||||||
|
var value = null;
|
||||||
|
var key = null;
|
||||||
|
|
||||||
|
// allocates the new object map
|
||||||
|
var newObject = {};
|
||||||
|
|
||||||
|
// iterates over all the keys in the
|
||||||
|
// base object
|
||||||
|
for (key in object) {
|
||||||
|
// retrieves the value
|
||||||
|
value = object[key];
|
||||||
|
|
||||||
|
// sets the value in the new object
|
||||||
|
newObject[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterates over all the keys in
|
||||||
|
// the extension object
|
||||||
|
for (key in extensionObject) {
|
||||||
|
// retrieves the value and then sets
|
||||||
|
// the value in the new object
|
||||||
|
value = extensionObject[key];
|
||||||
|
newObject[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the new object
|
||||||
|
return newObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extends the given object with the given extension object. This method uses
|
||||||
|
* the base object for the creation of the resulting object.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* object The base object to be used.
|
||||||
|
* @param {Object}
|
||||||
|
* extensionObject The object ot be used to extend the base one.
|
||||||
|
* @return {Object} The resulting object.
|
||||||
|
*/
|
||||||
|
_Object._extend = function(object, extensionObject) {
|
||||||
|
// allocates the space for the values and for
|
||||||
|
// the keys that are going to be used
|
||||||
|
var value = null;
|
||||||
|
var key = null;
|
||||||
|
|
||||||
|
// iterates over all the keys in
|
||||||
|
// the extension object
|
||||||
|
for (key in extensionObject) {
|
||||||
|
// retrieves the value
|
||||||
|
value = extensionObject[key];
|
||||||
|
|
||||||
|
// sets the value in the base object
|
||||||
|
object[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the base object as the
|
||||||
|
// resulting object
|
||||||
|
return object;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
_Object: _Object
|
||||||
|
};
|
||||||
|
}
|
55
src/general/root.js
Normal file
55
src/general/root.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Object = (_global.Object = _global.Object || {});
|
||||||
|
|
||||||
|
Object.isEmpty = function(object) {
|
||||||
|
for (var property in object) {
|
||||||
|
if (object[property] !== undefined) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.clone = function(object, recursive) {
|
||||||
|
if (object === null || object === undefined || typeof object !== "object") {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
var cloned = new object.constructor();
|
||||||
|
for (var key in object) {
|
||||||
|
var value = object[key];
|
||||||
|
value = recursive ? Object.clone(value) : value;
|
||||||
|
cloned[key] = value;
|
||||||
|
}
|
||||||
|
return cloned;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Object: Object
|
||||||
|
};
|
||||||
|
}
|
196
src/general/stack_trace.js
Normal file
196
src/general/stack_trace.js
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var StackTrace = (_global.StackTrace = _global.StackTrace || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default complete stack value.
|
||||||
|
*
|
||||||
|
* @type Boolean
|
||||||
|
*/
|
||||||
|
StackTrace.DEFAULT_COMPLETE_STACK_VALUE = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the stack trace for the current state.
|
||||||
|
*
|
||||||
|
* @param {Boolean}
|
||||||
|
* completeStack Defines if the stack should be complete (function
|
||||||
|
* contents) or not.
|
||||||
|
* @return {List} The result list with the stack trace.
|
||||||
|
*/
|
||||||
|
StackTrace.getStackTrace = function(completeStack) {
|
||||||
|
// sets the complete stack value
|
||||||
|
completeStack = completeStack || StackTrace.DEFAULT_COMPLETE_STACK_VALUE;
|
||||||
|
|
||||||
|
// starts the result list
|
||||||
|
var result = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
// tries to acess an attribute in an undefined value to raise an exception
|
||||||
|
// eslint-disable-next-line no-unused-expressions,no-undef
|
||||||
|
invalid.invalid;
|
||||||
|
} catch (exception) {
|
||||||
|
// parses the error stack using the given exception
|
||||||
|
var stack = StackTrace.parseErrorStack(exception, completeStack);
|
||||||
|
|
||||||
|
// iterates over the stack list
|
||||||
|
for (var i = 1; i < stack.length; i++) {
|
||||||
|
// appends the stack item to the result list
|
||||||
|
result.push(stack[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the result list
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the stack trace (as a string) for the current state.
|
||||||
|
*
|
||||||
|
* @param {Boolean}
|
||||||
|
* completeStack Defines if the stack should be complete (function
|
||||||
|
* contents) or not.
|
||||||
|
* @return {String} The result string with the stack trace.
|
||||||
|
*/
|
||||||
|
StackTrace.getStackTraceString = function(completeStack) {
|
||||||
|
// sets the complete stack value
|
||||||
|
completeStack = completeStack || StackTrace.DEFAULT_COMPLETE_STACK_VALUE;
|
||||||
|
|
||||||
|
// retrieves the stack trace result
|
||||||
|
var result = StackTrace.getStackTrace(completeStack);
|
||||||
|
|
||||||
|
// creates the stack string as a join of the result
|
||||||
|
var stackTraceString = result.join("\n");
|
||||||
|
|
||||||
|
// returns the stack trace string
|
||||||
|
return stackTraceString;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the error stack from the given exception.
|
||||||
|
*
|
||||||
|
* @param {Exception}
|
||||||
|
* exception The exception to be parsed to retrieve the error stack.
|
||||||
|
* @param {Boolean}
|
||||||
|
* completeStack Defines if the stack should be complete (function
|
||||||
|
* contents) or not.
|
||||||
|
* @return {List} The error stack list.
|
||||||
|
*/
|
||||||
|
StackTrace.parseErrorStack = function(exception, completeStack) {
|
||||||
|
// sets the complete stack value
|
||||||
|
completeStack = completeStack || StackTrace.DEFAULT_COMPLETE_STACK_VALUE;
|
||||||
|
|
||||||
|
// starts the value of the name variable to be used in the
|
||||||
|
// possible retrieval of the function name
|
||||||
|
var name = null;
|
||||||
|
var functionValue = null;
|
||||||
|
|
||||||
|
// starts the stack list
|
||||||
|
var stack = [];
|
||||||
|
|
||||||
|
// in case there is no exception defined
|
||||||
|
if (!exception) {
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
// in case there is an exception stack defined (firefox)
|
||||||
|
if (exception.stack) {
|
||||||
|
// splits the stack list in the new line character
|
||||||
|
var stackList = exception.stack.split("\n");
|
||||||
|
|
||||||
|
// iterates over all the element of the stack list
|
||||||
|
for (var i = 0; i < stackList.length - 1; i++) {
|
||||||
|
// retrieves the function value
|
||||||
|
functionValue = stackList[i];
|
||||||
|
|
||||||
|
// retrieves the symbol name
|
||||||
|
name = functionValue.match(/^(\w*)/)[1];
|
||||||
|
|
||||||
|
// in case the symbol name is not defined
|
||||||
|
if (!name) {
|
||||||
|
// sets the symbol name as anonymous
|
||||||
|
name = "anonymous";
|
||||||
|
}
|
||||||
|
|
||||||
|
stack[stack.length] = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// in case there is no exception stack defined (webkit and ie)
|
||||||
|
else {
|
||||||
|
// sets the initial the current function
|
||||||
|
// eslint-disable-next-line no-caller
|
||||||
|
var currentFunction = arguments.callee.caller;
|
||||||
|
|
||||||
|
// while there is a valid current function defined
|
||||||
|
while (currentFunction) {
|
||||||
|
// retrieves the function value
|
||||||
|
functionValue = currentFunction.toString();
|
||||||
|
|
||||||
|
// in case the stack should be complete
|
||||||
|
if (completeStack) {
|
||||||
|
// adds the function value to the stack
|
||||||
|
stack.push(functionValue);
|
||||||
|
} else {
|
||||||
|
// retrieves the symbol name
|
||||||
|
name = functionValue.substring(
|
||||||
|
functionValue.indexOf("function") + 8,
|
||||||
|
functionValue.indexOf("(")
|
||||||
|
);
|
||||||
|
|
||||||
|
// in case the symbol name is not valid
|
||||||
|
if (name === " ") {
|
||||||
|
// sets the symbol name as anonymous
|
||||||
|
name = "anonymous";
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieves the function argument names
|
||||||
|
var functionArguments = currentFunction.argumentNames();
|
||||||
|
|
||||||
|
// creates the arguments string joining all the arguments
|
||||||
|
// in the function arguments list
|
||||||
|
var argumentsString = functionArguments.join(",");
|
||||||
|
|
||||||
|
// creates the function string
|
||||||
|
var functionString = name + "(" + argumentsString + ")";
|
||||||
|
|
||||||
|
// adds the function string to the stack
|
||||||
|
stack.push(functionString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sets the new current function
|
||||||
|
currentFunction = currentFunction.caller;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the stack
|
||||||
|
return stack;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
StackTrace: StackTrace
|
||||||
|
};
|
||||||
|
}
|
16
src/index.js
Normal file
16
src/index.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Created by WebStorm.
|
||||||
|
* User: martin
|
||||||
|
* Date: 01/06/2020
|
||||||
|
* Time: 14:19
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
const LocalStorage = require('./LocalStorage');
|
||||||
|
const utils = require('./utils');
|
||||||
|
|
||||||
|
exports.LocalStorage=LocalStorage;
|
||||||
|
exports.Utils=utils;
|
||||||
|
|
||||||
|
|
||||||
|
|
3
src/logging/formatters/index.js
Normal file
3
src/logging/formatters/index.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
const simpleFormatter = require("./simple_formatter");
|
||||||
|
|
||||||
|
Object.assign(module.exports, simpleFormatter);
|
66
src/logging/formatters/simple_formatter.js
Normal file
66
src/logging/formatters/simple_formatter.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
if (typeof require !== "undefined") {
|
||||||
|
var logging = require("../logging");
|
||||||
|
var general = require("../../general");
|
||||||
|
var Logging = logging.Logging;
|
||||||
|
var _Object = general._Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*/
|
||||||
|
Logging.SimpleFormatter = function(formatString) {
|
||||||
|
this.formatString = formatString || "{asctime} [{level}] {message}";
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.SimpleFormatter = _Object.inherit(Logging.SimpleFormatter, Logging.Formatter);
|
||||||
|
|
||||||
|
Logging.SimpleFormatter.prototype.format = function(record) {
|
||||||
|
var date = new Date();
|
||||||
|
var asctime = "{0}-{1}-{2} {3}:{4}:{5},{6}".format(
|
||||||
|
date.getFullYear(),
|
||||||
|
String(date.getMonth()).padStart(2, "0"),
|
||||||
|
String(date.getDay()).padStart(2, "0"),
|
||||||
|
date.getHours(),
|
||||||
|
date.getMinutes(),
|
||||||
|
date.getSeconds(),
|
||||||
|
date.getMilliseconds()
|
||||||
|
);
|
||||||
|
var level = record.getLevelString();
|
||||||
|
var message = record.getMessage();
|
||||||
|
return this.formatString.formatOptions({
|
||||||
|
level: level,
|
||||||
|
asctime: asctime,
|
||||||
|
message: message
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Logging: Logging
|
||||||
|
};
|
||||||
|
}
|
112
src/logging/handlers/consola_handler.js
Normal file
112
src/logging/handlers/consola_handler.js
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
if (typeof require !== "undefined") {
|
||||||
|
var logging = require("../logging");
|
||||||
|
var general = require("../../general");
|
||||||
|
var Logging = logging.Logging;
|
||||||
|
var _Object = general._Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* instance The options consoale instance to be used in the construction.
|
||||||
|
* @param {Boolean}
|
||||||
|
* noDefaults If the defaults (handlers) should not be applied to a possible
|
||||||
|
* new instance to be constructed.
|
||||||
|
*/
|
||||||
|
Logging.ConsolaHandler = function(instance, noDefaults) {
|
||||||
|
// tries to require the consola dependency to be used
|
||||||
|
// for the ouput of the logging, notice that if webpack
|
||||||
|
// exits the requirement is ignored
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
if (typeof __webpack_require__ === "undefined") {
|
||||||
|
var consola = require("consola");
|
||||||
|
}
|
||||||
|
var parameters = {
|
||||||
|
level: 0,
|
||||||
|
reporters: [],
|
||||||
|
types: []
|
||||||
|
};
|
||||||
|
this.instance = instance || (consola.create ? consola : new consola.Consola(parameters));
|
||||||
|
if (!noDefaults && consola.FancyReporter) {
|
||||||
|
// clears any if the previously added reporters and then
|
||||||
|
// adds the fancy reporter as the default one
|
||||||
|
this.instance.clear();
|
||||||
|
this.instance.add(new consola.FancyReporter());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.ConsolaHandler = _Object.inherit(Logging.ConsolaHandler, Logging.Handler);
|
||||||
|
|
||||||
|
Logging.ConsolaHandler.MAPPING = {
|
||||||
|
NOTSET: "debug",
|
||||||
|
DEBUG: "debug",
|
||||||
|
INFO: "info",
|
||||||
|
WARNING: "warning",
|
||||||
|
ERROR: "error",
|
||||||
|
CRITICAL: "critical"
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.ConsolaHandler.isReady = function() {
|
||||||
|
try {
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
if (typeof __webpack_require__ === "undefined") {
|
||||||
|
require.resolve("consola");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!process || !process.stdout || !process.stdout.isTTY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.ConsolaHandler.prototype.emit = function(record) {
|
||||||
|
this.base.emit(record);
|
||||||
|
|
||||||
|
// formats the record retrieving the message that
|
||||||
|
// is going to be sent to the concrete handler
|
||||||
|
var message = this.format(record);
|
||||||
|
|
||||||
|
// retrieves the level string for the current record
|
||||||
|
// and uses it to retrieve the associated method name
|
||||||
|
// fo the consola environment
|
||||||
|
var levelString = record.getLevelString();
|
||||||
|
var name = Logging.ConsolaHandler.MAPPING[levelString];
|
||||||
|
|
||||||
|
// calls the appropriate method under the consola environment
|
||||||
|
// for the logging of the message
|
||||||
|
this.instance[name](message);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Logging: Logging
|
||||||
|
};
|
||||||
|
}
|
7
src/logging/handlers/index.js
Normal file
7
src/logging/handlers/index.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
const consolaHandler = require("./consola_handler");
|
||||||
|
const loggyHandler = require("./loggy_handler");
|
||||||
|
const streamHandler = require("./stream_handler");
|
||||||
|
|
||||||
|
Object.assign(module.exports, consolaHandler);
|
||||||
|
Object.assign(module.exports, loggyHandler);
|
||||||
|
Object.assign(module.exports, streamHandler);
|
113
src/logging/handlers/loggy_handler.js
Normal file
113
src/logging/handlers/loggy_handler.js
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
if (typeof require !== "undefined") {
|
||||||
|
var logging = require("../logging");
|
||||||
|
var general = require("../../general");
|
||||||
|
var Logging = logging.Logging;
|
||||||
|
var _Object = general._Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var jQuery = (_global.jQuery = _global.jQuery || null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* options The options for the handler construction.
|
||||||
|
*/
|
||||||
|
Logging.LoggyHandler = function(options) {
|
||||||
|
// starts the queue of pending messages
|
||||||
|
this.recordQueue = [];
|
||||||
|
|
||||||
|
// sets the current scope
|
||||||
|
var scope = this;
|
||||||
|
|
||||||
|
jQuery(document).ready(function() {
|
||||||
|
// starts the loggy structures and then
|
||||||
|
// runs the flush operation
|
||||||
|
jQuery("body").loggy("default", options);
|
||||||
|
scope.flush();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.LoggyHandler = _Object.inherit(Logging.LoggyHandler, Logging.Handler);
|
||||||
|
|
||||||
|
Logging.LoggyHandler.prototype.flush = function() {
|
||||||
|
this.base.flush();
|
||||||
|
|
||||||
|
// iterates over all the records in the record queue
|
||||||
|
for (var index = 0; index < this.recordQueue.length; index++) {
|
||||||
|
// retrieves the current record and
|
||||||
|
// emits the record
|
||||||
|
var record = this.recordQueue[index];
|
||||||
|
this.emit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates a new record queue
|
||||||
|
this.recordQueue = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.LoggyHandler.prototype.emit = function(record) {
|
||||||
|
this.base.emit(record);
|
||||||
|
|
||||||
|
// in case the structure is not initialized, the emit
|
||||||
|
// operation in loggy must be delayed
|
||||||
|
if (!this.initialized()) {
|
||||||
|
// adds the record to the records queue and
|
||||||
|
// then return immediately as there's nothing
|
||||||
|
// else that may be done for now
|
||||||
|
this.recordQueue.push(record);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// formats the record retrieving the message that
|
||||||
|
// is going to be sent to the concrete handler
|
||||||
|
var message = this.format(record);
|
||||||
|
|
||||||
|
// retrieves the record level string and runs the
|
||||||
|
// lowercasing operation in it to retrive the current
|
||||||
|
// valid message type value for it
|
||||||
|
var levelString = record.getLevelString();
|
||||||
|
var messageType = levelString.toLowerCase();
|
||||||
|
|
||||||
|
// sends the log message to the loggy so that it can
|
||||||
|
// be properly handled by it
|
||||||
|
jQuery("body").loggy("log", {
|
||||||
|
message: message,
|
||||||
|
messageType: messageType
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.LoggyHandler.prototype.initialized = function() {
|
||||||
|
return jQuery("body").loggy("initialized");
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Logging: Logging
|
||||||
|
};
|
||||||
|
}
|
61
src/logging/handlers/stream_handler.js
Normal file
61
src/logging/handlers/stream_handler.js
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
if (typeof require !== "undefined") {
|
||||||
|
var logging = require("../logging");
|
||||||
|
var general = require("../../general");
|
||||||
|
var Logging = logging.Logging;
|
||||||
|
var _Object = general._Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*
|
||||||
|
* @param {Object}
|
||||||
|
* stream The stream to be used.
|
||||||
|
*/
|
||||||
|
Logging.StreamHandler = function(stream) {
|
||||||
|
this.stream = stream || console;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.StreamHandler = _Object.inherit(Logging.StreamHandler, Logging.Handler);
|
||||||
|
|
||||||
|
Logging.StreamHandler.prototype.emit = function(record) {
|
||||||
|
this.base.emit(record);
|
||||||
|
|
||||||
|
// formats the record retrieving the message
|
||||||
|
var message = this.format(record);
|
||||||
|
|
||||||
|
// prints the message to the stream
|
||||||
|
// flushes the stream
|
||||||
|
this.stream.info(message);
|
||||||
|
this.flush();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Logging: Logging
|
||||||
|
};
|
||||||
|
}
|
7
src/logging/index.js
Normal file
7
src/logging/index.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
const formatters = require("./formatters");
|
||||||
|
const handlers = require("./handlers");
|
||||||
|
const logging = require("./logging");
|
||||||
|
|
||||||
|
Object.assign(module.exports, formatters);
|
||||||
|
Object.assign(module.exports, handlers);
|
||||||
|
Object.assign(module.exports, logging);
|
441
src/logging/logging.js
Normal file
441
src/logging/logging.js
Normal file
@ -0,0 +1,441 @@
|
|||||||
|
// Hive Colony Framework
|
||||||
|
// Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
//
|
||||||
|
// This file is part of Hive Colony Framework.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Apache License as published by the Apache
|
||||||
|
// Foundation, either version 2.0 of the License, or (at your option) any
|
||||||
|
// later version.
|
||||||
|
//
|
||||||
|
// Hive Colony Framework is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Apache License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Apache License along with
|
||||||
|
// Hive Colony Framework. If not, see <http://www.apache.org/licenses/>.
|
||||||
|
|
||||||
|
// __author__ = João Magalhães <joamag@hive.pt>
|
||||||
|
// __version__ = 1.0.0
|
||||||
|
// __revision__ = $LastChangedRevision$
|
||||||
|
// __date__ = $LastChangedDate$
|
||||||
|
// __copyright__ = Copyright (c) 2008-2020 Hive Solutions Lda.
|
||||||
|
// __license__ = Apache License, Version 2.0
|
||||||
|
|
||||||
|
var _global = typeof global === "undefined" ? window : global;
|
||||||
|
var Logging = (_global.Logging = _global.Logging || {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently created loggers.
|
||||||
|
*
|
||||||
|
* @type Map
|
||||||
|
*/
|
||||||
|
Logging.loggers = {};
|
||||||
|
|
||||||
|
Logging.getLogger = function(loggerName, defaults) {
|
||||||
|
// ensures the proper loading of the stream handler to avoid
|
||||||
|
// any unwanted behaviour (in the defaults creation)
|
||||||
|
if (typeof require !== "undefined") {
|
||||||
|
require("./handlers");
|
||||||
|
require("./formatters");
|
||||||
|
}
|
||||||
|
|
||||||
|
// verifies if the defaults have been sent and if that's
|
||||||
|
// not the case builds the default ones
|
||||||
|
if (typeof defaults === "undefined") {
|
||||||
|
defaults = {
|
||||||
|
handlers: [Logging.StreamHandler],
|
||||||
|
formatter: Logging.SimpleFormatter
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// starts the initial reference to logger, this may
|
||||||
|
// be contructed by the end of the execution
|
||||||
|
var logger = null;
|
||||||
|
|
||||||
|
// retrieves the logger name, falling back to the
|
||||||
|
// default name in case none is provided
|
||||||
|
loggerName = loggerName || Logging.constants.DEFAULT_LOGGER_NAME;
|
||||||
|
|
||||||
|
// in case there is no logger with the given
|
||||||
|
// name in the logger map
|
||||||
|
if (!Logging.loggers[loggerName]) {
|
||||||
|
// creates a new logger with the given name and
|
||||||
|
// sets the logger in the loggers map
|
||||||
|
logger = new Logging.Logger(loggerName, defaults.level || undefined);
|
||||||
|
Logging.loggers[loggerName] = logger;
|
||||||
|
|
||||||
|
// iterates over the multiple values of the defaults
|
||||||
|
// to buld the proper handlers
|
||||||
|
var defaultHandlers = defaults.handlers || [];
|
||||||
|
for (var index = 0; index < defaultHandlers.length; index++) {
|
||||||
|
var handler = new defaultHandlers[index]();
|
||||||
|
logger.addHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates the default formatter for the logger and set it
|
||||||
|
// changing the value for all the current handlers
|
||||||
|
var DefaultFormatter = defaults.formatter || null;
|
||||||
|
if (DefaultFormatter) {
|
||||||
|
var formatter = new DefaultFormatter();
|
||||||
|
logger.setFormatter(formatter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieves the logger and returns it to
|
||||||
|
// the caller method
|
||||||
|
logger = Logging.loggers[loggerName];
|
||||||
|
return logger;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.debug = function(messageValue) {
|
||||||
|
Logging.getLogger(Logging.constants.DEFAULT_LOGGER_NAME).debug(messageValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.info = function(messageValue) {
|
||||||
|
Logging.getLogger(Logging.constants.DEFAULT_LOGGER_NAME).info(messageValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.warn = function(messageValue) {
|
||||||
|
Logging.getLogger(Logging.constants.DEFAULT_LOGGER_NAME).warn(messageValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.error = function(messageValue) {
|
||||||
|
Logging.getLogger(Logging.constants.DEFAULT_LOGGER_NAME).error(messageValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.critical = function(messageValue) {
|
||||||
|
Logging.getLogger(Logging.constants.DEFAULT_LOGGER_NAME).critical(messageValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The map containig the logging contants.
|
||||||
|
*
|
||||||
|
* @type Map
|
||||||
|
*/
|
||||||
|
Logging.constants = {
|
||||||
|
/**
|
||||||
|
* The critical number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
CRITICAL: 50,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
ERROR: 40,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The warning number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
WARNING: 30,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The info number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
INFO: 20,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The debug number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
DEBUG: 10,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The not set number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
NOTSET: 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default level number.
|
||||||
|
*
|
||||||
|
* @type Integer
|
||||||
|
*/
|
||||||
|
DEFAULT_LEVEL: 20,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The critical value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
CRITICAL_VALUE: "CRITICAL",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
ERROR_VALUE: "ERROR",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The warning value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
WARNING_VALUE: "WARNING",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The info value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
INFO_VALUE: "INFO",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The debug value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
DEBUG_VALUE: "DEBUG",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The not set value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
NOTSET_VALUE: "NOTSET",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default level value.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
DEFAULT_LEVEL_VALUE: "INFO",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default logger name.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
DEFAULT_LOGGER_NAME: "default"
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.LevelsMap = {};
|
||||||
|
|
||||||
|
Logging.LevelsMap[Logging.constants.CRITICAL] = Logging.constants.CRITICAL_VALUE;
|
||||||
|
Logging.LevelsMap[Logging.constants.ERROR] = Logging.constants.ERROR_VALUE;
|
||||||
|
Logging.LevelsMap[Logging.constants.WARNING] = Logging.constants.WARNING_VALUE;
|
||||||
|
Logging.LevelsMap[Logging.constants.INFO] = Logging.constants.INFO_VALUE;
|
||||||
|
Logging.LevelsMap[Logging.constants.DEBUG] = Logging.constants.DEBUG_VALUE;
|
||||||
|
Logging.LevelsMap[Logging.constants.NOTSET] = Logging.constants.NOTSET_VALUE;
|
||||||
|
|
||||||
|
Logging.LevelsMap[Logging.constants.CRITICAL_VALUE] = Logging.constants.CRITICAL;
|
||||||
|
Logging.LevelsMap[Logging.constants.ERROR_VALUE] = Logging.constants.ERROR;
|
||||||
|
Logging.LevelsMap[Logging.constants.WARNING_VALUE] = Logging.constants.WARNING;
|
||||||
|
Logging.LevelsMap[Logging.constants.INFO_VALUE] = Logging.constants.INFO;
|
||||||
|
Logging.LevelsMap[Logging.constants.DEBUG_VALUE] = Logging.constants.DEBUG;
|
||||||
|
Logging.LevelsMap[Logging.constants.NOTSET_VALUE] = Logging.constants.NOTSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* loggerName The name of the logger.
|
||||||
|
*/
|
||||||
|
Logging.Logger = function(loggerName, level, handlers) {
|
||||||
|
this.loggerName = loggerName;
|
||||||
|
|
||||||
|
this.level = typeof level === "undefined" ? Logging.constants.DEFAULT_LEVEL : level;
|
||||||
|
this.handlers = typeof handlers === "undefined" ? [] : handlers;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new handler to the logger.
|
||||||
|
*
|
||||||
|
* @param {Handler}
|
||||||
|
* handler The handler to be added to the logger.
|
||||||
|
*/
|
||||||
|
Logging.Logger.prototype.addHandler = function(handler) {
|
||||||
|
this.handlers.push(handler);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the level of verbosity.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* level The level of verbosity to be set.
|
||||||
|
*/
|
||||||
|
Logging.Logger.prototype.setLevel = function(level) {
|
||||||
|
this.level = level;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.debug = function(messageValue) {
|
||||||
|
if (this.isEnabledFor(Logging.constants.DEBUG)) {
|
||||||
|
this._log(messageValue, Logging.constants.DEBUG);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.info = function(messageValue) {
|
||||||
|
if (this.isEnabledFor(Logging.constants.INFO)) {
|
||||||
|
this._log(messageValue, Logging.constants.INFO);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.warn = function(messageValue) {
|
||||||
|
if (this.isEnabledFor(Logging.constants.WARNING)) {
|
||||||
|
this._log(messageValue, Logging.constants.WARNING);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.error = function(messageValue) {
|
||||||
|
if (this.isEnabledFor(Logging.constants.ERROR)) {
|
||||||
|
this._log(messageValue, Logging.constants.ERROR);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.critical = function(messageValue) {
|
||||||
|
if (this.isEnabledFor(Logging.constants.CRITICAL)) {
|
||||||
|
this._log(messageValue, Logging.constants.CRITICAL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.isEnabledFor = function(level) {
|
||||||
|
return level >= this.getEffectiveLevel();
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.getEffectiveLevel = function() {
|
||||||
|
return this.level;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.setFormatter = function(formatter) {
|
||||||
|
for (var index = 0; index < this.handlers.length; index++) {
|
||||||
|
var handler = this.handlers[index];
|
||||||
|
handler.setFormatter(formatter);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype._log = function(messageValue, level) {
|
||||||
|
// creates a new record for the message value and the level
|
||||||
|
var record = new Logging.Record(messageValue, level);
|
||||||
|
|
||||||
|
// handles the record
|
||||||
|
this.handle(record);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.handle = function(record) {
|
||||||
|
// calls the handlers for the record
|
||||||
|
this.callHandlers(record);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Logger.prototype.callHandlers = function(record) {
|
||||||
|
// iterates over all the handlers
|
||||||
|
for (var index = 0; index < this.handlers.length; index++) {
|
||||||
|
// retrieves the current handler and
|
||||||
|
// handles the record with the handler
|
||||||
|
var handler = this.handlers[index];
|
||||||
|
handler.handle(record);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*
|
||||||
|
* @param {String}
|
||||||
|
* message The message.
|
||||||
|
* @param {Integer}
|
||||||
|
* level The level.
|
||||||
|
*/
|
||||||
|
Logging.Record = function(message, level) {
|
||||||
|
this.message = message;
|
||||||
|
this.level = level;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the message.
|
||||||
|
*
|
||||||
|
* @return {String} The message.
|
||||||
|
*/
|
||||||
|
Logging.Record.prototype.getMessage = function() {
|
||||||
|
return this.message;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the level.
|
||||||
|
*
|
||||||
|
* @return {Integer} The level.
|
||||||
|
*/
|
||||||
|
Logging.Record.prototype.getLevel = function() {
|
||||||
|
return this.level;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the level string value.
|
||||||
|
*
|
||||||
|
* @return {String} The level string value.
|
||||||
|
*/
|
||||||
|
Logging.Record.prototype.getLevelString = function() {
|
||||||
|
return Logging.LevelsMap[this.level];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*/
|
||||||
|
Logging.Handler = function() {
|
||||||
|
this.formatter = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Handler.isReady = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the formatter for the handler.
|
||||||
|
*
|
||||||
|
* @param {Formatter}
|
||||||
|
* formatter The formatter for the handler.
|
||||||
|
*/
|
||||||
|
Logging.Handler.prototype.setFormatter = function(formatter) {
|
||||||
|
this.formatter = formatter;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Handler.prototype.handle = function(record) {
|
||||||
|
// emits the record so that it gets pipelined
|
||||||
|
// to the inner implementation
|
||||||
|
this.emit(record);
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Handler.prototype.format = function(record) {
|
||||||
|
// sets the inital value for the message
|
||||||
|
var message = null;
|
||||||
|
|
||||||
|
// in case no formatter
|
||||||
|
if (!this.formatter) {
|
||||||
|
// retrieves the record message and returns
|
||||||
|
// it to the caller method
|
||||||
|
message = record.getMessage();
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
// formats the message using the formatter
|
||||||
|
// and returns it to the caller
|
||||||
|
message = this.formatter.format(record);
|
||||||
|
return message;
|
||||||
|
};
|
||||||
|
|
||||||
|
Logging.Handler.prototype.flush = function() {};
|
||||||
|
|
||||||
|
Logging.Handler.prototype.emit = function(record) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor of the class.
|
||||||
|
*/
|
||||||
|
Logging.Formatter = function() {};
|
||||||
|
|
||||||
|
Logging.Formatter.prototype.format = function(record) {};
|
||||||
|
|
||||||
|
if (typeof module !== "undefined") {
|
||||||
|
module.exports = {
|
||||||
|
Logging: Logging
|
||||||
|
};
|
||||||
|
}
|
262
src/utils.js
Normal file
262
src/utils.js
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param timeString
|
||||||
|
* @param today
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const partOfDay = (timeString, today) => {
|
||||||
|
console.log(new Date());
|
||||||
|
if (timeString === undefined || timeString === null)
|
||||||
|
timeString = (new Date()).getHours().toString();
|
||||||
|
|
||||||
|
if (today === undefined)
|
||||||
|
today = false;
|
||||||
|
|
||||||
|
const hours = timeString.substring(0, 2);
|
||||||
|
let dayBit;
|
||||||
|
|
||||||
|
console.log('Hours', hours);
|
||||||
|
|
||||||
|
if (hours >= 0 && hours < 4)
|
||||||
|
dayBit = 'Late Night';
|
||||||
|
|
||||||
|
else if (hours >= 4 && hours < 7)
|
||||||
|
dayBit = 'Early Morning';
|
||||||
|
|
||||||
|
else if (hours >= 7 && hours < 12)
|
||||||
|
dayBit = 'Morning';
|
||||||
|
|
||||||
|
else if (hours >= 12 && hours < 17)
|
||||||
|
dayBit = 'Afternoon';
|
||||||
|
|
||||||
|
else if (hours < 21)
|
||||||
|
dayBit = 'Evening';
|
||||||
|
|
||||||
|
else
|
||||||
|
dayBit = 'Night';
|
||||||
|
|
||||||
|
if (today)
|
||||||
|
dayBit = dayBit === 'night' ? 'tonight' : `this ${dayBit}`;
|
||||||
|
|
||||||
|
console.log('partOfDay', dayBit);
|
||||||
|
|
||||||
|
return dayBit;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param extra
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const toHour = (extra = 0) => {
|
||||||
|
const now = new Date();
|
||||||
|
return (3600000 - (now.getTime() % 3600000)) + extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const hourFloor = () => {
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
return parseInt(~~(now.getTime() / 3600000) * 3600000, 10).toString(32);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const getWeek = function (d) {
|
||||||
|
var target = new Date(d.valueOf());
|
||||||
|
var dayNr = (d.getDay() + 6) % 7;
|
||||||
|
target.setDate(target.getDate() - dayNr + 3);
|
||||||
|
var firstThursday = target.valueOf();
|
||||||
|
target.setMonth(0, 1);
|
||||||
|
if (target.getDay() != 4) {
|
||||||
|
target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
|
||||||
|
}
|
||||||
|
return 1 + Math.ceil((firstThursday - target) / 604800000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param lat1
|
||||||
|
* @param lon1
|
||||||
|
* @param lat2
|
||||||
|
* @param lon2
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const distance = (lat1, lon1, lat2, lon2) => {
|
||||||
|
const p = 0.017453292519943295; // Math.PI / 180
|
||||||
|
const c = Math.cos;
|
||||||
|
const a = 0.5 - c((lat2 - lat1) * p) / 2 +
|
||||||
|
c(lat1 * p) * c(lat2 * p) *
|
||||||
|
(1 - c((lon2 - lon1) * p)) / 2;
|
||||||
|
|
||||||
|
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
|
||||||
|
};
|
||||||
|
|
||||||
|
function splitURL(url) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param count
|
||||||
|
* @param noun
|
||||||
|
* @param suffix
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const maybePluralize = (count, noun, suffix = 's') =>
|
||||||
|
`${count} ${noun}${count !== 1 ? suffix : ''}`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param fn
|
||||||
|
* @param time
|
||||||
|
* @returns {Function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const debounce = function (fn, time) {
|
||||||
|
let timeout;
|
||||||
|
|
||||||
|
return function (...args) { // <-- not an arrow function
|
||||||
|
const functionCall = () => fn.apply(this, args);
|
||||||
|
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(functionCall, time);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback
|
||||||
|
* @param limit
|
||||||
|
* @returns {Function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const throttle = (callback, limit) => {
|
||||||
|
var wait = false;
|
||||||
|
|
||||||
|
return function (...args) {
|
||||||
|
if (!wait) {
|
||||||
|
callback.apply(null, args);
|
||||||
|
wait = true;
|
||||||
|
setTimeout(function () {
|
||||||
|
wait = false;
|
||||||
|
}, limit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param func
|
||||||
|
* @returns {function(): *}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const once = function (func) {
|
||||||
|
var alreadyCalled = false;
|
||||||
|
var result;
|
||||||
|
|
||||||
|
return function (...args) {
|
||||||
|
if (!alreadyCalled) {
|
||||||
|
result = func.apply(this, args);
|
||||||
|
alreadyCalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @returns {boolean|boolean}
|
||||||
|
*/
|
||||||
|
const isEmpty = obj => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length;
|
||||||
|
|
||||||
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @param prop
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
const hasOwn = (obj, prop) => hasOwnProperty.call(obj, prop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @param path
|
||||||
|
* @param defaultValue
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
const get = (obj, path, defaultValue = undefined) => {
|
||||||
|
const travel = regexp =>
|
||||||
|
String.prototype.split
|
||||||
|
.call(path, regexp)
|
||||||
|
.filter(Boolean)
|
||||||
|
.reduce((res, key) => (res !== null && res !== undefined ? res[key] : res), obj);
|
||||||
|
const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/);
|
||||||
|
|
||||||
|
return result === undefined || result === obj ? defaultValue : result;
|
||||||
|
};
|
||||||
|
|
||||||
|
const arrayFromObj = (jsonObj, wantedFields) => {
|
||||||
|
return wantedFields.map((key) => {
|
||||||
|
if (jsonObj.hasOwnProperty(key))
|
||||||
|
return jsonObj[key];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const extractFromObj = (jsonObj, wantedFields) => {
|
||||||
|
return Object.keys(jsonObj).reduce((obj, key) => {
|
||||||
|
if (wantedFields.includes(key))
|
||||||
|
obj[key] = jsonObj[key];
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
};
|
||||||
|
|
||||||
|
const objectMatcher = (obj, matcher) => {
|
||||||
|
if (typeof(obj) !== 'object' || obj === null) return false;
|
||||||
|
|
||||||
|
let count = Object.keys(obj).length;
|
||||||
|
const keys = Object.keys(obj);
|
||||||
|
|
||||||
|
if (count !== matcher.length) return false;
|
||||||
|
|
||||||
|
matcher.forEach((item) => {
|
||||||
|
if (keys.indexOf(item) !== -1)
|
||||||
|
count--;
|
||||||
|
});
|
||||||
|
|
||||||
|
return (count === 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports = {
|
||||||
|
'partOfDay': partOfDay,
|
||||||
|
'toHour': toHour,
|
||||||
|
'hourFloor': hourFloor,
|
||||||
|
'getWeek': getWeek,
|
||||||
|
'distance': distance,
|
||||||
|
'maybePluralize': maybePluralize,
|
||||||
|
'debounce': debounce,
|
||||||
|
'throttle': throttle,
|
||||||
|
'once': once,
|
||||||
|
'isEmpty': isEmpty,
|
||||||
|
'hasOwn': hasOwn,
|
||||||
|
'get': get,
|
||||||
|
'arrayFromObj' : arrayFromObj,
|
||||||
|
'extractFromObj' : extractFromObj,
|
||||||
|
'objectMatcher' : objectMatcher
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// module.exports = { partOfDay, toHour, hourFloor, distance, maybePluralize, debounce, throttle, once, isEmpty, hasOwn, get, Logger, LocalStorage };
|
||||||
|
|
||||||
|
module.exports = exports;
|
7
ts-src/arrayFromObj.test.ts
Normal file
7
ts-src/arrayFromObj.test.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { arrayFromObj } from './arrayFromObj';
|
||||||
|
|
||||||
|
test('It creates the proper array', function () {
|
||||||
|
const testObj = { a: 1, b: 2 };
|
||||||
|
|
||||||
|
expect(arrayFromObj(testObj, ['a', 'b'])).toEqual([1, 2]);
|
||||||
|
});
|
16
ts-src/arrayFromObj.ts
Normal file
16
ts-src/arrayFromObj.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Create an array from an Object using specified fields
|
||||||
|
* @param jsonObj The Original object
|
||||||
|
* @param wantedFields The required fields
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.arrayFromObj({ a: 1, b: 2 }, ['a', 'b']) // => [1, 2]
|
||||||
|
*/
|
||||||
|
export function arrayFromObj(jsonObj: Object, wantedFields: string[]): any[] {
|
||||||
|
return wantedFields.map((key) => {
|
||||||
|
if (jsonObj.hasOwnProperty(key)) {
|
||||||
|
const { value }: any = Object.getOwnPropertyDescriptor(jsonObj, key);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
31
ts-src/debounce.test.ts
Normal file
31
ts-src/debounce.test.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { debounce } from '../ts-src/debounce';
|
||||||
|
import * as sinon from 'sinon';
|
||||||
|
|
||||||
|
let clock: sinon.SinonFakeTimers;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
clock = sinon.useFakeTimers();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
clock.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should only trigger once', function () {
|
||||||
|
const func = jest.fn();
|
||||||
|
const debouncedFunc = debounce(func, 1000);
|
||||||
|
|
||||||
|
debouncedFunc();
|
||||||
|
expect(func).toHaveBeenCalledTimes(0);
|
||||||
|
|
||||||
|
// Call it several times with 500ms between each call
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
clock.tick(500);
|
||||||
|
debouncedFunc();
|
||||||
|
}
|
||||||
|
expect(func).toHaveBeenCalledTimes(0); // func not called
|
||||||
|
|
||||||
|
// wait 1000ms
|
||||||
|
clock.tick(1000);
|
||||||
|
expect(func).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
23
ts-src/debounce.ts
Normal file
23
ts-src/debounce.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Debounce the calling of a function
|
||||||
|
* @param fn The function to be debounced
|
||||||
|
* @param time How long to wait
|
||||||
|
* @returns {Function}
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.debounce(fn, time)
|
||||||
|
*
|
||||||
|
|
||||||
|
*/
|
||||||
|
export function debounce(fn: Function, time: number): Function {
|
||||||
|
let timeout: NodeJS.Timeout;
|
||||||
|
|
||||||
|
return function (...args: any): any {
|
||||||
|
// <-- not an arrow function
|
||||||
|
// @ts-ignore
|
||||||
|
const functionCall = () => fn.apply(<any>this, args);
|
||||||
|
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(functionCall, time);
|
||||||
|
};
|
||||||
|
}
|
13
ts-src/distance.test.ts
Normal file
13
ts-src/distance.test.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { distance } from './distance';
|
||||||
|
import { LatLong } from './latLong';
|
||||||
|
|
||||||
|
test('Should return the correct Base32 value', () => {
|
||||||
|
expect(distance(1, 1, 2, 2)).toEqual(157.22543203805722);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should return the correct Base32 value', () => {
|
||||||
|
const a: LatLong = new LatLong(1, 1);
|
||||||
|
const b: LatLong = new LatLong(2, 2);
|
||||||
|
|
||||||
|
expect(distance(a, b)).toEqual(157.22543203805722);
|
||||||
|
});
|
57
ts-src/distance.ts
Normal file
57
ts-src/distance.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import { LatLong } from './latLong';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the distance between two lat long points
|
||||||
|
* @param lat1
|
||||||
|
* @param lon1
|
||||||
|
* @param lat2
|
||||||
|
* @param lon2
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.distance(lat1, long1, lat2, long2)
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* distance(1, 1, 2, 2) // => 157.22543203805722;
|
||||||
|
*/
|
||||||
|
export function distance(lat1: number, lon1: number, lat2: number, lon2: number): number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the distance between two lat long points
|
||||||
|
* @param latLong1
|
||||||
|
* @param latLong2
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.distance(latLong1, latLong2)
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* const a: U.LatLong = new LatLong(1, 1);
|
||||||
|
* const b: U.LatLong = new LatLong(2, 2);
|
||||||
|
* U.distance(a, b) // => 157.22543203805722
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function distance(latLong1: LatLong, latLong2: LatLong): number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the Distance between two lat long points
|
||||||
|
*/
|
||||||
|
export function distance(): number {
|
||||||
|
if (arguments.length === 4) {
|
||||||
|
return _distance(arguments[0], arguments[1], arguments[2], arguments[3]);
|
||||||
|
} else if (arguments.length === 2) {
|
||||||
|
return _distance(
|
||||||
|
<number>arguments[0].lat,
|
||||||
|
<number>arguments[0].long,
|
||||||
|
<number>arguments[1].lat,
|
||||||
|
<number>arguments[1].long
|
||||||
|
);
|
||||||
|
} else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _distance(lat1: number, lon1: number, lat2: number, lon2: number): number {
|
||||||
|
const p = 0.017453292519943295; // Math.PI / 180
|
||||||
|
const c = Math.cos;
|
||||||
|
const a = 0.5 - c((lat2 - lat1) * p) / 2 + (c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p))) / 2;
|
||||||
|
|
||||||
|
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
|
||||||
|
}
|
13
ts-src/extractFromObj.test.ts
Normal file
13
ts-src/extractFromObj.test.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { extractFromObj } from './extractFromObj';
|
||||||
|
|
||||||
|
test('It should correctly extract values', function () {
|
||||||
|
const o = { a: 1, b: 2 };
|
||||||
|
|
||||||
|
expect(extractFromObj(o, ['a'])).toEqual({ a: 1 });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('It should correctly extract more complex structure', function () {
|
||||||
|
const o = { a: { bob: 1, steve: 2 }, b: 2 };
|
||||||
|
|
||||||
|
expect(extractFromObj(o, ['a'])).toEqual({ a: { bob: 1, steve: 2 } });
|
||||||
|
});
|
27
ts-src/extractFromObj.ts
Normal file
27
ts-src/extractFromObj.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Extract an object from another object using specific fields
|
||||||
|
* @param jsonObj The source object
|
||||||
|
* @param wantedFields The required fields
|
||||||
|
* @signature
|
||||||
|
* U.extractFromObj(jsonObj, wantedFields)
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.extractFromObj({ a: 1, b: 2 }, ['a']) // => { a: 1 }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function extractFromObj(jsonObj: Object, wantedFields: string[]): {} {
|
||||||
|
return Object.keys(jsonObj).reduce((obj, key) => {
|
||||||
|
if (wantedFields.includes(key)) {
|
||||||
|
const { value }: any = Object.getOwnPropertyDescriptor(jsonObj, key);
|
||||||
|
|
||||||
|
Object.defineProperty(obj, key, {
|
||||||
|
value: value,
|
||||||
|
writable: true,
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
}
|
13
ts-src/hasOwn.test.ts
Normal file
13
ts-src/hasOwn.test.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { hasOwn } from './hasOwn';
|
||||||
|
|
||||||
|
let testObj: Object = {
|
||||||
|
bob: true
|
||||||
|
};
|
||||||
|
|
||||||
|
test('It has a specified property', function () {
|
||||||
|
expect(hasOwn(testObj, 'bob')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('It does not have a specified property', function () {
|
||||||
|
expect(hasOwn(testObj, 'Steve')).toBeFalsy();
|
||||||
|
});
|
14
ts-src/hasOwn.ts
Normal file
14
ts-src/hasOwn.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if an object has an property
|
||||||
|
* @param obj The source object
|
||||||
|
* @param prop The required property
|
||||||
|
* @returns {boolean}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.hasOwn({bob:'1'}, 'bob') // => true
|
||||||
|
*/
|
||||||
|
export function hasOwn(obj: Object, prop: string): boolean {
|
||||||
|
return hasOwnProperty.call(obj, prop);
|
||||||
|
}
|
5
ts-src/hourFloor.test.ts
Normal file
5
ts-src/hourFloor.test.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { hourFloor } from './hourFloor';
|
||||||
|
|
||||||
|
test('Should return the correct Base32 value', () => {
|
||||||
|
expect(hourFloor(1605532173)).toEqual('1fnp540');
|
||||||
|
});
|
12
ts-src/hourFloor.ts
Normal file
12
ts-src/hourFloor.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Get the hour floor as a Base 32 string
|
||||||
|
* @param timestamp The timestamp as a number
|
||||||
|
* @returns {string}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.hourFloor(1605532173) // => '1fnp540'
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function hourFloor(timestamp: number): string {
|
||||||
|
return (Math.floor(timestamp / 3600000) * 3600000).toString(32);
|
||||||
|
}
|
13
ts-src/index.ts
Normal file
13
ts-src/index.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export * from './arrayFromObj';
|
||||||
|
export * from './debounce';
|
||||||
|
export * from './distance';
|
||||||
|
export * from './extractFromObj';
|
||||||
|
export * from './hasOwn';
|
||||||
|
export * from './hourFloor';
|
||||||
|
export * from './isEmpty';
|
||||||
|
export * from './latLong';
|
||||||
|
export * from './maybePluralize';
|
||||||
|
export * from './once';
|
||||||
|
export * from './partOfDay';
|
||||||
|
export * from './throttle';
|
||||||
|
export * from './toHour';
|
9
ts-src/isEmpty.test.ts
Normal file
9
ts-src/isEmpty.test.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { isEmpty } from './isEmpty';
|
||||||
|
|
||||||
|
test('Object is empty', function () {
|
||||||
|
expect(isEmpty({})).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Object is not empty', function () {
|
||||||
|
expect(isEmpty({ bob: true })).toBe(false);
|
||||||
|
});
|
12
ts-src/isEmpty.ts
Normal file
12
ts-src/isEmpty.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* Check if an object is empty
|
||||||
|
* @param obj The object being checked
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.isEmpty({}) // => true
|
||||||
|
* U.isEmpty({ bob: true }) // => false
|
||||||
|
*/
|
||||||
|
export function isEmpty(obj: Object): boolean {
|
||||||
|
// @ts-ignore
|
||||||
|
return [Object, Array].includes((obj || {}).constructor) && !Object.entries(obj || {}).length;
|
||||||
|
}
|
16
ts-src/latLong.ts
Normal file
16
ts-src/latLong.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Calculate the distance between two latLongs
|
||||||
|
* @param lat1
|
||||||
|
* @param lon1
|
||||||
|
* @param lat2
|
||||||
|
* @param lon2
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
export class LatLong {
|
||||||
|
lat: number;
|
||||||
|
long: number;
|
||||||
|
constructor(lat:number, long:number) {
|
||||||
|
this.lat = lat;
|
||||||
|
this.long = long;
|
||||||
|
}
|
||||||
|
}
|
9
ts-src/maybePluralize.test.ts
Normal file
9
ts-src/maybePluralize.test.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { maybePluralize } from './maybePluralize';
|
||||||
|
|
||||||
|
test('Should be 1 Bag', () => {
|
||||||
|
expect(maybePluralize(1, 'Bag', 's')).toEqual('1 Bag');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should be 5 Bags', () => {
|
||||||
|
expect(maybePluralize(5, 'Bag', 's')).toEqual('5 Bags');
|
||||||
|
});
|
18
ts-src/maybePluralize.ts
Normal file
18
ts-src/maybePluralize.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Maybe pluralize a count:
|
||||||
|
*
|
||||||
|
* @param count the value counting
|
||||||
|
* @param noun the name of the value
|
||||||
|
* @param suffix the suffix
|
||||||
|
* @returns {string}
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.maybePluralize(number, noun, suffix)
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* U.maybePluralize(1, 'Bag', 's') // => 1 Bag
|
||||||
|
* U.maybePluralize(5, 'Bag', 's') // => 5 Bags
|
||||||
|
*/
|
||||||
|
export function maybePluralize(count: number, noun: string, suffix = 's'): string {
|
||||||
|
return `${count} ${noun}${count !== 1 ? suffix : ''}`;
|
||||||
|
}
|
15
ts-src/once.test.ts
Normal file
15
ts-src/once.test.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { once } from './once';
|
||||||
|
|
||||||
|
test('It should trigger once', function () {
|
||||||
|
const func = jest.fn();
|
||||||
|
|
||||||
|
const onetimeFunc = once(func);
|
||||||
|
|
||||||
|
onetimeFunc();
|
||||||
|
|
||||||
|
expect(func).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
onetimeFunc();
|
||||||
|
|
||||||
|
expect(func).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
22
ts-src/once.ts
Normal file
22
ts-src/once.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Trigger a function once and then prevent it from triggering again
|
||||||
|
* @returns {Function}
|
||||||
|
* @param fn
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.once(fn)
|
||||||
|
*/
|
||||||
|
export function once(fn: Function): Function {
|
||||||
|
let alreadyCalled: boolean = false;
|
||||||
|
let result: Function;
|
||||||
|
|
||||||
|
return function (...args: any): any {
|
||||||
|
if (!alreadyCalled) {
|
||||||
|
// @ts-ignore
|
||||||
|
result = fn.apply(<any>this, args);
|
||||||
|
alreadyCalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
9
ts-src/partOfDay.test.ts
Normal file
9
ts-src/partOfDay.test.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { partOfDay } from './partOfDay';
|
||||||
|
|
||||||
|
test('Should return Afternoon', () => {
|
||||||
|
expect(partOfDay('12:00', false)).toEqual('Afternoon');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Should return Late Night', () => {
|
||||||
|
expect(partOfDay('00:00', false)).toEqual('Late Night');
|
||||||
|
});
|
30
ts-src/partOfDay.ts
Normal file
30
ts-src/partOfDay.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Get a string phrase for the current time of day
|
||||||
|
* @param timeString
|
||||||
|
* @param today
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.partOfDay(timeString, today)
|
||||||
|
* @example
|
||||||
|
* U.partOfDay('13:00') // => 'Afternoon'
|
||||||
|
*/
|
||||||
|
export function partOfDay(timeString: string, today: boolean = false): string {
|
||||||
|
if (timeString === undefined || timeString === null) timeString = new Date().getHours().toString();
|
||||||
|
|
||||||
|
if (today === undefined) today = false;
|
||||||
|
|
||||||
|
const hours: number = parseInt(timeString.substring(0, 2), 10);
|
||||||
|
|
||||||
|
let dayBit;
|
||||||
|
|
||||||
|
if (hours >= 0 && hours < 4) dayBit = 'Late Night';
|
||||||
|
else if (hours >= 4 && hours < 7) dayBit = 'Early Morning';
|
||||||
|
else if (hours >= 7 && hours < 12) dayBit = 'Morning';
|
||||||
|
else if (hours >= 12 && hours < 17) dayBit = 'Afternoon';
|
||||||
|
else if (hours < 21) dayBit = 'Evening';
|
||||||
|
else dayBit = 'Night';
|
||||||
|
|
||||||
|
if (today) dayBit = dayBit === 'night' ? 'tonight' : `this ${dayBit}`;
|
||||||
|
|
||||||
|
return dayBit;
|
||||||
|
}
|
32
ts-src/throttle.test.ts
Normal file
32
ts-src/throttle.test.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { throttle } from './throttle';
|
||||||
|
|
||||||
|
import * as sinon from 'sinon';
|
||||||
|
|
||||||
|
let clock: sinon.SinonFakeTimers;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
clock = sinon.useFakeTimers();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
clock.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('It should throttle calls', function () {
|
||||||
|
const func = jest.fn();
|
||||||
|
|
||||||
|
const throttledFunc = throttle(func, 1000);
|
||||||
|
|
||||||
|
throttledFunc();
|
||||||
|
|
||||||
|
expect(func).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
throttledFunc();
|
||||||
|
|
||||||
|
expect(func).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
clock.tick(1000);
|
||||||
|
throttledFunc();
|
||||||
|
expect(func).toHaveBeenCalledTimes(2);
|
||||||
|
});
|
||||||
|
|
22
ts-src/throttle.ts
Normal file
22
ts-src/throttle.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Throttle the calling of a function
|
||||||
|
* @returns {Function}
|
||||||
|
* @param callback
|
||||||
|
* @param limit
|
||||||
|
*
|
||||||
|
* @signature
|
||||||
|
* U.throttle(callback, limit)
|
||||||
|
*/
|
||||||
|
export function throttle(callback: Function, limit: number): Function {
|
||||||
|
var wait: boolean = false;
|
||||||
|
|
||||||
|
return function (...args: any): any {
|
||||||
|
if (!wait) {
|
||||||
|
callback.apply(null, args);
|
||||||
|
wait = true;
|
||||||
|
setTimeout(function () {
|
||||||
|
wait = false;
|
||||||
|
}, limit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
5
ts-src/toHour.test.ts
Normal file
5
ts-src/toHour.test.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { toHour } from './toHour';
|
||||||
|
|
||||||
|
test('Should return number of MS to the hour', () => {
|
||||||
|
expect(toHour(1605532173, 0)).toEqual(67827);
|
||||||
|
});
|
14
ts-src/toHour.ts
Normal file
14
ts-src/toHour.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Return the number of Milliseconds to the hour for the supplied timestamp
|
||||||
|
* @param currentTimsestamp
|
||||||
|
* @param extra
|
||||||
|
* @returns {number}
|
||||||
|
* *
|
||||||
|
* @signature
|
||||||
|
* U.toHour(currentTimsestamp, extra)
|
||||||
|
* @example
|
||||||
|
* U.toHour('13:00') // => 1605532173
|
||||||
|
*/
|
||||||
|
export function toHour(currentTimsestamp: number, extra: number = 0): number {
|
||||||
|
return 3600000 - (currentTimsestamp % 3600000) + extra;
|
||||||
|
}
|
163
ts-src/utils.txt
Normal file
163
ts-src/utils.txt
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
///<reference path="../node_modules/@types/node/globals.d.ts"/>
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param timeString
|
||||||
|
* @param today
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const partOfDay = (timeString:string, today:boolean = false):string => {
|
||||||
|
console.log(new Date());
|
||||||
|
if (timeString === undefined || timeString === null)
|
||||||
|
timeString = (new Date()).getHours().toString();
|
||||||
|
|
||||||
|
if (today === undefined)
|
||||||
|
today = false;
|
||||||
|
|
||||||
|
const hours:number = parseInt(timeString.substring(0, 2),10);
|
||||||
|
|
||||||
|
let dayBit;
|
||||||
|
|
||||||
|
console.log('Hours', hours);
|
||||||
|
|
||||||
|
if (hours >= 0 && hours < 4)
|
||||||
|
dayBit = 'Late Night';
|
||||||
|
|
||||||
|
else if (hours >= 4 && hours < 7)
|
||||||
|
dayBit = 'Early Morning';
|
||||||
|
|
||||||
|
else if (hours >= 7 && hours < 12)
|
||||||
|
dayBit = 'Morning';
|
||||||
|
|
||||||
|
else if (hours >= 12 && hours < 17)
|
||||||
|
dayBit = 'Afternoon';
|
||||||
|
|
||||||
|
else if (hours < 21)
|
||||||
|
dayBit = 'Evening';
|
||||||
|
|
||||||
|
else
|
||||||
|
dayBit = 'Night';
|
||||||
|
|
||||||
|
if (today)
|
||||||
|
dayBit = dayBit === 'night' ? 'tonight' : `this ${dayBit}`;
|
||||||
|
|
||||||
|
console.log('partOfDay', dayBit);
|
||||||
|
|
||||||
|
return dayBit;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param extra
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const toHour = (extra:number = 0):number => {
|
||||||
|
const now = new Date();
|
||||||
|
return (3600000 - (now.getTime() % 3600000)) + extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const hourFloor = ():string => {
|
||||||
|
const now:Date = new Date();
|
||||||
|
|
||||||
|
return (~~(now.getTime() / 3600000) * 3600000).toString(32);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the distance between two latLongs
|
||||||
|
* @param lat1
|
||||||
|
* @param lon1
|
||||||
|
* @param lat2
|
||||||
|
* @param lon2
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const distance = (lat1:number, lon1:number, lat2:number, lon2:number) : number => {
|
||||||
|
const p = 0.017453292519943295; // Math.PI / 180
|
||||||
|
const c = Math.cos;
|
||||||
|
const a = 0.5 - c((lat2 - lat1) * p) / 2 +
|
||||||
|
c(lat1 * p) * c(lat2 * p) *
|
||||||
|
(1 - c((lon2 - lon1) * p)) / 2;
|
||||||
|
|
||||||
|
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maybe pluralize a count:
|
||||||
|
* EG:
|
||||||
|
* > 1 Bag
|
||||||
|
* > 5 Bags
|
||||||
|
*
|
||||||
|
* @param count
|
||||||
|
* @param noun
|
||||||
|
* @param suffix
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const maybePluralize = (count:number, noun:string, suffix = 's'):string =>
|
||||||
|
`${count} ${noun}${count !== 1 ? suffix : ''}`;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param fn
|
||||||
|
* @param time
|
||||||
|
* @returns {Function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const debounce = function (fn:Function, time:number):Function {
|
||||||
|
let timeout:NodeJS.Timeout;
|
||||||
|
|
||||||
|
return function (...args:any):any { // <-- not an arrow function
|
||||||
|
const functionCall = () => fn.apply(this, args);
|
||||||
|
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(functionCall, time);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback
|
||||||
|
* @param limit
|
||||||
|
* @returns {Function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const throttle = (callback:Function, limit:number):Function => {
|
||||||
|
var wait:boolean = false;
|
||||||
|
|
||||||
|
return function (...args:any):any {
|
||||||
|
if (!wait) {
|
||||||
|
callback.apply(null, args);
|
||||||
|
wait = true;
|
||||||
|
setTimeout(function () {
|
||||||
|
wait = false;
|
||||||
|
}, limit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param func
|
||||||
|
* @returns {function(): *}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
const once = function (func:Function): Function {
|
||||||
|
var alreadyCalled = false;
|
||||||
|
var result:Function;
|
||||||
|
|
||||||
|
return (...args: any): any => {
|
||||||
|
if (!alreadyCalled) {
|
||||||
|
result = func.apply(this, args);
|
||||||
|
alreadyCalled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
68
tsconfig.json
Normal file
68
tsconfig.json
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Basic Options */
|
||||||
|
"target":
|
||||||
|
"es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
|
||||||
|
"module":
|
||||||
|
"esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
|
||||||
|
|
||||||
|
"lib": [
|
||||||
|
"es6",
|
||||||
|
"es2017.object"
|
||||||
|
] /* Specify library files to be included in the compilation. */,
|
||||||
|
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||||
|
// "checkJs": true, /* Report errors in .js files. */
|
||||||
|
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||||
|
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||||
|
// "sourceMap": true, /* Generates corresponding '.map' file. */
|
||||||
|
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||||
|
"outDir": "./dist" /* Redirect output structure to the directory. */,
|
||||||
|
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||||
|
// "removeComments": true, /* Do not emit comments to output. */
|
||||||
|
// "noEmit": true, /* Do not emit outputs. */
|
||||||
|
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||||
|
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||||
|
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||||
|
"noEmit": false,
|
||||||
|
"declaration": false,
|
||||||
|
"declarationMap": false,
|
||||||
|
/* Strict Type-Checking Options */
|
||||||
|
"strict": true /* Enable all strict type-checking options. */,
|
||||||
|
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
|
||||||
|
"strictNullChecks": true /* Enable strict null checks. */,
|
||||||
|
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||||
|
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||||
|
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||||
|
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||||
|
|
||||||
|
/* Additional Checks */
|
||||||
|
"noUnusedLocals": true /* Report errors on unused locals. */,
|
||||||
|
"noUnusedParameters": false /* Report errors on unused parameters. */,
|
||||||
|
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||||
|
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
|
||||||
|
|
||||||
|
/* Module Resolution Options */
|
||||||
|
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||||
|
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||||
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
|
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||||
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
|
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
|
||||||
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||||
|
|
||||||
|
/* Source Map Options */
|
||||||
|
// "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||||
|
// "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||||
|
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||||
|
|
||||||
|
/* Experimental Options */
|
||||||
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */,
|
||||||
|
"skipLibCheck": true
|
||||||
|
},
|
||||||
|
"include": ["ts-src"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user