diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs index bc8b8a0aede714e3f5e171dc4c0f4ce9bc4ab46f..2e3d2e2c15e008cb2c52701056ac1c1c8e1da781 100644 --- a/application/source/data/transformer.mjs +++ b/application/source/data/transformer.mjs @@ -576,6 +576,32 @@ function transform(value) { return map.get(value); + case "money": + case "currency": + + try { + locale = getLocaleOfDocument(); + } catch (e) { + throw new Error("unsupported locale or missing format (" + e.message + ")"); + } + + const currency = value.substring(0, 3); + if(!currency) { + throw new Error("missing currency parameter"); + } + + const maximumFractionDigits = args?.[0] || 2; + const roundingIncrement = args?.[1] || 5; + + const nf = new Intl.NumberFormat(locale, { + style: "currency", + currency: currency, + maximumFractionDigits: maximumFractionDigits, + roundingIncrement: roundingIncrement, + }); + + return nf.format(value.substring(3)); + case "timestamp": date = new Date(value); timestamp = date.getTime(); @@ -598,6 +624,34 @@ function transform(value) { throw new Error("unsupported locale or missing format (" + e.message + ")"); } + case "datetime": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + try { + locale = getLocaleOfDocument(); + return date.toLocaleString(locale); + + } catch (e) { + throw new Error("unsupported locale or missing format (" + e.message + ")"); + } + + case "date": + date = new Date(value); + if (isNaN(date.getTime())) { + throw new Error("invalid date"); + } + + try { + locale = getLocaleOfDocument(); + return date.toLocaleDateString(locale); + + } catch (e) { + throw new Error("unsupported locale or missing format (" + e.message + ")"); + } + case "year": date = new Date(value); @@ -658,20 +712,6 @@ function transform(value) { return date.getSeconds(); - case "date": - date = new Date(value); - if (isNaN(date.getTime())) { - throw new Error("invalid date"); - } - - try { - locale = getLocaleOfDocument(); - return date.toLocaleDateString(locale); - - } catch (e) { - throw new Error("unsupported locale or missing format (" + e.message + ")"); - } - case "i18n": case "translation": translations = getDocumentTranslations(); diff --git a/development/package.json b/development/package.json index a0832b0500fe8a977f512067a373503bead88672..940baa10e2df77c4fb0161a3b50b603827e352d9 100644 --- a/development/package.json +++ b/development/package.json @@ -35,7 +35,7 @@ "esbuild": "^0.17.10", "flow-bin": "^0.200.1", "fs": "0.0.1-security", - "glob": "^9.0.1", + "glob": "^9.1.0", "graphviz": "^0.0.9", "jsdoc": "^4.0.2", "jsdoc-external-example": "github:volker-schukai/jsdoc-external-example", diff --git a/development/pnpm-lock.yaml b/development/pnpm-lock.yaml index 5d82fc78aef57fc882192a33b6485c01d9ddf6f2..42c593785d7b2016b6723f9299ca3917454136c5 100644 --- a/development/pnpm-lock.yaml +++ b/development/pnpm-lock.yaml @@ -16,7 +16,7 @@ specifiers: esbuild: ^0.17.10 flow-bin: ^0.200.1 fs: 0.0.1-security - glob: ^9.0.1 + glob: ^9.1.0 graphviz: ^0.0.9 jsdoc: ^4.0.2 jsdoc-external-example: github:volker-schukai/jsdoc-external-example @@ -65,7 +65,7 @@ devDependencies: esbuild: 0.17.10 flow-bin: 0.200.1 fs: 0.0.1-security - glob: 9.0.1 + glob: 9.1.0 graphviz: 0.0.9 jsdoc: 4.0.2 jsdoc-external-example: github.com/volker-schukai/jsdoc-external-example/e039186b531487bd1b1d5e2e1586a396b910c9d9 @@ -791,8 +791,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jsdoc/salty/0.2.3: - resolution: {integrity: sha512-bbtCxCkxcnWhi50I+4Lj6mdz9w3pOXOgEQrID8TCZ/DF51fW7M9GCQW2y45SpBDdHd1Eirm1X/Cf6CkAAe8HPg==} + /@jsdoc/salty/0.2.4: + resolution: {integrity: sha512-HRBmslXHM6kpZOfGf0o41NUlGYGER0NoUBcT2Sik4rxzAN7f7+si7ad57SFSFpftvaMVnUaY7YlJuv3v5G80ZA==} engines: {node: '>=v12.0.0'} dependencies: lodash: 4.17.21 @@ -1454,7 +1454,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001458 - electron-to-chromium: 1.4.313 + electron-to-chromium: 1.4.314 node-releases: 2.0.10 update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true @@ -1634,7 +1634,7 @@ packages: peerDependencies: jsdoc: '>=3.x <=4.x' dependencies: - '@jsdoc/salty': 0.2.3 + '@jsdoc/salty': 0.2.4 fs-extra: 10.1.0 html-minifier: 4.0.0 jsdoc: 4.0.2 @@ -1750,7 +1750,7 @@ packages: execa: 4.1.0 polyfill-library: 3.111.0 semver: 7.3.8 - snyk: 1.1109.0 + snyk: 1.1110.0 yargs: 15.4.1 transitivePeerDependencies: - supports-color @@ -2012,8 +2012,8 @@ packages: tslib: 2.5.0 dev: true - /electron-to-chromium/1.4.313: - resolution: {integrity: sha512-QckB9OVqr2oybjIrbMI99uF+b9+iTja5weFe0ePbqLb5BHqXOJUO1SG6kDj/1WtWPRIBr51N153AEq8m7HuIaA==} + /electron-to-chromium/1.4.314: + resolution: {integrity: sha512-+3RmNVx9hZLlc0gW//4yep0K5SYKmIvB5DXg1Yg6varsuAHlHwTeqeygfS8DWwLCsNOWrgj+p9qgM5WYjw1lXQ==} dev: true /emoji-regex/7.0.3: @@ -2408,12 +2408,12 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/9.0.1: - resolution: {integrity: sha512-psRdn8MI0gRcH0xow0VOhYxXD/6ZaRGmgtfN0oWN/hCgjxpRQBMCl7wE4JRJSAUTdJsW+FmD0EtE0CgJhKqSVw==} + /glob/9.1.0: + resolution: {integrity: sha512-bAnZn/xYN7o43Y97vDipnunJtQOOhJAyt7/zt1HrzFgtIrol4eJTUn8Kd74B1cMyOBuzWUMvBr2F178h0UQuUw==} engines: {node: '>=16 || 14 >=14.17'} dependencies: fs.realpath: 1.0.0 - minimatch: 7.3.0 + minimatch: 7.4.1 minipass: 4.2.4 path-scurry: 1.5.0 dev: true @@ -2751,7 +2751,7 @@ packages: hasBin: true dependencies: '@babel/parser': 7.21.2 - '@jsdoc/salty': 0.2.3 + '@jsdoc/salty': 0.2.4 '@types/markdown-it': 12.2.3 bluebird: 3.7.2 catharsis: 0.9.0 @@ -2984,8 +2984,8 @@ packages: yallist: 4.0.0 dev: true - /lru-cache/7.17.0: - resolution: {integrity: sha512-zSxlVVwOabhVyTi6E8gYv2cr6bXK+8ifYz5/uyJb9feXX6NACVDwY4p5Ut3WC3Ivo/QhpARHU3iujx2xGAYHbQ==} + /lru-cache/7.18.1: + resolution: {integrity: sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==} engines: {node: '>=12'} dev: true @@ -3085,8 +3085,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch/7.3.0: - resolution: {integrity: sha512-WaMDuhKa7a6zKiwplR1AOz+zGvJba24k5VU1Cy6NhEguavT2YRlHxuINUgTas4wiS6fwBpYq4TcA1XIECSntyw==} + /minimatch/7.4.1: + resolution: {integrity: sha512-Oz1iPEP+MGl7KS3SciLsLLcuZ7VsBfb7Qrz/jYt/s/sYAv272P26HSLz2f77Y6hzTKXiBi6g765fqpEDNc5fJw==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -3406,7 +3406,7 @@ packages: resolution: {integrity: sha512-hJ8rODLI9B2qwsYAd32rrI76gwVUPeu5kq/do6URDj2bJCVH3ilyT978Mv/NLuFMaqzHrn3XtiDLMZHaTTh4vA==} engines: {node: '>=14'} dependencies: - lru-cache: 7.17.0 + lru-cache: 7.18.1 minipass: 4.2.4 dev: true @@ -4191,8 +4191,8 @@ packages: supports-color: 7.2.0 dev: true - /snyk/1.1109.0: - resolution: {integrity: sha512-sBcibkAfcq6nXr6t0GieDjdc8kQfEf429+M1VKavGfLaJPQNIqSjtOhQJ5FcZqaB/mCWa1szektkHeyAiB4m9A==} + /snyk/1.1110.0: + resolution: {integrity: sha512-rmyaxtEesqEPQOLeWcX7R9duOxNUKfP1ypX6/XaXxQRduvj7S+P6qXCIpZuJIcR3fnnN/jNbvY6WR+sdc2uqxA==} engines: {node: '>=12'} hasBin: true dev: true diff --git a/development/test/cases/data/transformer.mjs b/development/test/cases/data/transformer.mjs index 84e2e536ad7b7af9b18d2871d9ce450f277e8ad4..fa8168777cea91a2e85d997f041a1b0a78cf29fe 100644 --- a/development/test/cases/data/transformer.mjs +++ b/development/test/cases/data/transformer.mjs @@ -28,6 +28,10 @@ describe('Transformer', function () { describe('Transformer.run()', function () { [ + ['currency:1:2', "EUR14.25", "14,2 €"], + ['currency', "EUR14.25", "14,25 €"], + ['datetime', "2023-02-14 14:12:10", "14.2.2023, 14:12:10"], + ['datetime', "2023-02-14 08:02:01", "14.2.2023, 08:02:01"], ['has-entries', {}, false], ['has-entries', {a:4}, true], ['has-entries', [], false],