Compare commits
10 Commits
v1.0.1
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
| 35d2ef8580 | |||
| 5b69cecf9f | |||
| ef8b4e04ce | |||
| 082cb761c0 | |||
| 0968085084 | |||
| a629482a20 | |||
| c818e56f3e | |||
| 41e794b35d | |||
| 1a3faad442 | |||
| f9d771f079 |
28
.github/workflows/ci.yml
vendored
Normal file
28
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
name: JavaScriptUtilsVitest
|
||||||
|
run-name: ${{ github.actor}} runs vitest checks
|
||||||
|
|
||||||
|
# on:
|
||||||
|
# push:
|
||||||
|
# branches:
|
||||||
|
# - main
|
||||||
|
# pull_request:
|
||||||
|
# branches:
|
||||||
|
# - main
|
||||||
|
# - staging
|
||||||
|
# - development
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ci-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 23
|
||||||
|
- name: Run `npm install`
|
||||||
|
run: |
|
||||||
|
npm install
|
||||||
|
- name: Run vitest and report issues
|
||||||
|
run: npm run test:run
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1,3 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
|
coverage/*
|
||||||
|
package-lock.json
|
||||||
|
|||||||
18
ReadMe.md
18
ReadMe.md
@@ -100,19 +100,19 @@ Build with the following commands, the output will be stored in "build/js/output
|
|||||||
For full not minified version
|
For full not minified version
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm build utils-build
|
npm run utils-build
|
||||||
```
|
```
|
||||||
|
|
||||||
For minified build (but keeps the function names as is)
|
For minified build (but keeps the function names as is)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm build utils-min-build
|
npm run utils-min-build
|
||||||
```
|
```
|
||||||
|
|
||||||
Or build both at the same time
|
Or build both at the same time
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm build utils-build-all
|
npm run utils-build-all
|
||||||
```
|
```
|
||||||
|
|
||||||
## Develop
|
## Develop
|
||||||
@@ -141,6 +141,18 @@ vitest is used for all usage tests
|
|||||||
npx vitest
|
npx vitest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
for one stop tests
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run test:run
|
||||||
|
```
|
||||||
|
|
||||||
|
To show the full coverate (of all files)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run test:coverage
|
||||||
|
```
|
||||||
|
|
||||||
Currently covered:
|
Currently covered:
|
||||||
|
|
||||||
- FormatBytes
|
- FormatBytes
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
console.log('AELX OUT: %o', aelx_out);
|
console.log('AELX OUT: %o', aelx_out);
|
||||||
build_test.innerHTML += aelx_out;
|
build_test.innerHTML += aelx_out;
|
||||||
|
|
||||||
|
// console.log("TEST URL: %o", parseQueryString("http://foor.org/?key=value"));
|
||||||
|
console.log("TEST URL: %o", getQueryStringParam('', "http://foor.org/?param=foo¶m=other", true));
|
||||||
|
console.log("TEST URL: %o", parseQueryString("http://foor.org/?param=foo¶m=other", ''));
|
||||||
|
// console.log("TEST URL: %o", getQueryStringParam('', "http://foor.org/?key=value&key=other&key=value&bar="));
|
||||||
|
|
||||||
// console.log('TR: %s', l10n.__('Original'));
|
// console.log('TR: %s', l10n.__('Original'));
|
||||||
// console.log('TR: %s', l10n.__('Not exists'));
|
// console.log('TR: %s', l10n.__('Not exists'));
|
||||||
});
|
});
|
||||||
|
|||||||
2443
package-lock.json
generated
2443
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,8 @@
|
|||||||
"main": "",
|
"main": "",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "vitest",
|
"test": "vitest",
|
||||||
"coverage": "vitest run --coverage",
|
"test:run": "vitest run",
|
||||||
|
"test:coverage": "vitest run --coverage",
|
||||||
"utils-min-build": "node_modules/esbuild/bin/esbuild utils.min=src/utils.mjs --outdir=build/js/output/ --format=esm --bundle --charset=utf8 --tree-shaking=false --minify-whitespace --minify-syntax --sourcemap",
|
"utils-min-build": "node_modules/esbuild/bin/esbuild utils.min=src/utils.mjs --outdir=build/js/output/ --format=esm --bundle --charset=utf8 --tree-shaking=false --minify-whitespace --minify-syntax --sourcemap",
|
||||||
"utils-build": "node_modules/esbuild/bin/esbuild utils=src/utils.mjs --outdir=build/js/output/ --format=esm --bundle --charset=utf8 --tree-shaking=false",
|
"utils-build": "node_modules/esbuild/bin/esbuild utils=src/utils.mjs --outdir=build/js/output/ --format=esm --bundle --charset=utf8 --tree-shaking=false",
|
||||||
"utils-build-all": "npm run utils-min-build && npm run utils-build",
|
"utils-build-all": "npm run utils-min-build && npm run utils-build",
|
||||||
@@ -17,9 +18,11 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.20.0",
|
"@eslint/js": "^9.20.0",
|
||||||
"@types/jquery": "^3.5.32",
|
"@types/jquery": "^3.5.32",
|
||||||
|
"@vitest/coverage-v8": "^3.0.8",
|
||||||
"esbuild": "^0.25.0",
|
"esbuild": "^0.25.0",
|
||||||
"eslint": "^9.20.1",
|
"eslint": "^9.20.1",
|
||||||
"globals": "^15.15.0",
|
"globals": "^15.15.0",
|
||||||
|
"jsdom": "^26.0.0",
|
||||||
"vitest": "^3.0.8"
|
"vitest": "^3.0.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
127
src/utils.mjs
127
src/utils.mjs
@@ -10,6 +10,8 @@ import {
|
|||||||
isFunction as _isFunction,
|
isFunction as _isFunction,
|
||||||
executeFunctionByName as _executeFunctionByName,
|
executeFunctionByName as _executeFunctionByName,
|
||||||
isObject as _isObject,
|
isObject as _isObject,
|
||||||
|
isArray as _isArray,
|
||||||
|
isIterable as _isIterable,
|
||||||
getObjectCount as _getObjectCount,
|
getObjectCount as _getObjectCount,
|
||||||
keyInObject as _keyInObject,
|
keyInObject as _keyInObject,
|
||||||
getKeyByValue as _getKeyByValue,
|
getKeyByValue as _getKeyByValue,
|
||||||
@@ -61,7 +63,11 @@ import {
|
|||||||
} from './utils/FormatBytes.mjs';
|
} from './utils/FormatBytes.mjs';
|
||||||
import {
|
import {
|
||||||
parseQueryString as _parseQueryString,
|
parseQueryString as _parseQueryString,
|
||||||
getQueryStringParam as _getQueryStringParam
|
getQueryStringParam as _getQueryStringParam,
|
||||||
|
hasUrlParameter as _hasUrlParameter,
|
||||||
|
getUrlParameter as _getUrlParameter,
|
||||||
|
updateUrlParameter as _updateUrlParameter,
|
||||||
|
removeUrlParameter as _removeUrlParameter,
|
||||||
} from './utils/UrlParser.mjs';
|
} from './utils/UrlParser.mjs';
|
||||||
import {
|
import {
|
||||||
loginLogout as _loginLogout,
|
loginLogout as _loginLogout,
|
||||||
@@ -81,6 +87,11 @@ import { l10nTranslation } from './utils/l10nTranslation.mjs';
|
|||||||
import { HtmlElementCreator } from './utils/HtmlElementCreator.mjs';
|
import { HtmlElementCreator } from './utils/HtmlElementCreator.mjs';
|
||||||
import { ActionBox } from './utils/ActionBox.mjs';
|
import { ActionBox } from './utils/ActionBox.mjs';
|
||||||
import { LoginNavMenu } from './utils/LoginNavMenu.mjs';
|
import { LoginNavMenu } from './utils/LoginNavMenu.mjs';
|
||||||
|
import {
|
||||||
|
isWebkit as _isWebkit,
|
||||||
|
isMobileWebKit as _isMobileWebKit,
|
||||||
|
isDesktopWebKit as _isDesktopWebKit
|
||||||
|
} from './utils/BrowserDetect.mjs';
|
||||||
|
|
||||||
let aiob = new ActionIndicatorOverlayBox();
|
let aiob = new ActionIndicatorOverlayBox();
|
||||||
let hec = new HtmlElementCreator();
|
let hec = new HtmlElementCreator();
|
||||||
@@ -433,8 +444,8 @@ function executeFunctionByName(functionName, context) // eslint-disable-line no-
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* checks if a variable is an object
|
* checks if a variable is an object
|
||||||
* @param {any} val possible object
|
* @param {any} val possible object
|
||||||
* @return {Boolean} true/false if it is an object or not
|
* @return {Boolean} true/false if it is an object or not
|
||||||
*/
|
*/
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
function isObject(val) // eslint-disable-line no-unused-vars
|
function isObject(val) // eslint-disable-line no-unused-vars
|
||||||
@@ -442,6 +453,28 @@ function isObject(val) // eslint-disable-line no-unused-vars
|
|||||||
return _isObject(val);
|
return _isObject(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if variable is array
|
||||||
|
* @param {any} val possible array
|
||||||
|
* @returns {Boolean} true/false if it an array
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function isArray(val) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _isArray(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks if a variable is an iterable
|
||||||
|
* @param {any} val possible iterable
|
||||||
|
* @return {Boolean} true/false if it is an object or not
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function isIterable(val) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _isIterable(val);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the length of an object (entries)
|
* get the length of an object (entries)
|
||||||
* @param {Object} object object to check
|
* @param {Object} object object to check
|
||||||
@@ -937,16 +970,14 @@ function html_options_refill(name, data, sort = '') // eslint-disable-line no-un
|
|||||||
* ALTERNATIVE CODE
|
* ALTERNATIVE CODE
|
||||||
* var url = new URL(window.location.href);
|
* var url = new URL(window.location.href);
|
||||||
* param_uid = url.searchParams.get('uid');
|
* param_uid = url.searchParams.get('uid');
|
||||||
* @param {String} [query=''] the query string to parse
|
* @param {String} [query=''] the query string to parse, if not set will auto fill
|
||||||
* if not set will auto fill
|
* @param {String} [return_key=''] if set only returns this key entry or empty for none
|
||||||
* @param {String} [return_key=''] if set only returns this key entry
|
* @param {Boolean} [single=false] if set to true then only the first found will be returned
|
||||||
* or empty for none
|
|
||||||
* @return {Object|String} parameter entry list
|
|
||||||
*/
|
*/
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
function parseQueryString(query = '', return_key = '') // eslint-disable-line no-unused-vars
|
function parseQueryString(query = '', return_key = '', single = false) // eslint-disable-line no-unused-vars
|
||||||
{
|
{
|
||||||
return _parseQueryString(query, return_key);
|
return _parseQueryString(query, return_key, single);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -955,15 +986,12 @@ function parseQueryString(query = '', return_key = '') // eslint-disable-line no
|
|||||||
* if a parameter is set several times it will be returned as an array
|
* if a parameter is set several times it will be returned as an array
|
||||||
* if search parameter set and nothing found and empty string is returned
|
* if search parameter set and nothing found and empty string is returned
|
||||||
* if no parametes exist and no serach is set and empty object is returned
|
* if no parametes exist and no serach is set and empty object is returned
|
||||||
* @param {String} [search=''] if set searches for this entry, if empty
|
* @param {String} [search=''] if set searches for this entry, if empty all parameters are returned
|
||||||
* all parameters are returned
|
* @param {String} [query=''] different query string to parse, if not set (default) the current window href is used
|
||||||
* @param {String} [query=''] different query string to parse, if not
|
* @param {Boolean} [single=false] if set to true then only the first found will be returned
|
||||||
* set (default) the current window href is used
|
* @return {Object|Array|String} if search is empty, object, if search is set
|
||||||
* @param {Boolean} [single=false] if set to true then only the first found
|
* and only one entry, then string, else array
|
||||||
* will be returned
|
* unless single is true
|
||||||
* @return {Object|Array|String} if search is empty, object, if search is set
|
|
||||||
* and only one entry, then string, else array
|
|
||||||
* unless single is true
|
|
||||||
*/
|
*/
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
function getQueryStringParam(search = '', query = '', single = false) // eslint-disable-line no-unused-vars
|
function getQueryStringParam(search = '', query = '', single = false) // eslint-disable-line no-unused-vars
|
||||||
@@ -971,6 +999,51 @@ function getQueryStringParam(search = '', query = '', single = false) // eslint-
|
|||||||
return _getQueryStringParam(search, query, single);
|
return _getQueryStringParam(search, query, single);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add or update a query parameter in the current URL and update the browser's address bar
|
||||||
|
* @param {string} key - The parameter name to add or update
|
||||||
|
* @param {string} value - The value to set for the parameter
|
||||||
|
* @param {boolean} [reload=false] - Whether to reload the page after updating the URL
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function updateUrlParameter(key, value, reload = false) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _updateUrlParameter(key, value, reload);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a parameter from the current URL and update the browser's address bar
|
||||||
|
* @param {string} key - The parameter name to remove
|
||||||
|
* @param {boolean} [reload=false] - Whether to reload the page after updating the URL
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function removeUrlParameter(key, reload = false) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _removeUrlParameter(key, reload);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if key exists as URL parameter
|
||||||
|
* @param {String} key URL parameter to search
|
||||||
|
* @returns {Boolean} True if key exists
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function hasUrlParameter(key) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _hasUrlParameter(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return one value for a URL paramter or null if not found
|
||||||
|
* @param {String} key Which URL parameter to get
|
||||||
|
* @returns {String|Null} URL parameter content
|
||||||
|
*/
|
||||||
|
// @ts-ignore
|
||||||
|
function getUrlParameter(key) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _getUrlParameter(key);
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: ACL LOGIN
|
// MARK: ACL LOGIN
|
||||||
// *** MASTER logout call
|
// *** MASTER logout call
|
||||||
/**
|
/**
|
||||||
@@ -1156,4 +1229,20 @@ function adjustActionBoxHeight(target_id = 'actionBox', override = 0, content_ov
|
|||||||
ab.adjustActionBoxHeight(target_id, override, content_override);
|
ab.adjustActionBoxHeight(target_id, override, content_override);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: BROWSER DETECTION
|
||||||
|
function isWebkit() // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _isWebkit();
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMobileWebKit() // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _isMobileWebKit();
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDesktopWebKit() // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
return _isDesktopWebKit();
|
||||||
|
}
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Creator: Clemens Schwaighofer
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export { ActionBox };
|
export { ActionBox };
|
||||||
import { keyInObject, getObjectCount } from './JavaScriptHelpers.mjs';
|
import { objectKeyExists, getObjectCount } from './JavaScriptHelpers.mjs';
|
||||||
import { exists } from './DomHelpers.mjs';
|
import { exists } from './DomHelpers.mjs';
|
||||||
import { setCenter, getWindowSize } from './ResizingAndMove.mjs';
|
import { setCenter, getWindowSize } from './ResizingAndMove.mjs';
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ class ActionBox {
|
|||||||
}
|
}
|
||||||
// adjust zIndex so its above all other and set action box zindex +1
|
// adjust zIndex so its above all other and set action box zindex +1
|
||||||
$('#overlayBox').show();
|
$('#overlayBox').show();
|
||||||
if (!keyInObject(target_id, this.zIndex.boxes)) {
|
if (!objectKeyExists(this.zIndex.boxes, target_id)) {
|
||||||
this.zIndex.boxes[target_id] = this.zIndex.max;
|
this.zIndex.boxes[target_id] = this.zIndex.max;
|
||||||
// increase by ten
|
// increase by ten
|
||||||
this.zIndex.max += 10;
|
this.zIndex.max += 10;
|
||||||
@@ -197,7 +197,7 @@ class ActionBox {
|
|||||||
}
|
}
|
||||||
// clear storage object
|
// clear storage object
|
||||||
if (
|
if (
|
||||||
keyInObject(target_id, this.action_box_storage) && clean === true
|
objectKeyExists(this.action_box_storage, target_id) && clean === true
|
||||||
) {
|
) {
|
||||||
this.action_box_storage[target_id] = {};
|
this.action_box_storage[target_id] = {};
|
||||||
}
|
}
|
||||||
@@ -249,18 +249,18 @@ class ActionBox {
|
|||||||
settings = {},
|
settings = {},
|
||||||
show_close = true
|
show_close = true
|
||||||
) {
|
) {
|
||||||
if (!keyInObject(target_id, this.action_box_storage)) {
|
if (!objectKeyExists(this.action_box_storage, target_id)) {
|
||||||
this.action_box_storage[target_id] = {};
|
this.action_box_storage[target_id] = {};
|
||||||
}
|
}
|
||||||
// settings can have the following
|
// settings can have the following
|
||||||
// : header_css:[]
|
// : header_css:[]
|
||||||
// : action_box_css:[]
|
// : action_box_css:[]
|
||||||
let header_css = [];
|
let header_css = [];
|
||||||
if (keyInObject('header_css', settings)) {
|
if (objectKeyExists(settings, 'header_css')) {
|
||||||
header_css = settings.header_css;
|
header_css = settings.header_css;
|
||||||
}
|
}
|
||||||
let action_box_css = [];
|
let action_box_css = [];
|
||||||
if (keyInObject('action_box_css', settings)) {
|
if (objectKeyExists(settings, 'action_box_css')) {
|
||||||
action_box_css = settings.action_box_css;
|
action_box_css = settings.action_box_css;
|
||||||
}
|
}
|
||||||
let elements = [];
|
let elements = [];
|
||||||
@@ -288,7 +288,7 @@ class ActionBox {
|
|||||||
// if we have header content, add that here
|
// if we have header content, add that here
|
||||||
if (getObjectCount(headers) > 0) {
|
if (getObjectCount(headers) > 0) {
|
||||||
// if the element has an entry called "raw_string" then this does not need to be converted
|
// if the element has an entry called "raw_string" then this does not need to be converted
|
||||||
if (keyInObject('raw_string', headers)) {
|
if (objectKeyExists(headers, 'raw_string')) {
|
||||||
elements.push(headers.raw_string);
|
elements.push(headers.raw_string);
|
||||||
} else {
|
} else {
|
||||||
elements.push(this.hec.phfo(headers));
|
elements.push(this.hec.phfo(headers));
|
||||||
@@ -297,7 +297,7 @@ class ActionBox {
|
|||||||
// main content part (this should NOT be empty), if empty, add empty _content block
|
// main content part (this should NOT be empty), if empty, add empty _content block
|
||||||
if (getObjectCount(contents) > 0) {
|
if (getObjectCount(contents) > 0) {
|
||||||
// if the element has an entry called "raw_string" then this does not need to be converted
|
// if the element has an entry called "raw_string" then this does not need to be converted
|
||||||
if (keyInObject('raw_string', contents)) {
|
if (objectKeyExists(contents, 'raw_string')) {
|
||||||
elements.push(contents.raw_string);
|
elements.push(contents.raw_string);
|
||||||
} else {
|
} else {
|
||||||
elements.push(this.hec.phfo(contents));
|
elements.push(this.hec.phfo(contents));
|
||||||
|
|||||||
31
src/utils/BrowserDetect.mjs
Normal file
31
src/utils/BrowserDetect.mjs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
Description: Browser detect
|
||||||
|
Date: 2025/11.25
|
||||||
|
Creator: Clemens Schwaighofer
|
||||||
|
*/
|
||||||
|
|
||||||
|
export { isWebkit, isMobileWebKit, isDesktopWebKit };
|
||||||
|
|
||||||
|
// Desktop Safari, all mobile WebKit browsers on iOS and webview iOS
|
||||||
|
function isWebkit()
|
||||||
|
{
|
||||||
|
return "GestureEvent" in window;
|
||||||
|
}
|
||||||
|
|
||||||
|
// all mobile webkit browsers and webview iOS
|
||||||
|
function isMobileWebKit()
|
||||||
|
{
|
||||||
|
return "ongesturechange" in window;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Desktop Safari
|
||||||
|
function isDesktopWebKit()
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
typeof window !== 'undefined' &&
|
||||||
|
'safari' in window &&
|
||||||
|
'pushNotification' in window.safari
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Date Time functions
|
Description: Date Time functions
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: DOM Helpers
|
Description: DOM Helpers
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Byte string formatting
|
Description: Byte string formatting
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -19,6 +19,9 @@ function formatBytes(bytes)
|
|||||||
if (typeof bytes === "bigint") {
|
if (typeof bytes === "bigint") {
|
||||||
bytes = Number(bytes);
|
bytes = Number(bytes);
|
||||||
}
|
}
|
||||||
|
if (isNaN(bytes)) {
|
||||||
|
return bytes.toString();
|
||||||
|
}
|
||||||
do {
|
do {
|
||||||
bytes = bytes / 1024;
|
bytes = bytes / 1024;
|
||||||
i++;
|
i++;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: DOM Management and HTML builder
|
Description: DOM Management and HTML builder
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ export {
|
|||||||
// deprecated name
|
// deprecated name
|
||||||
HtmlElementCreator as DomManagement
|
HtmlElementCreator as DomManagement
|
||||||
};
|
};
|
||||||
import { deepCopyFunction, isObject } from './JavaScriptHelpers.mjs';
|
import { deepCopyFunction, isObject, isArray } from './JavaScriptHelpers.mjs';
|
||||||
|
|
||||||
class HtmlElementCreator {
|
class HtmlElementCreator {
|
||||||
/**
|
/**
|
||||||
@@ -50,7 +50,7 @@ class HtmlElementCreator {
|
|||||||
base.sub.push(deepCopyFunction(attach));
|
base.sub.push(deepCopyFunction(attach));
|
||||||
} else {
|
} else {
|
||||||
// sub check
|
// sub check
|
||||||
if (isObject(base.sub) && base.sub.length > 0) {
|
if (isArray(base.sub) && base.sub.length > 0) {
|
||||||
for (var i = 0; i < base.sub.length; i ++) {
|
for (var i = 0; i < base.sub.length; i ++) {
|
||||||
// recursive call to sub element
|
// recursive call to sub element
|
||||||
this.ael(base.sub[i], attach, id);
|
this.ael(base.sub[i], attach, id);
|
||||||
@@ -209,7 +209,7 @@ class HtmlElementCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// second CSS
|
// second CSS
|
||||||
if (isObject(tree.css) && tree.css.length > 0) {
|
if (isArray(tree.css) && tree.css.length > 0) {
|
||||||
line += ' class="';
|
line += ' class="';
|
||||||
for (i = 0; i < tree.css.length; i ++) {
|
for (i = 0; i < tree.css.length; i ++) {
|
||||||
line += tree.css[i] + ' ';
|
line += tree.css[i] + ' ';
|
||||||
@@ -234,7 +234,7 @@ class HtmlElementCreator {
|
|||||||
// dive into sub tree to attach sub nodes
|
// dive into sub tree to attach sub nodes
|
||||||
// NOTES: we can have content (text) AND sub nodes at the same level
|
// NOTES: we can have content (text) AND sub nodes at the same level
|
||||||
// CONTENT (TEXT) takes preference over SUB NODE in order
|
// CONTENT (TEXT) takes preference over SUB NODE in order
|
||||||
if (isObject(tree.sub) && tree.sub.length > 0) {
|
if (isArray(tree.sub) && tree.sub.length > 0) {
|
||||||
if (tree.content) {
|
if (tree.content) {
|
||||||
content.push(tree.content);
|
content.push(tree.content);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: HTML Helpers
|
Description: HTML Helpers
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
/*
|
/*
|
||||||
Description: JavaScript Helpers
|
Description: JavaScript Helpers
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export {
|
export {
|
||||||
errorCatch, isFunction, executeFunctionByName,
|
errorCatch, isFunction,
|
||||||
isObject, getObjectCount,
|
executeFunctionByName, runFunction, runFunctionArgsArray,
|
||||||
|
isObject, isIterable, isArray, getObjectCount,
|
||||||
keyInObject, objectKeyExists,
|
keyInObject, objectKeyExists,
|
||||||
getKeyByValue, valueInObject, objectValueExists,
|
getKeyByValue, valueInObject, objectValueExists,
|
||||||
deepCopyFunction
|
deepCopyFunction
|
||||||
@@ -77,6 +78,35 @@ function executeFunctionByName(functionName, context /*, args */)
|
|||||||
return context[func].apply(context, args);
|
return context[func].apply(context, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call a function by string
|
||||||
|
* call runFunctionArgArray
|
||||||
|
* @param {string} name Function name to call
|
||||||
|
* @param {Array} arguments all next function arguments are passed on as argument to the function
|
||||||
|
* @returns void
|
||||||
|
*/
|
||||||
|
function runFunction(name)
|
||||||
|
{
|
||||||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
runFunctionArgsArray(name, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call a function with a string, argumens as array
|
||||||
|
* @param {string} name Function name to call
|
||||||
|
* @param {array} args function arguments as arry
|
||||||
|
* @returns void
|
||||||
|
*/
|
||||||
|
function runFunctionArgsArray(name, args)
|
||||||
|
{
|
||||||
|
var fn = window[name];
|
||||||
|
if(typeof fn !== 'function') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn.apply(window, args);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks if a variable is an object
|
* checks if a variable is an object
|
||||||
* @param {any} val possible object
|
* @param {any} val possible object
|
||||||
@@ -84,10 +114,33 @@ function executeFunctionByName(functionName, context /*, args */)
|
|||||||
*/
|
*/
|
||||||
function isObject(val)
|
function isObject(val)
|
||||||
{
|
{
|
||||||
if (val === null) {
|
return val !== null && typeof val === 'object' && !Array.isArray(val);
|
||||||
return false;
|
}
|
||||||
}
|
|
||||||
return ((typeof val === 'function') || (typeof val === 'object'));
|
/**
|
||||||
|
* Check if variable is array
|
||||||
|
* @param {any} val possible array
|
||||||
|
* @returns {Boolean} true/false if it an array
|
||||||
|
*/
|
||||||
|
function isArray(val)
|
||||||
|
{
|
||||||
|
return val !== null && Array.isArray(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if any iterable type
|
||||||
|
* @param {any} val possible iteratable object/array
|
||||||
|
* @returns {Boolean} true/false if it is iterable
|
||||||
|
*/
|
||||||
|
function isIterable(val)
|
||||||
|
{
|
||||||
|
if (val == null) return false;
|
||||||
|
|
||||||
|
// Check if it's iterable, but excldue strings
|
||||||
|
if (typeof val[Symbol.iterator] === 'function' && typeof val !== 'string') return true;
|
||||||
|
|
||||||
|
// Check if it's a plain object
|
||||||
|
return typeof val === 'object' && val.constructor === Object;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Login access and menu
|
Description: Login access and menu
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Login access and menu
|
Description: Login access and menu
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Resize and Move Javascript
|
Description: Resize and Move Javascript
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: String Helpers
|
Description: String Helpers
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +1,26 @@
|
|||||||
/*
|
/*
|
||||||
Description: HTML Helpers
|
Description: HTML Helpers
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export { parseQueryString, getQueryStringParam };
|
export { parseQueryString, getQueryStringParam, hasUrlParameter, getUrlParameter, updateUrlParameter, removeUrlParameter };
|
||||||
import { keyInObject } from './JavaScriptHelpers.mjs';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* NOTE: this original code was wrong, now using URL and parsing through
|
||||||
|
* getQueryStringParam
|
||||||
* parses a query string from window.location.search.substring(1)
|
* parses a query string from window.location.search.substring(1)
|
||||||
* ALTERNATIVE CODE
|
* ALTERNATIVE CODE
|
||||||
* var url = new URL(window.location.href);
|
* var url = new URL(window.location.href);
|
||||||
* param_uid = url.searchParams.get('uid');
|
* param_uid = url.searchParams.get('uid');
|
||||||
* @param {String} [query=''] the query string to parse
|
* @param {String} [query=''] the query string to parse, if not set will auto fill
|
||||||
* if not set will auto fill
|
* @param {String} [return_key=''] if set only returns this key entry or empty for none
|
||||||
* @param {String} [return_key=''] if set only returns this key entry
|
* @param {Boolean} [single=false] if set to true then only the first found will be returned
|
||||||
* or empty for none
|
* @return {Object|String} parameter entry list
|
||||||
* @return {Object|String} parameter entry list
|
|
||||||
*/
|
*/
|
||||||
function parseQueryString(query = '', return_key = '')
|
function parseQueryString(query = '', return_key = '', single = false)
|
||||||
{
|
{
|
||||||
if (!query) {
|
return getQueryStringParam(return_key, query, single);
|
||||||
query = window.location.search.substring(1);
|
|
||||||
}
|
|
||||||
var vars = query.split('&');
|
|
||||||
var query_string = {};
|
|
||||||
for (var i = 0; i < vars.length; i++) {
|
|
||||||
var pair = vars[i].split('=');
|
|
||||||
var key = decodeURIComponent(pair[0]);
|
|
||||||
var value = decodeURIComponent(pair[1]);
|
|
||||||
// skip over run if there is nothing
|
|
||||||
if (!key || value === 'undefined') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// If first entry with this name
|
|
||||||
if (typeof query_string[key] === 'undefined') {
|
|
||||||
query_string[key] = decodeURIComponent(value);
|
|
||||||
// If second entry with this name
|
|
||||||
} else if (typeof query_string[key] === 'string') {
|
|
||||||
var arr = [query_string[key], decodeURIComponent(value)];
|
|
||||||
query_string[key] = arr;
|
|
||||||
// If third or later entry with this name
|
|
||||||
} else {
|
|
||||||
query_string[key].push(decodeURIComponent(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (return_key) {
|
|
||||||
if (keyInObject(return_key, query_string)) {
|
|
||||||
return query_string[return_key];
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return query_string;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -62,15 +29,12 @@ function parseQueryString(query = '', return_key = '')
|
|||||||
* if a parameter is set several times it will be returned as an array
|
* if a parameter is set several times it will be returned as an array
|
||||||
* if search parameter set and nothing found and empty string is returned
|
* if search parameter set and nothing found and empty string is returned
|
||||||
* if no parametes exist and no serach is set and empty object is returned
|
* if no parametes exist and no serach is set and empty object is returned
|
||||||
* @param {String} [search=''] if set searches for this entry, if empty
|
* @param {String} [search=''] if set searches for this entry, if empty all parameters are returned
|
||||||
* all parameters are returned
|
* @param {String} [query=''] different query string to parse, if not set (default) the current window href is used
|
||||||
* @param {String} [query=''] different query string to parse, if not
|
* @param {Boolean} [single=false] if set to true then only the first found will be returned
|
||||||
* set (default) the current window href is used
|
* @return {Object|Array|String} if search is empty, object, if search is set
|
||||||
* @param {Boolean} [single=false] if set to true then only the first found
|
* and only one entry, then string, else array
|
||||||
* will be returned
|
* unless single is true
|
||||||
* @return {Object|Array|String} if search is empty, object, if search is set
|
|
||||||
* and only one entry, then string, else array
|
|
||||||
* unless single is true
|
|
||||||
*/
|
*/
|
||||||
function getQueryStringParam(search = '', query = '', single = false)
|
function getQueryStringParam(search = '', query = '', single = false)
|
||||||
{
|
{
|
||||||
@@ -105,4 +69,74 @@ function getQueryStringParam(search = '', query = '', single = false)
|
|||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if key exists as URL parameter
|
||||||
|
* @param {String} key URL parameter to search
|
||||||
|
* @returns {Boolean} True if key exists
|
||||||
|
*/
|
||||||
|
function hasUrlParameter(key)
|
||||||
|
{
|
||||||
|
var urlParams = new URLSearchParams(window.location.search);
|
||||||
|
return urlParams.has(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return one value for a URL paramter or null if not found
|
||||||
|
* @param {String} key Which URL parameter to get
|
||||||
|
* @returns {String|Null} URL parameter content
|
||||||
|
*/
|
||||||
|
function getUrlParameter(key)
|
||||||
|
{
|
||||||
|
var urlParams = new URLSearchParams(window.location.search);
|
||||||
|
return urlParams.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add or update a query parameter in the current URL and update the browser's address bar
|
||||||
|
* @param {string} key - The parameter name to add or update
|
||||||
|
* @param {string} value - The value to set for the parameter
|
||||||
|
* @param {boolean} [reload=false] - Whether to reload the page after updating the URL
|
||||||
|
*/
|
||||||
|
function updateUrlParameter(key, value, reload = false)
|
||||||
|
{
|
||||||
|
// Create a URL object from the current URL
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
|
||||||
|
// Set or update the parameter
|
||||||
|
url.searchParams.set(key, value);
|
||||||
|
|
||||||
|
const newUrl = url.toString();
|
||||||
|
|
||||||
|
// Update the browser's address bar without reloading the page
|
||||||
|
window.history.pushState({ path: newUrl }, '', newUrl);
|
||||||
|
|
||||||
|
// Optionally reload the page
|
||||||
|
if (reload) {
|
||||||
|
// window.location.href = newUrl;
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a parameter from the current URL and update the browser's address bar
|
||||||
|
* @param {string} key - The parameter name to remove
|
||||||
|
* @param {boolean} [reload=false] - Whether to reload the page after updating the URL
|
||||||
|
*/
|
||||||
|
function removeUrlParameter(key, reload = false)
|
||||||
|
{
|
||||||
|
// Create a URL object from the current URL
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
|
||||||
|
// Remove the parameter if it exists
|
||||||
|
url.searchParams.delete(key);
|
||||||
|
|
||||||
|
// Update the browser's address bar without reloading the page
|
||||||
|
window.history.pushState({}, '', url.toString());
|
||||||
|
|
||||||
|
// Optionally reload the page
|
||||||
|
if (reload) {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// __EMD__
|
// __EMD__
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Description: Translation call
|
Description: Translation call
|
||||||
Date: 2025//3/6
|
Date: 2025/3/6
|
||||||
Creator: Clemens Schwaighofer
|
Creator: Clemens Schwaighofer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ import {
|
|||||||
} from '../src/utils/FormatBytes.mjs';
|
} from '../src/utils/FormatBytes.mjs';
|
||||||
|
|
||||||
let bytes_map = [
|
let bytes_map = [
|
||||||
|
{
|
||||||
|
"in": "120MB",
|
||||||
|
"out": "120MB",
|
||||||
|
"out_l": "120MB",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"in": -123123123,
|
"in": -123123123,
|
||||||
"out": "-120237.42kB",
|
"out": "-120237.42kB",
|
||||||
@@ -57,6 +62,7 @@ describe("formatBytes", () => {
|
|||||||
it('convert bytes to human readable, round up to next set', () => {
|
it('convert bytes to human readable, round up to next set', () => {
|
||||||
// expect(formatBytes(1021152)).toBe('0.97MB');
|
// expect(formatBytes(1021152)).toBe('0.97MB');
|
||||||
for (const bytes of bytes_map) {
|
for (const bytes of bytes_map) {
|
||||||
|
// @ts-ignore
|
||||||
expect(formatBytes(bytes.in)).toBe(bytes.out);
|
expect(formatBytes(bytes.in)).toBe(bytes.out);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -66,6 +72,7 @@ describe("formatBytesLong", () => {
|
|||||||
it('convert bytes to human readable, keep on current set', () => {
|
it('convert bytes to human readable, keep on current set', () => {
|
||||||
expect(formatBytesLong(1021152)).toBe('997.22 KB');
|
expect(formatBytesLong(1021152)).toBe('997.22 KB');
|
||||||
for (const bytes of bytes_map) {
|
for (const bytes of bytes_map) {
|
||||||
|
// @ts-ignore
|
||||||
expect(formatBytesLong(bytes.in)).toBe(bytes.out_l);
|
expect(formatBytesLong(bytes.in)).toBe(bytes.out_l);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -257,6 +257,41 @@ describe("ael", () => {
|
|||||||
"tag": "div"
|
"tag": "div"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
let test_cel = hec.ael(
|
||||||
|
hec.cel('div', 'block-id'),
|
||||||
|
hec.cel('div', 'sub-id'),
|
||||||
|
);
|
||||||
|
expect(hec.ael(test_cel, hec.cel('div', 'new-block'), 'sub-id')).toEqual(
|
||||||
|
{
|
||||||
|
"content": "",
|
||||||
|
"css": [],
|
||||||
|
"id": "block-id",
|
||||||
|
"name": undefined,
|
||||||
|
"options": {},
|
||||||
|
"sub": [
|
||||||
|
{
|
||||||
|
"content": "",
|
||||||
|
"css": [],
|
||||||
|
"id": "sub-id",
|
||||||
|
"name": undefined,
|
||||||
|
"options": {},
|
||||||
|
"sub": [
|
||||||
|
{
|
||||||
|
"content": "",
|
||||||
|
"css": [],
|
||||||
|
"id": "new-block",
|
||||||
|
"name": undefined,
|
||||||
|
"options": {},
|
||||||
|
"sub": [],
|
||||||
|
"tag": "div"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tag": "div"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tag": "div"
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -640,11 +675,11 @@ describe("phfo", () => {
|
|||||||
"id": "block test",
|
"id": "block test",
|
||||||
"in": hec.aelx(hec.cel('div', 'outer-id'),
|
"in": hec.aelx(hec.cel('div', 'outer-id'),
|
||||||
hec.aelx(hec.cel('div', 'inner-id'),
|
hec.aelx(hec.cel('div', 'inner-id'),
|
||||||
hec.cel('input', 'some-id', '', ['abc'], {"type": "button", "onclick": "send()"})
|
hec.cel('input', 'some-id', '', ['abc'], {"type": "button", "onclick": "send()"}),
|
||||||
|
hec.cel('div', '', 'content')
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
"out": '<div id="outer-id"><div id="inner-id"><input id="some-id" name="some-id" class="abc" type="button" onclick="send()"></div></div>'
|
"out": '<div id="outer-id"><div id="inner-id"><input id="some-id" name="some-id" class="abc" type="button" onclick="send()"><div>content</div></div></div>'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
for (const cel_entry of cel_list) {
|
for (const cel_entry of cel_list) {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import {
|
|||||||
// isFunction,
|
// isFunction,
|
||||||
// executeFunctionByName,
|
// executeFunctionByName,
|
||||||
isObject,
|
isObject,
|
||||||
|
isArray,
|
||||||
|
isIterable,
|
||||||
getObjectCount,
|
getObjectCount,
|
||||||
keyInObject,
|
keyInObject,
|
||||||
objectKeyExists,
|
objectKeyExists,
|
||||||
@@ -30,15 +32,57 @@ describe("isObject", () => {
|
|||||||
let is_object = {
|
let is_object = {
|
||||||
"a": 1
|
"a": 1
|
||||||
};
|
};
|
||||||
|
let empty_array = [];
|
||||||
|
let is_array = [1, 2, 3];
|
||||||
let is_string = "";
|
let is_string = "";
|
||||||
let is_number = 1;
|
let is_number = 1;
|
||||||
expect(isObject(empty_object)).toEqual(true);
|
expect(isObject(empty_object)).toEqual(true);
|
||||||
expect(isObject(is_object)).toEqual(true);
|
expect(isObject(is_object)).toEqual(true);
|
||||||
|
expect(isObject(empty_array)).toEqual(false);
|
||||||
|
expect(isObject(is_array)).toEqual(false);
|
||||||
expect(isObject(is_string)).toEqual(false);
|
expect(isObject(is_string)).toEqual(false);
|
||||||
expect(isObject(is_number)).toEqual(false);
|
expect(isObject(is_number)).toEqual(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("isArray", () => {
|
||||||
|
it('should return bool if array', () => {
|
||||||
|
let empty_object = {};
|
||||||
|
let is_object = {
|
||||||
|
"a": 1
|
||||||
|
};
|
||||||
|
let empty_array = [];
|
||||||
|
let is_array = [1, 2, 3];
|
||||||
|
let is_string = "";
|
||||||
|
let is_number = 1;
|
||||||
|
expect(isArray(empty_object)).toEqual(false);
|
||||||
|
expect(isArray(is_object)).toEqual(false);
|
||||||
|
expect(isArray(empty_array)).toEqual(true);
|
||||||
|
expect(isArray(is_array)).toEqual(true);
|
||||||
|
expect(isArray(is_string)).toEqual(false);
|
||||||
|
expect(isArray(is_number)).toEqual(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("isIterable", () => {
|
||||||
|
it('should return bool if iterable', () => {
|
||||||
|
let empty_object = {};
|
||||||
|
let is_object = {
|
||||||
|
"a": 1
|
||||||
|
};
|
||||||
|
let empty_array = [];
|
||||||
|
let is_array = [1, 2, 3];
|
||||||
|
let is_string = "";
|
||||||
|
let is_number = 1;
|
||||||
|
expect(isIterable(empty_object)).toEqual(true);
|
||||||
|
expect(isIterable(is_object)).toEqual(true);
|
||||||
|
expect(isIterable(empty_array)).toEqual(true);
|
||||||
|
expect(isIterable(is_array)).toEqual(true);
|
||||||
|
expect(isIterable(is_string)).toEqual(false);
|
||||||
|
expect(isIterable(is_number)).toEqual(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("getObjectCount", () => {
|
describe("getObjectCount", () => {
|
||||||
it('should return count of objects', () => {
|
it('should return count of objects', () => {
|
||||||
let zero = {};
|
let zero = {};
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ describe("roundPrecision", () => {
|
|||||||
it('should round numbers to a given precision', () => {
|
it('should round numbers to a given precision', () => {
|
||||||
let val = roundPrecision(10.1234, 2);
|
let val = roundPrecision(10.1234, 2);
|
||||||
expect(val).toBe(10.12);
|
expect(val).toBe(10.12);
|
||||||
|
// @ts-ignore
|
||||||
|
expect(roundPrecision("abc", 2)).toBe("abc");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -5,17 +5,99 @@ import {
|
|||||||
getQueryStringParam,
|
getQueryStringParam,
|
||||||
} from '../src/utils/UrlParser.mjs';
|
} from '../src/utils/UrlParser.mjs';
|
||||||
|
|
||||||
describe("parseQueryString", () => {
|
let url_list = [
|
||||||
it('Should parse query string for key', () => {
|
{
|
||||||
let kv = parseQueryString("http://foor.org?key=value");
|
"id": "no params",
|
||||||
expect(kv).toEqual({"http://foor.org?key": "value"});
|
"in": {
|
||||||
});
|
"query": "http://foor.org",
|
||||||
});
|
"search": "",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "no params",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param",
|
||||||
|
"search": "",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": {"param": ""}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "one params",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo",
|
||||||
|
"search": "",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": {"param": "foo"}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "two params",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo&bar=other",
|
||||||
|
"search": "",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": {"param": "foo", "bar": "other"}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "two params, select",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo&bar=other",
|
||||||
|
"search": "bar",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": "other"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "two params, same",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo¶m=other",
|
||||||
|
"search": "",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": {"param": ["foo", "other"]}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "two params, same, single but no search",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo¶m=other",
|
||||||
|
"search": "",
|
||||||
|
"single": true
|
||||||
|
},
|
||||||
|
// "out": {"param": ["foo", "other"]}
|
||||||
|
"out": {"param": "foo"}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "three params, same, search",
|
||||||
|
"in": {
|
||||||
|
"query": "http://foor.org/?param=foo¶m=other&different=1",
|
||||||
|
"search": "param",
|
||||||
|
"single": false
|
||||||
|
},
|
||||||
|
"out": ["foo", "other"]
|
||||||
|
},
|
||||||
|
];
|
||||||
describe("getQueryStringParam", () => {
|
describe("getQueryStringParam", () => {
|
||||||
it('Should parse query string for key', () => {
|
it('Should parse query string for key', () => {
|
||||||
let kv = getQueryStringParam("key", "http://foor.org?key=value");
|
for (const url of url_list) {
|
||||||
expect(kv).toEqual("value");
|
expect(
|
||||||
|
getQueryStringParam(url.in.search, url.in.query, url.in.single)
|
||||||
|
).toEqual(url.out);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("parseQueryString", () => {
|
||||||
|
it('Should parse query string for key', () => {
|
||||||
|
// let kv = getQueryStringParam("key", "http://foor.org?key=value");
|
||||||
|
// expect(kv).toEqual("value");
|
||||||
|
for (const url of url_list) {
|
||||||
|
expect(
|
||||||
|
parseQueryString(url.in.query, url.in.search, url.in.single)
|
||||||
|
).toEqual(url.out);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
20
vitest.config.js
Normal file
20
vitest.config.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
import { defineConfig } from 'vitest/config';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
test: {
|
||||||
|
environment: 'jsdom',
|
||||||
|
include: [
|
||||||
|
'tests/**/*.{test,spec}.?(c|m)[jt]s?(x)'
|
||||||
|
],
|
||||||
|
// exclude: [],
|
||||||
|
coverage: {
|
||||||
|
include: [
|
||||||
|
'src/',
|
||||||
|
],
|
||||||
|
exclude: [
|
||||||
|
'src/utils.mjs',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user