diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 4df4f2d8..0e200349 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -121,8 +121,11 @@ jobs: - name: 🏗️ Build run: npm run build - - name: 📦 Electron Package - run: npx electron-packager . LinguifAI --platform=win32 --arch=x64 --out=dist + #- name: 📦 Electron Package + # run: npx electron-packager . LinguifAI --platform=win32 --arch=x64 --out=dist + + - name: 📦 Electron Builder + run: npm run electron:package:win - name: Get latest release number id: get_latest_release @@ -139,12 +142,15 @@ jobs: const newVersion = `${parseInt(versionParts[0])}.${parseInt(versionParts[1])}.${parseInt(versionParts[2]) + 1}`; console.log(`::set-output name=new_version::${newVersion}`); + - name: Rename file + run: mv dist/LinguifAI\ Setup\ 0.1.0.exe dist/LinguifAI\ Setup\ ${{ steps.get_latest_release.outputs.new_version }}.exe + - name: Create Release id: create_release uses: softprops/action-gh-release@v1 with: files: | - ./dist/LinguifAI-win32-x64/LinguifAI.exe + ./dist/LinguifAI\ Setup\ ${{ steps.get_latest_release.outputs.new_version }}.exe tag_name: v${{ steps.get_latest_release.outputs.new_version }} name: Release v${{ steps.get_latest_release.outputs.new_version }} prerelease: true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eab7f8ba..b19f8445 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -99,9 +99,15 @@ jobs: with: node-version: "14" - - name: Install Wine + - name: Install Wine64 run: sudo apt update && sudo apt install wine64 + - name: Install Wine32 + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install wine32 + - name: ⬇️ Checkout repo uses: actions/checkout@v4 with: @@ -121,8 +127,13 @@ jobs: - name: 🏗️ Build run: npm run build - - name: 📦 Electron Package - run: npx electron-packager . LinguifAI --platform=win32 --arch=x64 --out=dist + #- name: 📦 Electron Package + # run: npx electron-packager . LinguifAI --platform=win32 --arch=x64 --out=dist + + - name: 📦 Electron Builder + run: npm run electron:package:win + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get latest release number id: get_latest_release @@ -136,17 +147,20 @@ jobs: }); const latestRelease = response.data.tag_name; const versionParts = latestRelease.replace(/^v/, '').split('.'); - const newVersion = `${parseInt(versionParts[0])}.${parseInt(versionParts[1])}.${parseInt(versionParts[2]) + 1}`; + const newVersion = `${parseInt(versionParts[0])}.${parseInt(versionParts[1]) + 1}.0`; console.log(`::set-output name=new_version::${newVersion}`); + - name: Rename file + run: mv dist/LinguifAI\ Setup\ 0.1.0.exe dist/LinguifAI\ Setup\ ${{ steps.get_latest_release.outputs.new_version }}.exe + - name: Create Release id: create_release uses: softprops/action-gh-release@v1 with: files: | - ./dist/LinguifAI-win32-x64/LinguifAI.exe + ./dist/LinguifAI\ Setup\ ${{ steps.get_latest_release.outputs.new_version }}.exe tag_name: v${{ steps.get_latest_release.outputs.new_version }} - release_name: Release v${{ steps.get_latest_release.outputs.new_version }} - draft: true + name: Release v${{ steps.get_latest_release.outputs.new_version }} + prerelease: true body: | Descrição do release aqui diff --git a/api/DataProcesser.py b/api/DataProcesser.py index 3934be55..f63e130f 100644 --- a/api/DataProcesser.py +++ b/api/DataProcesser.py @@ -3,20 +3,21 @@ from NbEmotionsModel import make_prediction from NbLinRegressionModel import make_prediction_nblin from available_classifiers import get_available_classifiers -from tensorflow.python.keras.models import load_model -import scipy as sp -import pandas as pd -import numpy as np -import tensorflow as tf +import Neural_Network2 import pickle import re import joblib +import numpy as np import string import os -from sklearn.feature_extraction.text import TfidfVectorizer +import pandas as pd +import torch +from collections import Counter +from functools import partial import nltk +from nltk.tokenize import wordpunct_tokenize from nltk.corpus import stopwords nltk.download('stopwords') # mais imports @@ -31,7 +32,7 @@ def handle_classify(self, df, classifier): model_name = classifier_switcher[classifier] if model_name.endswith('.pkl'): return self.pretrained_predict(df, model_name) - elif model_name.endswith('.h5'): + else: return self.trained_predict(df, model_name) #classifier_switcher = { # 0: self.classify_emotions, @@ -54,16 +55,13 @@ def generate_statistics(self, df): def preprocess_text(self, text): - text = str(text).lower() - text = re.sub('\[.*?\]', '', text) - text = re.sub("\\W", " ", text) - text = re.sub('https?://\S+|www\.\S+', '', text) - text = re.sub('<.*?>+', '', text) - text = re.sub('[%s]' % re.escape(string.punctuation), '', text) - text = re.sub('\n', '', text) - text = re.sub('\w*\d\w*', '', text) - - return text + stop_words = set(stopwords.words('english')) + text = str(text) + text = re.sub(r'[^\w\s]', '', text) + text = text.lower() + tokens = wordpunct_tokenize(text) + tokens = [token for token in tokens if token not in stop_words] + return tokens def classify_emotions(self, df): @@ -84,49 +82,71 @@ def pretrained_predict(self, df, model_name): pipeline = pickle.load(model) texts_to_predict = df['input_column'] + texts_to_predict = [str(text) for text in texts_to_predict] predictions = pipeline.predict(texts_to_predict) df['output_column'] = predictions return df def load_weights_and_model(self, name): - model_filename = f"api/models/{name}" - num_classes = model_filename[model_filename.index("s") + 2 : model_filename.index("-")] - model = tf.keras.Sequential([ - tf.keras.layers.Embedding(input_dim=20000, output_dim=128), - tf.keras.layers.LSTM(64), - tf.keras.layers.Dense(int(num_classes), activation='softmax') - ]) - model.load_weights(model_filename) - return model - - def trained_predict(self, df, model_name): - model = self.load_weights_and_model(model_name) - - - encoder_name = model_name[model_name.index('l') + 2 : model_name.index('.')] + model_filename = os.path.join("api", "models", name) + if os.path.exists(model_filename): + model = torch.load(model_filename) + return model + else: + raise FileNotFoundError(f"Model file '{model_filename}' not found.") - label_map_filename = f"api\encoders/LabelMapping-{encoder_name}.joblib" + def trained_predict(self, df, model_name): + label_map_filename = f"api/encoders/LabelMapping-{model_name}.joblib" label_encoder = joblib.load(label_map_filename) - raw_text = df['input_column'].tolist() - - # prediction (nao sei como fazer agora) - # vectorizer = TfidfVectorizer(max_features=20000) - # raw_text = [self.preprocess_text(text).encode("utf-8") for text in raw_text] - # vectorizer.fit_transform(raw_text) - # vectorized_data = vectorizer.transform(raw_text) - - # vectorized_data = np.asarray(vectorized_data.todense()) - - # # Make predictions using the model - - # predictions = model.predict(vectorized_data) - - # predicted_labels_encoded = tf.argmax(predictions, axis=1).numpy() - - # predicted_labels = [label_encoder.classes_[label] for label in predicted_labels_encoded] + model = self.load_weights_and_model(model_name) + model.eval() - # df['output_column'] = predicted_labels + stop_words = set(stopwords.words('english')) + + df['tokens'] = df.input_column.progress_apply( + partial(Neural_Network2.tokenize, stop_words=stop_words), + ) + + all_tokens = [sublst for lst in df.tokens.tolist() for sublst in lst] + common_tokens = set(list(zip( + *Counter(all_tokens).most_common(20000)))[0]) + df.loc[:, 'tokens'] = df.tokens.progress_apply( + partial( + Neural_Network2.remove_rare_words, + common_tokens=common_tokens, + max_len=200, + ), + ) + + df = df[df.tokens.progress_apply( + lambda tokens: any(token != '' for token in tokens), + )] + + vocab = sorted({ + sublst for lst in df.tokens.tolist() for sublst in lst + }) + self.token2idx = {token: idx for idx, token in enumerate(vocab)} + + self.token2idx[''] = max(self.token2idx.values()) + 1 + + self.idx2token = {idx: token for token, idx in self.token2idx.items()} + + df['indexed_tokens'] = df.tokens.apply( + lambda tokens: [self.token2idx[token] for token in tokens], + ) + + predictions = [] + for input_column_row in df['indexed_tokens']: + with torch.no_grad(): + _, logits = model([input_column_row], return_activations=True) + logits = logits.detach().cpu().numpy() + prediction = np.argmax(logits, axis=1)[0] + predictions.append(prediction) + + decoded_predictions = label_encoder.inverse_transform(predictions) + + df['output_column'] = decoded_predictions return df diff --git a/api/Neural_Network2.py b/api/Neural_Network2.py index 1cdc04fa..62abf20f 100644 --- a/api/Neural_Network2.py +++ b/api/Neural_Network2.py @@ -1,122 +1,385 @@ -import json +import random import re -import string -import pandas as pd -import numpy as np -import tensorflow as tf import os +from collections import Counter +from functools import partial +from pathlib import Path import joblib -from sklearn.feature_extraction.text import TfidfVectorizer - -from tensorflow.python.keras import layers -from tensorflow.python.keras.models import Sequential +import json +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from nltk.corpus import stopwords +from nltk import wordpunct_tokenize +from tqdm import tqdm +from sklearn.metrics import classification_report from sklearn.preprocessing import LabelEncoder -from tensorflow.python.keras.callbacks import Callback - -dirname = os.path.dirname(__file__) - -def preprocess_text(text): - text = str(text).lower() - text = re.sub('\[.*?\]', '', text) - text = re.sub("\\W", " ", text) - text = re.sub('https?://\S+|www\.\S+', '', text) - text = re.sub('<.*?>+', '', text) - text = re.sub('[%s]' % re.escape(string.punctuation), '', text) - text = re.sub('\n', '', text) - text = re.sub('\w*\d\w*', '', text) - return text - -class TrainingProgressCallback(Callback): - def __init__(self): - super(TrainingProgressCallback, self).__init__() - self.batch_count = 0 - - def on_batch_end(self, batch, logs=None): - self.batch_count += 1 - if self.batch_count % 50 == 0: - self.update_progress(logs) - - def on_epoch_end(self, epoch, logs=None): - self.update_progress(logs) - - def update_progress(self, logs): - total_epochs = self.params['epochs'] - current_batch = self.model._train_counter - total_batches = self.params['steps'] * total_epochs - percent_complete = int((current_batch / total_batches) * 100) - - # Definir o status de treinamento como True - training_in_progress = True - - # Verificar se a época atual é a última - if current_batch == total_batches: - training_in_progress = False - - # Salvar o progresso em um arquivo JSON - training_progress = { - 'training_progress': percent_complete, - 'training_in_progress': training_in_progress - } - - training_progress2 = { - 'training_progress': percent_complete, - 'training_in_progress': training_in_progress, - 'epochs': total_epochs, - 'total_batches': total_batches, - 'current_batch': current_batch - } - - print(training_progress2) - - with open('training_progress.json', 'w') as file: - json.dump(training_progress, file) - -def create_and_train_model(train_texts, train_labels, name, epochs=5, batch_size=32): - label_encoder = LabelEncoder() - train_labels_encoded = label_encoder.fit_transform(train_labels) - - num_classes = len(label_encoder.classes_) - train_labels_one_hot = tf.keras.utils.to_categorical(train_labels_encoded, num_classes=num_classes) - - label_mapping_file = f"api/encoders/LabelMapping-{name}.joblib" - joblib.dump(label_encoder, label_mapping_file) - - tfidf_vectorizer = TfidfVectorizer(max_features=20000) + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import optim +from torch.optim.lr_scheduler import CosineAnnealingLR +from torch.utils.data import Dataset, DataLoader +from torch.utils.data.dataset import random_split +from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence + +tqdm.pandas() + +import nltk +nltk.download('stopwords') + +device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + +def remove_rare_words(tokens, common_tokens, max_len): + return [token if token in common_tokens + else '' for token in tokens][-max_len:] + +def tokenize(text, stop_words): + text = str(text) + text = re.sub(r'[^\w\s]', '', text) + text = text.lower() + tokens = wordpunct_tokenize(text) + tokens = [token for token in tokens if token not in stop_words] + return tokens + + +class CustomDataset(Dataset): + def __init__(self, df, max_vocab, max_len, name): + # Clean and tokenize + stop_words = set(stopwords.words('english')) + + df['tokens'] = df.input_text.progress_apply( + partial(tokenize, stop_words=stop_words), + ) + + # Replace rare words with + all_tokens = [sublst for lst in df.tokens.tolist() for sublst in lst] + common_tokens = set(list(zip( + *Counter(all_tokens).most_common(max_vocab)))[0]) + df.loc[:, 'tokens'] = df.tokens.progress_apply( + partial( + remove_rare_words, + common_tokens=common_tokens, + max_len=max_len, + ), + ) + + # Remove sequences with only + df = df[df.tokens.progress_apply( + lambda tokens: any(token != '' for token in tokens), + )] + + vocab = sorted({ + sublst for lst in df.tokens.tolist() for sublst in lst + }) + self.token2idx = {token: idx for idx, token in enumerate(vocab)} + + # Add a padding idx + self.token2idx[''] = max(self.token2idx.values()) + 1 + + self.idx2token = {idx: token for token, idx in self.token2idx.items()} + + df['indexed_tokens'] = df.tokens.apply( + lambda tokens: [self.token2idx[token] for token in tokens], + ) + + label_encoder = LabelEncoder() + df['encoded_labels'] = label_encoder.fit_transform(df['labels']) + encoder_name = f"LabelMapping-{name}" + encoder_filename = os.path.join("api", "encoders", f"{encoder_name}.joblib") + os.makedirs(os.path.dirname(encoder_filename), exist_ok=True) + joblib.dump(label_encoder, encoder_filename) + + self.text = df.input_text.tolist() + self.sequences = df.indexed_tokens.tolist() + self.targets = df.encoded_labels.tolist() + + def __getitem__(self, i): + return self.sequences[i], self.targets[i], self.text[i] + + def __len__(self): + return len(self.sequences) - train_texts = [preprocess_text(text) for text in train_texts] - train_texts_tfidf = tfidf_vectorizer.fit_transform(train_texts) - train_dataset = tf.data.Dataset.from_tensor_slices((train_texts_tfidf.toarray(), train_labels_one_hot)) - train_dataset = train_dataset.shuffle(len(train_texts)).batch(32) +def split_train_valid_test(corpus, valid_ratio=0.1, test_ratio=0.1): + """Split dataset into train, validation, and test.""" + test_length = int(len(corpus) * test_ratio) + valid_length = int(len(corpus) * valid_ratio) + train_length = len(corpus) - valid_length - test_length + return random_split( + corpus, lengths=[train_length, valid_length, test_length], + ) + + +def collate(batch): + inputs = [item[0] for item in batch] + target = torch.LongTensor([item[1] for item in batch]) + text = [item[2] for item in batch] + return inputs, target, text + +def pad_sequences(sequences, padding_val=0, pad_left=False): + """Pad a list of sequences to the same length with a padding_val.""" + sequence_length = max(len(sequence) for sequence in sequences) + if not pad_left: + return [ + sequence + (sequence_length - len(sequence)) * [padding_val] + for sequence in sequences + ] + return [ + (sequence_length - len(sequence)) * [padding_val] + sequence + for sequence in sequences + ] + + +class RNNClassifier(nn.Module): + def __init__(self, output_size, hidden_size, vocab_size, padding_idx, + device, dropout_probability=0.3, bidirectional=False, n_layers=1, + embedding_dimension=50, batch_size=32): + super(RNNClassifier, self).__init__() + self.hidden_size = hidden_size + self.output_size = output_size + self.batch_size = batch_size + self.n_layers = n_layers + self.dropout_probability = dropout_probability + self.device = device + self.padding_idx = padding_idx + + # We need to multiply some layers by two if the model is bidirectional + self.input_size_factor = 2 if bidirectional else 1 + + self.embedding = nn.Embedding(vocab_size, embedding_dimension) + + self.rnn = nn.LSTM( + embedding_dimension, + self.hidden_size, + self.n_layers, + bidirectional=bidirectional, + ) + + self.fc1 = nn.Linear( + self.hidden_size * self.input_size_factor, + 16, + ) + self.fc2 = nn.Linear( + 16, + self.output_size, + ) + + + def init_hidden(self): + """Set initial hidden states.""" + h0 = torch.randn( + self.n_layers * self.input_size_factor, + self.batch_size, + self.hidden_size, + ) + c0 = torch.randn( + self.n_layers * self.input_size_factor, + self.batch_size, + self.hidden_size, + ) + + h0 = h0.to(self.device) + c0 = c0.to(self.device) - # Parâmetros do modelo - num_features = train_texts_tfidf.shape[1] + return h0, c0 - # Define a arquitetura do modelo - model = tf.keras.Sequential([ - tf.keras.layers.Embedding(input_dim=num_features, output_dim=64), - tf.keras.layers.SimpleRNN(64), - tf.keras.layers.Dense(num_classes, activation='softmax') - ]) + def apply_rnn(self, embedding_out, lengths): + packed = pack_padded_sequence( + embedding_out, + lengths, + batch_first=True, + ) + activations, _ = self.rnn(packed, self.init_hidden()) + activations, _ = pad_packed_sequence(activations, batch_first=True) + + indices = (lengths - 1).view(-1, 1).expand( + activations.size(0), activations.size(2), + ).unsqueeze(1) + indices = indices.to(self.device) + + activations = activations.gather(1, indices).squeeze(1) + return activations + + def forward(self, inputs, return_activations=False): + batch_size = len(inputs) + + # This makes the model not break for the last batch that might be less + # than batch_size in size + if batch_size != self.batch_size: + self.batch_size = batch_size + + lengths = torch.LongTensor([len(x) for x in inputs]) + lengths, permutation_indices = lengths.sort(0, descending=True) + + # Pad sequences so that they are all the same length + padded_inputs = pad_sequences(inputs, padding_val=self.padding_idx) + inputs = torch.LongTensor(padded_inputs) + + # Sort inputs + inputs = inputs[permutation_indices].to(self.device) + + # Get embeddings + embedding_out = self.embedding(inputs) + + activations = self.apply_rnn(embedding_out, lengths) + + x = F.dropout(torch.relu(self.fc1(activations)), 0.05) + x = self.fc2(x) + out = torch.sigmoid(x) + + # Put the output back in correct order + permutation_index_pairs = list(zip( + permutation_indices.tolist(), + list(range(len(permutation_indices))), + )) + reordered_indices = [ + pair[1] for pair + in sorted(permutation_index_pairs, key=lambda pair: pair[0]) + ] + + if return_activations: + return out[reordered_indices], x[reordered_indices] + + return out[reordered_indices] - model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) - try: - progress_callback = TrainingProgressCallback() - history = model.fit(train_dataset, epochs=epochs, batch_size=batch_size, callbacks=[progress_callback]) - model_filename = f"api/models/{str(num_classes)}-Trained-Model-{name}.weights.h5" - model.save_weights(model_filename) +def train_epoch(model, optimizer, scheduler, train_loader, criterion, curr_epoch, num_total_epochs): + model.train() + total_loss = total = 0 + progress_bar = tqdm(train_loader, desc='Training', leave=False) + num_iters = 0 + for inputs, target, text in progress_bar: + target = target.to(device) + + # Clean old gradients + optimizer.zero_grad() + + # Forwards pass + output = model(inputs) + + # Calculate how wrong the model is + loss = criterion(output, target) + + # Perform gradient descent, backwards pass + loss.backward() + + # Take a step in the right direction + optimizer.step() + scheduler.step() - training_stats = { - "loss": history.history['loss'], - "accuracy": history.history['accuracy'] - } + # Record metrics + total_loss += loss.item() + total += len(target) + num_iters += 1 + if num_iters % 20 == 0: + with open('training_progress.json', 'w') as f: + progress = 100 * (curr_epoch + num_iters/len(train_loader)) / num_total_epochs + training_progress = { + 'training_progress': progress, + 'training_in_progress': True + } + json.dump(training_progress, f) - return json.dumps(training_stats) + return total_loss / total - except Exception as e: - return f"Error during model creation/training: {str(e)}" +def validate_epoch(model, valid_loader, criterion): + model.eval() + total_loss = total = 0 + with torch.no_grad(): + progress_bar = tqdm(valid_loader, desc='Validating', leave=False) + for inputs, target, text in progress_bar: + target = target.to(device) + # Forwards pass + output = model(inputs) + + # Calculate how wrong the model is + loss = criterion(output, target) + + # Record metrics + total_loss += loss.item() + total += len(target) + + return total_loss / total + +def create_and_train_model(df, name, epochs = 10, batch_size = 32, learning_rate = 0.001): + + dropout_probability = 0.2 + n_rnn_layers = 1 + embedding_dimension = 128 + hidden_size = 64 + is_bidirectional = True + max_vocab = 20000 + max_len = 200 + valid_ratio = 0.05 + test_ratio = 0.05 + + dataset = CustomDataset(df, max_vocab, max_len, name) + + train_dataset, valid_dataset, test_dataset = split_train_valid_test( + dataset, valid_ratio=valid_ratio, test_ratio=test_ratio) + len(train_dataset), len(valid_dataset), len(test_dataset) + + + train_loader = DataLoader(train_dataset, batch_size=batch_size, collate_fn=collate) + valid_loader = DataLoader(valid_dataset, batch_size=batch_size, collate_fn=collate) + test_loader = DataLoader(test_dataset, batch_size=batch_size, collate_fn=collate) + + + model = RNNClassifier( + output_size=len(df.labels), + hidden_size=hidden_size, + embedding_dimension=embedding_dimension, + vocab_size=len(dataset.token2idx), + padding_idx=dataset.token2idx[''], + dropout_probability=dropout_probability, + bidirectional=is_bidirectional, + n_layers=n_rnn_layers, + device=device, + batch_size=batch_size, + ) + model = model.to(device) + + criterion = nn.CrossEntropyLoss() + optimizer = optim.Adam( + filter(lambda p: p.requires_grad, model.parameters()), + lr=learning_rate, + ) + scheduler = CosineAnnealingLR(optimizer, 1) + + n_epochs = 0 + train_losses, valid_losses = [], [] + for curr_epoch in range(epochs): + train_loss = train_epoch(model, optimizer, scheduler, train_loader, criterion, curr_epoch, epochs) + valid_loss = validate_epoch(model, valid_loader, criterion) + + tqdm.write( + f'epoch #{n_epochs + 1:3d}\ttrain_loss: {train_loss:.2e}' + f'\tvalid_loss: {valid_loss:.2e}\n', + ) + + # Early stopping if the current valid_loss is greater than the last three valid losses + if len(valid_losses) > 2 and all(valid_loss >= loss + for loss in valid_losses[-3:]): + print('Stopping early') + break + + train_losses.append(train_loss) + valid_losses.append(valid_loss) + + n_epochs += 1 + + model_path = os.path.join('api', 'models', name) + os.makedirs(os.path.dirname(model_path), exist_ok=True) + torch.save(model, model_path) + training_progress = { + 'training_progress': 0, + 'training_in_progress': True + } + with open('training_progress.json', 'w') as file: + json.dump(training_progress, file) diff --git a/api/app.py b/api/app.py index 64b6fdaa..e2cbcb1d 100644 --- a/api/app.py +++ b/api/app.py @@ -4,19 +4,24 @@ from Neural_Network2 import create_and_train_model from available_classifiers import get_available_classifiers +import time import os -import atexit -import threading import pandas as pd import nltk import json import asyncio +import logging nltk.download('wordnet') + app = Flask(__name__) server_thread = None CORS(app) # Permite todas as origens por padrão (não recomendado para produção) +log = logging.getLogger('werkzeug') +log.disabled = True + + app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True data_processer = DataProcesser() @@ -43,9 +48,10 @@ def upload_file(): df = pd.DataFrame(selected_data, columns=['input_column']) result = data_processer.handle_classify(df, selected_classifier) - stats = data_processer.generate_statistics(result) + # stats = data_processer.generate_statistics(result) - return jsonify({'result': result.to_json(), 'stats': stats}) + return jsonify({'result': result.to_json()}) + # return jsonify({'result': result.to_json(), 'stats': stats}) @app.route('/get-classifiers', methods=["GET"]) def get_classifiers(): @@ -57,7 +63,7 @@ def shutdown(): shutdown_server() return 'Server shutting down...' -@app.route('/neural-network',methods=["POST"]) +@app.route('/neural-network', methods=["POST"]) def train_model(): received_data = request.json @@ -83,13 +89,15 @@ def train_model(): # reseta status training_progress = { - 'training_progress': 1, + 'training_progress': 0, 'training_in_progress': True } with open('training_progress.json', 'w') as file: json.dump(training_progress, file) - create_and_train_model(selected_data, selected_label, name, epochs, batch_size) + df = pd.DataFrame({'input_text': selected_data, 'labels': selected_label}) + + create_and_train_model(df, name, epochs, batch_size, learning_rate) return jsonify({"message": "Model train started successfully."}), 200 @@ -100,7 +108,16 @@ def get_training_status(): try: data = json.load(file) except json.decoder.JSONDecodeError: - return jsonify({'training_in_progress': True, 'training_progress': 0}) + try: + time.sleep(1) + data = json.load(file) + except json.decoder.JSONDecodeError: + try: + time.sleep(1) + data = json.load(file) + except json.decoder.JSONDecodeError: + print("error!") + return jsonify({'training_in_progress': True, 'training_progress': 0}) training_status = data.get('training_in_progress', False) progress = data.get('training_progress', 0) return jsonify({'training_in_progress': training_status, 'training_progress': progress}) @@ -108,11 +125,11 @@ def get_training_status(): return jsonify({'training_in_progress': False, 'training_progress': 0}) -#@app.teardown_appcontext -#def teardown_appcontext(error=None): - #shutdown_server() - if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000) - #server_thread = threading.Thread(target=run_flask_app) - #server_thread.start() \ No newline at end of file + training_progress = { + 'training_progress': 0, + 'training_in_progress': True + } + with open('training_progress.json', 'w') as file: + json.dump(training_progress, file) + app.run(host='0.0.0.0', port=5000, debug=False) \ No newline at end of file diff --git a/api/available_classifiers.py b/api/available_classifiers.py index 73dc5657..8a3c47bd 100644 --- a/api/available_classifiers.py +++ b/api/available_classifiers.py @@ -1,10 +1,11 @@ import os -import pickle def get_available_classifiers(): model_folder = 'api/models' # Verifica se o diretório 'models' existe + + ## retorna o path atual if not os.path.exists(model_folder): return [] @@ -13,7 +14,6 @@ def get_available_classifiers(): classifiers = {} for file in model_files: - if file.endswith('.pkl') or file.endswith('.keras') or file.endswith('.h5'): - classifiers[len(classifiers)] = file + classifiers[len(classifiers)] = file return classifiers \ No newline at end of file diff --git a/api/models/IHIJI b/api/models/IHIJI new file mode 100644 index 00000000..9eab30d8 Binary files /dev/null and b/api/models/IHIJI differ diff --git a/api/models/Trained-Model-Testing.keras b/api/models/Trained-Model-Testing.keras deleted file mode 100644 index eaa14a43..00000000 Binary files a/api/models/Trained-Model-Testing.keras and /dev/null differ diff --git a/api/models/Tweet_emotions b/api/models/Tweet_emotions new file mode 100644 index 00000000..357ed44f Binary files /dev/null and b/api/models/Tweet_emotions differ diff --git a/api/requirements.txt b/api/requirements.txt new file mode 100644 index 00000000..aba370e6 --- /dev/null +++ b/api/requirements.txt @@ -0,0 +1,11 @@ +Flask==2.3.2 +Flask-Cors==4.0.0 +pandas==2.0.3 +nltk==3.8.1 +scikit-learn==1.3.0 +numpy==1.25.2 +matplotlib==3.7.1 +seaborn==0.13.0 +tensorflow==2.16.1 +keras==3.0.0 +torchtext==0.17.2 \ No newline at end of file diff --git a/license.md b/license.md new file mode 100644 index 00000000..8e05ffc2 --- /dev/null +++ b/license.md @@ -0,0 +1 @@ +Teste de texto aqui diff --git a/package.json b/package.json index e2456008..f7363ab2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,12 @@ { "name": "LinguifAI", + "description": "", + "author": { + "name": "TailLinguifAI", + "email": "" + }, "version": "0.1.0", - "main": "main.js", + "main": "./public/electron.js", "homepage": "./", "private": true, "dependencies": { @@ -17,7 +22,6 @@ "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "axios": "^1.6.0", - "electron-packager": "^17.1.2", "electron-process": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -30,6 +34,7 @@ "typescript": "^4.9.5" }, "scripts": { + "start2": "set BROWSER=NONE && react-scripts start", "start": "concurrently \"npm run start:react\" \"npm run start:flask\"", "start:react": "react-scripts start", "start:flask": "python api/app.py", @@ -37,7 +42,11 @@ "ciBuild": "CI=true react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "electron": "electron ." + "electron": "electron .", + "start-electron": "set ELECTRON_START_URL=http://localhost:3000/ && electron .", + "pack": "electron-builder --dir", + "dist": "electron-builder", + "electron:package:win": "npm run build && electron-builder -w -c.extraMetadata.main=build/electron.js" }, "eslintConfig": { "extends": [ @@ -60,6 +69,38 @@ "devDependencies": { "concurrently": "^8.2.2", "electron": "^26.1.0", + "electron-builder": "^24.13.3", + "electron-packager": "^17.1.2", "tailwindcss": "^3.3.3" + }, + "build": { + "appId": "LinguifAI", + "win": { + "target": [ + "nsis" + ] + }, + "files": [ + "build/**/*", + "node_modules/**/*", + "resources/**/*" + ], + "directories": { + "buildResources": "build" + }, + "extraFiles": [ + { + "from": "api", + "to": "api", + "filter": [ + "**/*" + ] + } + ], + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true, + "license": "license.md" + } } } diff --git a/main.js b/public/electron.js similarity index 66% rename from main.js rename to public/electron.js index 8bc6ed34..aa954681 100644 --- a/main.js +++ b/public/electron.js @@ -1,21 +1,31 @@ const { app, BrowserWindow } = require("electron"); const childProcess = require("child_process"); const path = require("path"); +const url = require("url"); const axios = require("axios"); let flaskServerProcess; function installDependencies() { // Execute pip install command to install dependencies from requirements.txt - childProcess.execSync("pip install -r ./resources/app/requirements.txt", { stdio: "inherit" }); + const requirementsPath = process.env.ELECTRON_START_URL + ? "./api/requirements.txt" + : "./api/requirements.txt"; + childProcess.execSync(`pip install -r ${requirementsPath}`, { + stdio: "inherit", + }); } function startFlaskServer() { - installDependencies(); + //installDependencies(); + + const pythonPath = process.env.ELECTRON_START_URL + ? "./api/app.py" + : "./api/app.py"; - flaskServerProcess = childProcess.spawn("python", ["./resources/app/api/app.py"], { + flaskServerProcess = childProcess.spawn("python3", [pythonPath], { detached: false, - stdio: ["ignore", "pipe", "pipe"], // Capture stdout and stderr + stdio: ["ignore", "pipe", "pipe"], }); // Capture stdout @@ -50,8 +60,20 @@ function createWindow() { height: 600, show: false, }); + // flaskServerProcess + win.webContents.executeJavaScript( + `console.log("startUrl: ${flaskServerProcess.pid}")` + ); - win.loadFile(path.join(__dirname, "./build/index.html")); + const startUrl = + process.env.ELECTRON_START_URL || + url.format({ + pathname: path.join(__dirname, "./index.html"), + protocol: "file:", + slashes: true, + }); + + win.loadURL(startUrl); win.once("ready-to-show", () => { win.maximize(); @@ -68,7 +90,7 @@ function createWindow() { app.whenReady().then(() => { startFlaskServer(); createWindow(); - + app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); diff --git a/public/requirements.txt b/public/requirements.txt new file mode 100644 index 00000000..994420bd --- /dev/null +++ b/public/requirements.txt @@ -0,0 +1,10 @@ +Flask==2.3.2 +Flask-Cors==4.0.0 +pandas==2.0.3 +nltk==3.8.1 +scikit-learn==1.3.0 +numpy==1.26.4 +matplotlib==3.7.1 +seaborn==0.13.0 +tensorflow==2.16.1 +keras==3.0.0 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 14b780e3..00000000 Binary files a/requirements.txt and /dev/null differ diff --git a/src/pages/train.tsx b/src/pages/train.tsx index 1a1373b2..91be7f58 100644 --- a/src/pages/train.tsx +++ b/src/pages/train.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useRef } from "react"; import SelectFileCard from "../components/selectFileCard/selectFileCard"; import axios from "axios"; import ResultTable from "../components/resultTable/resultTable"; @@ -25,7 +25,7 @@ export default function Train() { const handleSubmit = async () => { setIsLoading(true); - setLoadingProgress(1); + setLoadingProgress(0); let selectedData = data.map((row) => ({ value: row[selectedColumn], @@ -47,41 +47,21 @@ export default function Train() { console.log(sendData); - const maxRetries = 3; - let retryCount = 0; - - const url = "http://localhost:5000/neural-network"; - - async function postData(url: string, data: { data: any[]; label: any[]; batch_size: number; epochs: number; learning_rate: number; name: string; }) { - try { - const response = await axios.post(url, data); - } catch (error) { - if (retryCount < maxRetries) { - retryCount++; - console.error(`Error occurred, retrying (attempt ${retryCount})...`); - postData(url, data); // Retry recursively - } else { - console.error("Max retry limit reached. Unable to post data."); - throw error; // Throw the error after maximum retries - } - } - } - await axios - .post("http://localhost:5000/neural-network", sendData) + .post(url, sendData) .catch(async (error) => { await axios - .post("http://localhost:5000/neural-network", sendData) + .post(url, sendData) .catch(async (error) => { await axios - .post("http://localhost:5000/neural-network", sendData) + .post(url, sendData) .catch(async (error) => { await axios - .post("http://localhost:5000/neural-network", sendData) + .post(url, sendData) .catch((error) => { - console.error(error.response.data); + throw new Error(error); }) }) }) @@ -130,25 +110,42 @@ export default function Train() { // carregamento const [loadingProgress, setLoadingProgress] = useState(0); + const prevLoadingProgressRef = useRef(0); // Explicitly type prevLoadingProgressRef useEffect(() => { const fetchData = async () => { try { - const response = await axios.get( - "http://localhost:5000/training-status" - ); + const response = await axios.get("http://localhost:5000/training-status"); const { training_progress, training_in_progress } = response.data; - setLoadingProgress( - training_in_progress || training_progress === 100 - ? training_progress - : 1 - ); + const newProgress: number = training_in_progress || training_progress === 100 ? training_progress : 0; // Explicitly type newProgress + updateLoadingProgress(newProgress); } catch (error) { - console.error("Erro ao buscar progresso:", error); + console.error("Error fetching progress:", error); } }; - const interval = setInterval(fetchData, 3000); + const updateLoadingProgress = (newProgress: number) => { // Explicitly type newProgress parameter + const duration = 1000; // Duration in milliseconds for the transition + const startTime = Date.now(); + const startProgress = prevLoadingProgressRef.current; + + const updateProgress = () => { + const elapsedTime = Date.now() - startTime; + const progress = Math.min(1, elapsedTime / duration); // Ensure progress doesn't exceed 1 + const interpolatedProgress = startProgress + (newProgress - startProgress) * progress; + setLoadingProgress(interpolatedProgress); + + if (progress < 1) { + requestAnimationFrame(updateProgress); + } else { + prevLoadingProgressRef.current = newProgress; + } + }; + + updateProgress(); + }; + + const interval = setInterval(fetchData, 1050); return () => clearInterval(interval); }, []); @@ -317,10 +314,10 @@ export default function Train() {
- {`Treinamento em ${loadingProgress}%`} + {`Treinamento em ${loadingProgress.toFixed(2)}%`}
)} @@ -341,4 +338,4 @@ export default function Train() { ); -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cbe83f33..618dc5e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" @@ -1263,6 +1268,14 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + "@electron/asar@^3.2.1": version "3.2.9" resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.9.tgz#7b3a1fd677b485629f334dd80ced8c85353ba7e7" @@ -1287,6 +1300,15 @@ optionalDependencies: global-agent "^3.0.0" +"@electron/notarize@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe" + integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + "@electron/notarize@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.4.tgz#a7d38773f4cad40df111a5edc64037e5d768ea1e" @@ -1295,6 +1317,18 @@ debug "^4.1.1" fs-extra "^9.0.1" +"@electron/osx-sign@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== + dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + "@electron/osx-sign@^1.0.5": version "1.1.0" resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.1.0.tgz#461ee8cbec833768ced5a99ed61b0f6fdce78852" @@ -1307,7 +1341,7 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@^1.3.2": +"@electron/universal@1.5.1", "@electron/universal@^1.3.2": version "1.5.1" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5" integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== @@ -1517,6 +1551,18 @@ resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -1795,6 +1841,16 @@ dependencies: cross-spawn "^7.0.1" +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + "@mui/base@5.0.0-beta.16": version "5.0.0-beta.16" resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz" @@ -1907,6 +1963,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.11" resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz" @@ -2168,6 +2229,11 @@ resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" @@ -2251,6 +2317,13 @@ dependencies: "@types/node" "*" +"@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" @@ -2297,6 +2370,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/graceful-fs@^4.1.2": version "4.1.6" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" @@ -2375,6 +2455,11 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node@*", "@types/node@^16.18.48": version "16.18.52" resolved "https://registry.npmjs.org/@types/node/-/node-16.18.52.tgz" @@ -2397,6 +2482,14 @@ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + "@types/prettier@^2.1.5": version "2.7.3" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" @@ -2522,6 +2615,11 @@ resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz" integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== +"@types/verror@^1.10.3": + version "1.10.10" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.10.tgz#d5a4b56abac169bfbc8b23d291363a682e6fa087" + integrity sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg== + "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz" @@ -2882,7 +2980,7 @@ ajv@8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2968,6 +3066,44 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b" + integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== + dependencies: + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "2.2.1" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.5.1" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.13.1" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + arch@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" @@ -3102,11 +3238,26 @@ asap@~2.0.6: resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + async@^3.2.3: version "3.2.4" resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" @@ -3313,7 +3464,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.5.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3344,7 +3495,14 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bluebird@^3.1.1, bluebird@^3.7.2: +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.1.1, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3460,6 +3618,44 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@9.2.4: + version "9.2.4" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" + integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816" + integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== + dependencies: + "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" @@ -3626,11 +3822,21 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" @@ -3653,6 +3859,14 @@ cli-boxes@^3.0.0: resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + clipboardy@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz" @@ -3837,6 +4051,14 @@ concurrently@^8.2.2: tree-kill "^1.2.2" yargs "^17.7.2" +config-file-ts@^0.2.4: + version "0.2.6" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== + dependencies: + glob "^10.3.10" + typescript "^5.3.3" + confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" @@ -3896,6 +4118,11 @@ core-js@^3.19.2: resolved "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz" integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -3923,6 +4150,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" @@ -3932,7 +4166,7 @@ cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: is-wsl "^2.2.0" which "^2.0.2" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4347,6 +4581,34 @@ dlv@^1.1.3: resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dmg-builder@24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55" + integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" @@ -4469,6 +4731,11 @@ dotenv@^10.0.0: resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + duplexer@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" @@ -4484,13 +4751,30 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.6: +ejs@^3.1.6, ejs@^3.1.8: version "3.1.9" resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" +electron-builder@^24.13.3: + version "24.13.3" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616" + integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== + dependencies: + app-builder-lib "24.13.3" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + dmg-builder "24.13.3" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" + electron-packager@^17.1.2: version "17.1.2" resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-17.1.2.tgz#18030b28024d242b706d0a8a67ed4cd1a57311aa" @@ -4525,6 +4809,19 @@ electron-process@^0.2.0: object-hash "^1.1.0" uuid "^2.0.1" +electron-publish@24.13.1: + version "24.13.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c" + integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.13.1" + builder-util-runtime "9.2.4" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" + electron-to-chromium@^1.4.477: version "1.4.523" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz" @@ -4594,6 +4891,11 @@ env-paths@^2.2.0: resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -5132,6 +5434,11 @@ extract-zip@^2.0.0, extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -5332,6 +5639,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" @@ -5421,6 +5736,13 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-monkey@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" @@ -5556,6 +5878,17 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.3.10: + version "10.3.12" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.10.2" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -5746,6 +6079,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" @@ -5852,6 +6192,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" @@ -5880,7 +6229,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5893,6 +6242,14 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -5900,7 +6257,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -5924,6 +6281,11 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" @@ -6058,6 +6420,13 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.13.0, is-core-module@^2.9.0: version "2.13.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" @@ -6268,6 +6637,11 @@ isbinaryfile@^4.0.8: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== +isbinaryfile@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz#fe6e4dfe2e34e947ffa240c113444876ba393ae0" + integrity sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -6326,6 +6700,15 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" @@ -7020,6 +7403,11 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.7.3" +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" @@ -7164,6 +7552,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -7297,6 +7690,11 @@ mime@1.6.0: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -7336,18 +7734,55 @@ minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.1: version "5.1.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.1: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" @@ -7420,6 +7855,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + node-forge@^1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -7813,6 +8253,14 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -8497,6 +8945,14 @@ progress@^2.0.3: resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise@^8.1.0: version "8.3.0" resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" @@ -8817,6 +9273,18 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== + dependencies: + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -9070,6 +9538,11 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" @@ -9164,6 +9637,13 @@ safe-regex-test@^1.0.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sanitize.css@*: version "13.0.0" resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz" @@ -9177,6 +9657,11 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" @@ -9418,6 +9903,18 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -9433,6 +9930,20 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" @@ -9461,7 +9972,7 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9577,6 +10088,11 @@ stackframe@^1.3.4: resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + static-eval@2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz" @@ -9622,6 +10138,15 @@ string-natural-compare@^3.0.1: resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -9705,6 +10230,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -9915,11 +10447,31 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.12: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + tempy@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" @@ -9997,6 +10549,18 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -10055,6 +10619,13 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" @@ -10195,6 +10766,11 @@ typescript@^4.9.5: resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.3.3: + version "5.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" + integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" @@ -10301,6 +10877,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -10358,6 +10939,15 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" @@ -10809,6 +11399,15 @@ workbox-window@6.6.0: "@types/trusted-types" "^2.0.2" workbox-core "6.6.0" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -10818,7 +11417,7 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1: +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== @@ -10857,7 +11456,7 @@ xml-name-validator@^3.0.0: resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlbuilder@^15.1.1: +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== @@ -10915,7 +11514,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.7.2: +yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==