worked on twitter api support added surrealist to flake got database create user and sign in functions working

This commit is contained in:
specCon18 2024-05-01 17:10:42 -04:00
parent 19d70ba912
commit 5b9c9187ff
12 changed files with 374 additions and 225 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

125
.gitignore vendored
View file

@ -1,128 +1,7 @@
# Logs
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
.config/.env .config/.env
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
index
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/ node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist/ dist/
.direnv/
# Gatsby files database.surql
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# direnv
.direnv

19
flake.lock generated
View file

@ -34,10 +34,27 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-unstable": {
"locked": {
"lastModified": 1714253743,
"narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs",
"nixpkgs-unstable": "nixpkgs-unstable"
} }
}, },
"systems": { "systems": {

View file

@ -2,7 +2,11 @@
description = "A js development environment"; description = "A js development environment";
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils = {
inputs.nixpkgs.follows = "nixpkgs-unstable";
url = "github:numtide/flake-utils";
};
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
}; };
outputs = { self, nixpkgs, flake-utils, ... }: outputs = { self, nixpkgs, flake-utils, ... }:
@ -12,13 +16,20 @@
inherit system; inherit system;
overlays = []; overlays = [];
}; };
unstable = import <nixos-unstable> { config = { allowUnfree = true; }; };
in in
{ {
devShell = pkgs.mkShell { devShell = pkgs.mkShell {
buildInputs = [ buildInputs = with pkgs; [
pkgs.nodejs_20 nodejs_20
pkgs.yarn yarn
surrealdb
unstable.surrealist
]; ];
}; };
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [
"surrealdb"
];
}); });
} }

View file

@ -3,13 +3,16 @@
"main": "src/index.js", "main": "src/index.js",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"start": "node dist/server.js" "start": "node dist/server.js --env-file='.config/.env'"
}, },
"dependencies": { "dependencies": {
"@types/express": "^4.17.21", "@types/express": "^4.17.21",
"dotenv": "^16.4.5", "axios": "^1.6.8",
"cron": "^3.1.7",
"express": "^4.19.2", "express": "^4.19.2",
"linkedin-api-client": "^0.3.0" "linkedin-api-client": "^0.3.0",
"surrealdb.js": "^1.0.0-beta.5",
"twitter-api-v2": "^1.16.3"
}, },
"devDependencies": {} "devDependencies": {}
} }

138
src/database.ts Normal file
View file

@ -0,0 +1,138 @@
import axios, { AxiosRequestConfig } from "axios";
interface db_auth_data {
user:string,
pass:string,
db:string,
sc?:string,
ns:string
};
interface spapi_user {
name:string
accounts?:Array<spapi_account>
};
interface spapi_account {
id:string,
username:string,
post_count:number,
platform_ident:string,
last_post: ISO8601Timestamp,
};
interface platform_auth_data {
[key: string]: {
[key: string]: string;
};
}
type ISO8601Timestamp = `${number}-${number}-${number}T${number}:${number}:${number}${'Z' | '' | `${'+' | '-'}${number}:${number}`}`;
const platform_auth_structures: platform_auth_data = {
linkedin: {
api_key: ""
},
//TODO find correct auth_data for twitter posts on v2 api
twitter: {
access_token: "",
refresh_token: ""
}
};
const platforms:{ [key: string]: any } = {
twitter:{identifier:"twit",auth_data:platform_auth_structures.twitter},
linkedin:{identifier:"li",auth_data:platform_auth_structures.linkedin}
};
//Create a user in the table User on the local running SurrealDB instance over http via the Surreal REST API on port 8000
function create_user(token:string, auth:db_auth_data, user:spapi_user){
let surql_query = `CREATE User:${user.name} SET name = '${user.name}', accounts = null;`;
let request_config:AxiosRequestConfig = {
url: '/sql',
method: 'post',
baseURL: 'http://localhost:8000',
headers: {
'Accept':'application/json',
'Authorization':token,
'NS': auth.ns,
'DB': auth.db,
},
data: surql_query,
auth: {
username:auth.user,
password:auth.pass
},
responseType: 'json',
};
let res = axios.request(request_config).then(function (response) {
return response.data;
});
return res
}
function create_account(account:spapi_account, user:spapi_user,){
if (account.platform_ident == platforms.twitter.identifier) {
} else if (account.platform_ident === platforms.linkedin.identifier) {
} else {
console.log("Invalid Platform Identifier")
}
}
//Authenticate with the local running SurrealDB instance over http via the Surreal REST API on port 8000
function db_auth(data:db_auth_data) {
let request_config:AxiosRequestConfig = {
url: '/signin',
method: 'post',
baseURL: 'http://127.0.0.1:8000',
headers: {
'Accept':'application/json',
},
data: {
NS: data.ns,
DB: data.db,
user: data.user,
pass: data.pass
},
auth: {
username: data.user,
password: data.pass
},
responseType: 'json',
};
let res = axios.request(request_config).then(function (response) {
return response.data.token;
});
return res
};
// * Example/test Code for creating a user
// let data:db_auth_data = {
// ns: "social_post",
// db: "social_post",
// user: "root",
// pass: "root"
// };
// let user:spapi_user = {
// name: 'jessie'
// }
// try {
// let token = await db_auth(data);
// let res = await create_user(token,data,user);
// // Assuming res is an array with one element containing the result object
// if (res && res.length > 0) {
// // Accessing the first element of the result array and then accessing the 'result' property of that object
// let resultObject = res[0].result;
// console.log(resultObject);
// // Now you can work with the resultObject
// } else {
// console.log("No result found.");
// }
// } catch (error) {
// console.error('Error:', error);
// }

View file

@ -1,65 +0,0 @@
/**
* Example calls to create a post on LinkedIn. This requires a member-based token with the following
* scopes (r_liteprofile, w_member_social), which is provided by the Sign in with LinkedIn and Share on LinkedIn
* API products.
*
* The steps include:
* 1. Fetching the authenticated member's profile to obtain the member's identifier (a person URN)
* 2. Create a post using /posts endpoint
*
* To view these posts, go to linkedin.com and click Me > Posts & Activity.
*
* BEWARE: This will make an actual post to the main feed which is visible to anyone.
*/
import { RestliClient } from 'linkedin-api-client';
import dotenv from 'dotenv';
dotenv.config({ path: './.config/.env' });
const USERINFO_RESOURCE = '/userinfo';
const POSTS_RESOURCE = '/posts';
const API_VERSION = '202401';
async function main(): Promise<void> {
const restliClient = new RestliClient();
restliClient.setDebugParams({ enabled: true });
const accessToken = process.env.LI_API_KEY || '';
const meResponse = await restliClient.get({
resourcePath: USERINFO_RESOURCE,
accessToken
});
console.log(meResponse.data);
/**
* Calling the newer, more streamlined (and versioned) /posts API to create
* a text post on behalf of the authenticated member.
*/
const postsCreateResponse = await restliClient.create({
resourcePath: POSTS_RESOURCE,
entity: {
author: `urn:li:person:${meResponse.data.sub}`,
lifecycleState: 'PUBLISHED',
visibility: 'PUBLIC',
commentary: 'Sample text post created with /posts API',
distribution: {
feedDistribution: 'MAIN_FEED',
targetEntities: [],
thirdPartyDistributionChannels: []
}
},
accessToken,
versionString: API_VERSION
});
// This is the created share URN
console.log(postsCreateResponse.createdEntityId);
}
main()
.then(() => {
console.log('Completed');
})
.catch((error) => {
console.log(`Error encountered: ${error.message}`);
});

35
src/platforms/li_post.ts Normal file
View file

@ -0,0 +1,35 @@
import { RestliClient } from 'linkedin-api-client';
const USERINFO_ENDPOINT = '/userinfo';
const POSTS_ENDPOINT = '/posts';
const API_VERSION = process.env.LI_API_VERSION || '';
const API_KEY = process.env.LI_API_KEY || '';
export async function post_to_li(): Promise<void> {
const restliClient = new RestliClient();
restliClient.setDebugParams({ enabled: true });
const meResponse = await restliClient.get({
resourcePath: USERINFO_ENDPOINT,
accessToken: API_KEY
});
const postsCreateResponse = await restliClient.create({
resourcePath: POSTS_ENDPOINT,
entity: {
author: `urn:li:person:${meResponse.data.sub}`,
lifecycleState: 'PUBLISHED',
visibility: 'PUBLIC',
commentary: 'Sample text post created with /posts API',
distribution: {
feedDistribution: 'MAIN_FEED',
targetEntities: [],
thirdPartyDistributionChannels: []
}
},
accessToken:API_KEY,
versionString: API_VERSION
});
console.log(postsCreateResponse.createdEntityId);
}

View file

@ -0,0 +1,13 @@
import { TwitterApi } from "twitter-api-v2";
const client = new TwitterApi({
clientId: process.env.TWITTER_CLIENT_ID || '',
clientSecret: process.env.TWITTER_CLIENT_SECRET || '',
});
const bearer = new TwitterApi(process.env.TWITTER_BEARER_TOKEN || '');
function auth(){};
export const twitter_callback_url = "http://127.0.0.1:3000/callback/";
export const twitter_client = client.readWrite;
export const twitter_bearer = bearer.readOnly;

View file

@ -1,29 +1,31 @@
import express from 'express'; import {Router,Request,Response} from 'express';
import { RestliClient } from 'linkedin-api-client'; import {post_to_li} from './platforms/li_post.js'
import { config } from 'dotenv'; import {twitter_client} from './platforms/twitter_post.js';
//Load the .env file in ./config/.env to get apiKeys
config({ path: './.config/.env' });
// Create a router // Create a router
const router = express.Router(); const router = Router();
const restliClient = new RestliClient();
// Load API Keys
const twitterApiKey = process.env.TWITTER_API_KEY;
const liApiKey = process.env.LI_API_KEY || '';
// Define routes // Endpoints to post to twitter
// Twitter API tweet endpoint: https://api.twitter.com/1.1/statuses/update.json //TODO: accept MD as input and convert to non-formatted text as Twitter is dumb and doesn't allow formatting in posts
router.get('/twitter', (req,res) => { router.post('/twitter/tweet', (req: Request, res: Response) => {});
router.get('/twitter/callback',(req:Request,res:Response) => {});
});
// LinkedIn API tweet endpoint: https://api.linkedin.com/v2/ugcPosts //Endpoints for surrealdb
router.get('/li', (req,res) => { /// Endpoints for the User Table
}); router.post('/db/user/create', (req:Request,res:Response) => {});
router.get('/db/user/read', (req:Request,res:Response) => {});
router.patch('/db/user/update', (req:Request,res:Response) => {});
router.delete('/db/user/delete', (req:Request,res:Response) => {});
/// Endpoints for the Account Table
router.post('/db/account/create', (req:Request,res:Response) => {});
router.get('/db/account/read', (req:Request,res:Response) => {});
router.patch('/db/account/update', (req:Request,res:Response) => {});
router.delete('/db/account/delete', (req:Request,res:Response) => {});
// Route post to each enpoint // Endpoint to post to linkedin
router.get('/all', (req,res) => { //TODO: accept MD as input and convert to non-formatted text as LinkedIn is dumb and doesn't allow formatting in posts
router.post('/linkedin/post', (req: Request, res: Response) => {
post_to_li().then(() => {console.log('Completed');}).catch((error) => {console.log(`Error encountered: ${error.message}`);});
}); });
// Export the router // Export the router

View file

@ -2,11 +2,11 @@ import express from 'express';
import router from './router.js'; import router from './router.js';
const app = express(); const app = express();
const port = 3000; const port = process.env.PORT || 3000;
// Use the router // Use the router
app.use(router); app.use(router);
app.listen(port, () => { app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`); console.log(`Server running at http://127.0.0.1:${port}`);
}); });

127
yarn.lock
View file

@ -2,6 +2,24 @@
# yarn lockfile v1 # yarn lockfile v1
"@deno/shim-deno-test@^0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@deno/shim-deno-test/-/shim-deno-test-0.4.0.tgz#2ff56821854c51323c0cd08a4a56d668f84367ba"
integrity sha512-oYWcD7CpERZy/TXMTM9Tgh1HD/POHlbY9WpzmAk+5H8DohcxG415Qws8yLGlim3EaKBT2v3lJv01x4G0BosnaQ==
"@deno/shim-deno@~0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@deno/shim-deno/-/shim-deno-0.16.1.tgz#f7d3925745c74337c83818de7d6435557c816c60"
integrity sha512-s9v0kzF5bm/o9TgdwvsraHx6QNllYrXXmKzgOG2lh4LFXnVMr2gpjK/c/ve6EflQn1MqImcWmVD8HAv5ahuuZQ==
dependencies:
"@deno/shim-deno-test" "^0.4.0"
which "^2.0.2"
"@icholy/duration@^5.1.0":
version "5.1.0"
resolved "https://registry.yarnpkg.com/@icholy/duration/-/duration-5.1.0.tgz#da193379e3a1b3107984c8bf22b4aa4ee7af1ef8"
integrity sha512-I/zdjC6qYdwWJ2H1/PZbI3g58pPIiI/eOe5XDTtQ/v36d0ogcvAylqwOIWj/teY1rBnIMzUyWfX7PMm9I67WWg==
"@types/body-parser@*": "@types/body-parser@*":
version "1.19.5" version "1.19.5"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4"
@ -42,6 +60,11 @@
resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f"
integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==
"@types/luxon@~3.4.0":
version "3.4.2"
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.4.2.tgz#e4fc7214a420173cea47739c33cdf10874694db7"
integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==
"@types/mime@^1": "@types/mime@^1":
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690"
@ -99,7 +122,7 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
axios@^1.1.3: axios@^1.1.3, axios@^1.6.8:
version "1.6.8" version "1.6.8"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
@ -126,6 +149,13 @@ body-parser@1.20.2:
type-is "~1.6.18" type-is "~1.6.18"
unpipe "1.0.0" unpipe "1.0.0"
bufferutil@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea"
integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==
dependencies:
node-gyp-build "^4.3.0"
bytes@3.1.2: bytes@3.1.2:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
@ -142,6 +172,13 @@ call-bind@^1.0.7:
get-intrinsic "^1.2.4" get-intrinsic "^1.2.4"
set-function-length "^1.2.1" set-function-length "^1.2.1"
cbor-redux@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cbor-redux/-/cbor-redux-1.0.0.tgz#82437cf23bab5920bbb19a708a1c46a505da790c"
integrity sha512-nqCD/Yu2FON0XgZYdUNsMx1Tc08MOY3noh9bO2MvkjlyLZyqIVWjuz6A0mDrPJncdOfacokFUtF7zlzzP5oK5A==
dependencies:
"@deno/shim-deno" "~0.16.1"
combined-stream@^1.0.8: combined-stream@^1.0.8:
version "1.0.8" version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@ -171,6 +208,14 @@ cookie@0.6.0:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
cron@^3.1.7:
version "3.1.7"
resolved "https://registry.yarnpkg.com/cron/-/cron-3.1.7.tgz#3423d618ba625e78458fff8cb67001672d49ba0d"
integrity sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==
dependencies:
"@types/luxon" "~3.4.0"
luxon "~3.4.0"
debug@2.6.9: debug@2.6.9:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -178,6 +223,11 @@ debug@2.6.9:
dependencies: dependencies:
ms "2.0.0" ms "2.0.0"
decimal.js@^10.4.3:
version "10.4.3"
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
define-data-property@^1.1.4: define-data-property@^1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
@ -202,11 +252,6 @@ destroy@1.2.0:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
dotenv@^16.4.5:
version "16.4.5"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
ee-first@1.1.1: ee-first@1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -388,6 +433,16 @@ ipaddr.js@1.9.1:
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
isows@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061"
integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==
linkedin-api-client@^0.3.0: linkedin-api-client@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/linkedin-api-client/-/linkedin-api-client-0.3.0.tgz#b10db8b028a74cad4ca3baa0781b2787a2c8b56c" resolved "https://registry.yarnpkg.com/linkedin-api-client/-/linkedin-api-client-0.3.0.tgz#b10db8b028a74cad4ca3baa0781b2787a2c8b56c"
@ -402,6 +457,11 @@ lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
luxon@~3.4.0:
version "3.4.4"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af"
integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==
media-typer@0.3.0: media-typer@0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@ -449,6 +509,11 @@ negotiator@0.6.3:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
node-gyp-build@^4.3.0:
version "4.8.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd"
integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==
object-inspect@^1.13.1: object-inspect@^1.13.1:
version "1.13.1" version "1.13.1"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
@ -584,11 +649,32 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
surrealdb.js@^1.0.0-beta.5:
version "1.0.0-beta.5"
resolved "https://registry.yarnpkg.com/surrealdb.js/-/surrealdb.js-1.0.0-beta.5.tgz#2eb48a46838774dd229c84bc6a1193135fbfbd82"
integrity sha512-8JEHCLm/ulm4gBX9XJ/MGKofHlBw14mRAiG/1spvadQ1N51UsmDXMHD11YPACXZ2yBjJfDeYY1EdH9OW4PnrQA==
dependencies:
"@icholy/duration" "^5.1.0"
cbor-redux "1.0.0"
decimal.js "^10.4.3"
isows "^1.0.4"
uuidv7 "0.6.3"
ws "^8.16.0"
zod "*"
optionalDependencies:
bufferutil "^4.0.8"
utf-8-validate "^6.0.3"
toidentifier@1.0.1: toidentifier@1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
twitter-api-v2@^1.16.3:
version "1.16.3"
resolved "https://registry.yarnpkg.com/twitter-api-v2/-/twitter-api-v2-1.16.3.tgz#6042c61b4dee35329dda3d153d9f08d2c6a348e3"
integrity sha512-T9Wbq1y3IrTshBvtVawpWp1GmL3mduF4RhieSfM1HsL10Qda0EeJMDUwr5C6IeelnSZ65tiiXzs0xUS8FHM9XA==
type-is@~1.6.18: type-is@~1.6.18:
version "1.6.18" version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@ -607,12 +693,41 @@ unpipe@1.0.0, unpipe@~1.0.0:
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
utf-8-validate@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777"
integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==
dependencies:
node-gyp-build "^4.3.0"
utils-merge@1.0.1: utils-merge@1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
uuidv7@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/uuidv7/-/uuidv7-0.6.3.tgz#2abcfa683b4ad4a0cbbbaedffc3ef940c110cf10"
integrity sha512-zV3eW2NlXTsun/aJ7AixxZjH/byQcH/r3J99MI0dDEkU2cJIBJxhEWUHDTpOaLPRNhebPZoeHuykYREkI9HafA==
vary@~1.1.2: vary@~1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
which@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
ws@^8.16.0:
version "8.17.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea"
integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==
zod@*:
version "3.23.5"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.5.tgz#c7b7617d017d4a2f21852f533258d26a9a5ae09f"
integrity sha512-fkwiq0VIQTksNNA131rDOsVJcns0pfVUjHzLrNBiF/O/Xxb5lQyEXkhZWcJ7npWsYlvs+h0jFWXXy4X46Em1JA==