From 5b9c9187ff079aff2475b729c2bd8b08f7d2d0e7 Mon Sep 17 00:00:00 2001 From: specCon18 Date: Wed, 1 May 2024 17:10:42 -0400 Subject: [PATCH] worked on twitter api support added surrealist to flake got database create user and sign in functions working --- .envrc | 1 + .gitignore | 125 +----------------------------- flake.lock | 19 ++++- flake.nix | 19 ++++- package.json | 9 ++- src/database.ts | 138 ++++++++++++++++++++++++++++++++++ src/li_post.ts | 65 ---------------- src/platforms/li_post.ts | 35 +++++++++ src/platforms/twitter_post.ts | 13 ++++ src/router.ts | 44 +++++------ src/server.ts | 4 +- yarn.lock | 127 +++++++++++++++++++++++++++++-- 12 files changed, 374 insertions(+), 225 deletions(-) create mode 100644 .envrc create mode 100644 src/database.ts delete mode 100644 src/li_post.ts create mode 100644 src/platforms/li_post.ts create mode 100644 src/platforms/twitter_post.ts diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index a616f3f..739c00f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,128 +1,7 @@ -# Logs yarn-debug.log* yarn-error.log* .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/ -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/ - -# Gatsby files -.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 +.direnv/ +database.surql \ No newline at end of file diff --git a/flake.lock b/flake.lock index 50ef5da..f610925 100644 --- a/flake.lock +++ b/flake.lock @@ -34,10 +34,27 @@ "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": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable" } }, "systems": { diff --git a/flake.nix b/flake.nix index 15e77ea..6883f13 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,11 @@ description = "A js development environment"; inputs = { 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, ... }: @@ -12,13 +16,20 @@ inherit system; overlays = []; }; + unstable = import { config = { allowUnfree = true; }; }; in { devShell = pkgs.mkShell { - buildInputs = [ - pkgs.nodejs_20 - pkgs.yarn + buildInputs = with pkgs; [ + nodejs_20 + yarn + surrealdb + unstable.surrealist ]; }; + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [ + "surrealdb" + ]; + }); } diff --git a/package.json b/package.json index 32727d8..f64e600 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,16 @@ "main": "src/index.js", "scripts": { "build": "tsc", - "start": "node dist/server.js" + "start": "node dist/server.js --env-file='.config/.env'" }, "dependencies": { "@types/express": "^4.17.21", - "dotenv": "^16.4.5", + "axios": "^1.6.8", + "cron": "^3.1.7", "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": {} } diff --git a/src/database.ts b/src/database.ts new file mode 100644 index 0000000..fce19bd --- /dev/null +++ b/src/database.ts @@ -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 +}; + +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); +// } diff --git a/src/li_post.ts b/src/li_post.ts deleted file mode 100644 index 4bc6ea6..0000000 --- a/src/li_post.ts +++ /dev/null @@ -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 { - 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}`); - }); diff --git a/src/platforms/li_post.ts b/src/platforms/li_post.ts new file mode 100644 index 0000000..1c82323 --- /dev/null +++ b/src/platforms/li_post.ts @@ -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 { + 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); +} diff --git a/src/platforms/twitter_post.ts b/src/platforms/twitter_post.ts new file mode 100644 index 0000000..8f2a7dc --- /dev/null +++ b/src/platforms/twitter_post.ts @@ -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; diff --git a/src/router.ts b/src/router.ts index adcff4e..c2fffe7 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,29 +1,31 @@ -import express from 'express'; -import { RestliClient } from 'linkedin-api-client'; -import { config } from 'dotenv'; +import {Router,Request,Response} from 'express'; +import {post_to_li} from './platforms/li_post.js' +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 -const router = express.Router(); -const restliClient = new RestliClient(); -// Load API Keys -const twitterApiKey = process.env.TWITTER_API_KEY; -const liApiKey = process.env.LI_API_KEY || ''; +const router = Router(); -// Define routes -// Twitter API tweet endpoint: https://api.twitter.com/1.1/statuses/update.json -router.get('/twitter', (req,res) => { - -}); +// Endpoints to post to twitter +//TODO: accept MD as input and convert to non-formatted text as Twitter is dumb and doesn't allow formatting in posts +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 -router.get('/li', (req,res) => { -}); +//Endpoints for surrealdb +/// 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 -router.get('/all', (req,res) => { - +// Endpoint to post to linkedin +//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 diff --git a/src/server.ts b/src/server.ts index 6b209bc..a90d12e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -2,11 +2,11 @@ import express from 'express'; import router from './router.js'; const app = express(); -const port = 3000; +const port = process.env.PORT || 3000; // Use the router app.use(router); app.listen(port, () => { - console.log(`Server running at http://localhost:${port}`); + console.log(`Server running at http://127.0.0.1:${port}`); }); diff --git a/yarn.lock b/yarn.lock index e1210c6..aec7c46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,24 @@ # 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@*": version "1.19.5" 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" 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": version "1.3.5" 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" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.1.3: +axios@^1.1.3, axios@^1.6.8: version "1.6.8" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== @@ -126,6 +149,13 @@ body-parser@1.20.2: type-is "~1.6.18" 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: version "3.1.2" 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" 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: version "1.0.8" 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" 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: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -178,6 +223,11 @@ debug@2.6.9: dependencies: 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: version "1.1.4" 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" 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: version "1.1.1" 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" 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: version "0.3.0" 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" 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: version "0.3.0" 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" 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: version "1.13.1" 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" 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: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 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: version "1.6.18" 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" 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: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 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: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 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==