@tstdl/base 0.83.17 → 0.83.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.83.17",
3
+ "version": "0.83.18",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -21,12 +21,12 @@
21
21
  "luxon": "^3.3",
22
22
  "reflect-metadata": "^0.1",
23
23
  "rxjs": "^7.8",
24
- "type-fest": "^3.7"
24
+ "type-fest": "^3.8"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/chroma-js": "2.4",
28
28
  "@types/koa__router": "12.0",
29
- "@types/luxon": "3.2",
29
+ "@types/luxon": "3.3",
30
30
  "@types/minio": "7.0",
31
31
  "@types/mjml": "4.7",
32
32
  "@types/node": "18",
@@ -35,7 +35,7 @@
35
35
  "@typescript-eslint/parser": "5.57",
36
36
  "concurrently": "8.0",
37
37
  "esbuild": "0.17",
38
- "eslint": "8.37",
38
+ "eslint": "8.38",
39
39
  "eslint-import-resolver-typescript": "3.5",
40
40
  "eslint-plugin-import": "2.27",
41
41
  "tsc-alias": "1.8",
@@ -55,8 +55,8 @@
55
55
  "knex": "^2.4",
56
56
  "koa": "^2.14",
57
57
  "minio": "^7.0",
58
- "mjml": "^4.13",
59
- "mongodb": "5.1",
58
+ "mjml": "^4.14",
59
+ "mongodb": "5.2",
60
60
  "nodemailer": "^6.9",
61
61
  "preact": "^10.13",
62
62
  "preact-render-to-string": "^5.2",
package/random/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- export * from './number/index.js';
1
+ export * from './number-generator/index.js';
2
+ export * from './series.js';
package/random/index.js CHANGED
@@ -15,4 +15,5 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
15
15
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
16
  var random_exports = {};
17
17
  module.exports = __toCommonJS(random_exports);
18
- __reExport(random_exports, require("./number/index.js"), module.exports);
18
+ __reExport(random_exports, require("./number-generator/index.js"), module.exports);
19
+ __reExport(random_exports, require("./series.js"), module.exports);
@@ -1,3 +1,3 @@
1
1
  export * from './mulberry32.js';
2
- export * from './seeded.js';
2
+ export * from './seeded-random-number-generator.js';
3
3
  export * from './sfc32.js';
@@ -13,8 +13,8 @@ var __copyProps = (to, from, except, desc) => {
13
13
  };
14
14
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
15
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
- var number_exports = {};
17
- module.exports = __toCommonJS(number_exports);
18
- __reExport(number_exports, require("./mulberry32.js"), module.exports);
19
- __reExport(number_exports, require("./seeded.js"), module.exports);
20
- __reExport(number_exports, require("./sfc32.js"), module.exports);
16
+ var number_generator_exports = {};
17
+ module.exports = __toCommonJS(number_generator_exports);
18
+ __reExport(number_generator_exports, require("./mulberry32.js"), module.exports);
19
+ __reExport(number_generator_exports, require("./seeded-random-number-generator.js"), module.exports);
20
+ __reExport(number_generator_exports, require("./sfc32.js"), module.exports);
@@ -1,4 +1,4 @@
1
- import { SeededRandomNumberGenerator } from './seeded.js';
1
+ import { SeededRandomNumberGenerator } from './seeded-random-number-generator.js';
2
2
  export declare class Mulberry32 extends SeededRandomNumberGenerator {
3
3
  private state;
4
4
  constructor(seed: number);
@@ -10,7 +10,7 @@ export declare class Mulberry32 extends SeededRandomNumberGenerator {
10
10
  /**
11
11
  * mulberry32
12
12
  *
13
- * very fast 32 bit random number generator with 32 bit state
13
+ * Very fast 32 bit random number generator with 32 bit state
14
14
  * @param seed 32 bit integer seed
15
15
  */
16
- export declare function mulberry32(seed: number): SeededRandomNumberGenerator;
16
+ export declare function mulberry32(seed?: number): SeededRandomNumberGenerator;
@@ -22,10 +22,11 @@ __export(mulberry32_exports, {
22
22
  mulberry32: () => mulberry32
23
23
  });
24
24
  module.exports = __toCommonJS(mulberry32_exports);
25
- var import_seeded = require("./seeded.js");
25
+ var import_seeded_random_number_generator = require("./seeded-random-number-generator.js");
26
+ var import_utils = require("./utils.js");
26
27
  const maxValue = 2 ** 32 - 1;
27
28
  const nextDivisor = 2 ** 32;
28
- class Mulberry32 extends import_seeded.SeededRandomNumberGenerator {
29
+ class Mulberry32 extends import_seeded_random_number_generator.SeededRandomNumberGenerator {
29
30
  state;
30
31
  constructor(seed) {
31
32
  super(maxValue);
@@ -48,6 +49,6 @@ class Mulberry32 extends import_seeded.SeededRandomNumberGenerator {
48
49
  return new Mulberry32(this.state);
49
50
  }
50
51
  }
51
- function mulberry32(seed) {
52
+ function mulberry32(seed = (0, import_utils.random32BitSeed)()) {
52
53
  return new Mulberry32(seed);
53
54
  }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generates a random value in interval [0, 1).
3
+ */
4
+ export type RandomNumberGeneratorFn = () => number;
5
+ export declare const defaultRandomNumberGeneratorFn: RandomNumberGeneratorFn;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var random_number_generator_function_exports = {};
20
+ __export(random_number_generator_function_exports, {
21
+ defaultRandomNumberGeneratorFn: () => defaultRandomNumberGeneratorFn
22
+ });
23
+ module.exports = __toCommonJS(random_number_generator_function_exports);
24
+ const defaultRandomNumberGeneratorFn = Math.random;
@@ -0,0 +1,15 @@
1
+ export declare abstract class RandomNumberGenerator {
2
+ /**
3
+ * Maximum value the generator will generate for {@link nextInt}
4
+ */
5
+ readonly maxValue: number;
6
+ constructor(maxValue: number);
7
+ /**
8
+ * Generate a random integer between 0 and {@link maxValue}
9
+ */
10
+ abstract nextInt(): number;
11
+ /**
12
+ * Generate a random float in interval [0, 1)
13
+ */
14
+ abstract next(): number;
15
+ }
@@ -16,14 +16,14 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var seeded_exports = {};
20
- __export(seeded_exports, {
21
- SeededRandomNumberGenerator: () => SeededRandomNumberGenerator
19
+ var random_number_generator_exports = {};
20
+ __export(random_number_generator_exports, {
21
+ RandomNumberGenerator: () => RandomNumberGenerator
22
22
  });
23
- module.exports = __toCommonJS(seeded_exports);
24
- class SeededRandomNumberGenerator {
23
+ module.exports = __toCommonJS(random_number_generator_exports);
24
+ class RandomNumberGenerator {
25
25
  /**
26
- * maximum value the generator will generate for {@link nextInt}
26
+ * Maximum value the generator will generate for {@link nextInt}
27
27
  */
28
28
  maxValue;
29
29
  constructor(maxValue) {
@@ -0,0 +1,12 @@
1
+ import { RandomNumberGenerator } from './random-number-generator.js';
2
+ export declare abstract class SeededRandomNumberGenerator extends RandomNumberGenerator {
3
+ constructor(maxValue: number);
4
+ /**
5
+ * Fork the rng based on the current state
6
+ */
7
+ abstract fork(): SeededRandomNumberGenerator;
8
+ /**
9
+ * Clone the rng with the current state
10
+ */
11
+ abstract clone(): SeededRandomNumberGenerator;
12
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var seeded_random_number_generator_exports = {};
20
+ __export(seeded_random_number_generator_exports, {
21
+ SeededRandomNumberGenerator: () => SeededRandomNumberGenerator
22
+ });
23
+ module.exports = __toCommonJS(seeded_random_number_generator_exports);
24
+ var import_random_number_generator = require("./random-number-generator.js");
25
+ class SeededRandomNumberGenerator extends import_random_number_generator.RandomNumberGenerator {
26
+ constructor(maxValue) {
27
+ super(maxValue);
28
+ }
29
+ }
@@ -1,4 +1,4 @@
1
- import { SeededRandomNumberGenerator } from './seeded.js';
1
+ import { SeededRandomNumberGenerator } from './seeded-random-number-generator.js';
2
2
  export declare class Sfc32 extends SeededRandomNumberGenerator {
3
3
  private state1;
4
4
  private state2;
@@ -13,7 +13,11 @@ export declare class Sfc32 extends SeededRandomNumberGenerator {
13
13
  /**
14
14
  * sfc32 - Small Fast Counter
15
15
  *
16
- * fast 32 bit random number generator with 128 bit state
17
- * @param seed 32 bit integer seed
16
+ * Fast 32 bit random number generator with 128 bit state
17
+ * @param seed1 32 bit integer seed 1
18
+ * @param seed2 32 bit integer seed 2
19
+ * @param seed3 32 bit integer seed 3
20
+ * @param seed4 32 bit integer seed 4
18
21
  */
22
+ export declare function sfc32(): SeededRandomNumberGenerator;
19
23
  export declare function sfc32(seed1: number, seed2: number, seed3: number, seed4: number): SeededRandomNumberGenerator;
@@ -22,10 +22,11 @@ __export(sfc32_exports, {
22
22
  sfc32: () => sfc32
23
23
  });
24
24
  module.exports = __toCommonJS(sfc32_exports);
25
- var import_seeded = require("./seeded.js");
25
+ var import_seeded_random_number_generator = require("./seeded-random-number-generator.js");
26
+ var import_utils = require("./utils.js");
26
27
  const maxValue = 2 ** 32 - 1;
27
28
  const nextDivisor = 2 ** 32;
28
- class Sfc32 extends import_seeded.SeededRandomNumberGenerator {
29
+ class Sfc32 extends import_seeded_random_number_generator.SeededRandomNumberGenerator {
29
30
  state1;
30
31
  state2;
31
32
  state3;
@@ -61,6 +62,6 @@ class Sfc32 extends import_seeded.SeededRandomNumberGenerator {
61
62
  return new Sfc32(this.state1, this.state2, this.state3, this.state4);
62
63
  }
63
64
  }
64
- function sfc32(seed1, seed2, seed3, seed4) {
65
+ function sfc32(seed1 = (0, import_utils.random32BitSeed)(), seed2 = (0, import_utils.random32BitSeed)(), seed3 = (0, import_utils.random32BitSeed)(), seed4 = (0, import_utils.random32BitSeed)()) {
65
66
  return new Sfc32(seed1, seed2, seed3, seed4);
66
67
  }
@@ -0,0 +1 @@
1
+ export declare function random32BitSeed(): number;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var utils_exports = {};
20
+ __export(utils_exports, {
21
+ random32BitSeed: () => random32BitSeed
22
+ });
23
+ module.exports = __toCommonJS(utils_exports);
24
+ function random32BitSeed() {
25
+ return Math.floor(Math.random() * 2 ** 32);
26
+ }
@@ -0,0 +1,52 @@
1
+ import type { RandomNumberGeneratorFn } from './number-generator/random-number-generator-function.js';
2
+ export type RandomSeriesOptions = {
3
+ /**
4
+ * Initial value of series. If [number, number] is provided, a random value in that range is generated. If not provided but {@link RandomSeriesOptions.bounds} are, their values are used.
5
+ */
6
+ initial?: number | [min: number, max: number];
7
+ /**
8
+ * Bounds for generated values. If provided, a regression toward the mean is used.
9
+ * If {@link RandomSeriesOptions.volatility} is to high, bounds may be exceeded.
10
+ */
11
+ bounds?: [lower: number, upper: number];
12
+ /**
13
+ * Exponent to use for regression toward the mean (if bounds are provided). Practical values are in the interval [0.5, 15], depending on {@link RandomSeriesOptions.volatility}.
14
+ * High values have (nearly) no regression inside the most part of the {@link RandomSeriesOptions.bounds}, with exponentially higher regression towards the bounds.
15
+ * Value of 1 has a linear "strength" of regression the further it is from the mean of the bounds.
16
+ * Values < 1 already have a strong regression around the mean with only logarithmically stronger regression toward the edges. This results in the value staying close at the mean.
17
+ */
18
+ regressionExponent?: number;
19
+ /**
20
+ * Relative volatility of the series (ratio of value). Practical values are in the interval (0, 0.25), depending on {@link RandomSeriesOptions.regressionExponent}.
21
+ * You can also provide an Iterator of numbers to represent volatile/dynamic volatility. Passes current value as parameter for {@link Iterator.next}.
22
+ */
23
+ volatility?: number | Iterator<number, any, any>;
24
+ /**
25
+ * Whether volatility is relative to current value or initial value.
26
+ */
27
+ relativeTo?: 'current' | 'initial';
28
+ /**
29
+ * Random number generator to use (useful if seeded generator is used to generate static series for each run).
30
+ */
31
+ generator?: RandomNumberGeneratorFn;
32
+ };
33
+ /**
34
+ * Generator to create random series data like stock charts or measurements over time.
35
+ *
36
+ * @example
37
+ *
38
+ * // very simple: series starting at 1 without bounds
39
+ * randomSeries();
40
+ *
41
+ * // bounded: series between 100 and 200
42
+ * randomSeries({ bounds: [100, 200] });
43
+ *
44
+ * // complex: series between 5 and 50 with dynamic volatility like a stock chart
45
+ * randomSeries({
46
+ * bounds: [5, 50],
47
+ * volatility: randomSeries({ bounds: [0.01, 0.2], volatility: 0.2, regressionExponent: 2 }),
48
+ * relativeTo: 'current',
49
+ * regressionExponent: 8
50
+ * });
51
+ */
52
+ export declare function randomSeries({ bounds, initial, volatility, relativeTo, generator, regressionExponent }?: RandomSeriesOptions): Generator<number>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var series_exports = {};
20
+ __export(series_exports, {
21
+ randomSeries: () => randomSeries
22
+ });
23
+ module.exports = __toCommonJS(series_exports);
24
+ var import_math = require("../utils/math.js");
25
+ var import_type_guards = require("../utils/type-guards.js");
26
+ var import_random_number_generator_function = require("./number-generator/random-number-generator-function.js");
27
+ function* randomSeries({ bounds, initial = bounds ?? 1, volatility = 0.025, relativeTo = "initial", generator = import_random_number_generator_function.defaultRandomNumberGeneratorFn, regressionExponent = 10 } = {}) {
28
+ const initialValue = (0, import_type_guards.isNumber)(initial) ? initial : (0, import_math.randomInt)(initial[0], initial[1]);
29
+ const isRelativeToCurrent = relativeTo == "current";
30
+ const hasBounds = (0, import_type_guards.isDefined)(bounds);
31
+ const min = hasBounds ? bounds[0] : void 0;
32
+ const max = hasBounds ? bounds[1] : void 0;
33
+ const volatilityProvider = (0, import_type_guards.isNumber)(volatility) ? () => volatility : (value2) => volatility.next(value2).value;
34
+ let value = initialValue;
35
+ while (true) {
36
+ const currentVolatility = volatilityProvider(value);
37
+ let changePercent = currentVolatility * ((0.5 - generator()) * 2);
38
+ if (hasBounds) {
39
+ const normalizedDeltaFromMean = (0, import_math.linearInterpolate)(value, min, max, -1, 1);
40
+ const regressFactor = (0, import_math.clamp)(Math.abs(normalizedDeltaFromMean) ** regressionExponent * Math.sign(normalizedDeltaFromMean), -1.5, 1.5);
41
+ changePercent -= currentVolatility * regressFactor;
42
+ }
43
+ yield value += isRelativeToCurrent ? value * changePercent : initialValue * changePercent;
44
+ }
45
+ }
package/utils/math.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- /**
2
- * Generates a random value in interval [0, 1).
3
- */
4
- export type RandomNumberGenerator = () => number;
1
+ import type { RandomNumberGeneratorFn } from '../random/number-generator/random-number-generator-function.js';
5
2
  /**
6
3
  * Generate a random float in interval [min, max).
7
4
  * @param min minimum value
@@ -9,7 +6,7 @@ export type RandomNumberGenerator = () => number;
9
6
  * @param generator Random number generator to use, defaults to `Math.random`. Must return a number in interval [0, 1).
10
7
  * @returns random number (float)
11
8
  */
12
- export declare function randomFloat(min: number, max: number, generator?: RandomNumberGenerator): number;
9
+ export declare function randomFloat(min: number, max: number, generator?: RandomNumberGeneratorFn): number;
13
10
  /**
14
11
  * Generate a random integer in interval [min, max].
15
12
  * @param min minimum value
@@ -17,7 +14,7 @@ export declare function randomFloat(min: number, max: number, generator?: Random
17
14
  * @param generator random number generator to use, defaults to `Math.random`. Must return a number in interval [0, 1)
18
15
  * @returns random number (integer)
19
16
  */
20
- export declare function randomInt(min: number, max: number, generator?: RandomNumberGenerator): number;
17
+ export declare function randomInt(min: number, max: number, generator?: RandomNumberGeneratorFn): number;
21
18
  /**
22
19
  * Calculate the sum of all values.
23
20
  * @param values values to sum
package/utils/math.js CHANGED
@@ -32,11 +32,11 @@ __export(math_exports, {
32
32
  });
33
33
  module.exports = __toCommonJS(math_exports);
34
34
  var import_not_supported_error = require("../error/not-supported.error.js");
35
- const defaultRandomNumberGenerator = () => Math.random();
36
- function randomFloat(min, max, generator = defaultRandomNumberGenerator) {
35
+ var import_random_number_generator_function = require("../random/number-generator/random-number-generator-function.js");
36
+ function randomFloat(min, max, generator = import_random_number_generator_function.defaultRandomNumberGeneratorFn) {
37
37
  return linearInterpolateFloat(generator(), min, max);
38
38
  }
39
- function randomInt(min, max, generator = defaultRandomNumberGenerator) {
39
+ function randomInt(min, max, generator = import_random_number_generator_function.defaultRandomNumberGeneratorFn) {
40
40
  return Math.floor(linearInterpolateFloat(generator(), min, max + 1));
41
41
  }
42
42
  function sum(values) {
@@ -1,24 +0,0 @@
1
- export declare abstract class SeededRandomNumberGenerator {
2
- /**
3
- * maximum value the generator will generate for {@link nextInt}
4
- */
5
- readonly maxValue: number;
6
- constructor(maxValue: number);
7
- /**
8
- * generate a random integer between 0 and {@link maxValue}
9
- * @see maxValue
10
- */
11
- abstract nextInt(): number;
12
- /**
13
- * generate a random float in interval [0, 1)
14
- */
15
- abstract next(): number;
16
- /**
17
- * fork the rng based on the current state
18
- */
19
- abstract fork(): SeededRandomNumberGenerator;
20
- /**
21
- * clone the rng with the current state
22
- */
23
- abstract clone(): SeededRandomNumberGenerator;
24
- }