Merge branch 'develop' into omkar/fix-state-diagram-default-direction

This commit is contained in:
Sidharth Vinod
2025-02-18 23:44:19 +05:30
committed by GitHub
14 changed files with 139 additions and 83 deletions

View File

@@ -0,0 +1,5 @@
---
'mermaid': patch
---
Added versioning to StateDB and updated tests and diagrams to use it.

View File

@@ -45,9 +45,8 @@ jobs:
node-version-file: '.node-version' node-version-file: '.node-version'
- name: Cache snapshots - name: Cache snapshots
id: cache-snapshot id: cache-snapshot
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
with: with:
save-always: true
path: ./cypress/snapshots path: ./cypress/snapshots
key: ${{ runner.os }}-snapshots-${{ env.targetHash }} key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
@@ -96,7 +95,7 @@ jobs:
# These cached snapshots are downloaded, providing the reference snapshots. # These cached snapshots are downloaded, providing the reference snapshots.
- name: Cache snapshots - name: Cache snapshots
id: cache-snapshot id: cache-snapshot
uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 uses: actions/cache/restore@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
with: with:
path: ./cypress/snapshots path: ./cypress/snapshots
key: ${{ runner.os }}-snapshots-${{ env.targetHash }} key: ${{ runner.os }}-snapshots-${{ env.targetHash }}

View File

@@ -32,7 +32,7 @@ jobs:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Restore lychee cache - name: Restore lychee cache
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
with: with:
path: .lycheecache path: .lycheecache
key: cache-lychee-${{ github.sha }} key: cache-lychee-${{ github.sha }}

View File

@@ -372,8 +372,8 @@ export const addLinks = function (actorId: string, text: { text: string }) {
// JSON.parse the text // JSON.parse the text
try { try {
let sanitizedText = sanitizeText(text.text, getConfig()); let sanitizedText = sanitizeText(text.text, getConfig());
sanitizedText = sanitizedText.replace(/&/g, '&');
sanitizedText = sanitizedText.replace(/=/g, '='); sanitizedText = sanitizedText.replace(/=/g, '=');
sanitizedText = sanitizedText.replace(/&/g, '&');
const links = JSON.parse(sanitizedText); const links = JSON.parse(sanitizedText);
// add the deserialized text to the actor's links field. // add the deserialized text to the actor's links field.
insertLinks(actor, links); insertLinks(actor, links);
@@ -389,8 +389,8 @@ export const addALink = function (actorId: string, text: { text: string }) {
const links: Record<string, string> = {}; const links: Record<string, string> = {};
let sanitizedText = sanitizeText(text.text, getConfig()); let sanitizedText = sanitizeText(text.text, getConfig());
const sep = sanitizedText.indexOf('@'); const sep = sanitizedText.indexOf('@');
sanitizedText = sanitizedText.replace(/&amp;/g, '&');
sanitizedText = sanitizedText.replace(/&equals;/g, '='); sanitizedText = sanitizedText.replace(/&equals;/g, '=');
sanitizedText = sanitizedText.replace(/&amp;/g, '&');
const label = sanitizedText.slice(0, sep - 1).trim(); const label = sanitizedText.slice(0, sep - 1).trim();
const link = sanitizedText.slice(sep + 1).trim(); const link = sanitizedText.slice(sep + 1).trim();

View File

@@ -9,7 +9,7 @@ setConfig({
describe('state parser can parse...', () => { describe('state parser can parse...', () => {
let stateDb; let stateDb;
beforeEach(function () { beforeEach(function () {
stateDb = new StateDB(); stateDb = new StateDB(2);
stateDiagram.parser.yy = stateDb; stateDiagram.parser.yy = stateDb;
stateDiagram.parser.yy.clear(); stateDiagram.parser.yy.clear();
}); });

View File

@@ -9,7 +9,7 @@ setConfig({
describe('ClassDefs and classes when parsing a State diagram', () => { describe('ClassDefs and classes when parsing a State diagram', () => {
let stateDb; let stateDb;
beforeEach(function () { beforeEach(function () {
stateDb = new StateDB(); stateDb = new StateDB(2);
stateDiagram.parser.yy = stateDb; stateDiagram.parser.yy = stateDb;
stateDiagram.parser.yy.clear(); stateDiagram.parser.yy.clear();
}); });
@@ -135,7 +135,6 @@ describe('ClassDefs and classes when parsing a State diagram', () => {
diagram += '[*]:::exampleStyleClass --> b\n'; diagram += '[*]:::exampleStyleClass --> b\n';
stateDiagram.parser.parse(diagram); stateDiagram.parser.parse(diagram);
stateDiagram.parser.yy.extract(stateDiagram.parser.yy.getRootDocV2());
const states = stateDiagram.parser.yy.getStates(); const states = stateDiagram.parser.yy.getStates();
const classes = stateDiagram.parser.yy.getClasses(); const classes = stateDiagram.parser.yy.getClasses();

View File

@@ -59,9 +59,14 @@ const newDoc = () => {
const clone = (o) => JSON.parse(JSON.stringify(o)); const clone = (o) => JSON.parse(JSON.stringify(o));
export class StateDB { export class StateDB {
constructor() { /**
* @param {1 | 2} version - v1 renderer or v2 renderer.
*/
constructor(version) {
this.clear(); this.clear();
this.version = version;
// Needed for JISON since it only supports direct properties // Needed for JISON since it only supports direct properties
this.setRootDoc = this.setRootDoc.bind(this); this.setRootDoc = this.setRootDoc.bind(this);
this.getDividerId = this.getDividerId.bind(this); this.getDividerId = this.getDividerId.bind(this);
@@ -69,6 +74,12 @@ export class StateDB {
this.trimColon = this.trimColon.bind(this); this.trimColon = this.trimColon.bind(this);
} }
/**
* @private
* @type {1 | 2}
*/
version;
/** /**
* @private * @private
* @type {Array} * @type {Array}
@@ -126,7 +137,11 @@ export class StateDB {
log.info('Setting root doc', o); log.info('Setting root doc', o);
// rootDoc = { id: 'root', doc: o }; // rootDoc = { id: 'root', doc: o };
this.rootDoc = o; this.rootDoc = o;
this.extract(o); if (this.version === 1) {
this.extract(o);
} else {
this.extract(this.getRootDocV2());
}
} }
getRootDoc() { getRootDoc() {
@@ -186,6 +201,10 @@ export class StateDB {
} }
} }
} }
/**
* @private
*/
getRootDocV2() { getRootDocV2() {
this.docTranslator({ id: 'root' }, { id: 'root', doc: this.rootDoc }, true); this.docTranslator({ id: 'root' }, { id: 'root', doc: this.rootDoc }, true);
return { id: 'root', doc: this.rootDoc }; return { id: 'root', doc: this.rootDoc };

View File

@@ -3,7 +3,7 @@ import { StateDB } from './stateDb.js';
describe('State Diagram stateDb', () => { describe('State Diagram stateDb', () => {
let stateDb; let stateDb;
beforeEach(() => { beforeEach(() => {
stateDb = new StateDB(); stateDb = new StateDB(1);
}); });
describe('addStyleClass', () => { describe('addStyleClass', () => {
@@ -23,7 +23,7 @@ describe('State Diagram stateDb', () => {
describe('addDescription to a state', () => { describe('addDescription to a state', () => {
let stateDb; let stateDb;
beforeEach(() => { beforeEach(() => {
stateDb = new StateDB(); stateDb = new StateDB(1);
stateDb.addState('state1'); stateDb.addState('state1');
}); });
@@ -79,7 +79,7 @@ describe('State Diagram stateDb', () => {
describe('state db class', () => { describe('state db class', () => {
let stateDb; let stateDb;
beforeEach(() => { beforeEach(() => {
stateDb = new StateDB(); stateDb = new StateDB(1);
}); });
// This is to ensure that functions used in state JISON are exposed as function from StateDb // This is to ensure that functions used in state JISON are exposed as function from StateDb
it('should have functions used in flow JISON as own property', () => { it('should have functions used in flow JISON as own property', () => {

View File

@@ -7,7 +7,7 @@ describe('state diagram V2, ', function () {
describe('when parsing an info graph it', function () { describe('when parsing an info graph it', function () {
let stateDb; let stateDb;
beforeEach(function () { beforeEach(function () {
stateDb = new StateDB(); stateDb = new StateDB(2);
parser.yy = stateDb; parser.yy = stateDb;
stateDiagram.parser.yy = stateDb; stateDiagram.parser.yy = stateDb;
stateDiagram.parser.yy.clear(); stateDiagram.parser.yy.clear();

View File

@@ -8,7 +8,7 @@ import renderer from './stateRenderer-v3-unified.js';
export const diagram: DiagramDefinition = { export const diagram: DiagramDefinition = {
parser, parser,
get db() { get db() {
return new StateDB(); return new StateDB(2);
}, },
renderer, renderer,
styles, styles,

View File

@@ -5,7 +5,7 @@ describe('state diagram, ', function () {
describe('when parsing an info graph it', function () { describe('when parsing an info graph it', function () {
let stateDb; let stateDb;
beforeEach(function () { beforeEach(function () {
stateDb = new StateDB(); stateDb = new StateDB(1);
parser.yy = stateDb; parser.yy = stateDb;
}); });

View File

@@ -8,7 +8,7 @@ import renderer from './stateRenderer.js';
export const diagram: DiagramDefinition = { export const diagram: DiagramDefinition = {
parser, parser,
get db() { get db() {
return new StateDB(); return new StateDB(1);
}, },
renderer, renderer,
styles, styles,

View File

@@ -136,7 +136,6 @@ const renderDoc = (doc, diagram, parentId, altBkg, root, domDocument, diagObj) =
return {}; return {};
}); });
diagObj.db.extract(doc);
const states = diagObj.db.getStates(); const states = diagObj.db.getStates();
const relations = diagObj.db.getRelations(); const relations = diagObj.db.getRelations();

163
pnpm-lock.yaml generated
View File

@@ -36,7 +36,7 @@ importers:
version: 9.12.0 version: 9.12.0
'@rollup/plugin-typescript': '@rollup/plugin-typescript':
specifier: ^11.1.6 specifier: ^11.1.6
version: 11.1.6(rollup@4.32.0)(tslib@2.7.0)(typescript@5.4.5) version: 11.1.6(rollup@4.32.0)(tslib@2.8.1)(typescript@5.4.5)
'@types/cors': '@types/cors':
specifier: ^2.8.17 specifier: ^2.8.17
version: 2.8.17 version: 2.8.17
@@ -120,7 +120,7 @@ importers:
version: 28.8.3(@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.12.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.16.11))(typescript@5.4.5) version: 28.8.3(@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.12.0(jiti@1.21.6))(jest@29.7.0(@types/node@20.16.11))(typescript@5.4.5)
eslint-plugin-jsdoc: eslint-plugin-jsdoc:
specifier: ^50.0.0 specifier: ^50.0.0
version: 50.3.1(eslint@9.12.0(jiti@1.21.6)) version: 50.3.2(eslint@9.12.0(jiti@1.21.6))
eslint-plugin-json: eslint-plugin-json:
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.1 version: 4.0.1
@@ -138,7 +138,7 @@ importers:
version: 0.3.0 version: 0.3.0
eslint-plugin-unicorn: eslint-plugin-unicorn:
specifier: ^56.0.0 specifier: ^56.0.0
version: 56.0.0(eslint@9.12.0(jiti@1.21.6)) version: 56.0.1(eslint@9.12.0(jiti@1.21.6))
express: express:
specifier: ^4.19.1 specifier: ^4.19.1
version: 4.21.0 version: 4.21.0
@@ -967,10 +967,6 @@ packages:
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.7':
resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.9': '@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -2313,6 +2309,12 @@ packages:
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/eslint-utils@4.4.1':
resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/regexpp@4.11.1': '@eslint-community/regexpp@4.11.1':
resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -4226,8 +4228,8 @@ packages:
caniuse-lite@1.0.30001667: caniuse-lite@1.0.30001667:
resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==}
caniuse-lite@1.0.30001699: caniuse-lite@1.0.30001700:
resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==}
caseless@0.12.0: caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -4318,8 +4320,8 @@ packages:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
ci-info@4.0.0: ci-info@4.1.0:
resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==}
engines: {node: '>=8'} engines: {node: '>=8'}
cjs-module-lexer@1.4.1: cjs-module-lexer@1.4.1:
@@ -4549,9 +4551,6 @@ packages:
resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
engines: {node: '>=12.13'} engines: {node: '>=12.13'}
core-js-compat@3.38.1:
resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==}
core-js-compat@3.40.0: core-js-compat@3.40.0:
resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==}
@@ -5261,6 +5260,9 @@ packages:
es-module-lexer@1.5.4: es-module-lexer@1.5.4:
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
es-module-lexer@1.6.0:
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
es-object-atoms@1.1.1: es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -5370,8 +5372,8 @@ packages:
jest: jest:
optional: true optional: true
eslint-plugin-jsdoc@50.3.1: eslint-plugin-jsdoc@50.3.2:
resolution: {integrity: sha512-SY9oUuTMr6aWoJggUS40LtMjsRzJPB5ZT7F432xZIHK3EfHF+8i48GbUBpwanrtlL9l1gILNTHK9o8gEhYLcKA==} resolution: {integrity: sha512-TjgZocG53N3a84PdCFGqVMWLWwDitOUuKjlJftwTu/iTiD7N/Q2Q3eEy/Q4GfJqpM4rTJCkzUYWQfol6RZNDcA==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -5399,8 +5401,8 @@ packages:
eslint-plugin-tsdoc@0.3.0: eslint-plugin-tsdoc@0.3.0:
resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==}
eslint-plugin-unicorn@56.0.0: eslint-plugin-unicorn@56.0.1:
resolution: {integrity: sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==} resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==}
engines: {node: '>=18.18'} engines: {node: '>=18.18'}
peerDependencies: peerDependencies:
eslint: '>=8.56.0' eslint: '>=8.56.0'
@@ -5421,6 +5423,10 @@ packages:
resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@4.2.0:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.12.0: eslint@9.12.0:
resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -5439,6 +5445,10 @@ packages:
resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@10.3.0:
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
esprima@1.1.1: esprima@1.1.1:
resolution: {integrity: sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==} resolution: {integrity: sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
@@ -8538,6 +8548,11 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
semver@7.7.1:
resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
engines: {node: '>=10'}
hasBin: true
send@0.19.0: send@0.19.0:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -8761,8 +8776,8 @@ packages:
spdx-expression-parse@4.0.0: spdx-expression-parse@4.0.0:
resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
spdx-license-ids@3.0.20: spdx-license-ids@3.0.21:
resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
spdy-transport@3.0.0: spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
@@ -9166,6 +9181,9 @@ packages:
tslib@2.7.0: tslib@2.7.0:
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsx@4.19.1: tsx@4.19.1:
resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
@@ -10597,7 +10615,7 @@ snapshots:
'@babel/types': 7.25.7 '@babel/types': 7.25.7
'@jridgewell/gen-mapping': 0.3.5 '@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
jsesc: 3.0.2 jsesc: 3.1.0
'@babel/generator@7.26.9': '@babel/generator@7.26.9':
dependencies: dependencies:
@@ -10619,7 +10637,7 @@ snapshots:
dependencies: dependencies:
'@babel/compat-data': 7.25.7 '@babel/compat-data': 7.25.7
'@babel/helper-validator-option': 7.25.7 '@babel/helper-validator-option': 7.25.7
browserslist: 4.24.0 browserslist: 4.24.4
lru-cache: 5.1.1 lru-cache: 5.1.1
semver: 6.3.1 semver: 6.3.1
@@ -10739,7 +10757,7 @@ snapshots:
'@babel/core': 7.25.7 '@babel/core': 7.25.7
'@babel/helper-module-imports': 7.25.7 '@babel/helper-module-imports': 7.25.7
'@babel/helper-simple-access': 7.25.7 '@babel/helper-simple-access': 7.25.7
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
'@babel/traverse': 7.25.7 '@babel/traverse': 7.25.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -10844,8 +10862,6 @@ snapshots:
'@babel/helper-string-parser@7.25.9': {} '@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.7': {}
'@babel/helper-validator-identifier@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {}
'@babel/helper-validator-option@7.25.7': {} '@babel/helper-validator-option@7.25.7': {}
@@ -10872,7 +10888,7 @@ snapshots:
'@babel/highlight@7.25.7': '@babel/highlight@7.25.7':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
chalk: 2.4.2 chalk: 2.4.2
js-tokens: 4.0.0 js-tokens: 4.0.0
picocolors: 1.1.1 picocolors: 1.1.1
@@ -11960,7 +11976,7 @@ snapshots:
'@babel/types@7.25.7': '@babel/types@7.25.7':
dependencies: dependencies:
'@babel/helper-string-parser': 7.25.7 '@babel/helper-string-parser': 7.25.7
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
'@babel/types@7.26.9': '@babel/types@7.26.9':
@@ -12446,7 +12462,7 @@ snapshots:
'@emnapi/runtime@1.3.0': '@emnapi/runtime@1.3.0':
dependencies: dependencies:
tslib: 2.7.0 tslib: 2.8.1
optional: true optional: true
'@es-joy/jsdoccomment@0.48.0': '@es-joy/jsdoccomment@0.48.0':
@@ -12676,6 +12692,11 @@ snapshots:
eslint: 9.12.0(jiti@1.21.6) eslint: 9.12.0(jiti@1.21.6)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/eslint-utils@4.4.1(eslint@9.12.0(jiti@1.21.6))':
dependencies:
eslint: 9.12.0(jiti@1.21.6)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.11.1': {} '@eslint-community/regexpp@4.11.1': {}
'@eslint/config-array@0.18.0': '@eslint/config-array@0.18.0':
@@ -13171,14 +13192,14 @@ snapshots:
optionalDependencies: optionalDependencies:
rollup: 2.79.2 rollup: 2.79.2
'@rollup/plugin-typescript@11.1.6(rollup@4.32.0)(tslib@2.7.0)(typescript@5.4.5)': '@rollup/plugin-typescript@11.1.6(rollup@4.32.0)(tslib@2.8.1)(typescript@5.4.5)':
dependencies: dependencies:
'@rollup/pluginutils': 5.1.2(rollup@4.32.0) '@rollup/pluginutils': 5.1.2(rollup@4.32.0)
resolve: 1.22.8 resolve: 1.22.8
typescript: 5.4.5 typescript: 5.4.5
optionalDependencies: optionalDependencies:
rollup: 4.32.0 rollup: 4.32.0
tslib: 2.7.0 tslib: 2.8.1
'@rollup/pluginutils@3.1.0(rollup@2.79.2)': '@rollup/pluginutils@3.1.0(rollup@2.79.2)':
dependencies: dependencies:
@@ -13859,7 +13880,7 @@ snapshots:
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.6.3 semver: 7.7.1
ts-api-utils: 1.3.0(typescript@5.6.2) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
@@ -13874,7 +13895,7 @@ snapshots:
fast-glob: 3.3.2 fast-glob: 3.3.2
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.6.3 semver: 7.7.1
ts-api-utils: 1.3.0(typescript@5.4.5) ts-api-utils: 1.3.0(typescript@5.4.5)
optionalDependencies: optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
@@ -13883,7 +13904,7 @@ snapshots:
'@typescript-eslint/utils@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5)': '@typescript-eslint/utils@8.8.1(eslint@9.12.0(jiti@1.21.6))(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.1(eslint@9.12.0(jiti@1.21.6))
'@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/scope-manager': 8.8.1
'@typescript-eslint/types': 8.8.1 '@typescript-eslint/types': 8.8.1
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5) '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.4.5)
@@ -14477,6 +14498,10 @@ snapshots:
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.12.1
acorn-jsx@5.3.2(acorn@8.14.0):
dependencies:
acorn: 8.14.0
acorn-walk@8.3.4: acorn-walk@8.3.4:
dependencies: dependencies:
acorn: 8.14.0 acorn: 8.14.0
@@ -14927,7 +14952,7 @@ snapshots:
browserslist@4.24.4: browserslist@4.24.4:
dependencies: dependencies:
caniuse-lite: 1.0.30001699 caniuse-lite: 1.0.30001700
electron-to-chromium: 1.5.101 electron-to-chromium: 1.5.101
node-releases: 2.0.19 node-releases: 2.0.19
update-browserslist-db: 1.1.2(browserslist@4.24.4) update-browserslist-db: 1.1.2(browserslist@4.24.4)
@@ -15018,7 +15043,7 @@ snapshots:
caniuse-lite@1.0.30001667: {} caniuse-lite@1.0.30001667: {}
caniuse-lite@1.0.30001699: {} caniuse-lite@1.0.30001700: {}
caseless@0.12.0: {} caseless@0.12.0: {}
@@ -15120,7 +15145,7 @@ snapshots:
ci-info@3.9.0: {} ci-info@3.9.0: {}
ci-info@4.0.0: {} ci-info@4.1.0: {}
cjs-module-lexer@1.4.1: {} cjs-module-lexer@1.4.1: {}
@@ -15339,10 +15364,6 @@ snapshots:
dependencies: dependencies:
is-what: 4.1.16 is-what: 4.1.16
core-js-compat@3.38.1:
dependencies:
browserslist: 4.24.0
core-js-compat@3.40.0: core-js-compat@3.40.0:
dependencies: dependencies:
browserslist: 4.24.4 browserslist: 4.24.4
@@ -16232,6 +16253,8 @@ snapshots:
es-module-lexer@1.5.4: {} es-module-lexer@1.5.4: {}
es-module-lexer@1.6.0: {}
es-object-atoms@1.1.1: es-object-atoms@1.1.1:
dependencies: dependencies:
es-errors: 1.3.0 es-errors: 1.3.0
@@ -16411,18 +16434,18 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
eslint-plugin-jsdoc@50.3.1(eslint@9.12.0(jiti@1.21.6)): eslint-plugin-jsdoc@50.3.2(eslint@9.12.0(jiti@1.21.6)):
dependencies: dependencies:
'@es-joy/jsdoccomment': 0.48.0 '@es-joy/jsdoccomment': 0.48.0
are-docs-informative: 0.0.2 are-docs-informative: 0.0.2
comment-parser: 1.4.1 comment-parser: 1.4.1
debug: 4.3.7(supports-color@8.1.1) debug: 4.4.0
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint: 9.12.0(jiti@1.21.6) eslint: 9.12.0(jiti@1.21.6)
espree: 10.2.0 espree: 10.3.0
esquery: 1.6.0 esquery: 1.6.0
parse-imports: 2.2.1 parse-imports: 2.2.1
semver: 7.6.3 semver: 7.7.1
spdx-expression-parse: 4.0.0 spdx-expression-parse: 4.0.0
synckit: 0.9.2 synckit: 0.9.2
transitivePeerDependencies: transitivePeerDependencies:
@@ -16452,24 +16475,24 @@ snapshots:
'@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc': 0.15.0
'@microsoft/tsdoc-config': 0.17.0 '@microsoft/tsdoc-config': 0.17.0
eslint-plugin-unicorn@56.0.0(eslint@9.12.0(jiti@1.21.6)): eslint-plugin-unicorn@56.0.1(eslint@9.12.0(jiti@1.21.6)):
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.25.7 '@babel/helper-validator-identifier': 7.25.9
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.1(eslint@9.12.0(jiti@1.21.6))
ci-info: 4.0.0 ci-info: 4.1.0
clean-regexp: 1.0.0 clean-regexp: 1.0.0
core-js-compat: 3.38.1 core-js-compat: 3.40.0
eslint: 9.12.0(jiti@1.21.6) eslint: 9.12.0(jiti@1.21.6)
esquery: 1.6.0 esquery: 1.6.0
globals: 15.10.0 globals: 15.10.0
indent-string: 4.0.0 indent-string: 4.0.0
is-builtin-module: 3.2.1 is-builtin-module: 3.2.1
jsesc: 3.0.2 jsesc: 3.1.0
pluralize: 8.0.0 pluralize: 8.0.0
read-pkg-up: 7.0.1 read-pkg-up: 7.0.1
regexp-tree: 0.1.27 regexp-tree: 0.1.27
regjsparser: 0.10.0 regjsparser: 0.10.0
semver: 7.6.3 semver: 7.7.1
strip-indent: 3.0.0 strip-indent: 3.0.0
eslint-scope@5.1.1: eslint-scope@5.1.1:
@@ -16486,6 +16509,8 @@ snapshots:
eslint-visitor-keys@4.1.0: {} eslint-visitor-keys@4.1.0: {}
eslint-visitor-keys@4.2.0: {}
eslint@9.12.0(jiti@1.21.6): eslint@9.12.0(jiti@1.21.6):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.6))
@@ -16541,6 +16566,12 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.12.1) acorn-jsx: 5.3.2(acorn@8.12.1)
eslint-visitor-keys: 4.1.0 eslint-visitor-keys: 4.1.0
espree@10.3.0:
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.2.0
esprima@1.1.1: {} esprima@1.1.1: {}
esprima@4.0.1: {} esprima@4.0.1: {}
@@ -16786,7 +16817,7 @@ snapshots:
proxy-addr: 2.0.7 proxy-addr: 2.0.7
rfdc: 1.4.1 rfdc: 1.4.1
secure-json-parse: 2.7.0 secure-json-parse: 2.7.0
semver: 7.6.3 semver: 7.6.2
toad-cache: 3.7.0 toad-cache: 3.7.0
fastq@1.17.1: fastq@1.17.1:
@@ -17843,7 +17874,7 @@ snapshots:
'@babel/parser': 7.25.7 '@babel/parser': 7.25.7
'@istanbuljs/schema': 0.1.3 '@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
semver: 7.6.3 semver: 7.7.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -18170,7 +18201,7 @@ snapshots:
jest-util: 29.7.0 jest-util: 29.7.0
natural-compare: 1.4.0 natural-compare: 1.4.0
pretty-format: 29.7.0 pretty-format: 29.7.0
semver: 7.6.3 semver: 7.7.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -18622,7 +18653,7 @@ snapshots:
make-dir@4.0.0: make-dir@4.0.0:
dependencies: dependencies:
semver: 7.6.3 semver: 7.7.1
makeerror@1.0.12: makeerror@1.0.12:
dependencies: dependencies:
@@ -19192,7 +19223,7 @@ snapshots:
normalize-package-data@2.5.0: normalize-package-data@2.5.0:
dependencies: dependencies:
hosted-git-info: 2.8.9 hosted-git-info: 2.8.9
resolve: 1.22.8 resolve: 1.22.10
semver: 5.7.2 semver: 5.7.2
validate-npm-package-license: 3.0.4 validate-npm-package-license: 3.0.4
@@ -19455,12 +19486,12 @@ snapshots:
parse-imports@2.2.1: parse-imports@2.2.1:
dependencies: dependencies:
es-module-lexer: 1.5.4 es-module-lexer: 1.6.0
slashes: 3.0.12 slashes: 3.0.12
parse-json@5.2.0: parse-json@5.2.0:
dependencies: dependencies:
'@babel/code-frame': 7.25.7 '@babel/code-frame': 7.26.2
error-ex: 1.3.2 error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1 json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4 lines-and-columns: 1.2.4
@@ -20226,6 +20257,8 @@ snapshots:
semver@7.6.3: {} semver@7.6.3: {}
semver@7.7.1: {}
send@0.19.0: send@0.19.0:
dependencies: dependencies:
debug: 2.6.9 debug: 2.6.9
@@ -20307,7 +20340,7 @@ snapshots:
dependencies: dependencies:
color: 4.2.3 color: 4.2.3
detect-libc: 2.0.3 detect-libc: 2.0.3
semver: 7.6.3 semver: 7.7.1
optionalDependencies: optionalDependencies:
'@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-arm64': 0.33.5
'@img/sharp-darwin-x64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5
@@ -20516,21 +20549,21 @@ snapshots:
spdx-correct@3.2.0: spdx-correct@3.2.0:
dependencies: dependencies:
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
spdx-license-ids: 3.0.20 spdx-license-ids: 3.0.21
spdx-exceptions@2.5.0: {} spdx-exceptions@2.5.0: {}
spdx-expression-parse@3.0.1: spdx-expression-parse@3.0.1:
dependencies: dependencies:
spdx-exceptions: 2.5.0 spdx-exceptions: 2.5.0
spdx-license-ids: 3.0.20 spdx-license-ids: 3.0.21
spdx-expression-parse@4.0.0: spdx-expression-parse@4.0.0:
dependencies: dependencies:
spdx-exceptions: 2.5.0 spdx-exceptions: 2.5.0
spdx-license-ids: 3.0.20 spdx-license-ids: 3.0.21
spdx-license-ids@3.0.20: {} spdx-license-ids@3.0.21: {}
spdy-transport@3.0.0: spdy-transport@3.0.0:
dependencies: dependencies:
@@ -20785,7 +20818,7 @@ snapshots:
synckit@0.9.2: synckit@0.9.2:
dependencies: dependencies:
'@pkgr/core': 0.1.1 '@pkgr/core': 0.1.1
tslib: 2.7.0 tslib: 2.8.1
tabbable@6.2.0: {} tabbable@6.2.0: {}
@@ -20996,6 +21029,8 @@ snapshots:
tslib@2.7.0: {} tslib@2.7.0: {}
tslib@2.8.1: {}
tsx@4.19.1: tsx@4.19.1:
dependencies: dependencies:
esbuild: 0.23.1 esbuild: 0.23.1