Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1.31
  • master
  • 1.10.0
  • 1.30.1
  • 1.31.0
  • 1.8.0
  • 1.9.0
  • 3.100.0
  • 3.100.1
  • 3.100.10
  • 3.100.11
  • 3.100.12
  • 3.100.13
  • 3.100.14
  • 3.100.15
  • 3.100.16
  • 3.100.17
  • 3.100.18
  • 3.100.19
  • 3.100.2
  • 3.100.20
  • 3.100.3
  • 3.100.4
  • 3.100.5
  • 3.100.6
  • 3.100.7
  • 3.100.8
  • 3.100.9
  • 3.101.0
  • 3.101.1
  • 3.101.2
  • 3.101.3
  • 3.102.0
  • 3.102.1
  • 3.102.2
  • 3.102.3
  • 3.102.4
  • 3.102.5
  • 3.102.6
  • 3.103.0
  • 3.103.1
  • 3.104.0
  • 3.104.1
  • 3.105.0
  • 3.105.1
  • 3.105.2
  • 3.106.0
  • 3.106.1
  • 3.107.0
  • 3.108.0
  • 3.108.1
  • 3.108.2
  • 3.108.3
  • 3.108.4
  • 3.108.5
  • 3.109.0
  • 3.110.0
  • 3.110.1
  • 3.110.2
  • 3.110.3
  • 3.110.4
  • 3.111.0
  • 3.112.0
  • 3.112.1
  • 3.112.2
  • 3.112.3
  • 3.112.4
  • 3.113.0
  • 3.114.0
  • 3.114.1
  • 3.114.2
  • 3.114.3
  • 3.114.4
  • 3.114.5
  • 3.114.6
  • 3.114.7
  • 3.115.0
  • 3.115.1
  • 3.115.2
  • 3.115.3
  • 3.115.4
  • 3.116.0
  • 3.116.1
  • 3.117.0
  • 3.117.1
  • 3.117.2
  • 3.117.3
  • 3.118.0
  • 3.118.1
  • 3.119.0
  • 3.120.0
  • 3.121.0
  • 3.51.5
  • 3.52.0
  • 3.52.1
  • 3.53.0
  • 3.54.0
  • 3.55.0
  • 3.55.1
  • 3.55.2
  • 3.55.3
  • 3.55.4
102 results

Target

Select target project
  • oss/libraries/javascript/monster
1 result
Select Git revision
  • 1.31
  • master
  • 1.10.0
  • 1.30.1
  • 1.31.0
  • 1.8.0
  • 1.9.0
  • 3.100.0
  • 3.100.1
  • 3.100.10
  • 3.100.11
  • 3.100.12
  • 3.100.13
  • 3.100.14
  • 3.100.15
  • 3.100.16
  • 3.100.17
  • 3.100.18
  • 3.100.19
  • 3.100.2
  • 3.100.20
  • 3.100.3
  • 3.100.4
  • 3.100.5
  • 3.100.6
  • 3.100.7
  • 3.100.8
  • 3.100.9
  • 3.101.0
  • 3.101.1
  • 3.101.2
  • 3.101.3
  • 3.102.0
  • 3.102.1
  • 3.102.2
  • 3.102.3
  • 3.102.4
  • 3.102.5
  • 3.102.6
  • 3.103.0
  • 3.103.1
  • 3.104.0
  • 3.104.1
  • 3.105.0
  • 3.105.1
  • 3.105.2
  • 3.106.0
  • 3.106.1
  • 3.107.0
  • 3.108.0
  • 3.108.1
  • 3.108.2
  • 3.108.3
  • 3.108.4
  • 3.108.5
  • 3.109.0
  • 3.110.0
  • 3.110.1
  • 3.110.2
  • 3.110.3
  • 3.110.4
  • 3.111.0
  • 3.112.0
  • 3.112.1
  • 3.112.2
  • 3.112.3
  • 3.112.4
  • 3.113.0
  • 3.114.0
  • 3.114.1
  • 3.114.2
  • 3.114.3
  • 3.114.4
  • 3.114.5
  • 3.114.6
  • 3.114.7
  • 3.115.0
  • 3.115.1
  • 3.115.2
  • 3.115.3
  • 3.115.4
  • 3.116.0
  • 3.116.1
  • 3.117.0
  • 3.117.1
  • 3.117.2
  • 3.117.3
  • 3.118.0
  • 3.118.1
  • 3.119.0
  • 3.120.0
  • 3.121.0
  • 3.51.5
  • 3.52.0
  • 3.52.1
  • 3.53.0
  • 3.54.0
  • 3.55.0
  • 3.55.1
  • 3.55.2
  • 3.55.3
  • 3.55.4
102 results
Show changes
Commits on Source (8)
Showing
with 6204 additions and 3286 deletions
<a name="v3.9.0"></a>
## [v3.9.0] - 2023-02-02
### Add Features
- document translations
### Bug Fixes
- optimize i18n: transformer
### Changes
- move doc to monsterjs-org
- write and update tests
- change imports
<a name="v3.8.0"></a>
## [v3.8.0] - 2023-02-01
### Add Features
......@@ -229,6 +243,7 @@
<a name="1.8.0"></a>
## 1.8.0 - 2021-08-15
[v3.9.0]: https://gitlab.schukai.com/oss/libraries/javascript/monster/compare/v3.8.0...v3.9.0
[v3.8.0]: https://gitlab.schukai.com/oss/libraries/javascript/monster/compare/v3.7.0...v3.8.0
[v3.7.0]: https://gitlab.schukai.com/oss/libraries/javascript/monster/compare/v3.6.0...v3.7.0
[v3.6.0]: https://gitlab.schukai.com/oss/libraries/javascript/monster/compare/v3.5.0...v3.6.0
......
{
"name": "@schukai/monster",
"version": "3.7.0",
"version": "3.8.0",
"description": "Monster is a simple library for creating fast, robust and lightweight websites.",
"keywords": [
"framework",
......
......@@ -8,8 +8,6 @@
import { internalSymbol, instanceSymbol } from "../../../constants.mjs";
import { isObject } from "../../../types/is.mjs";
import { Server } from "../server.mjs";
import { Pathfinder } from "../../pathfinder.mjs";
import { Pipe } from "../../pipe.mjs";
import { WriteError } from "./restapi/writeerror.mjs";
export { RestAPI };
......
......@@ -9,6 +9,7 @@ import { Base } from "../types/base.mjs";
import {getGlobal, getGlobalObject} from "../types/global.mjs";
import {ID} from "../types/id.mjs";
import {isArray, isObject, isString} from "../types/is.mjs";
import {getDocumentTranslations, Translations} from "../i18n/translations.mjs";
import {
validateFunction,
validateInteger,
......@@ -30,78 +31,7 @@ export { Transformer };
* let t = new Transformer('tolower').run('ABC'); // ↦ abc
* ```
*
* **all commands**
*
* in the following table all commands, parameters and existing aliases are described.
*
* | command | parameter | alias | description |
* |:-------------|:---------------------------|:------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
* | to-base64 | | base64, btob | Converts the value to base64 |
* | from-base64 | | atob | Converts the value from base64 |
* | call | function:param1:param2:... | | Calling a callback function. The function can be defined in three places: either globally, in the context `addCallback` or in the passed object |
* | default | value:type | ?? | If the value is undefined the first argument is returned, otherwise the value. The third optional parameter specifies the desired type. If no type is specified, string is used. Valid types are bool, string, int, float, undefined and object. An object default value must be specified as a base64 encoded json string. (since 1.12.0) |
* | debug | | | the passed value is output (console) and returned |
* | empty | | | Return empty String "" |
* | first-key | default | | Can be applied to objects and returns the value of the first key. All keys of the object are fetched and sorted. (since 1.23.0) |
* | fromjson | | | Type conversion from a JSON string (since 1.12.0) |
* | if | statement1:statement2 | ? | Is the ternary operator, the first parameter is the valid statement, the second is the false part. To use the current value in the queue, you can set the value keyword. On the other hand, if you want to have the static string "value", you have to put one backslash \\ in front of it and write value. the follow values are true: 'on', true, 'true'. If you want to have a space, you also have to write \\ in front of the space. |
* | index | key:default | property, key | Fetches a value from an object, an array, a map or a set |
* | last-key | default | | Can be applied to objects and returns the value of the last key. All keys of the object are fetched and sorted. (since 1.23.0) |
* | length | | count | Length of the string or entries of an array or object |
* | nop | | | Do nothing |
* | nth-key | index:default | | Can be applied to objects and returns the value of the nth key. All keys of the object are fetched and sorted. (since 1.23.0) |
* | nth-last-key | index:default | | Can be applied to objects and returns the value of the nth key from behind. All keys of the object are fetched and sorted. (since 1.23.0) |
* | path | path | | The access to an object is done via a Pathfinder object |
* | path-exists | path | | Check if the specified path is available in the value (since 1.24.0) |
* | plaintext | | plain | All HTML tags are removed (*) |
* | prefix | text | | Adds a prefix |
* | rawurlencode | | | URL coding |
* | static | | none | The Arguments value is used and passed to the value. Special characters \ <space> and : can be quotet by a preceding \. |
* | substring | start:length | | Returns a substring |
* | suffix | text | | Adds a suffix |
* | tointeger | | | Type conversion to an integer value |
* | tojson | | | Type conversion to a JSON string (since 1.8.0) |
* | tolower | | strtolower, tolowercase | The input value is converted to lowercase letters |
* | tostring | | | Type conversion to a string. |
* | toupper | | strtoupper, touppercase | The input value is converted to uppercase letters |
* | trim | | | Remove spaces at the beginning and end |
* | ucfirst | | | First character large |
* | ucwords | | | Any word beginning large |
* | undefined | | | Return undefined |
* | uniqid | | | Creates a string with a unique value (**)
*
* (*) for this functionality the extension [jsdom](https://www.npmjs.com/package/jsdom) must be loaded in the nodejs context.
*
* ```
* // polyfill
* if (typeof window !== "object") {
* const {window} = new JSDOM('', {
* url: 'http://example.com/',
* pretendToBeVisual: true
* });
*
* [
* 'self',
* 'document',
* 'Node',
* 'Element',
* 'HTMLElement',
* 'DocumentFragment',
* 'DOMParser',
* 'XMLSerializer',
* 'NodeFilter',
* 'InputEvent',
* 'CustomEvent'
* ].forEach(key => (global[key] = window[key]));
* }
* ```
*
* (**) for this command the crypt library is necessary in the nodejs context.
*
* ```
* import * as Crypto from "@peculiar/webcrypto";
* global['crypto'] = new Crypto.Crypto();
* ```
* @see {@link https://monsterjs.org/en/doc/#transformer|Monster Docs}
*
* @externalExample ../../example/data/transformer.mjs
* @license AGPLv3
......@@ -236,6 +166,10 @@ function transform(value) {
let key;
let defaultValue;
let element;
let attribute;
let translations;
switch (this.command) {
case "static":
return this.args.join(":");
......@@ -260,9 +194,11 @@ function transform(value) {
validateInteger(n);
return n;
case "to-json":
case "tojson":
return JSON.stringify(value);
case "from-json":
case "fromjson":
return JSON.parse(value);
......@@ -527,6 +463,22 @@ function transform(value) {
throw new Error("type not supported");
case "i18n":
case "translation":
translations = getDocumentTranslations();
if (!(translations instanceof Translations)) {
throw new Error("missing translations");
}
key = args.shift() || undefined;
if (key === undefined) {
key = value;
}
defaultValue = args.shift() || undefined;
return translations.getText(key, defaultValue);
default:
throw new Error(`unknown command ${this.command}`);
}
......
......@@ -5,11 +5,22 @@
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
*/
import {hasObjectLink, getLinkedObjects,addToObjectLink} from "../dom/attributes.mjs";
import {getLocaleOfDocument} from "../dom/locale.mjs";
import {BaseWithOptions} from "../types/basewithoptions.mjs";
import {Locale} from "./locale.mjs";
import {Translations} from "./translations.mjs";
export { Provider };
export {Provider, translationsLinkSymbol};
/**
* @memberOf Monster.I18n
* @type {symbol}
* @license AGPLv3
* @since 3.9.0
* @private
*/
const translationsLinkSymbol = Symbol.for("@schukai/monster/i18n/translations@@link");
/**
* A provider makes a translation object available.
......@@ -26,6 +37,11 @@ class Provider extends BaseWithOptions {
* @return {Promise}
*/
getTranslations(locale) {
if (locale === undefined) {
locale = getLocaleOfDocument();
}
return new Promise((resolve, reject) => {
try {
resolve(new Translations(locale));
......@@ -34,4 +50,56 @@ class Provider extends BaseWithOptions {
}
});
}
/**
* @param {Locale|string} locale
* @param {HTMLElement} element
* @return {Provider}
*/
assignToElement(locale, element) {
if (locale === undefined) {
locale = getLocaleOfDocument();
}
if (!(locale instanceof Locale)) {
throw new Error("Locale is not an instance of Locale");
}
if (!(element instanceof HTMLElement)) {
element = document.querySelector("body");
}
if (!(element instanceof HTMLElement)) {
throw new Error("Element is not an HTMLElement");
}
return this.getTranslations(locale).then((obj) => {
let translations = null;
if (hasObjectLink(element, translationsLinkSymbol)) {
const objects = getLinkedObjects(element, translationsLinkSymbol);
for (const o of objects) {
if (o instanceof Translations) {
translations = o;
break;
}
}
if (!(translations instanceof Translations)) {
throw new Error("Object is not an instance of Translations");
}
translations.assignTranslations(obj);
} else {
addToObjectLink(element, translationsLinkSymbol, obj);
}
return obj;
});
}
}
......@@ -7,7 +7,7 @@
import {internalSymbol} from "../../constants.mjs";
import {extend} from "../../data/extend.mjs";
import { getGlobalObject } from "../../types/global.mjs";
import {getDocument} from "../../dom/util.mjs";
import {isString} from "../../types/is.mjs";
import {validateObject, validateString} from "../../types/validate.mjs";
import {parseLocale} from "../locale.mjs";
......@@ -42,22 +42,27 @@ class Embed extends Provider {
* new Embed('translations')
* ```
*
* @param {string} id
* @param {HTMLElement|string} elementOrId
* @param {Object} options
*/
constructor(id, options) {
constructor(elementOrId, options) {
super(options);
if (options === undefined) {
options = {};
}
validateString(id);
if (elementOrId instanceof HTMLElement) {
/**
* @property {HTMLElement|string}
*/
this.translateElement = elementOrId;
} else {
/**
* @property {string}
* @property {HTMLElement|string}
*/
this.textId = id;
this.translateElement = getDocument().getElementById(validateString(elementOrId));
}
/**
* @private
......@@ -86,16 +91,25 @@ class Embed extends Provider {
}
return new Promise((resolve, reject) => {
let text = getGlobalObject("document").getElementById(this.textId);
if (text === null) {
if (this.translateElement === null) {
reject(new Error("Text not found"));
return;
}
if (!(this.translateElement instanceof HTMLScriptElement)) {
reject(new Error("Element is not a script tag"));
return;
}
if (this.translateElement.type !== "application/json") {
reject(new Error("Element is not a script tag with type application/json"));
return;
}
let translations = null;
try {
translations = JSON.parse(text.innerHTML);
translations = JSON.parse(this.translateElement.innerHTML);
} catch (e) {
reject(e);
return;
......@@ -112,4 +126,38 @@ class Embed extends Provider {
resolve(t);
});
}
/**
* Initializes the translations for the current document.
*
* `script[data-monster-role=translations]` is searched for and the translations are assigned to the element.
*
* @param element
* @returns {Promise<unknown[]>}
*/
static assignTranslationsToElement(element) {
const d = getDocument()
if (!(element instanceof HTMLElement)) {
element = d.querySelector("body");
}
const list = d.querySelectorAll("script[data-monster-role=translations]");
if (list === null) {
return;
}
const promises = [];
let result
list.forEach((translationElement) => {
const p = new Embed(translationElement);
promises.push(p.assignToElement(undefined, element));
});
return Promise.all(promises);
}
}
......@@ -5,12 +5,17 @@
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
*/
import { getLinkedObjects,hasObjectLink} from "../dom/attributes.mjs";
import {ATTRIBUTE_OBJECTLINK} from "../dom/constants.mjs";
import {getDocument} from "../dom/util.mjs";
import {Base} from "../types/base.mjs";
import {isObject, isString} from "../types/is.mjs";
import { validateInstance, validateInteger, validateObject, validateString } from "../types/validate.mjs";
import {validateInteger, validateObject, validateString} from "../types/validate.mjs";
import {Locale, parseLocale} from "./locale.mjs";
import {translationsLinkSymbol} from "./provider.mjs";
export { Translations };
export {Translations, getDocumentTranslations};
/**
* With this class you can manage translations and access the keys.
......@@ -30,11 +35,12 @@ class Translations extends Base {
constructor(locale) {
super();
if (isString(locale)) {
locale = parseLocale(locale);
if (locale instanceof Locale) {
this.locale = locale;
} else {
this.locale = parseLocale(validateString(locale));
}
this.locale = validateInstance(locale, Locale);
this.storage = new Map();
}
......@@ -166,6 +172,13 @@ class Translations extends Base {
assignTranslations(translations) {
validateObject(translations);
if (translations instanceof Translations) {
translations.storage.forEach((v, k) => {
this.setText(k, v);
});
return this;
}
for (const [k, v] of Object.entries(translations)) {
this.setText(k, v);
}
......@@ -173,3 +186,41 @@ class Translations extends Base {
return this;
}
}
/**
* Returns the translations for the current document.
*
* @param element
* @returns {*}
* @throws {Error} Element is not an HTMLElement
* @throws {Error} Missing translations
*/
function getDocumentTranslations(element) {
const d = getDocument()
if (!(element instanceof HTMLElement)) {
element = d.querySelector('['+ATTRIBUTE_OBJECTLINK+'="' + translationsLinkSymbol.toString() + '"]');
}
if (!(element instanceof HTMLElement)) {
throw new Error("Element is not an HTMLElement");
}
if (!hasObjectLink(element, translationsLinkSymbol)) {
throw new Error("Missing translations");
}
let obj = getLinkedObjects(element, translationsLinkSymbol);
for (const t of obj) {
if (t instanceof Translations) {
return t;
}
}
throw new Error("Missing translations");
}
......@@ -142,7 +142,7 @@ function getMonsterVersion() {
}
/** don't touch, replaced by make with package.json version */
monsterVersion = new Version("3.7.0");
monsterVersion = new Version("3.8.0");
return monsterVersion;
}
{
"name": "monster",
"version": "3.7.0",
"version": "3.8.0",
"description": "monster",
"repository": {
"type": "git",
......
......@@ -4,7 +4,6 @@ import {expect} from "chai"
import {RestAPI} from "../../../../../../application/source/data/datasource/server/restapi.mjs";
import {validateObject} from "../../../../../../application/source/types/validate.mjs";
describe('RestAPI', function () {
let fetchReference;
......
......@@ -2,6 +2,7 @@
import {expect} from "chai"
import {Transformer} from "../../../../application/source/data/transformer.mjs";
import {Embed} from "../../../../application/source/i18n/providers/embed.mjs";
import {initJSDOM} from "../../util/jsdom.mjs";
describe('Transformer', function () {
......@@ -197,4 +198,63 @@ describe('Transformer', function () {
}).to.throw(TypeError);
});
});
describe('i18n', function () {
let html1 = `
<div id="mock-translations"></div>
<script type="application/json" data-monster-role="translations">
{
"test1": "xyz",
"test3": {
"other": "xyz"
}
}
</script>
`;
beforeEach((done) => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = html1;
let elem = document.getElementById('mock-translations');
Embed.assignTranslationsToElement(elem).then((o) => {
done()
})
})
afterEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = "";
})
before(function (done) {
initJSDOM().then(() => {
done()
});
});
[
[ 'i18n:test1',"", "xyz"],
[ 'i18n:',"test1", "xyz"], // key by value
[ 'i18n::',"test1", "xyz"], // key by value no default
[ 'i18n::eee',"test2", "eee"], // key by value with default
[ 'i18n::ddd',"test2", "ddd"], // key by value and default
].forEach(function (data) {
let a = data.shift()
let b = data.shift()
let c = data.shift()
it('should transform('+a+').run('+b+') return ' + JSON.stringify(c), function () {
const t = new Transformer(a);
expect(t.run(b)).to.be.eql(c);
});
})
})
});
\ No newline at end of file
......@@ -35,7 +35,6 @@ describe('Attributes', function () {
})
});
......@@ -45,11 +44,15 @@ describe('Attributes', function () {
it('return language en', function () {
let html = document.getElementsByTagName('html');
let node = html.item(0);
let lang= node.getAttribute('lang');
node.removeAttribute('lang');
const locale = getLocaleOfDocument();
expect(locale).to.be.instanceOf(Locale);
expect(locale.localeString).to.be.equal('en-US');
expect(locale.localeString).to.be.equal(navigator.language);
node.setAttribute('lang', lang);
})
......
import {expect} from "chai"
import {ATTRIBUTE_OBJECTLINK} from "../../../../application/source/dom/constants.mjs";
import {getLinkedObjects} from "../../../../application/source/dom/attributes.mjs";
import {Provider} from "../../../../application/source/i18n/provider.mjs";
import {initJSDOM} from "../../util/jsdom.mjs";
import {getDocumentTranslations, Translations} from "../../../../application/source/i18n/translations.mjs";
describe('Provider', function () {
describe('Instance and Init', function () {
it('create instance', function () {
expect((new Provider()).getTranslations('en')).is.instanceof(Promise);
let html1 = `
<div id="test1">
</div>
`;
beforeEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = html1;
})
afterEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = "";
})
before(function (done) {
initJSDOM().then(() => {
done()
});
});
describe('Provider and Dom', function () {
const translationsLinkSymbol = Symbol.for("@schukai/monster/i18n/translations@@link");
it('assignToElement', function (done) {
const element = document.getElementById('test1');
const p = new Provider();
const r = p.assignToElement(undefined, element);
r.then((e) => {
const s = element.getAttribute(ATTRIBUTE_OBJECTLINK);
if (s === null) {
done(new Error("Attribute not set"));
return;
}
const i = getLinkedObjects(element, translationsLinkSymbol)
if (i === null) {
done(new Error("No linked object found"));
return;
}
let counter = 0;
for (let v of i) {
counter++;
}
if (counter !== 1) {
done(new Error("No linked object found"));
return;
}
const docTrans = getDocumentTranslations(element)
expect(docTrans).is.instanceof(Translations);
done();
}).catch(e => done(e));
});
});
......
import {expect} from "chai"
import {parseLocale} from "../../../../application/source/i18n/locale.mjs";
import {Translations} from "../../../../application/source/i18n/translations.mjs";
import {Embed} from "../../../../application/source/i18n/providers/embed.mjs";
import {
Translations,
getDocumentTranslations
} from "../../../../application/source/i18n/translations.mjs";
import {initJSDOM} from "../../util/jsdom.mjs";
describe('Translations', function () {
......@@ -53,5 +59,76 @@ describe('Translations', function () {
});
/**
* initDocumentTranslation
*/
describe("test initDocumentTranslation ", function () {
let html1 = `<div id="mock-translations"></div>
<script type="application/json" data-monster-role="translations">
{
"test1": "abc",
"test2": {
"other": "xyz"
}
}
</script>
<script type="application/json" data-monster-role="translations">
{
"test1": "xyz",
"test3": {
"other": "xyz"
}
}
</script>
`;
beforeEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = html1;
})
afterEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = "";
})
before(function (done) {
initJSDOM().then(() => {
done()
});
});
it('Init translations', function (done) {
let elem = document.getElementById('mock-translations');
Embed.assignTranslationsToElement(elem).then((o) => {
let mocks = document.getElementById('mocks');
// no exception because of default
expect(getDocumentTranslations(elem).getText('no-key','with-default'))
.is.equal('with-default');
expect(getDocumentTranslations(elem).getText('test1'))
.is.equal('xyz');
done();
}).catch((e) => {
done(e);
})
});
})
});
\ No newline at end of file
......@@ -7,7 +7,7 @@ describe('Monster', function () {
let monsterVersion
/** don´t touch, replaced by make with package.json version */
monsterVersion = new Version("3.7.0")
monsterVersion = new Version("3.8.0")
let m = getMonsterVersion();
......
......@@ -4,7 +4,6 @@ import {extend} from "../../../application/source/data/extend.mjs";
import {getGlobal} from "../../../application/source/types/global.mjs";
export const isBrowser = new Function("try {return this===window;}catch(e){ return false;}");
export const isNode = new Function("try {return this===global;}catch(e){return false;}");
......
......@@ -28,6 +28,7 @@ import "../cases/dom/assembler.mjs";
import "../cases/i18n/translations.mjs";
import "../cases/i18n/locale.mjs";
import "../cases/i18n/formatter.mjs";
import "../cases/i18n/providers/embed.mjs";
import "../cases/i18n/providers/fetch.mjs";
import "../cases/i18n/provider.mjs";
import "../cases/net/webconnect/message.mjs";
......
......@@ -14,8 +14,8 @@
</head>
<body>
<div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
<h1 style='margin-bottom: 0.1em;'>Monster 3.4.0</h1>
<div id="lastupdate" style='font-size:0.7em'>last update So 8. Jan 17:17:24 CET 2023</div>
<h1 style='margin-bottom: 0.1em;'>Monster 3.8.0</h1>
<div id="lastupdate" style='font-size:0.7em'>last update Do 2. Feb 11:38:37 CET 2023</div>
</div>
<div id="mocks"></div>
<div id="mocha"></div>
......
This diff is collapsed.
{"version":"3.8.0"}
{"version":"3.9.0"}