diff --git a/config/jest/setup.js b/config/jest/setup.js index e69de29..2f5b8e5 100644 --- a/config/jest/setup.js +++ b/config/jest/setup.js @@ -0,0 +1,3 @@ +global.crypto = { + randomUUID: () => 'mocked-uuid', +}; diff --git a/package.json b/package.json index bbbfec8..0576fce 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "reactivexcomponent.js", - "version": "7.0.4", + "version": "7.0.6", "description": "Javascript reactive client API for XComponent", - "main": "dist/index.js", "module": "dist/index.js", + "main": "dist/index.js", "types": "dist/index.d.ts", "exports": { "import": "./dist/index.js", @@ -14,6 +14,7 @@ "lib": "./lib" }, "scripts": { + "build:browser": "rollup -c", "build": "node scripts/clean.js && tsc", "watch": "node scripts/clean.js && tsc -w", "test": "node scripts/test.js --env=jsdom", @@ -80,15 +81,16 @@ "@types/xml2js": "0.4.8", "@types/xmldom": "^0.1.28", "atob": "^2.0.3", - "log4ts": "^0.4.2", "pako": "^1.0.3", "rxjs": "^6.0.0", "rxjs-compat": "^6", - "uuid": "^7.0.0", - "websocket": "^1.0.25", - "xml2js": "^0.4.17" + "tslib": "^2.8.1" }, "devDependencies": { + "@rollup/plugin-commonjs": "^28.0.3", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-typescript": "^12.1.2", "clean-webpack-plugin": "^1.0.0", "compression": "^1.6.2", "husky": "^6.0.0", @@ -98,6 +100,7 @@ "mock-socket": "^9.0.0", "prettier": "^1.14.0", "pretty-quick": "^2.0.0", + "rollup": "^4.39.0", "source-map-loader": "^0.2.0", "ts-jest": "^25.0.0", "ts-loader": "^5.0.0", diff --git a/rollup.config.cjs b/rollup.config.cjs new file mode 100644 index 0000000..683e4f0 --- /dev/null +++ b/rollup.config.cjs @@ -0,0 +1,22 @@ +const resolve = require('@rollup/plugin-node-resolve'); +const commonjs = require('@rollup/plugin-commonjs'); +const typescript = require('@rollup/plugin-typescript'); +const json = require('@rollup/plugin-json'); + + +module.exports = { + input: 'src/index.ts', + output: [ + { file: 'dist/index.js', format: 'esm' }, + { file: 'dist/index.umd.js', format: 'umd', name: 'ReactiveXComponent' } + ], + plugins: [ + resolve(), + commonjs(), + json(), + typescript({ + tsconfig: './tsconfig.json', + tslib: require.resolve('tslib') + }) + ] +}; diff --git a/src/XComponent.ts b/src/XComponent.ts index 8ced619..0fbd94c 100644 --- a/src/XComponent.ts +++ b/src/XComponent.ts @@ -1,80 +1,66 @@ -import { WebSocketConnection } from "./communication/WebSocketConnection"; -import { Connection } from "./interfaces/Connection"; -import { ErrorListener } from "./interfaces/ErrorListener"; -import { Logger, LoggerConfig } from "log4ts"; -import BasicLayout from "log4ts/build/layouts/BasicLayout"; -import ConsoleAppender from "log4ts/build/appenders/ConsoleAppender"; -import { LogLevel } from "log4ts/build/LogLevel"; -import { WebSocketBridgeCommunication } from "./communication/WebSocketBridgeCommunication"; -import { w3cwebsocket as WebSocketLib } from "websocket"; +import { WebSocketConnection } from './communication/WebSocketConnection'; +import { Connection } from './interfaces/Connection'; +import { ErrorListener } from './interfaces/ErrorListener'; +import { Logger } from './utils/Logger'; +import { WebSocketBridgeCommunication } from './communication/WebSocketBridgeCommunication'; export class XComponent { - private logger: Logger = Logger.getLogger("XComponent"); - private loggerconfig: LoggerConfig; + private logger = Logger.getLogger('XComponent'); private initialized: boolean = false; - public connect(serverUrl: string, errorListener?: ErrorListener, heartbeatIntervalSeconds: number = 10): Promise { + public connect( + serverUrl: string, + errorListener?: ErrorListener, + heartbeatIntervalSeconds: number = 10 + ): Promise { this.ensureInitialized(); - return new Promise((resolve, reject): void => { - let webSocket; - if (this.isNodeApplication()) { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; - webSocket = new WebSocketLib(serverUrl); - } else { - webSocket = new WebSocket(serverUrl); - } - let webSocketBridgeCommunication = new WebSocketBridgeCommunication(webSocket); - let connection = new WebSocketConnection(webSocket, webSocketBridgeCommunication); - - webSocket.onopen = ((e: Event) => { - connection.closedByUser = false; - webSocketBridgeCommunication.startHeartbeat(heartbeatIntervalSeconds); - this.logger.info("connection started on " + serverUrl + "."); - resolve(connection); - }).bind(this); - - webSocket.onerror = ((error: Event) => { - if (errorListener) { - errorListener.onError(new Error(error.toString())); - reject(error); + return new Promise( + (resolve, reject): void => { + let webSocket; + if (this.isNodeApplication()) { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + webSocket = new WebSocket(serverUrl); + } else { + webSocket = new WebSocket(serverUrl); } - this.logger.error("Error on " + serverUrl + ".", error); - }).bind(this); + let webSocketBridgeCommunication = new WebSocketBridgeCommunication(webSocket); + let connection = new WebSocketConnection(webSocket, webSocketBridgeCommunication); - webSocket.onclose = ((closeEvent: CloseEvent) => { - this.logger.info("connection on " + serverUrl + " closed.", closeEvent); - if (!connection.closedByUser && errorListener) { - errorListener.onError(new Error("Unxecpected connection close on " + serverUrl)); - reject(closeEvent); - } - webSocketBridgeCommunication.dispose(); - connection.dispose(); - }).bind(this); - }); - } + webSocket.onopen = ((e: Event) => { + connection.closedByUser = false; + webSocketBridgeCommunication.startHeartbeat(heartbeatIntervalSeconds); + this.logger.info('connection started on ' + serverUrl + '.'); + resolve(connection); + }).bind(this); - public setLogLevel(logLevel: LogLevel): void { - this.ensureInitialized(); - this.loggerconfig.setLevel(logLevel); - } + webSocket.onerror = ((error: Event) => { + if (errorListener) { + errorListener.onError(new Error(error.toString())); + reject(error); + } + this.logger.error('Error on ' + serverUrl + '.', error); + }).bind(this); - public getLogLevel(): LogLevel { - this.ensureInitialized(); - return this.loggerconfig.getLevel(); + webSocket.onclose = ((closeEvent: CloseEvent) => { + this.logger.info('connection on ' + serverUrl + ' closed.', closeEvent); + if (!connection.closedByUser && errorListener) { + errorListener.onError(new Error('Unxecpected connection close on ' + serverUrl)); + reject(closeEvent); + } + webSocketBridgeCommunication.dispose(); + connection.dispose(); + }).bind(this); + } + ); } private ensureInitialized() { if (!this.initialized) { - let consoleAppender = new ConsoleAppender(); - consoleAppender.setLayout(new BasicLayout()); - this.loggerconfig = new LoggerConfig(consoleAppender, LogLevel.INFO); - Logger.setConfig(this.loggerconfig); this.initialized = true; } } private isNodeApplication() { - return typeof process === "object" && - process + "" === "[object process]" && typeof window === "undefined"; + return typeof process === 'object' && process + '' === '[object process]' && typeof window === 'undefined'; } -} \ No newline at end of file +} diff --git a/src/communication/WebSocketBridgeCommunication.ts b/src/communication/WebSocketBridgeCommunication.ts index d849259..b71e543 100644 --- a/src/communication/WebSocketBridgeCommunication.ts +++ b/src/communication/WebSocketBridgeCommunication.ts @@ -3,12 +3,12 @@ import { filter, first, map, takeWhile } from 'rxjs/operators'; import { Commands } from '../configuration/xcWebSocketBridgeConfiguration'; import { CompositionModel, DeserializedData, Serializer, Deserializer } from './xcomponentMessages'; import 'rxjs/add/observable/fromEvent'; -import { Logger } from 'log4ts'; +import { Logger } from '../utils/Logger'; import { DefaultApiConfigurationParser } from '../configuration/apiConfigurationParser'; import { ApiConfiguration } from '../configuration/apiConfiguration'; export class WebSocketBridgeCommunication { - private logger: Logger = Logger.getLogger('HeartbeatManager'); + private logger = Logger.getLogger('HeartbeatManager'); private updates$: Observable; private deserializer: Deserializer; private serializer: Serializer; @@ -33,7 +33,7 @@ export class WebSocketBridgeCommunication { this.updates$ .pipe(filter((data: DeserializedData) => data.command === command)) .subscribe((data: DeserializedData) => { - this.logger.trace('Heartbeat received successfully'); + this.logger.debug('Heartbeat received successfully'); }); let commandData = { Command: command, @@ -42,7 +42,7 @@ export class WebSocketBridgeCommunication { let input = thisWebSocketBridgeCommunication.serializer.convertCommandDataToWebsocketInputFormat(commandData); this.heartbeatTimer = setInterval(() => { thisWebSocketBridgeCommunication.webSocket.send(input); - this.logger.trace('Heartbeat sent'); + this.logger.debug('Heartbeat sent'); }, heartbeatIntervalSeconds * 1000); } diff --git a/src/communication/WebSocketConnection.test.ts b/src/communication/WebSocketConnection.test.ts index d0db6b1..6009446 100644 --- a/src/communication/WebSocketConnection.test.ts +++ b/src/communication/WebSocketConnection.test.ts @@ -3,7 +3,7 @@ import { WebSocket, Server } from 'mock-socket'; import { ErrorListener } from '../../src/interfaces/ErrorListener'; import Mock from '../utils/mockSubscriberDependencies'; import pako = require('pako'); -import * as uuid from 'uuid/v4'; +import { generateUUID } from '../utils/uuid'; const encodeServerMessage = (strData: string) => { let binaryString = pako.deflate(strData, { to: 'string' }); @@ -12,7 +12,7 @@ const encodeServerMessage = (strData: string) => { }; describe('Test Connection module', function() { - let mockServer: Server; + let mockServer: Server | undefined; beforeEach(function() { // tslint:disable-next-line:no-any @@ -21,12 +21,12 @@ describe('Test Connection module', function() { (window).isTestEnvironnement = true; }); - afterEach(() => { + afterEach((done) => { if (mockServer) { - mockServer.stop(() => { - /**/ - }); + mockServer.close(); // Utiliser close() et non stop() + mockServer = undefined; } + done(); // Pour Jest : signaler la fin du teardown }); describe('Test createSession method', function() { @@ -41,7 +41,7 @@ describe('Test Connection module', function() { }) .then(session => { expect(session).not.toBe(null); - mockServer.stop(done); + mockServer?.stop(done); }) .catch(err => { console.log(err); @@ -72,7 +72,7 @@ describe('Test Connection module', function() { connection.createSession(xcApiFileName).catch(error => { // it refers explicitly to the unknown Api on the error message, not to some random crash expect(error.message).toMatch(xcApiFileName); - mockServer.stop(done); + mockServer?.stop(done); }); }); @@ -90,7 +90,7 @@ describe('Test Connection module', function() { mockServer = new Server(serverUrl); const xcApiFileName = 'api.xcApi'; mockServer.on('connection', server => { - mockServer.close(undefined); + mockServer?.close(undefined); }); new XComponent() .connect(serverUrl, new FakeErrorHandler(err => done())) @@ -114,7 +114,7 @@ describe('Test Connection module', function() { describe('Test getModel method', function() { let serverMock: Server, serverUrl: string; beforeEach(function() { - serverUrl = 'wss://' + uuid(); + serverUrl = 'wss://' + generateUUID(); serverMock = new Server(serverUrl); }); diff --git a/src/communication/WebSocketSubscriber.test.ts b/src/communication/WebSocketSubscriber.test.ts index 6e03309..0ad136f 100644 --- a/src/communication/WebSocketSubscriber.test.ts +++ b/src/communication/WebSocketSubscriber.test.ts @@ -4,11 +4,12 @@ import { Deserializer } from '../../src/communication/xcomponentMessages'; import Mock from '../utils/mockSubscriberDependencies'; import { EventEmitter } from 'events'; import { PrivateTopics } from '../../src/interfaces/PrivateTopics'; -import * as uuid from 'uuid/v4'; +import { generateUUID } from '../utils/uuid'; import { verify, instance, mock, anything } from '../../node_modules/ts-mockito/lib/ts-mockito'; import { WebSocketWrapper } from '../../src/communication/WebSocketWrapper'; describe('Test xcWebSocketSubscriber module', function() { + let mockServer: Server | undefined; beforeEach(function() { // tslint:disable-next-line:no-any (window).WebSocket = WebSocket; @@ -16,10 +17,18 @@ describe('Test xcWebSocketSubscriber module', function() { (window).isTestEnvironnement = true; }); + + afterEach(() => { + if (mockServer) { + mockServer.close(); + mockServer = undefined; + } + }); + describe('Test subscribe method', function() { - let subscriber, mockServer: Server, mockWebSocket; + let subscriber, mockWebSocket; beforeEach(function() { - let serverUrl = 'wss://' + uuid(); + let serverUrl = 'wss://' + generateUUID(); mockServer = new Server(serverUrl); mockWebSocket = new WebSocket(serverUrl); subscriber = new WebSocketSubscriber(new WebSocketWrapper(mockWebSocket), Mock.configuration); @@ -38,14 +47,14 @@ describe('Test xcWebSocketSubscriber module', function() { expect(data.stateMachineRef.StateName).toEqual(Mock.correctReceivedData.stateMachineRef.StateName); expect(data.stateMachineRef.send).toEqual(expect.any(Function)); expect(data.jsonMessage).toEqual(Mock.correctReceivedData.jsonMessage); - mockServer.stop(done); + mockServer?.stop(done); }; // subscribe send a message (subscribe request) subscriber.subscribe('component', 'stateMachine', { onStateMachineUpdate: stateMachineUpdateListener }); }; // tslint:disable-next-line:no-any - mockServer.on('connection', function(server: any) { + mockServer?.on('connection', function(server: any) { // when subscribe request is received, we send send jsonData // tslint:disable-next-line:no-any server.on('message', function(subscribeRequest: any) { @@ -103,9 +112,9 @@ describe('Test xcWebSocketSubscriber module', function() { }); describe('Test getSnapshot method', function() { - let subscriber, mockServer: Server, mockWebSocket, privateTopics; + let subscriber, mockWebSocket, privateTopics; beforeEach(function() { - let serverUrl = 'wss://' + uuid(); + let serverUrl = 'wss://' + generateUUID(); mockServer = new Server(serverUrl); mockWebSocket = new WebSocket(serverUrl); subscriber = new WebSocketSubscriber(new WebSocketWrapper(mockWebSocket), Mock.configuration); @@ -117,7 +126,7 @@ describe('Test xcWebSocketSubscriber module', function() { let deserializer = new Deserializer(); // tslint:disable-next-line:no-any - mockServer.on('connection', function(server: any) { + mockServer?.on('connection', function(server: any) { let n = -3; let topic: string = ''; @@ -164,7 +173,7 @@ describe('Test xcWebSocketSubscriber module', function() { mockWebSocket.onopen = function() { subscriber .getSnapshot('component', 'stateMachine', privateTopics) - .then(items => mockServer.stop(done)) + .then(items => mockServer?.stop(done)) .catch(err => { console.error(err); }); diff --git a/src/communication/WebSocketSubscriber.ts b/src/communication/WebSocketSubscriber.ts index 354f5e0..127bdd4 100644 --- a/src/communication/WebSocketSubscriber.ts +++ b/src/communication/WebSocketSubscriber.ts @@ -12,18 +12,18 @@ import { Serializer, Deserializer, fatalErrorState, - JsonMessage + JsonMessage, } from './xcomponentMessages'; import { PrivateTopics } from '../interfaces/PrivateTopics'; import { StateMachineInstance } from '../interfaces/StateMachineInstance'; import { StateMachineRef } from '../interfaces/StateMachineRef'; import { StateMachineUpdateListener } from '../interfaces/StateMachineUpdateListener'; -import * as uuid from 'uuid/v4'; -import { Logger } from 'log4ts'; +import { generateUUID } from '../utils/uuid'; +import { Logger } from '../utils/Logger'; import { WebSocketWrapper } from './WebSocketWrapper'; export class WebSocketSubscriber { - private logger: Logger = Logger.getLogger('WebSocketSubscriber'); + private logger = Logger.getLogger('WebSocketSubscriber'); private stateMachineRefSendPublisher: WebSocketPublisher; private subscribedStateMachines: { [componentName: string]: Array }; private updates$: Observable; @@ -56,7 +56,7 @@ export class WebSocketSubscriber { stateMachineName: string, privateTopics: PrivateTopics ): Promise> { - const replyTopic = uuid(); + const replyTopic = generateUUID(); const thisSubscriber = this; const promise = this.updates$ .pipe( @@ -94,7 +94,7 @@ export class WebSocketSubscriber { let jsonMessage = { Timeout: this.timeout, CallerPrivateTopic: privateTopics.getSubscriberTopics(), - ReplyTopic: replyTopic + ReplyTopic: replyTopic, }; let header = getHeaderWithIncomingType(); header.ComponentCode = componentCode; @@ -104,8 +104,8 @@ export class WebSocketSubscriber { ComponentCode: componentCode, Event: { Header: header, - JsonMessage: JSON.stringify(jsonMessage) - } + JsonMessage: JSON.stringify(jsonMessage), + }, }; return dataToSendSnapshot; } @@ -183,7 +183,7 @@ export class WebSocketSubscriber { let data = this.getDataToSend(topic, kind); let commandData = { Command: Commands[Commands.subscribe], - Data: data + Data: data, }; let input = this.serializer.convertCommandDataToWebsocketInputFormat(commandData); this.webSocketWrapper.send(input); @@ -193,7 +193,7 @@ export class WebSocketSubscriber { let data = this.getDataToSend(topic, kind); let commandData = { Command: Commands[Commands.unsubscribe], - Data: data + Data: data, }; let input = this.serializer.convertCommandDataToWebsocketInputFormat(commandData); this.webSocketWrapper.send(input); @@ -205,9 +205,9 @@ export class WebSocketSubscriber { JsonMessage: JSON.stringify({ Topic: { Key: topic, - kind: kind - } - }) + kind: kind, + }, + }), }; } @@ -224,7 +224,7 @@ export class WebSocketSubscriber { let data = this.getDataToSend(topic, kind); let commandData = { Command: Commands[Commands.unsubscribe], - Data: data + Data: data, }; this.webSocketWrapper.send(this.serializer.convertCommandDataToWebsocketInputFormat(commandData)); this.removeSubscribedStateMachines(componentName, stateMachineName); @@ -324,7 +324,7 @@ export class WebSocketSubscriber { specifiedPrivateTopic ); }, - ErrorMessage: errorMessage + ErrorMessage: errorMessage, }; return stateMachineRef; } diff --git a/src/communication/xcomponentMessages.ts b/src/communication/xcomponentMessages.ts index c7209ed..9a7e7c2 100644 --- a/src/communication/xcomponentMessages.ts +++ b/src/communication/xcomponentMessages.ts @@ -1,6 +1,6 @@ -import { Logger } from 'log4ts'; +import { Logger } from '../utils/Logger'; + import * as pako from 'pako'; -import * as atob from 'atob'; export const fatalErrorState = 'FatalError'; @@ -71,7 +71,7 @@ export let getHeaderWithIncomingType = (): Header => { }; export class Serializer { - private logger: Logger = Logger.getLogger('Serializer'); + private logger = Logger.getLogger('Serializer'); public convertToWebsocketInputFormat(data: Data): string { let input = `${data.RoutingKey} ${data.ComponentCode} ${JSON.stringify(data.Event)}`; @@ -139,7 +139,11 @@ export class Deserializer { public getJsonDataFromGetXcApiListRequest(data: string): Array { let jsonData = this.getJsonData(data); - return jsonData.Apis.$values; + // NewtonSoft JSON adds $values.... + if (jsonData.Apis.$values) { + return jsonData.Apis.$values; + } + return jsonData.Apis; } // tslint:disable-next-line:no-any diff --git a/src/configuration/apiCommunicationUtils.ts b/src/configuration/apiCommunicationUtils.ts new file mode 100644 index 0000000..2398bc2 --- /dev/null +++ b/src/configuration/apiCommunicationUtils.ts @@ -0,0 +1,46 @@ +import { ApiCommunication, Topic } from './parsedApiConfigurationTypes'; + +// Définir un type plus large pour couvrir les cas transformés depuis le XML +export type RawCommunication = { + attributes?: Partial; + componentCode?: string; + stateMachineCode?: string; + eventType?: string; + event?: string; + eventCode?: string; + topic?: { value?: string; type?: string; _?: string } | { value?: string; type?: string; _?: string }[]; +}; + +export function normalizeCommunication(input: RawCommunication): ApiCommunication { + return { + attributes: { + componentCode: input.componentCode ?? input.attributes?.componentCode ?? '', + stateMachineCode: input.stateMachineCode ?? input.attributes?.stateMachineCode, + eventType: input.eventType ?? input.attributes?.eventType, + event: input.event ?? input.attributes?.event, + eventCode: input.eventCode ?? input.attributes?.eventCode, + }, + topic: normalizeTopic(input.topic), + }; +} + +function normalizeTopic( + topic: { value?: string; type?: string; _?: string } | { value?: string; type?: string; _?: string }[] | undefined +): [Topic] { + if (!topic) { + return [{ value: '' }]; + } + + const getTopicValue = (t: { value?: string; type?: string; _?: string }): string => + typeof t._ === 'string' ? t._ : + typeof t.value === 'string' ? t.value : + ''; + + if (Array.isArray(topic)) { + const normalized = topic.map((t): Topic => ({ value: getTopicValue(t) })); + // ✅ on garde tous les éléments mais on force le type [Topic] + return normalized.length > 0 ? (normalized as [Topic]) : [{ value: '' }]; + } + + return [{ value: getTopicValue(topic) }]; +} diff --git a/src/configuration/apiConfiguration.test.ts b/src/configuration/apiConfiguration.test.ts index 3e11591..cf0e822 100644 --- a/src/configuration/apiConfiguration.test.ts +++ b/src/configuration/apiConfiguration.test.ts @@ -90,9 +90,11 @@ test('GetPublisherDetails should return the right publisher details given existi return parse().then(config => { let correctPublish = { eventCode: 9, - routingKey: 'input.1_0.HelloWorldMicroservice.HelloWorld.HelloWorldManager' + routingKey: 'input.1_0.HelloWorldMicroservice.HelloWorld.HelloWorldManager', }; let publish = config.getPublisherDetails(-69981087, -829536631, 'XComponent.HelloWorld.UserObject.SayHello'); + console.log('debug GetPublisherDetails: ' + publish); + console.log('debug GetPublisherDetails: ' + JSON.stringify(publish)); expect(publish).toEqual(correctPublish); }); }); diff --git a/src/configuration/apiConfiguration.ts b/src/configuration/apiConfiguration.ts index d038e34..c6caf66 100644 --- a/src/configuration/apiConfiguration.ts +++ b/src/configuration/apiConfiguration.ts @@ -1,4 +1,12 @@ -import { ParsedApiConfiguration, ApiCommunication, Component, State, StateMachine } from './parsedApiConfiguration'; +import { + ApiCommunication, + ParsedApiConfiguration, + Component, + State, + StateMachine, +} from './parsedApiConfigurationTypes'; + +import { normalizeCommunication } from './apiCommunicationUtils'; export interface PublisherDetails { eventCode: number; @@ -7,7 +15,7 @@ export interface PublisherDetails { export enum SubscriberEventType { Update, - Error + Error, } export interface ApiConfiguration { @@ -44,17 +52,17 @@ export class DefaultApiConfiguration implements ApiConfiguration { getComponentCode(componentName: string): number { const component = this.findComponentByName(componentName); - return Number(component.attributes.id); + return Number(component.id); } getStateMachineCode(componentName: string, stateMachineName: string): number { const component = this.findComponentByName(componentName); const stateMachine = this.findStateMachineByName(component, stateMachineName); - return Number(stateMachine.attributes.id); + return Number(stateMachine.id); } private findStateMachineByName(component: Component, stateMachineName: string): StateMachine { - const stateMachine = this.findStateMachine(component, stm => stm.attributes.name === stateMachineName); + const stateMachine = this.findStateMachine(component, stm => stm.name === stateMachineName); if (!stateMachine) { throw new Error(`StateMachine '${stateMachineName}' not found`); } @@ -62,7 +70,7 @@ export class DefaultApiConfiguration implements ApiConfiguration { } private findStateMachineByCode(component: Component, stateMachineCode: number): StateMachine { - const stateMachine = this.findStateMachine(component, stm => Number(stm.attributes.id) === stateMachineCode); + const stateMachine = this.findStateMachine(component, stm => Number(stm.id) === stateMachineCode); if (!stateMachine) { throw new Error(`StateMachine '${stateMachineCode}' not found`); } @@ -70,15 +78,25 @@ export class DefaultApiConfiguration implements ApiConfiguration { } private findStateByCode(stateMachine: StateMachine, stateCode: number): State { - const result = stateMachine.states[0].State.find(state => Number(state.attributes.id) === stateCode); + const stateContainer = stateMachine.states; + const statesArray = Array.isArray(stateContainer?.State) + ? stateContainer.State + : stateContainer?.State + ? [stateContainer.State] + : []; + + const result = statesArray.find(state => Number(state.id) === stateCode); + if (!result) { throw new Error(`State '${stateCode}' not found`); } + return result; } + private findComponentByName(componentName: string): Component { - const result = this.findComponent(component => component.attributes.name === componentName); + const result = this.findComponent(component => component.name === componentName); if (!result) { throw new Error(`Component '${componentName}' not found`); } @@ -86,7 +104,7 @@ export class DefaultApiConfiguration implements ApiConfiguration { } private findComponentByCode(componentCode: number): Component { - const result = this.findComponent(component => Number(component.attributes.id) === componentCode); + const result = this.findComponent(component => Number(component.id) === componentCode); if (!result) { throw new Error(`Component '${componentCode}' not found`); } @@ -94,25 +112,32 @@ export class DefaultApiConfiguration implements ApiConfiguration { } private findComponent(predicate: (component: Component) => boolean): Component | undefined { - return this._config.deployment.codesConverter[0].components[0].component.find(predicate); + const codesConverter = (this._config.deployment.codesConverter as unknown) as { + components: { + component: Component[]; + }; + }; + const components = codesConverter.components.component; + + return components.find(predicate); } private findStateMachine( component: Component, predicate: (stateMachine: StateMachine) => boolean ): StateMachine | undefined { - return component.stateMachines[0].stateMachine.find(predicate); + return component.stateMachines.stateMachine.find(predicate); } containsComponent(componentName: string): boolean { - const result = this.findComponent(component => component.attributes.name === componentName); + const result = this.findComponent(component => component.name === componentName); return result ? true : false; } containsStateMachine(componentName: string, stateMachineName: string): boolean { - const result = this.findComponent(component => component.attributes.name === componentName); + const result = this.findComponent(component => component.name === componentName); if (result) { - return result.stateMachines[0].stateMachine.find(stm => stm.attributes.name === stateMachineName) != null; + return result.stateMachines.stateMachine.find(stm => stm.name === stateMachineName) != null; } return false; } @@ -133,10 +158,9 @@ export class DefaultApiConfiguration implements ApiConfiguration { `publisher not found - component code: ${componentCode} - statemachine code: ${stateMachineCode} - message type: ${messageType} ` ); } - return { eventCode: Number(publisher.attributes.eventCode), - routingKey: publisher.topic[0].value + routingKey: publisher.topic[0].value, }; } @@ -145,7 +169,12 @@ export class DefaultApiConfiguration implements ApiConfiguration { stateMachineCode: number, messageType: string ): ApiCommunication | undefined { - return this._config.deployment.clientAPICommunication[0].publish.find( + const raw = this._config.deployment.clientAPICommunication.publish; + + const publishArrayRaw = Array.isArray(raw) ? raw : [raw]; + const publishArray = publishArrayRaw.map(normalizeCommunication); + + return publishArray.find( pub => Number(pub.attributes.componentCode) === componentCode && Number(pub.attributes.stateMachineCode) === stateMachineCode && @@ -170,18 +199,24 @@ export class DefaultApiConfiguration implements ApiConfiguration { stateMachineCode: number, type: SubscriberEventType ): ApiCommunication | undefined { - return this._config.deployment.clientAPICommunication[0].subscribe.find( - pub => - Number(pub.attributes.componentCode) === componentCode && - Number(pub.attributes.stateMachineCode) === stateMachineCode && - pub.attributes.eventType === SubscriberEventType[type].toUpperCase() + const raw = this._config.deployment.clientAPICommunication.subscribe; + const subscribeArrayRaw = Array.isArray(raw) ? raw : [raw]; + const subscribeArray = subscribeArrayRaw.map(normalizeCommunication); + + return subscribeArray.find( + sub => + Number(sub.attributes.componentCode) === componentCode && + Number(sub.attributes.stateMachineCode) === stateMachineCode && + sub.attributes.eventType === SubscriberEventType[type].toUpperCase() ); } getSnapshotTopic(componentCode: number): string { - const snapshot = this._config.deployment.clientAPICommunication[0].snapshot.find( - pub => Number(pub.attributes.componentCode) === componentCode - ); + const raw = this._config.deployment.clientAPICommunication.snapshot; + const snapshotArrayRaw = Array.isArray(raw) ? raw : [raw]; + const snapshotArray = snapshotArrayRaw.map(normalizeCommunication); + + const snapshot = snapshotArray.find(pub => Number(pub.attributes.componentCode) === componentCode); if (!snapshot) { throw new Error(`Snapshot topic not found - component code: ${componentCode}`); @@ -195,6 +230,6 @@ export class DefaultApiConfiguration implements ApiConfiguration { const stateMachine = this.findStateMachineByCode(component, stateMachineCode); const state = this.findStateByCode(stateMachine, stateCode); - return state.attributes.name; + return state.name; } } diff --git a/src/configuration/apiConfigurationParser.ts b/src/configuration/apiConfigurationParser.ts index f7ebe6c..df01857 100644 --- a/src/configuration/apiConfigurationParser.ts +++ b/src/configuration/apiConfigurationParser.ts @@ -1,31 +1,28 @@ -import { parseString } from 'xml2js'; + +import { ParsedApiConfiguration } from './parsedApiConfigurationTypes'; import { DefaultApiConfiguration, ApiConfiguration } from './apiConfiguration'; -import { ParsedApiConfiguration } from './parsedApiConfiguration'; +import { parseXmlToJson } from '../utils/xmlParser'; export interface ApiConfigurationParser { - parse(xmlConfig: string): Promise; + parse(xmlConfig: string): Promise; } +// Remplace la dépendance à xml2js export class DefaultApiConfigurationParser implements ApiConfigurationParser { - parse(xmlConfig: string): Promise { - return new Promise((resolve, reject) => { - // tslint:disable-next-line:no-any - parseString(xmlConfig, { charkey: 'value', attrkey: 'attributes' }, function(err: any, result: any) { - if (err) { - reject(err); - } else { - const rawConfig = result as ParsedApiConfiguration; - if (rawConfig) { - try { - resolve(new DefaultApiConfiguration(result)); - } catch (err) { - reject(err); - } - } else { - reject(new Error(`invalid configuration: ${xmlConfig}`)); - } - } - }); - }); - } + parse(xmlConfig: string): Promise { + return new Promise((resolve, reject) => { + try { + const result = parseXmlToJson(xmlConfig); // voir fonction ci-dessous + const rawConfig = result as ParsedApiConfiguration; + + if (rawConfig?.deployment) { + resolve(new DefaultApiConfiguration(rawConfig)); + } else { + reject(new Error('Invalid parsed XML structure')); + } + } catch (err) { + reject(err); + } + }); + } } diff --git a/src/configuration/parsedApiConfiguration.ts b/src/configuration/parsedApiConfiguration.ts deleted file mode 100644 index 70ba4a8..0000000 --- a/src/configuration/parsedApiConfiguration.ts +++ /dev/null @@ -1,47 +0,0 @@ -export interface ParsedApiConfiguration { - deployment: Deployment; -} - -export interface Deployment { - codesConverter: [CodeConverter]; - clientAPICommunication: [ClientApiCommunication]; -} - -export interface CodeConverter { - components: [{ component: [Component] }]; -} - -export interface Component { - attributes: { name: string; id: string }; - stateMachines: [{ stateMachine: [StateMachine] }]; -} - -export interface StateMachine { - attributes: { name: string; id: string }; - states: [{ State: [State] }]; -} - -export interface State { - attributes: { name: string; id: string }; -} - -export interface ClientApiCommunication { - publish: [ApiCommunication]; - subscribe: [ApiCommunication]; - snapshot: [ApiCommunication]; -} - -export interface ApiCommunication { - attributes: { - componentCode: string; - stateMachineCode?: string; - eventType?: string; - event?: string; - eventCode?: string; - }; - topic: [Topic]; -} - -export interface Topic { - value: string; -} diff --git a/src/configuration/parsedApiConfigurationTypes.ts b/src/configuration/parsedApiConfigurationTypes.ts new file mode 100644 index 0000000..14b7ccb --- /dev/null +++ b/src/configuration/parsedApiConfigurationTypes.ts @@ -0,0 +1,139 @@ +// Interfaces principales pour le parsing de la configuration XML XComponent + +export interface ParsedApiConfiguration { + deployment: Deployment; +} + +export interface ApiCommunication { + attributes: { + componentCode: string; + stateMachineCode?: string; + eventType?: string; + event?: string; + eventCode?: string; + }; + topic: [Topic]; +} + +export interface Topic { + value: string; +} + +export interface Deployment { + environment: string; + xcProjectName: string; + deploymentTargetCode: string; + deploymentTargetName: string; + version: string; + frameworkType: string; + xmlns: string; + threading: object; + serialization: string; + communication: { + websocket: WebSocketConfig; + }; + clientAPICommunication: ClientAPICommunication; + codesConverter: CodesConverter; +} + +export interface PublisherDetails { + eventCode: number; + routingKey: string; +} + +export enum SubscriberEventType { + Update, + Error, +} + +export interface ApiConfiguration { + getComponentCode(componentName: string): number; + containsComponent(componentName: string): boolean; + getStateMachineCode(componentName: string, stateMachineName: string): number; + containsStateMachine(componentName: string, stateMachineName: string): boolean; + getPublisherDetails(componentCode: number, stateMachineCode: number, messageType: string): PublisherDetails; + getSubscriberTopic(componentCode: number, stateMachineCode: number, type: SubscriberEventType): string; + getSnapshotTopic(componentCode: number): string; + getStateName(componentCode: number, stateMachineCode: number, stateCode: number): string; + containsPublisher(componentCode: number, stateMachineCode: number, messageType: string): boolean; + containsSubscriber(componentCode: number, stateMachineCode: number, type: SubscriberEventType): boolean; +} + +export interface WebSocketConfig { + name: string; + host: string; + port: string; + user: string; + password: string; + type: string; +} + +export interface ClientAPICommunication { + publish: PublishSubscribeConfig; + subscribe: PublishSubscribeConfig[]; + snapshot: SnapshotConfig; +} + +export interface PublishSubscribeConfig { + componentCode: string; + stateMachineCode?: string; + eventType: string; + topicType: string; + communicationType: string; + stateCode?: string; + eventCode?: string; + event?: string; + communication: string; + communicationThreadingType?: string; + topic: { + type: string; + }; +} + +export interface SnapshotConfig { + componentCode: string; + topic: { + type: string; + }; +} + +export interface CodesConverter { + components: { + component: Component[]; + }; +} + +export interface Component { + name: string; + id: string; + events: { + event: Event[]; + }; + stateMachines: { + stateMachine: StateMachine[]; + }; +} + +export interface Event { + name: string; + id: string; +} + +export interface StateMachine { + name: string; + id: string; + states: { + State: State | State[]; + }; +} + +export interface State { + name: string; + id: string; +} + +// Utilitaire pour normaliser les states (si unique ou liste) +export function getStateArray(sm: StateMachine): State[] { + const s = sm.states.State; + return Array.isArray(s) ? s : [s]; +} diff --git a/src/index.ts b/src/index.ts index 8a2c1fd..05e439b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,32 @@ -export { CompositionModel, JsonMessage } from "./communication/xcomponentMessages"; -export { StateMachineUpdateListener } from "./interfaces/StateMachineUpdateListener"; -export { StateMachineInstance } from "./interfaces/StateMachineInstance"; -export { StateMachineRef } from "./interfaces/StateMachineRef"; -export { ErrorListener } from "./interfaces/ErrorListener"; -export { Connection } from "./interfaces/Connection"; -export { LogLevel } from "log4ts/build/LogLevel"; -export { Session } from "./interfaces/Session"; -export { XComponent } from "./XComponent"; - -import { XComponent } from "./XComponent"; -export default new XComponent(); \ No newline at end of file +import { forceCompile } from './utils/forceCompile'; + +import { StateMachineInstance } from './interfaces/StateMachineInstance'; +import { StateMachineRef } from './interfaces/StateMachineRef'; +import { JsonMessage, CompositionModel } from './communication/xcomponentMessages'; +import { XComponent } from './XComponent'; +import { Session } from './interfaces/Session'; +import { Connection } from './interfaces/Connection'; +import { ErrorListener } from './interfaces/ErrorListener'; +import { StateMachineUpdateListener } from './interfaces/StateMachineUpdateListener'; + +// ✅ Exportation publique +export { CompositionModel, JsonMessage } from './communication/xcomponentMessages'; +export { StateMachineUpdateListener } from './interfaces/StateMachineUpdateListener'; +export { StateMachineInstance } from './interfaces/StateMachineInstance'; +export { StateMachineRef } from './interfaces/StateMachineRef'; +export { ErrorListener } from './interfaces/ErrorListener'; +export { Connection } from './interfaces/Connection'; +export { Session } from './interfaces/Session'; +export { XComponent } from './XComponent'; + +// ✅ Forcer l'inclusion sans violer TSLint +forceCompile(new StateMachineInstance({} as StateMachineRef, {} as JsonMessage)); +forceCompile(new XComponent()); +forceCompile({} as Session); +forceCompile({} as Connection); +forceCompile({} as ErrorListener); +forceCompile({} as StateMachineUpdateListener); +forceCompile({} as CompositionModel); + +// ✅ Export par défaut +export default new XComponent(); diff --git a/src/interfaces/PrivateTopics.ts b/src/interfaces/PrivateTopics.ts index 5b824d2..bafcbd4 100644 --- a/src/interfaces/PrivateTopics.ts +++ b/src/interfaces/PrivateTopics.ts @@ -1,10 +1,9 @@ import { Utils } from '../communication/Utils'; -import * as uuid from 'uuid/v4'; import { WebSocketSubscriber } from '../communication/WebSocketSubscriber'; import { Kinds } from '../configuration/xcWebSocketBridgeConfiguration'; - +import { generateUUID } from '../utils/uuid'; export class PrivateTopics { - private defaultPublisherTopic: string = uuid(); + private defaultPublisherTopic: string = generateUUID(); private subscriberTopics: Array = []; constructor(private subscriber: WebSocketSubscriber) { diff --git a/src/utils/Logger.ts b/src/utils/Logger.ts new file mode 100644 index 0000000..e1bcf93 --- /dev/null +++ b/src/utils/Logger.ts @@ -0,0 +1,25 @@ +export interface LogMethod { + (...args: unknown[]): void; +} + +export interface LoggerInstance { + debug: LogMethod; + info: LogMethod; + warn: LogMethod; + error: LogMethod; +} + +export class Logger { + static getLogger(name: string): LoggerInstance { + const wrap = (fn: (...args: unknown[]) => void): LogMethod => { + return (...args: unknown[]) => fn(`[${name}]`, ...args); + }; + + return { + debug: wrap(console.debug), + info: wrap(console.info), + warn: wrap(console.warn), + error: wrap(console.error), + }; + } +} diff --git a/src/utils/forceCompile.ts b/src/utils/forceCompile.ts new file mode 100644 index 0000000..f55f386 --- /dev/null +++ b/src/utils/forceCompile.ts @@ -0,0 +1,3 @@ +export function forceCompile(_value: T): void { + // Ne fait rien, sert juste à forcer la compilation +} diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts new file mode 100644 index 0000000..ceac18e --- /dev/null +++ b/src/utils/uuid.ts @@ -0,0 +1,3 @@ +export function generateUUID(): string { + return crypto.randomUUID(); +} diff --git a/src/utils/xmlParser.ts b/src/utils/xmlParser.ts new file mode 100644 index 0000000..fa30e14 --- /dev/null +++ b/src/utils/xmlParser.ts @@ -0,0 +1,51 @@ +import { ParsedApiConfiguration } from '../configuration/parsedApiConfigurationTypes'; + +type XmlJsonNode = { + [key: string]: XmlJsonNode | XmlJsonNode[] | string; + _: string; +}; + +function xmlNodeToJson(node: Element): XmlJsonNode { + const obj: XmlJsonNode = { _: '' }; + + // Attributs + for (const attr of Array.from(node.attributes)) { + obj[attr.name] = attr.value; + } + + // Enfants + for (const child of Array.from(node.children)) { + const tag = child.tagName; + const childObj = xmlNodeToJson(child); + if (obj[tag]) { + if (!Array.isArray(obj[tag])) { + obj[tag] = [obj[tag] as XmlJsonNode]; + } + (obj[tag] as XmlJsonNode[]).push(childObj); + } else { + obj[tag] = childObj; + } + } + + // Texte + const text = node.textContent?.trim(); + if (text && node.children.length === 0) { + obj._ = text; + } + + return obj; +} + + +export function parseXmlToJson(xml: string): ParsedApiConfiguration { + const parser = new DOMParser(); + const doc = parser.parseFromString(xml, 'application/xml'); + + const errorNode = doc.querySelector('parsererror'); + if (errorNode){ throw new Error('Invalid XML')}; + + const root = doc.documentElement; + const result = { [root.tagName]: xmlNodeToJson(root) }; + + return result as unknown as ParsedApiConfiguration; +} diff --git a/tsconfig.json b/tsconfig.json index 21ec250..7fe8c62 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,11 @@ { "compilerOptions": { "outDir": "dist", - "module": "commonjs", + "module": "esnext", "target": "es5", + "importHelpers": false, "declaration": true, - "lib": [ - "dom", - "es6", - "scripthost" - ], + "lib": ["dom", "es6", "scripthost"], "sourceMap": true, "allowJs": false, "jsx": "react", @@ -22,19 +19,7 @@ "noUnusedLocals": true, "skipLibCheck": true }, - "exclude": [ - "node_modules", - "build", - "scripts", - "acceptance-tests", - "jest", - "**/*.test.ts", - "**/*.test.tsx" - ], - "include": [ - "src/**/*" - ], - "types": [ - "typePatches" - ] -} \ No newline at end of file + "exclude": ["node_modules", "build", "scripts", "acceptance-tests", "jest", "**/*.test.ts", "**/*.test.tsx"], + "include": ["src/**/*"], + "types": ["typePatches"] +} diff --git a/yarn.lock b/yarn.lock index 13b6307..b4717b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -599,6 +599,159 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@rollup/plugin-commonjs@^28.0.3": + version "28.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz#44c2cc7c955c6113b96696b55e6bc2446bd67913" + integrity sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + fdir "^6.2.0" + is-reference "1.2.1" + magic-string "^0.30.3" + picomatch "^4.0.2" + +"@rollup/plugin-json@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" + integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== + dependencies: + "@rollup/pluginutils" "^5.1.0" + +"@rollup/plugin-node-resolve@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz#2fc6b54ca3d77e12f3fb45b2a55b50720de4c95d" + integrity sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-typescript@^12.1.2": + version "12.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz#ebaeec2e7376faa889030ccd7cb485a649e63118" + integrity sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg== + dependencies: + "@rollup/pluginutils" "^5.1.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz#1d8cc5dd3d8ffe569d8f7f67a45c7909828a0f66" + integrity sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA== + +"@rollup/rollup-android-arm64@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz#9c136034d3d9ed29d0b138c74dd63c5744507fca" + integrity sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ== + +"@rollup/rollup-darwin-arm64@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz#830d07794d6a407c12b484b8cf71affd4d3800a6" + integrity sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q== + +"@rollup/rollup-darwin-x64@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz#b26f0f47005c1fa5419a880f323ed509dc8d885c" + integrity sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ== + +"@rollup/rollup-freebsd-arm64@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz#2b60c81ac01ff7d1bc8df66aee7808b6690c6d19" + integrity sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ== + +"@rollup/rollup-freebsd-x64@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz#4826af30f4d933d82221289068846c9629cc628c" + integrity sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz#a1f4f963d5dcc9e5575c7acf9911824806436bf7" + integrity sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g== + +"@rollup/rollup-linux-arm-musleabihf@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz#e924b0a8b7c400089146f6278446e6b398b75a06" + integrity sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw== + +"@rollup/rollup-linux-arm64-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz#cb43303274ec9a716f4440b01ab4e20c23aebe20" + integrity sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ== + +"@rollup/rollup-linux-arm64-musl@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz#531c92533ce3d167f2111bfcd2aa1a2041266987" + integrity sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA== + +"@rollup/rollup-linux-loongarch64-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz#53403889755d0c37c92650aad016d5b06c1b061a" + integrity sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz#f669f162e29094c819c509e99dbeced58fc708f9" + integrity sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ== + +"@rollup/rollup-linux-riscv64-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz#4bab37353b11bcda5a74ca11b99dea929657fd5f" + integrity sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ== + +"@rollup/rollup-linux-riscv64-musl@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz#4d66be1ce3cfd40a7910eb34dddc7cbd4c2dd2a5" + integrity sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA== + +"@rollup/rollup-linux-s390x-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz#7181c329395ed53340a0c59678ad304a99627f6d" + integrity sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA== + +"@rollup/rollup-linux-x64-gnu@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz#00825b3458094d5c27cb4ed66e88bfe9f1e65f90" + integrity sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA== + +"@rollup/rollup-linux-x64-musl@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz#81caac2a31b8754186f3acc142953a178fcd6fba" + integrity sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg== + +"@rollup/rollup-win32-arm64-msvc@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz#3a3f421f5ce9bd99ed20ce1660cce7cee3e9f199" + integrity sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ== + +"@rollup/rollup-win32-ia32-msvc@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz#a44972d5cdd484dfd9cf3705a884bf0c2b7785a7" + integrity sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ== + +"@rollup/rollup-win32-x64-msvc@4.39.0": + version "4.39.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz#bfe0214e163f70c4fec1c8f7bb8ce266f4c05b7e" + integrity sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug== + "@sinonjs/commons@^1.7.0": version "1.8.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" @@ -650,6 +803,11 @@ version "0.31.39" resolved "https://registry.yarnpkg.com/@types/es6-shim/-/es6-shim-0.31.39.tgz#61de60fac180f967177bcde598a62072a39ea04b" +"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -710,6 +868,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@types/rx-core-binding@*": version "4.0.4" resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3" @@ -1463,6 +1626,11 @@ commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" @@ -1834,6 +2002,11 @@ estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1993,6 +2166,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fdir@^6.2.0: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" @@ -2073,10 +2251,20 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2255,6 +2443,13 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -2385,6 +2580,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -2458,6 +2660,11 @@ is-generator-fn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2480,6 +2687,13 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -3565,10 +3779,6 @@ lodash@^4.17.19, lodash@^4.7.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log4ts@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/log4ts/-/log4ts-0.4.2.tgz#379c40bdc8390eab9cea4bd6f7bbae8b38d9839b" - loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3582,6 +3792,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.30.3: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -3771,7 +3988,7 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -nan@^2.11.0, nan@^2.9.2: +nan@^2.9.2: version "2.12.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" @@ -4157,6 +4374,11 @@ path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4172,6 +4394,11 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -4513,6 +4740,15 @@ resolve@^1.18.1: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.22.1: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -4530,6 +4766,35 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" +rollup@^4.39.0: + version "4.39.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.39.0.tgz#9dc1013b70c0e2cb70ef28350142e9b81b3f640c" + integrity sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.39.0" + "@rollup/rollup-android-arm64" "4.39.0" + "@rollup/rollup-darwin-arm64" "4.39.0" + "@rollup/rollup-darwin-x64" "4.39.0" + "@rollup/rollup-freebsd-arm64" "4.39.0" + "@rollup/rollup-freebsd-x64" "4.39.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.39.0" + "@rollup/rollup-linux-arm-musleabihf" "4.39.0" + "@rollup/rollup-linux-arm64-gnu" "4.39.0" + "@rollup/rollup-linux-arm64-musl" "4.39.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.39.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.39.0" + "@rollup/rollup-linux-riscv64-gnu" "4.39.0" + "@rollup/rollup-linux-riscv64-musl" "4.39.0" + "@rollup/rollup-linux-s390x-gnu" "4.39.0" + "@rollup/rollup-linux-x64-gnu" "4.39.0" + "@rollup/rollup-linux-x64-musl" "4.39.0" + "@rollup/rollup-win32-arm64-msvc" "4.39.0" + "@rollup/rollup-win32-ia32-msvc" "4.39.0" + "@rollup/rollup-win32-x64-msvc" "4.39.0" + fsevents "~2.3.2" + rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -4594,7 +4859,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@>=0.6.0, sax@^1.2.4: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -4940,6 +5205,11 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -5112,6 +5382,11 @@ tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" +tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslint-config-prettier@^1.14.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -5274,10 +5549,6 @@ uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" -uuid@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.0.tgz#1833d4b9ce50b732bfaa271f9cb74e974d303c79" - uuid@^8.3.0: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -5358,15 +5629,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -websocket@^1.0.25: - version "1.0.28" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3" - dependencies: - debug "^2.2.0" - nan "^2.11.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -5494,17 +5756,6 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" -xml2js@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -5519,10 +5770,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"