Compare commits

...

15 Commits

Author SHA1 Message Date
Faruk AYDIN
95c1d7c02c feat: Implement draft design for execution filters 2023-05-27 21:19:28 +02:00
Ali BARIN
93a2e2151e fix: early exit upon failed actions 2023-05-27 21:16:24 +02:00
Ömer Faruk Aydın
663a1ed9d4 Merge pull request #1108 from automatisch/docs/filter
docs: Add filter connection and actions
2023-05-24 15:42:04 +02:00
Ali BARIN
4f46c55c85 feat: add LOG_LEVEL env. var. 2023-05-24 15:35:38 +02:00
Ali BARIN
9701c98af9 feat: error log errors in action and triggers 2023-05-24 15:35:38 +02:00
Ali BARIN
aabf2a1c79 feat: debug log incoming webhook requests 2023-05-24 15:35:38 +02:00
Ali BARIN
29539b090e feat: cover arrays in error handling 2023-05-24 15:35:38 +02:00
Faruk AYDIN
1c80677ac3 docs: Add filter connection and actions 2023-05-24 15:23:38 +02:00
Ali BARIN
ad419855e9 feat(webhook/handler): use UUID for internal ids 2023-05-24 12:59:48 +02:00
Ömer Faruk Aydın
30b75943f3 Merge pull request #1103 from automatisch/release/0.7.1
Release v0.7.1
2023-05-19 20:31:09 +02:00
Faruk AYDIN
41a67b402d Release v0.7.1 2023-05-19 19:56:51 +02:00
Faruk AYDIN
caa104b1cc chore: Update version to 0.7.1 in Dockerfiles 2023-05-19 19:56:01 +02:00
Rıdvan Akca
94085f2bc8 fix(shared-drive): add missing field to payload 2023-05-19 17:55:52 +02:00
Faruk AYDIN
d39c962314 docs: Add Google Sheets to available apps 2023-05-19 16:15:46 +02:00
Ömer Faruk Aydın
706fb0f063 Merge pull request #1100 from automatisch/release/0.7.0
Release v0.7.0
2023-05-19 13:16:42 +02:00
32 changed files with 223 additions and 69 deletions

View File

@@ -4,7 +4,7 @@ WORKDIR /automatisch
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base && \
yarn global add @automatisch/cli@0.7.0 --network-timeout 1000000 && \
yarn global add @automatisch/cli@0.7.1 --network-timeout 1000000 && \
rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM automatischio/automatisch:0.7.0
FROM automatischio/automatisch:0.7.1
WORKDIR /automatisch
RUN apk add --no-cache openssl dos2unix

View File

@@ -2,7 +2,7 @@
"packages": [
"packages/*"
],
"version": "0.7.0",
"version": "0.7.1",
"npmClient": "yarn",
"useWorkspaces": true,
"command": {

View File

@@ -1,6 +1,6 @@
{
"name": "@automatisch/backend",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"scripts": {
@@ -22,7 +22,7 @@
"prebuild": "rm -rf ./dist"
},
"dependencies": {
"@automatisch/web": "^0.7.0",
"@automatisch/web": "^0.7.1",
"@bull-board/express": "^3.10.1",
"@graphql-tools/graphql-file-loader": "^7.3.4",
"@graphql-tools/load": "^7.5.2",
@@ -100,7 +100,7 @@
"url": "https://github.com/automatisch/automatisch/issues"
},
"devDependencies": {
"@automatisch/types": "^0.7.0",
"@automatisch/types": "^0.7.1",
"@types/bcrypt": "^5.0.0",
"@types/bull": "^3.15.8",
"@types/cors": "^2.8.12",

View File

@@ -22,6 +22,7 @@ export default {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -19,6 +19,7 @@ const newFilesInFolder = async ($: IGlobalVariable) => {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -13,6 +13,7 @@ const newFiles = async ($: IGlobalVariable) => {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -20,6 +20,7 @@ const newFolders = async ($: IGlobalVariable) => {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -24,6 +24,7 @@ const updatedFiles = async ($: IGlobalVariable) => {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -22,6 +22,7 @@ export default {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -13,6 +13,7 @@ const newSpreadsheets = async ($: IGlobalVariable) => {
if ($.step.parameters.driveId) {
params.includeItemsFromAllDrives = true;
params.corpora = 'drive';
}
do {

View File

@@ -9,6 +9,7 @@ type AppConfig = {
webAppUrl: string;
webhookUrl: string;
appEnv: string;
logLevel: string;
isDev: boolean;
isProd: boolean;
postgresDatabase: string;
@@ -80,6 +81,7 @@ const appConfig: AppConfig = {
protocol,
port,
appEnv: appEnv,
logLevel: process.env.LOG_LEVEL || 'info',
isDev: appEnv === 'development',
isProd: appEnv === 'production',
version: process.env.npm_package_version,

View File

@@ -1,7 +1,8 @@
import Crypto from 'node:crypto';
import { Response } from 'express';
import bcrypt from 'bcrypt';
import { IRequest, ITriggerItem } from '@automatisch/types';
import logger from '../../helpers/logger';
import Flow from '../../models/flow';
import { processTrigger } from '../../services/trigger';
import actionQueue from '../../queues/action';
@@ -13,8 +14,19 @@ import {
} from '../../helpers/remove-job-configuration';
export default async (request: IRequest, response: Response) => {
const flowId = request.params.flowId;
// in case it's our built-in generic webhook trigger
let computedRequestPayload = {
headers: request.headers,
body: request.body,
query: request.query,
};
logger.debug(`Handling incoming webhook request at ${request.originalUrl}.`);
logger.debug(computedRequestPayload);
const flow = await Flow.query()
.findById(request.params.flowId)
.findById(flowId)
.throwIfNotFound();
const user = await flow.$relatedQuery('user');
@@ -56,29 +68,19 @@ export default async (request: IRequest, response: Response) => {
}
// in case trigger type is 'webhook'
let payload = request.body;
let rawInternalId: string | Buffer = request.rawBody;
// in case it's our built-in generic webhook trigger
if (isWebhookApp) {
payload = {
headers: request.headers,
body: request.body,
query: request.query,
};
rawInternalId = JSON.stringify(payload);
if (!isWebhookApp) {
computedRequestPayload = request.body;
}
const triggerItem: ITriggerItem = {
raw: payload,
raw: computedRequestPayload,
meta: {
internalId: await bcrypt.hash(rawInternalId, 1),
internalId: Crypto.randomUUID(),
},
};
const { flowId, executionId } = await processTrigger({
flowId: flow.id,
const { executionId } = await processTrigger({
flowId,
stepId: triggerStep.id,
triggerItem,
testRun,

View File

@@ -9,7 +9,7 @@ export default class BaseError extends Error {
try {
computedError = JSON.parse(error as string);
} catch {
computedError = typeof error === 'string' ? { error } : error;
computedError = (typeof error === 'string' || Array.isArray(error)) ? { error } : error;
}
let computedMessage: string;

View File

@@ -9,10 +9,6 @@ const levels = {
debug: 4,
};
const level = () => {
return appConfig.appEnv === 'development' ? 'debug' : 'info';
};
const colors = {
error: 'red',
warn: 'yellow',
@@ -41,7 +37,7 @@ const transports = [
];
export const logger = winston.createLogger({
level: level(),
level: appConfig.logLevel,
levels,
format,
transports,

View File

@@ -4,6 +4,7 @@ import Execution from '../models/execution';
import ExecutionStep from '../models/execution-step';
import computeParameters from '../helpers/compute-parameters';
import globalVariable from '../helpers/global-variable';
import { logger } from '../helpers/logger';
import HttpError from '../errors/http';
import EarlyExitError from '../errors/early-exit';
import AlreadyProcessedError from '../errors/already-processed';
@@ -53,6 +54,8 @@ export const processAction = async (options: ProcessActionOptions) => {
const shouldNotConsiderAsError = shouldEarlyExit || shouldNotProcess;
if (!shouldNotConsiderAsError) {
logger.error(error);
if (error instanceof HttpError) {
$.actionOutput.error = error.details;
} else {

View File

@@ -3,6 +3,7 @@ import globalVariable from '../helpers/global-variable';
import EarlyExitError from '../errors/early-exit';
import AlreadyProcessedError from '../errors/already-processed';
import HttpError from '../errors/http';
import { logger } from '../helpers/logger';
type ProcessFlowOptions = {
flowId: string;
@@ -35,6 +36,8 @@ export const processFlow = async (options: ProcessFlowOptions) => {
const shouldNotConsiderAsError = shouldEarlyExit || shouldNotProcess;
if (!shouldNotConsiderAsError) {
logger.error(error);
if (error instanceof HttpError) {
$.triggerOutput.error = error.details;
} else {

View File

@@ -26,6 +26,8 @@ export const worker = new Worker(
const { stepId, flowId, executionId, computedParameters, executionStep } =
await processAction(job.data as JobData);
if (executionStep.isFailed) return;
const step = await Step.query().findById(stepId).throwIfNotFound();
const nextStep = await step.getNextStep();

View File

@@ -1,6 +1,6 @@
{
"name": "@automatisch/cli",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"contributors": [
@@ -33,7 +33,7 @@
"version": "oclif readme && git add README.md"
},
"dependencies": {
"@automatisch/backend": "^0.7.0",
"@automatisch/backend": "^0.7.1",
"@oclif/core": "^1",
"@oclif/plugin-help": "^5",
"@oclif/plugin-plugins": "^2.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@automatisch/docs",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"private": true,

View File

@@ -68,6 +68,15 @@ export default defineConfig({
{ text: 'Connection', link: '/apps/dropbox/connection' },
],
},
{
text: 'Filter',
collapsible: true,
collapsed: true,
items: [
{ text: 'Actions', link: '/apps/filter/actions' },
{ text: 'Connection', link: '/apps/filter/connection' },
],
},
{
text: 'Flickr',
collapsible: true,

View File

@@ -14,30 +14,31 @@ The default values for some environment variables might be different in our deve
Please be careful with the `ENCRYPTION_KEY` and `WEBHOOK_SECRET_KEY` environment variables. They are used to encrypt your credentials from third-party services and verify webhook requests. If you change them, your existing connections and flows will not continue to work.
:::
| Variable Name | Type | Default Value | Description |
| --------------------------- | ------- | ------------------ | ---------------------------------------------------- |
| `HOST` | string | `localhost` | HTTP Host |
| `PROTOCOL` | string | `http` | HTTP Protocol |
| `PORT` | string | `3000` | HTTP Port |
| `APP_ENV` | string | `production` | Automatisch Environment |
| `WEB_APP_URL` | string | | Can be used to override connection URLs and CORS URL |
| `WEBHOOK_URL` | string | | Can be used to override webhook URL |
| `POSTGRES_DATABASE` | string | `automatisch` | Database Name |
| `POSTGRES_SCHEMA` | string | `public` | Database Schema |
| `POSTGRES_PORT` | number | `5432` | Database Port |
| `POSTGRES_ENABLE_SSL` | boolean | `false` | Enable/Disable SSL for the database |
| `POSTGRES_HOST` | string | `postgres` | Database Host |
| `POSTGRES_USERNAME` | string | `automatisch_user` | Database User |
| `POSTGRES_PASSWORD` | string | | Password of Database User |
| `ENCRYPTION_KEY` | string | | Encryption Key to store credentials |
| `WEBHOOK_SECRET_KEY` | string | | Webhook Secret Key to verify webhook requests |
| `APP_SECRET_KEY` | string | | Secret Key to authenticate the user |
| `REDIS_HOST` | string | `redis` | Redis Host |
| `REDIS_PORT` | number | `6379` | Redis Port |
| `REDIS_USERNAME` | string | | Redis Username |
| `REDIS_PASSWORD` | string | | Redis Password |
| `REDIS_TLS` | boolean | `false` | Redis TLS |
| `TELEMETRY_ENABLED` | boolean | `true` | Enable/Disable Telemetry |
| `ENABLE_BULLMQ_DASHBOARD` | boolean | `false` | Enable BullMQ Dashboard |
| `BULLMQ_DASHBOARD_USERNAME` | string | | Username to login BullMQ Dashboard |
| `BULLMQ_DASHBOARD_PASSWORD` | string | | Password to login BullMQ Dashboard |
| Variable Name | Type | Default Value | Description |
| --------------------------- | ------- | ------------------ | ---------------------------------------------------------------------------------------------------- |
| `HOST` | string | `localhost` | HTTP Host |
| `PROTOCOL` | string | `http` | HTTP Protocol |
| `PORT` | string | `3000` | HTTP Port |
| `APP_ENV` | string | `production` | Automatisch Environment |
| `WEB_APP_URL` | string | | Can be used to override connection URLs and CORS URL |
| `WEBHOOK_URL` | string | | Can be used to override webhook URL |
| `LOG_LEVEL` | string | `info` | Can be used to configure log level such as `error`, `warn`, `info`, `http`, `debug` |
| `POSTGRES_DATABASE` | string | `automatisch` | Database Name |
| `POSTGRES_SCHEMA` | string | `public` | Database Schema |
| `POSTGRES_PORT` | number | `5432` | Database Port |
| `POSTGRES_ENABLE_SSL` | boolean | `false` | Enable/Disable SSL for the database |
| `POSTGRES_HOST` | string | `postgres` | Database Host |
| `POSTGRES_USERNAME` | string | `automatisch_user` | Database User |
| `POSTGRES_PASSWORD` | string | | Password of Database User |
| `ENCRYPTION_KEY` | string | | Encryption Key to store credentials |
| `WEBHOOK_SECRET_KEY` | string | | Webhook Secret Key to verify webhook requests |
| `APP_SECRET_KEY` | string | | Secret Key to authenticate the user |
| `REDIS_HOST` | string | `redis` | Redis Host |
| `REDIS_PORT` | number | `6379` | Redis Port |
| `REDIS_USERNAME` | string | | Redis Username |
| `REDIS_PASSWORD` | string | | Redis Password |
| `REDIS_TLS` | boolean | `false` | Redis TLS |
| `TELEMETRY_ENABLED` | boolean | `true` | Enable/Disable Telemetry |
| `ENABLE_BULLMQ_DASHBOARD` | boolean | `false` | Enable BullMQ Dashboard |
| `BULLMQ_DASHBOARD_USERNAME` | string | | Username to login BullMQ Dashboard |
| `BULLMQ_DASHBOARD_PASSWORD` | string | | Password to login BullMQ Dashboard |

View File

@@ -0,0 +1,12 @@
---
favicon: /favicons/filter.svg
items:
- name: Continue if conditions match
desc: Let the execution continue if the conditions match.
---
<script setup>
import CustomListing from '../../components/CustomListing.vue'
</script>
<CustomListing />

View File

@@ -0,0 +1,12 @@
# Filter
Filter is a built-in app shipped with Automatisch, and it doesn't need to talk with any other external service to run. So there are no additional steps to use the Filter app. It can be used as an action and it filters the flow based on the given conditions. Available conditions are:
- is equal
- is not equal
- is greater than
- is less than
- is greater than or equal
- is less than or equal
- contains
- does not contain

View File

@@ -10,10 +10,12 @@ Following integrations are currently supported by Automatisch.
- [Delay](/apps/delay/actions)
- [Discord](/apps/discord/actions)
- [Dropbox](/apps/dropbox/actions)
- [Filter](/apps/filter/actions)
- [Flickr](/apps/flickr/triggers)
- [Github](/apps/github/triggers)
- [Google Drive](/apps/google-drive/triggers)
- [Google Forms](/apps/google-forms/triggers)
- [Google Sheets](/apps/google-sheets/triggers)
- [HTTP Request](/apps/http-request/actions)
- [Ntfy](/apps/ntfy/actions)
- [OpenAI](/apps/openai/actions)

View File

@@ -0,0 +1,8 @@
<svg width="800px" height="800px" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Shape" fill="#000000" transform="translate(42.666667, 85.333333)">
<path d="M3.55271368e-14,1.42108547e-14 L191.565013,234.666667 L192,234.666667 L192,384 L234.666667,384 L234.666667,234.666667 L426.666667,1.42108547e-14 L3.55271368e-14,1.42108547e-14 Z M214.448,192 L211.81248,192 L89.9076267,42.6666667 L336.630187,42.6666667 L214.448,192 Z">
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 629 B

View File

@@ -1,6 +1,6 @@
{
"name": "@automatisch/e2e-tests",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"private": true,
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",

View File

@@ -1,6 +1,6 @@
{
"name": "@automatisch/types",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"description": "Type definitions for automatisch",
"homepage": "https://github.com/automatisch/automatisch",

View File

@@ -1,17 +1,18 @@
{
"name": "@automatisch/web",
"version": "0.7.0",
"version": "0.7.1",
"license": "See LICENSE file",
"description": "The open source Zapier alternative. Build workflow automation without spending time and money.",
"dependencies": {
"@apollo/client": "^3.6.9",
"@automatisch/types": "^0.7.0",
"@automatisch/types": "^0.7.1",
"@emotion/react": "^11.4.1",
"@emotion/styled": "^11.3.0",
"@hookform/resolvers": "^2.8.8",
"@mui/icons-material": "^5.11.9",
"@mui/lab": "^5.0.0-alpha.120",
"@mui/material": "^5.11.10",
"@mui/x-date-pickers": "^6.5.0",
"@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",

View File

@@ -0,0 +1,52 @@
import * as React from 'react';
import { DemoContainer } from '@mui/x-date-pickers/internals/demo';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import InputAdornment from '@mui/material/InputAdornment';
import TextField from '@mui/material/TextField';
import Grid from '@mui/material/Grid';
import ConditionalIconButton from 'components/ConditionalIconButton';
import SearchIcon from '@mui/icons-material/Search';
export default function ExecutionFilters() {
return (
<LocalizationProvider dateAdapter={AdapterDayjs}>
<DemoContainer components={['DatePicker']}>
<DatePicker label="From" />
<DatePicker label="Until" />
<TextField
label="By data in/out"
InputProps={{
endAdornment: (
<InputAdornment position="start">
<SearchIcon />
</InputAdornment>
),
}}
variant="outlined"
/>
<Grid
container
item
xs="auto"
sm="auto"
alignItems="center"
order={{ xs: 1, sm: 2 }}
>
<ConditionalIconButton
type="submit"
variant="contained"
color="primary"
size="large"
icon={<SearchIcon />}
data-test="create-flow-button"
>
Search
</ConditionalIconButton>
</Grid>
</DemoContainer>
</LocalizationProvider>
);
}

View File

@@ -10,6 +10,7 @@ import PaginationItem from '@mui/material/PaginationItem';
import type { IExecution } from '@automatisch/types';
import NoResultFound from 'components/NoResultFound';
import ExecutionsFilter from 'components/ExecutionsFilter';
import ExecutionRow from 'components/ExecutionRow';
import Container from 'components/Container';
import PageTitle from 'components/PageTitle';
@@ -60,25 +61,22 @@ export default function Executions(): React.ReactElement {
<PageTitle>{formatMessage('executions.title')}</PageTitle>
</Grid>
</Grid>
<Divider sx={{ mt: [2, 0], mb: 2 }} />
<ExecutionsFilter />
<Divider sx={{ mt: 2, mb: 2 }} />
{loading && (
<CircularProgress
data-test="executions-loader"
sx={{ display: 'block', margin: '20px auto' }}
/>
)}
{!loading && !hasExecutions && (
<NoResultFound text={formatMessage('executions.noExecutions')} />
)}
{!loading &&
executions?.map((execution) => (
<ExecutionRow key={execution.id} execution={execution} />
))}
{pageInfo && pageInfo.totalPages > 1 && (
<Pagination
sx={{ display: 'flex', justifyContent: 'center', mt: 3 }}

View File

@@ -1343,6 +1343,13 @@
dependencies:
regenerator-runtime "^0.13.11"
"@babel/runtime@^7.21.0":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200"
integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==
dependencies:
regenerator-runtime "^0.13.11"
"@babel/template@^7.16.7", "@babel/template@^7.3.3":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
@@ -2944,6 +2951,29 @@
prop-types "^15.8.1"
react-is "^18.2.0"
"@mui/utils@^5.12.3":
version "5.13.1"
resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.1.tgz#86199e46014215f95da046a5ec803f4a39c96eee"
integrity sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==
dependencies:
"@babel/runtime" "^7.21.0"
"@types/prop-types" "^15.7.5"
"@types/react-is" "^18.2.0"
prop-types "^15.8.1"
react-is "^18.2.0"
"@mui/x-date-pickers@^6.5.0":
version "6.5.0"
resolved "https://registry.yarnpkg.com/@mui/x-date-pickers/-/x-date-pickers-6.5.0.tgz#b71dbf9d8961fb34d9d829a4c6f9159ebb4e9206"
integrity sha512-dRCO1mzHjfOqsa4LdKxiXQnV0cuGiAkliyxSDCdRn6clK2WdF9Oj+1+4Mkx7fcJA61SV1eP4Yg29s0/VDsZKZw==
dependencies:
"@babel/runtime" "^7.21.0"
"@mui/utils" "^5.12.3"
"@types/react-transition-group" "^4.4.6"
clsx "^1.2.1"
prop-types "^15.8.1"
react-transition-group "^4.4.5"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -4171,6 +4201,13 @@
dependencies:
"@types/react" "*"
"@types/react-is@^18.2.0":
version "18.2.0"
resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.0.tgz#2f5137853a46017b3d56447940fb3eb92bbf24a5"
integrity sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==
dependencies:
"@types/react" "*"
"@types/react-transition-group@^4.4.5":
version "4.4.5"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
@@ -4178,6 +4215,13 @@
dependencies:
"@types/react" "*"
"@types/react-transition-group@^4.4.6":
version "4.4.6"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e"
integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@16 || 17", "@types/react@^17.0.0":
version "17.0.38"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd"