Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
84ecf105c2 | ||
![]() |
c07a02ef31 | ||
![]() |
3c44f55f19 |
@@ -20,6 +20,7 @@
|
||||
"db:migrate": "node ./bin/database/convert-migrations.js && knex migrate:latest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@atproto/api": "^0.12.13",
|
||||
"@bull-board/express": "^3.10.1",
|
||||
"@casl/ability": "^6.5.0",
|
||||
"@graphql-tools/graphql-file-loader": "^7.3.4",
|
||||
|
@@ -0,0 +1,41 @@
|
||||
import { BskyAgent, RichText } from '@atproto/api';
|
||||
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Create post',
|
||||
key: 'createPost',
|
||||
description: 'Creates a new post.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Text',
|
||||
key: 'text',
|
||||
type: 'string',
|
||||
required: true,
|
||||
variables: true,
|
||||
description: '',
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const text = $.step.parameters.text;
|
||||
const agent = new BskyAgent({ service: 'https://bsky.social/xrpc' });
|
||||
const richText = new RichText({ text });
|
||||
await richText.detectFacets(agent);
|
||||
|
||||
const body = {
|
||||
repo: $.auth.data.did,
|
||||
collection: 'app.bsky.feed.post',
|
||||
record: {
|
||||
$type: 'app.bsky.feed.post',
|
||||
text: richText.text,
|
||||
facets: richText.facets,
|
||||
createdAt: new Date().toISOString(),
|
||||
},
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/com.atproto.repo.createRecord', body);
|
||||
|
||||
$.setActionItem({ raw: data });
|
||||
},
|
||||
});
|
4
packages/backend/src/apps/bluesky/actions/index.js
Normal file
4
packages/backend/src/apps/bluesky/actions/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import createPost from './create-post/index.js';
|
||||
import searchPostByUrl from './search-post-by-url/index.js';
|
||||
|
||||
export default [createPost, searchPostByUrl];
|
@@ -0,0 +1,35 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Search post by url',
|
||||
key: 'searchPostByUrl',
|
||||
description: 'Searches a post in a thread by url.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Post Url',
|
||||
key: 'postUrl',
|
||||
type: 'string',
|
||||
required: true,
|
||||
variables: true,
|
||||
description: 'Enter whole post url here.',
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const postUrl = $.step.parameters.postUrl;
|
||||
const urlParts = postUrl.split('/');
|
||||
const handle = urlParts[urlParts.length - 3];
|
||||
const postId = urlParts[urlParts.length - 1];
|
||||
const uri = `at://${handle}/app.bsky.feed.post/${postId}`;
|
||||
|
||||
const params = {
|
||||
uri,
|
||||
};
|
||||
|
||||
const { data } = await $.http.get('/app.bsky.feed.getPostThread', {
|
||||
params,
|
||||
});
|
||||
|
||||
$.setActionItem({ raw: data });
|
||||
},
|
||||
});
|
4
packages/backend/src/apps/bluesky/assets/favicon.svg
Normal file
4
packages/backend/src/apps/bluesky/assets/favicon.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50 -50 430 390" fill="#1185fd" aria-hidden="true">
|
||||
<path d="M180 141.964C163.699 110.262 119.308 51.1817 78.0347 22.044C38.4971 -5.86834 23.414 -1.03207 13.526 3.43594C2.08093 8.60755 0 26.1785 0 36.5164C0 46.8542 5.66748 121.272 9.36416 133.694C21.5786 174.738 65.0603 188.607 105.104 184.156C107.151 183.852 109.227 183.572 111.329 183.312C109.267 183.642 107.19 183.924 105.104 184.156C46.4204 192.847 -5.69621 214.233 62.6582 290.33C137.848 368.18 165.705 273.637 180 225.702C194.295 273.637 210.76 364.771 295.995 290.33C360 225.702 313.58 192.85 254.896 184.158C252.81 183.926 250.733 183.645 248.671 183.315C250.773 183.574 252.849 183.855 254.896 184.158C294.94 188.61 338.421 174.74 350.636 133.697C354.333 121.275 360 46.8568 360 36.519C360 26.1811 357.919 8.61012 346.474 3.43851C336.586 -1.02949 321.503 -5.86576 281.965 22.0466C240.692 51.1843 196.301 110.262 180 141.964Z">
|
||||
</path>
|
||||
</svg>
|
After Width: | Height: | Size: 956 B |
34
packages/backend/src/apps/bluesky/auth/index.js
Normal file
34
packages/backend/src/apps/bluesky/auth/index.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
import isStillVerified from './is-still-verified.js';
|
||||
import refreshToken from './refresh-token.js';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'handle',
|
||||
label: 'Your Bluesky Handle',
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: '',
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'password',
|
||||
label: 'Your Bluesky Password',
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: '',
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
refreshToken,
|
||||
};
|
@@ -0,0 +1,8 @@
|
||||
import getCurrentUser from '../common/get-current-user.js';
|
||||
|
||||
const isStillVerified = async ($) => {
|
||||
const currentUser = await getCurrentUser($);
|
||||
return !!currentUser.did;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
24
packages/backend/src/apps/bluesky/auth/refresh-token.js
Normal file
24
packages/backend/src/apps/bluesky/auth/refresh-token.js
Normal file
@@ -0,0 +1,24 @@
|
||||
const refreshToken = async ($) => {
|
||||
const { refreshJwt } = $.auth.data;
|
||||
|
||||
const { data } = await $.http.post(
|
||||
'/com.atproto.server.refreshSession',
|
||||
null,
|
||||
{
|
||||
headers: {
|
||||
Authorization: `Bearer ${refreshJwt}`,
|
||||
},
|
||||
additionalProperties: {
|
||||
skipAddingAuthHeader: true,
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
await $.auth.set({
|
||||
accessJwt: data.accessJwt,
|
||||
refreshJwt: data.refreshJwt,
|
||||
did: data.did,
|
||||
});
|
||||
};
|
||||
|
||||
export default refreshToken;
|
20
packages/backend/src/apps/bluesky/auth/verify-credentials.js
Normal file
20
packages/backend/src/apps/bluesky/auth/verify-credentials.js
Normal file
@@ -0,0 +1,20 @@
|
||||
const verifyCredentials = async ($) => {
|
||||
const handle = $.auth.data.handle;
|
||||
const password = $.auth.data.password;
|
||||
|
||||
const body = {
|
||||
identifier: handle,
|
||||
password,
|
||||
};
|
||||
|
||||
const { data } = await $.http.post('/com.atproto.server.createSession', body);
|
||||
|
||||
await $.auth.set({
|
||||
accessJwt: data.accessJwt,
|
||||
refreshJwt: data.refreshJwt,
|
||||
did: data.did,
|
||||
screenName: data.handle,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
12
packages/backend/src/apps/bluesky/common/add-auth-header.js
Normal file
12
packages/backend/src/apps/bluesky/common/add-auth-header.js
Normal file
@@ -0,0 +1,12 @@
|
||||
const addAuthHeader = ($, requestConfig) => {
|
||||
if (requestConfig.additionalProperties?.skipAddingAuthHeader)
|
||||
return requestConfig;
|
||||
|
||||
if ($.auth.data?.accessJwt) {
|
||||
requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessJwt}`;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addAuthHeader;
|
15
packages/backend/src/apps/bluesky/common/get-current-user.js
Normal file
15
packages/backend/src/apps/bluesky/common/get-current-user.js
Normal file
@@ -0,0 +1,15 @@
|
||||
const getCurrentUser = async ($) => {
|
||||
const handle = $.auth.data.handle;
|
||||
|
||||
const params = {
|
||||
actor: handle,
|
||||
};
|
||||
|
||||
const { data: currentUser } = await $.http.get('/app.bsky.actor.getProfile', {
|
||||
params,
|
||||
});
|
||||
|
||||
return currentUser;
|
||||
};
|
||||
|
||||
export default getCurrentUser;
|
18
packages/backend/src/apps/bluesky/index.js
Normal file
18
packages/backend/src/apps/bluesky/index.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import addAuthHeader from './common/add-auth-header.js';
|
||||
import auth from './auth/index.js';
|
||||
import actions from './actions/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'Bluesky',
|
||||
key: 'bluesky',
|
||||
iconUrl: '{BASE_URL}/apps/bluesky/assets/favicon.svg',
|
||||
authDocUrl: '{DOCS_URL}/apps/bluesky/connection',
|
||||
supportsConnections: true,
|
||||
baseUrl: 'https://bluesky.app',
|
||||
apiBaseUrl: 'https://bsky.social/xrpc',
|
||||
primaryColor: '1185fd',
|
||||
beforeRequest: [addAuthHeader],
|
||||
auth,
|
||||
actions,
|
||||
});
|
@@ -1,29 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Detect language',
|
||||
key: 'detectLanguage',
|
||||
description: 'Detects language of a text.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Text',
|
||||
key: 'text',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The text to detect.',
|
||||
variables: true,
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { text } = $.step.parameters;
|
||||
|
||||
const body = {
|
||||
q: text,
|
||||
};
|
||||
|
||||
const response = await $.http.post('/detect', body);
|
||||
|
||||
$.setActionItem({ raw: response.data[0] });
|
||||
},
|
||||
});
|
@@ -1,4 +0,0 @@
|
||||
import detectLanguage from './detect-language/index.js';
|
||||
import translateText from './translate-text/index.js';
|
||||
|
||||
export default [detectLanguage, translateText];
|
@@ -1,86 +0,0 @@
|
||||
import defineAction from '../../../../helpers/define-action.js';
|
||||
|
||||
export default defineAction({
|
||||
name: 'Translate text',
|
||||
key: 'translateText',
|
||||
description: 'Translate a text.',
|
||||
arguments: [
|
||||
{
|
||||
label: 'Text',
|
||||
key: 'text',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The text to translate.',
|
||||
variables: true,
|
||||
},
|
||||
{
|
||||
label: 'Source Language',
|
||||
key: 'sourceLanguage',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listLanguages',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Target Language',
|
||||
key: 'targetLanguage',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: '',
|
||||
variables: true,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listLanguages',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Format',
|
||||
key: 'format',
|
||||
type: 'dropdown',
|
||||
description: '',
|
||||
required: false,
|
||||
variables: true,
|
||||
options: [
|
||||
{
|
||||
label: 'Text',
|
||||
value: 'text',
|
||||
},
|
||||
{
|
||||
label: 'HTML',
|
||||
value: 'html',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
async run($) {
|
||||
const { text, sourceLanguage, targetLanguage, format } = $.step.parameters;
|
||||
|
||||
const body = {
|
||||
q: text,
|
||||
source: sourceLanguage,
|
||||
target: targetLanguage,
|
||||
format,
|
||||
};
|
||||
|
||||
const response = await $.http.post('/translate', body);
|
||||
|
||||
$.setActionItem({ raw: response.data });
|
||||
},
|
||||
});
|
@@ -1,28 +0,0 @@
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="187.04305" height="188.81523" viewBox="0 0 49.488472 49.957363" version="1.1" id="svg8">
|
||||
<defs id="defs2">
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect835"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect835-7"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect874"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect923"/>
|
||||
</defs>
|
||||
<metadata id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" transform="translate(-23.040803,-26.932047)">
|
||||
<g id="g861" transform="translate(-42.114518,-17.993737)" style="fill:#000000">
|
||||
<g aria-label="众" transform="matrix(4.3205134,0,0,4.3205134,-37.271798,-327.6536)" id="text833" style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect835);fill:#000000;fill-opacity:1;stroke:none">
|
||||
<path d="m 34.996103,90.121035 -0.614947,0.759641 q -2.754346,-1.41593 -3.948067,-2.950715 -1.167884,1.617467 -3.7672,2.888703 L 26.0096,90.084861 q 3.457142,-1.601964 4.283963,-3.849882 l 0.878496,0.273884 q -0.175699,0.516763 -0.232543,0.604613 1.116207,1.596797 4.056587,3.007559 z m 0.165364,4.91958 -0.676959,0.645954 q -1.514115,-1.157549 -2.346102,-2.826692 -0.547769,1.550288 -2.268589,2.806021 l -0.676959,-0.625283 q 1.19889,-0.795814 1.798334,-1.875848 0.599445,-1.080034 0.682127,-3.079906 l 0.909502,0.07751 q 0,0.268716 -0.04134,0.671791 l -0.03617,0.361734 q 0,0.273884 0.30489,1.033525 0.310058,0.754474 0.899167,1.467606 0.594277,0.707965 1.452103,1.343583 z m -4.800725,-1.374588 -0.702797,0.63045 q -0.594277,-0.780312 -1.162716,-1.276404 -0.651121,1.421098 -2.020542,2.676831 l -0.687295,-0.614948 q 1.229895,-1.095537 1.767329,-2.201409 0.5426,-1.105872 0.697629,-2.795686 l 0.919838,0.09819 q -0.103353,0.940508 -0.366902,1.91719 1.00252,0.862993 1.555456,1.565791 z" style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Adobe Garamond Pro';-inkscape-font-specification:'Adobe Garamond Pro Bold';fill:#00000" id="path961"/>
|
||||
</g>
|
||||
<g aria-label="L" id="text841" style="font-style:normal;font-weight:normal;font-size:43.3964px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.08492">
|
||||
<path d="M 84.81389,94.883148 V 91.324643 H 69.191186 V 63.247172 h -4.035865 v 31.635976 z" style="fill:#000000;stroke-width:1.08492" id="path964"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="g921" transform="translate(29.198135,-14.725175)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,44 +0,0 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
import isStillVerified from './is-still-verified.js';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'screenName',
|
||||
label: 'Screen Name',
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description:
|
||||
'Screen name of your connection to be used on Automatisch UI.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'instanceUrl',
|
||||
label: 'Instance URL',
|
||||
type: 'string',
|
||||
required: false,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: 'For the self hosted version.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
{
|
||||
key: 'apiKey',
|
||||
label: 'API Key',
|
||||
type: 'string',
|
||||
required: false,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
placeholder: null,
|
||||
description: 'LibreTranslate API key of your account.',
|
||||
clickToCopy: false,
|
||||
},
|
||||
],
|
||||
|
||||
verifyCredentials,
|
||||
isStillVerified,
|
||||
};
|
@@ -1,8 +0,0 @@
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
|
||||
const isStillVerified = async ($) => {
|
||||
await verifyCredentials($);
|
||||
return true;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -1,14 +0,0 @@
|
||||
const verifyCredentials = async ($) => {
|
||||
const body = {
|
||||
q: 'Hi!',
|
||||
};
|
||||
|
||||
await $.http.post('/detect', body);
|
||||
|
||||
await $.auth.set({
|
||||
screenName: $.auth.data.screenName,
|
||||
apiKey: $.auth.data.apiKey,
|
||||
});
|
||||
};
|
||||
|
||||
export default verifyCredentials;
|
@@ -1,9 +0,0 @@
|
||||
const addApiKey = ($, requestConfig) => {
|
||||
const apiKey = $.auth.data.apiKey;
|
||||
|
||||
requestConfig.data = { api_key: apiKey, ...(requestConfig.data || {}) };
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default addApiKey;
|
@@ -1,16 +0,0 @@
|
||||
const setBaseUrl = ($, requestConfig) => {
|
||||
const instanceUrl = $.auth.data.instanceUrl;
|
||||
const apiKey = $.auth.data.apiKey;
|
||||
|
||||
if (instanceUrl) {
|
||||
requestConfig.baseURL = instanceUrl;
|
||||
} else if ($.app.apiBaseUrl) {
|
||||
requestConfig.baseURL = $.app.apiBaseUrl;
|
||||
}
|
||||
|
||||
requestConfig.data = { api_key: apiKey, ...(requestConfig.data || {}) };
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default setBaseUrl;
|
@@ -1,3 +0,0 @@
|
||||
import listLanguages from './list-languages/index.js';
|
||||
|
||||
export default [listLanguages];
|
@@ -1,25 +0,0 @@
|
||||
export default {
|
||||
name: 'List languages',
|
||||
key: 'listLanguages',
|
||||
|
||||
async run($) {
|
||||
const languages = {
|
||||
data: [],
|
||||
};
|
||||
|
||||
const { data } = await $.http.get('/languages');
|
||||
|
||||
if (!data?.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const language of data) {
|
||||
languages.data.push({
|
||||
value: language.code,
|
||||
name: language.name,
|
||||
});
|
||||
}
|
||||
|
||||
return languages;
|
||||
},
|
||||
};
|
@@ -1,21 +0,0 @@
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import auth from './auth/index.js';
|
||||
import addApiKey from './common/add-api-key.js';
|
||||
import setBaseUrl from './common/set-base-url.js';
|
||||
import actions from './actions/index.js';
|
||||
import dynamicData from './dynamic-data/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'LibreTranslate',
|
||||
key: 'libretranslate',
|
||||
iconUrl: '{BASE_URL}/apps/libretranslate/assets/favicon.svg',
|
||||
authDocUrl: '{DOCS_URL}/apps/libretranslate/connection',
|
||||
supportsConnections: true,
|
||||
baseUrl: 'https://libretranslate.com',
|
||||
apiBaseUrl: 'https://libretranslate.com',
|
||||
primaryColor: 'ffffff',
|
||||
beforeRequest: [setBaseUrl, addApiKey],
|
||||
auth,
|
||||
actions,
|
||||
dynamicData,
|
||||
});
|
@@ -52,7 +52,7 @@ const appConfig = {
|
||||
isDev: appEnv === 'development',
|
||||
isTest: appEnv === 'test',
|
||||
isProd: appEnv === 'production',
|
||||
version: '0.12.0',
|
||||
version: '0.11.0',
|
||||
postgresDatabase: process.env.POSTGRES_DATABASE || 'automatisch_development',
|
||||
postgresSchema: process.env.POSTGRES_SCHEMA || 'public',
|
||||
postgresPort: parseInt(process.env.POSTGRES_PORT || '5432'),
|
||||
|
@@ -10,7 +10,7 @@ describe('GET /api/v1/automatisch/version', () => {
|
||||
|
||||
const expectedPayload = {
|
||||
data: {
|
||||
version: '0.12.0',
|
||||
version: '0.11.0',
|
||||
},
|
||||
meta: {
|
||||
count: 1,
|
||||
|
@@ -1,11 +0,0 @@
|
||||
export async function up(knex) {
|
||||
return knex.schema.alterTable('datastore', (table) => {
|
||||
table.text('value').alter();
|
||||
});
|
||||
}
|
||||
|
||||
export async function down(knex) {
|
||||
return knex.schema.alterTable('datastore', (table) => {
|
||||
table.string('value').alter();
|
||||
});
|
||||
}
|
@@ -50,6 +50,15 @@ export default defineConfig({
|
||||
{ text: 'Connection', link: '/apps/appwrite/connection' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Bluesky',
|
||||
collapsible: true,
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: 'Actions', link: '/apps/bluesky/actions' },
|
||||
{ text: 'Connection', link: '/apps/bluesky/connection' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Carbone',
|
||||
collapsible: true,
|
||||
@@ -243,15 +252,6 @@ export default defineConfig({
|
||||
{ text: 'Connection', link: '/apps/invoice-ninja/connection' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'LibreTranslate',
|
||||
collapsible: true,
|
||||
collapsed: true,
|
||||
items: [
|
||||
{ text: 'Actions', link: '/apps/libretranslate/actions' },
|
||||
{ text: 'Connection', link: '/apps/libretranslate/connection' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Mattermost',
|
||||
collapsible: true,
|
||||
|
14
packages/docs/pages/apps/bluesky/actions.md
Normal file
14
packages/docs/pages/apps/bluesky/actions.md
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
favicon: /favicons/bluesky.svg
|
||||
items:
|
||||
- name: Create post
|
||||
desc: Creates a new post.
|
||||
- name: Search post by url
|
||||
desc: Searches a post in a thread by url.
|
||||
---
|
||||
|
||||
<script setup>
|
||||
import CustomListing from '../../components/CustomListing.vue'
|
||||
</script>
|
||||
|
||||
<CustomListing />
|
10
packages/docs/pages/apps/bluesky/connection.md
Normal file
10
packages/docs/pages/apps/bluesky/connection.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Bluesky
|
||||
|
||||
:::info
|
||||
This page explains the steps you need to follow to set up the Bluesky connection in Automatisch. If any of the steps are outdated, please let us know!
|
||||
:::
|
||||
|
||||
1. Enter your `Bluesky Handle` from the page to the `Your Bluesky Handle` field on Automatisch.
|
||||
1. Enter your `Bluesky Password` from the page to the `Your Bluesky Password` field on Automatisch.
|
||||
1. Click **Submit** button on Automatisch.
|
||||
1. Congrats! Start using your new Bluesky connection within the flows.
|
@@ -1,12 +0,0 @@
|
||||
---
|
||||
favicon: /favicons/libretranslate.svg
|
||||
items:
|
||||
- name: Translate text
|
||||
desc: Translate a text.
|
||||
---
|
||||
|
||||
<script setup>
|
||||
import CustomListing from '../../components/CustomListing.vue'
|
||||
</script>
|
||||
|
||||
<CustomListing />
|
@@ -1,12 +0,0 @@
|
||||
# LibreTranslate
|
||||
|
||||
:::info
|
||||
This page explains the steps you need to follow to set up the LibreTranslate
|
||||
connection in Automatisch. If any of the steps are outdated, please let us know!
|
||||
:::
|
||||
|
||||
1. Login to your LibreTranslate account.
|
||||
2. Copy your `API key` from the page to the `API Key` field on Automatisch.
|
||||
3. If you are using a self hosted version of LibreTranslate, copy your `Instance URl` to the `Instance URL` field on Automatisch.
|
||||
4. Write any screen name to be displayed in Automatisch.
|
||||
5. Now, you can start using the LibreTranslate connection with Automatisch.
|
@@ -4,6 +4,7 @@ The following integrations are currently supported by Automatisch.
|
||||
|
||||
- [Airtable](/apps/airtable/actions)
|
||||
- [Appwrite](/apps/appwrite/triggers)
|
||||
- [Bluesky](/apps/bluesky/actions)
|
||||
- [Carbone](/apps/carbone/actions)
|
||||
- [Datastore](/apps/datastore/actions)
|
||||
- [DeepL](/apps/deepl/actions)
|
||||
@@ -25,7 +26,6 @@ The following integrations are currently supported by Automatisch.
|
||||
- [HTTP Request](/apps/http-request/actions)
|
||||
- [HubSpot](/apps/hubspot/actions)
|
||||
- [Invoice Ninja](/apps/invoice-ninja/triggers)
|
||||
- [LibreTranslate](/apps/libretranslate/actions)
|
||||
- [Mattermost](/apps/mattermost/actions)
|
||||
- [Miro](/apps/miro/actions)
|
||||
- [Notion](/apps/notion/triggers)
|
||||
|
4
packages/docs/pages/public/favicons/bluesky.svg
Normal file
4
packages/docs/pages/public/favicons/bluesky.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-50 -50 430 390" fill="#1185fd" aria-hidden="true">
|
||||
<path d="M180 141.964C163.699 110.262 119.308 51.1817 78.0347 22.044C38.4971 -5.86834 23.414 -1.03207 13.526 3.43594C2.08093 8.60755 0 26.1785 0 36.5164C0 46.8542 5.66748 121.272 9.36416 133.694C21.5786 174.738 65.0603 188.607 105.104 184.156C107.151 183.852 109.227 183.572 111.329 183.312C109.267 183.642 107.19 183.924 105.104 184.156C46.4204 192.847 -5.69621 214.233 62.6582 290.33C137.848 368.18 165.705 273.637 180 225.702C194.295 273.637 210.76 364.771 295.995 290.33C360 225.702 313.58 192.85 254.896 184.158C252.81 183.926 250.733 183.645 248.671 183.315C250.773 183.574 252.849 183.855 254.896 184.158C294.94 188.61 338.421 174.74 350.636 133.697C354.333 121.275 360 46.8568 360 36.519C360 26.1811 357.919 8.61012 346.474 3.43851C336.586 -1.02949 321.503 -5.86576 281.965 22.0466C240.692 51.1843 196.301 110.262 180 141.964Z">
|
||||
</path>
|
||||
</svg>
|
After Width: | Height: | Size: 956 B |
@@ -1,28 +0,0 @@
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="187.04305" height="188.81523" viewBox="0 0 49.488472 49.957363" version="1.1" id="svg8">
|
||||
<defs id="defs2">
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect835"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect835-7"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect874"/>
|
||||
<rect x="25.162016" y="84.327377" width="71.115189" height="52.835255" id="rect923"/>
|
||||
</defs>
|
||||
<metadata id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" transform="translate(-23.040803,-26.932047)">
|
||||
<g id="g861" transform="translate(-42.114518,-17.993737)" style="fill:#000000">
|
||||
<g aria-label="众" transform="matrix(4.3205134,0,0,4.3205134,-37.271798,-327.6536)" id="text833" style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect835);fill:#000000;fill-opacity:1;stroke:none">
|
||||
<path d="m 34.996103,90.121035 -0.614947,0.759641 q -2.754346,-1.41593 -3.948067,-2.950715 -1.167884,1.617467 -3.7672,2.888703 L 26.0096,90.084861 q 3.457142,-1.601964 4.283963,-3.849882 l 0.878496,0.273884 q -0.175699,0.516763 -0.232543,0.604613 1.116207,1.596797 4.056587,3.007559 z m 0.165364,4.91958 -0.676959,0.645954 q -1.514115,-1.157549 -2.346102,-2.826692 -0.547769,1.550288 -2.268589,2.806021 l -0.676959,-0.625283 q 1.19889,-0.795814 1.798334,-1.875848 0.599445,-1.080034 0.682127,-3.079906 l 0.909502,0.07751 q 0,0.268716 -0.04134,0.671791 l -0.03617,0.361734 q 0,0.273884 0.30489,1.033525 0.310058,0.754474 0.899167,1.467606 0.594277,0.707965 1.452103,1.343583 z m -4.800725,-1.374588 -0.702797,0.63045 q -0.594277,-0.780312 -1.162716,-1.276404 -0.651121,1.421098 -2.020542,2.676831 l -0.687295,-0.614948 q 1.229895,-1.095537 1.767329,-2.201409 0.5426,-1.105872 0.697629,-2.795686 l 0.919838,0.09819 q -0.103353,0.940508 -0.366902,1.91719 1.00252,0.862993 1.555456,1.565791 z" style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Adobe Garamond Pro';-inkscape-font-specification:'Adobe Garamond Pro Bold';fill:#00000" id="path961"/>
|
||||
</g>
|
||||
<g aria-label="L" id="text841" style="font-style:normal;font-weight:normal;font-size:43.3964px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.08492">
|
||||
<path d="M 84.81389,94.883148 V 91.324643 H 69.191186 V 63.247172 h -4.035865 v 31.635976 z" style="fill:#000000;stroke-width:1.08492" id="path964"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="g921" transform="translate(29.198135,-14.725175)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -36,7 +36,7 @@ function AdminApplicationSettings(props) {
|
||||
|
||||
const handleSubmit = async (values) => {
|
||||
try {
|
||||
if (!appConfig?.data) {
|
||||
if (!appConfig.data) {
|
||||
await createAppConfig({
|
||||
variables: {
|
||||
input: { key: props.appKey, ...values },
|
||||
@@ -69,7 +69,6 @@ function AdminApplicationSettings(props) {
|
||||
}),
|
||||
[appConfig?.data],
|
||||
);
|
||||
|
||||
return (
|
||||
<Form
|
||||
defaultValues={defaultValues}
|
||||
|
@@ -28,12 +28,9 @@ function ContextMenu(props) {
|
||||
variables: { input: { id: flowId } },
|
||||
});
|
||||
|
||||
if (appKey) {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: ['apps', appKey, 'flows'],
|
||||
});
|
||||
}
|
||||
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: ['apps', appKey, 'flows'],
|
||||
});
|
||||
enqueueSnackbar(formatMessage('flow.successfullyDuplicated'), {
|
||||
variant: 'success',
|
||||
SnackbarProps: {
|
||||
@@ -59,12 +56,9 @@ function ContextMenu(props) {
|
||||
},
|
||||
});
|
||||
|
||||
if (appKey) {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: ['apps', appKey, 'flows'],
|
||||
});
|
||||
}
|
||||
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: ['apps', appKey, 'flows'],
|
||||
});
|
||||
enqueueSnackbar(formatMessage('flow.successfullyDeleted'), {
|
||||
variant: 'success',
|
||||
});
|
||||
@@ -116,7 +110,7 @@ ContextMenu.propTypes = {
|
||||
]).isRequired,
|
||||
onDeleteFlow: PropTypes.func,
|
||||
onDuplicateFlow: PropTypes.func,
|
||||
appKey: PropTypes.string,
|
||||
appKey: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default ContextMenu;
|
||||
|
@@ -38,24 +38,20 @@ function FlowRow(props) {
|
||||
const contextButtonRef = React.useRef(null);
|
||||
const [anchorEl, setAnchorEl] = React.useState(null);
|
||||
const { flow, onDuplicateFlow, onDeleteFlow, appKey } = props;
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
const onContextMenuClick = (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
event.nativeEvent.stopImmediatePropagation();
|
||||
setAnchorEl(contextButtonRef.current);
|
||||
};
|
||||
|
||||
const createdAt = DateTime.fromMillis(parseInt(flow.createdAt, 10));
|
||||
const updatedAt = DateTime.fromMillis(parseInt(flow.updatedAt, 10));
|
||||
const isUpdated = updatedAt > createdAt;
|
||||
const relativeCreatedAt = createdAt.toRelative();
|
||||
const relativeUpdatedAt = updatedAt.toRelative();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Card sx={{ mb: 1 }} data-test="flow-row">
|
||||
@@ -131,7 +127,7 @@ FlowRow.propTypes = {
|
||||
flow: FlowPropType.isRequired,
|
||||
onDeleteFlow: PropTypes.func,
|
||||
onDuplicateFlow: PropTypes.func,
|
||||
appKey: PropTypes.string,
|
||||
appKey: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
export default FlowRow;
|
||||
|
78
yarn.lock
78
yarn.lock
@@ -170,6 +170,52 @@
|
||||
tslib "^2.3.0"
|
||||
zen-observable-ts "~1.1.0"
|
||||
|
||||
"@atproto/api@^0.12.13":
|
||||
version "0.12.13"
|
||||
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.12.13.tgz#269d6c57ea894e23f20b28bd3cbfed944bd28528"
|
||||
integrity sha512-pRSID6w8AUiZJoCxgctMPRTSGVFHq7wphAnxEbRLBP3OQ1g+BRZUcqFw+e+17Pd3wrc8VImjiD4HCWtCJvCx3w==
|
||||
dependencies:
|
||||
"@atproto/common-web" "^0.3.0"
|
||||
"@atproto/lexicon" "^0.4.0"
|
||||
"@atproto/syntax" "^0.3.0"
|
||||
"@atproto/xrpc" "^0.5.0"
|
||||
multiformats "^9.9.0"
|
||||
tlds "^1.234.0"
|
||||
|
||||
"@atproto/common-web@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.3.0.tgz#36da8c2c31d8cf8a140c3c8f03223319bf4430bb"
|
||||
integrity sha512-67VnV6JJyX+ZWyjV7xFQMypAgDmjVaR9ZCuU/QW+mqlqI7fex2uL4Fv+7/jHadgzhuJHVd6OHOvNn0wR5WZYtA==
|
||||
dependencies:
|
||||
graphemer "^1.4.0"
|
||||
multiformats "^9.9.0"
|
||||
uint8arrays "3.0.0"
|
||||
zod "^3.21.4"
|
||||
|
||||
"@atproto/lexicon@^0.4.0":
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.4.0.tgz#63e8829945d80c25524882caa8ed27b1151cc576"
|
||||
integrity sha512-RvCBKdSI4M8qWm5uTNz1z3R2yIvIhmOsMuleOj8YR6BwRD+QbtUBy3l+xQ7iXf4M5fdfJFxaUNa6Ty0iRwdKqQ==
|
||||
dependencies:
|
||||
"@atproto/common-web" "^0.3.0"
|
||||
"@atproto/syntax" "^0.3.0"
|
||||
iso-datestring-validator "^2.2.2"
|
||||
multiformats "^9.9.0"
|
||||
zod "^3.21.4"
|
||||
|
||||
"@atproto/syntax@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@atproto/syntax/-/syntax-0.3.0.tgz#fafa2dbea9add37253005cb663e7373e05e618b3"
|
||||
integrity sha512-Weq0ZBxffGHDXHl9U7BQc2BFJi/e23AL+k+i5+D9hUq/bzT4yjGsrCejkjq0xt82xXDjmhhvQSZ0LqxyZ5woxA==
|
||||
|
||||
"@atproto/xrpc@^0.5.0":
|
||||
version "0.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.5.0.tgz#dacbfd8f7b13f0ab5bd56f8fdd4b460e132a6032"
|
||||
integrity sha512-swu+wyOLvYW4l3n+VAuJbHcPcES+tin2Lsrp8Bw5aIXIICiuFn1YMFlwK9JwVUzTH21Py1s1nHEjr4CJeElJog==
|
||||
dependencies:
|
||||
"@atproto/lexicon" "^0.4.0"
|
||||
zod "^3.21.4"
|
||||
|
||||
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3":
|
||||
version "7.16.7"
|
||||
resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz"
|
||||
@@ -8939,6 +8985,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
|
||||
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz"
|
||||
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
|
||||
|
||||
graphemer@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
|
||||
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
|
||||
|
||||
graphql-executor@0.0.18:
|
||||
version "0.0.18"
|
||||
resolved "https://registry.npmjs.org/graphql-executor/-/graphql-executor-0.0.18.tgz"
|
||||
@@ -9876,6 +9927,11 @@ isexe@^3.1.1:
|
||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d"
|
||||
integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==
|
||||
|
||||
iso-datestring-validator@^2.2.2:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz#2daa80d2900b7a954f9f731d42f96ee0c19a6895"
|
||||
integrity sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==
|
||||
|
||||
isobject@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
|
||||
@@ -11592,6 +11648,11 @@ multicast-dns@^6.0.1:
|
||||
dns-packet "^1.3.1"
|
||||
thunky "^1.0.2"
|
||||
|
||||
multiformats@^9.4.2, multiformats@^9.9.0:
|
||||
version "9.9.0"
|
||||
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37"
|
||||
integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==
|
||||
|
||||
multimatch@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz"
|
||||
@@ -15574,6 +15635,11 @@ tinyspy@^2.2.0:
|
||||
resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce"
|
||||
integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==
|
||||
|
||||
tlds@^1.234.0:
|
||||
version "1.252.0"
|
||||
resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.252.0.tgz#71d9617f4ef4cc7347843bee72428e71b8b0f419"
|
||||
integrity sha512-GA16+8HXvqtfEnw/DTcwB0UU354QE1n3+wh08oFjr6Znl7ZLAeUgYzCcK+/CCrOyE0vnHR8/pu3XXG3vDijXpQ==
|
||||
|
||||
tmp@^0.0.33:
|
||||
version "0.0.33"
|
||||
resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
|
||||
@@ -15823,6 +15889,13 @@ uid-number@0.0.6:
|
||||
resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz"
|
||||
integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
|
||||
|
||||
uint8arrays@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b"
|
||||
integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==
|
||||
dependencies:
|
||||
multiformats "^9.4.2"
|
||||
|
||||
umask@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz"
|
||||
@@ -16948,3 +17021,8 @@ zen-observable@0.8.15:
|
||||
version "0.8.15"
|
||||
resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz"
|
||||
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
|
||||
|
||||
zod@^3.21.4:
|
||||
version "3.23.8"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
|
||||
integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
|
||||
|
Reference in New Issue
Block a user