@robinpath/linkedin
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const LinkedinModule: ModuleAdapter; | ||
| export default LinkedinModule; | ||
| export { LinkedinModule }; | ||
| export { LinkedinFunctions, LinkedinFunctionMetadata, LinkedinModuleMetadata, LinkedinCredentialTypes, } from "./linkedin.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,cAAc,EAAE,aAQrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
| import { LinkedinFunctions, LinkedinFunctionMetadata, LinkedinModuleMetadata, LinkedinCredentialTypes, configureLinkedin, } from "./linkedin.js"; | ||
| const LinkedinModule = { | ||
| name: "linkedin", | ||
| functions: LinkedinFunctions, | ||
| functionMetadata: LinkedinFunctionMetadata, | ||
| moduleMetadata: LinkedinModuleMetadata, | ||
| credentialTypes: LinkedinCredentialTypes, | ||
| configure: configureLinkedin, | ||
| global: false, | ||
| }; | ||
| export default LinkedinModule; | ||
| export { LinkedinModule }; | ||
| export { LinkedinFunctions, LinkedinFunctionMetadata, LinkedinModuleMetadata, LinkedinCredentialTypes, } from "./linkedin.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,EAAE,wBAAwB;IAC1C,cAAc,EAAE,sBAAsB;IACtC,eAAe,EAAE,uBAAuB;IACxC,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
| /** | ||
| * RobinPath LinkedIn Module (Node port) | ||
| * | ||
| * LinkedIn REST API v2 integration — post personal and company shares, look | ||
| * up profiles and organizations, manage shares. Mirror of | ||
| * packages/php/linkedin/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the visual | ||
| * editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * OAuth 2.0 access token and the URN of the authenticated entity (a person | ||
| * URN like `urn:li:person:abc123` or an organization URN like | ||
| * `urn:li:organization:1234`) at call time via the injected ModuleHost. | ||
| * | ||
| * The `urn` credential field tells the module who is making the call — | ||
| * LinkedIn requires this for /ugcPosts and /shares because the access | ||
| * token does not carry that context implicitly. For company shares, save | ||
| * a separate credential per organization. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - linkedin_oauth2 : { accessToken, urn } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureLinkedin(h: ModuleHost): void; | ||
| export declare const LinkedinFunctions: Record<string, BuiltinHandler>; | ||
| export declare const LinkedinCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const LinkedinFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const LinkedinModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=linkedin.d.ts.map |
| {"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../src/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAErD;AA2XD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAO5D,CAAC;AAIF,eAAO,MAAM,uBAAuB,EAAE,oBAAoB,EA2BzD,CAAC;AA6HF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA2KrE,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,cAkCpC,CAAC"} |
+623
| /** | ||
| * RobinPath LinkedIn Module (Node port) | ||
| * | ||
| * LinkedIn REST API v2 integration — post personal and company shares, look | ||
| * up profiles and organizations, manage shares. Mirror of | ||
| * packages/php/linkedin/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the visual | ||
| * editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * OAuth 2.0 access token and the URN of the authenticated entity (a person | ||
| * URN like `urn:li:person:abc123` or an organization URN like | ||
| * `urn:li:organization:1234`) at call time via the injected ModuleHost. | ||
| * | ||
| * The `urn` credential field tells the module who is making the call — | ||
| * LinkedIn requires this for /ugcPosts and /shares because the access | ||
| * token does not carry that context implicitly. For company shares, save | ||
| * a separate credential per organization. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - linkedin_oauth2 : { accessToken, urn } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("LinkedIn module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureLinkedin(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://api.linkedin.com/v2/"; | ||
| const REST_VERSION = "202405"; | ||
| const RESTLI_VERSION = "2.0.0"; | ||
| const CREDENTIAL_TYPE = "linkedin_oauth2"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| async function resolveCredential(credentialSlug, requireUrn = true) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.accessToken ?? ""); | ||
| if (!token) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`accessToken\` field.`, "token_missing"); | ||
| } | ||
| const urn = String(fields.urn ?? ""); | ||
| if (requireUrn && !urn) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`urn\` field. Save the author URN (urn:li:person:… or urn:li:organization:…) to the credential.`, "urn_missing"); | ||
| } | ||
| return { accessToken: token, urn }; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function callApi(accessToken, method, path, query, body) { | ||
| let url = API_BASE + path; | ||
| if (query && Object.keys(query).length > 0) { | ||
| // Rest.li-style List(...) values must NOT be URL-encoded a second time; | ||
| // build the query string manually to preserve them. | ||
| const pairs = []; | ||
| for (const [k, v] of Object.entries(query)) { | ||
| const val = String(v); | ||
| pairs.push(`${encodeURIComponent(k)}=${val.startsWith("List(") ? val : encodeURIComponent(val)}`); | ||
| } | ||
| url += (url.includes("?") ? "&" : "?") + pairs.join("&"); | ||
| } | ||
| const headers = { | ||
| Authorization: `Bearer ${accessToken}`, | ||
| Accept: "application/json", | ||
| "LinkedIn-Version": REST_VERSION, | ||
| "X-Restli-Protocol-Version": RESTLI_VERSION, | ||
| }; | ||
| const init = { | ||
| method: method.toUpperCase(), | ||
| headers, | ||
| }; | ||
| if (body !== null && body !== undefined) { | ||
| headers["Content-Type"] = "application/json; charset=utf-8"; | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(url, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| return handleResponse(response, `${method.toUpperCase()} ${path}`); | ||
| } | ||
| async function handleResponse(response, label) { | ||
| const status = response.status; | ||
| const rawBody = await response.text(); | ||
| // LinkedIn often responds 201 to POST /ugcPosts with the share URN in the | ||
| // `x-restli-id` header and an empty body. Surface it as `{ id, status }`. | ||
| const createdId = response.headers.get("x-restli-id") ?? ""; | ||
| let decoded; | ||
| if (rawBody === "") { | ||
| decoded = {}; | ||
| } | ||
| else { | ||
| try { | ||
| const parsed = JSON.parse(rawBody); | ||
| decoded = | ||
| parsed && typeof parsed === "object" && !Array.isArray(parsed) | ||
| ? parsed | ||
| : { raw: rawBody }; | ||
| } | ||
| catch { | ||
| decoded = { raw: rawBody }; | ||
| } | ||
| } | ||
| // 2xx → success. | ||
| if (status >= 200 && status < 300) { | ||
| if (createdId !== "" && !("id" in decoded)) { | ||
| decoded.id = createdId; | ||
| } | ||
| if (status === 204 && Object.keys(decoded).length === 0) { | ||
| return { ok: true, status: 204 }; | ||
| } | ||
| decoded.status = status; | ||
| return decoded; | ||
| } | ||
| let code; | ||
| if (status === 401) | ||
| code = "unauthorized"; | ||
| else if (status === 403) | ||
| code = "forbidden"; | ||
| else | ||
| code = "linkedin_error"; | ||
| // LinkedIn error envelope: { message, status, serviceErrorCode, code } | ||
| const message = typeof decoded.message === "string" | ||
| ? decoded.message | ||
| : `LinkedIn ${label} failed (HTTP ${status})`; | ||
| const linkedinError = typeof decoded.code === "string" | ||
| ? decoded.code | ||
| : typeof decoded.serviceErrorCode === "string" || | ||
| typeof decoded.serviceErrorCode === "number" | ||
| ? String(decoded.serviceErrorCode) | ||
| : ""; | ||
| return { | ||
| ...decoded, | ||
| error: message, | ||
| code, | ||
| status, | ||
| linkedin_error: linkedinError, | ||
| }; | ||
| } | ||
| // ── Body builder ─────────────────────────────────────────────────────── | ||
| /** | ||
| * Build the /v2/ugcPosts request body from an author URN, text, and options. | ||
| */ | ||
| function buildUgcPostBody(authorUrn, text, opts) { | ||
| let visibility = String(opts.visibility ?? "PUBLIC").toUpperCase(); | ||
| if (visibility !== "PUBLIC" && visibility !== "CONNECTIONS") { | ||
| visibility = "PUBLIC"; | ||
| } | ||
| const commentary = String(opts.shareCommentary ?? text); | ||
| const shareContent = { | ||
| shareCommentary: { text: commentary }, | ||
| shareMediaCategory: "NONE", | ||
| }; | ||
| // Auto-attach media when a URL is provided. | ||
| if (opts.mediaUrl !== undefined && opts.mediaUrl !== null && String(opts.mediaUrl) !== "") { | ||
| const category = opts.shareMediaCategory !== undefined | ||
| ? String(opts.shareMediaCategory).toUpperCase() | ||
| : "ARTICLE"; | ||
| const mediaItem = { | ||
| status: "READY", | ||
| originalUrl: String(opts.mediaUrl), | ||
| }; | ||
| if (opts.mediaTitle !== undefined && opts.mediaTitle !== null && String(opts.mediaTitle) !== "") { | ||
| mediaItem.title = { text: String(opts.mediaTitle) }; | ||
| } | ||
| if (opts.mediaDescription !== undefined && | ||
| opts.mediaDescription !== null && | ||
| String(opts.mediaDescription) !== "") { | ||
| mediaItem.description = { text: String(opts.mediaDescription) }; | ||
| } | ||
| shareContent.shareMediaCategory = category; | ||
| shareContent.media = [mediaItem]; | ||
| } | ||
| return { | ||
| author: authorUrn, | ||
| lifecycleState: "PUBLISHED", | ||
| specificContent: { | ||
| "com.linkedin.ugc.ShareContent": shareContent, | ||
| }, | ||
| visibility: { | ||
| "com.linkedin.ugc.MemberNetworkVisibility": visibility, | ||
| }, | ||
| }; | ||
| } | ||
| function isPlainObject(v) { | ||
| return !!v && typeof v === "object" && !Array.isArray(v); | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const postShare = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const text = String(args[1] ?? ""); | ||
| const opts = (isPlainObject(args[2]) ? args[2] : {}); | ||
| const resolved = await resolveCredential(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| if (!resolved.urn.startsWith("urn:li:person:")) { | ||
| return errorReturn(`Credential URN '${resolved.urn}' is not a person URN. Use linkedin.postCompanyShare for organization URNs.`, "wrong_urn_type"); | ||
| } | ||
| const body = buildUgcPostBody(resolved.urn, text, opts); | ||
| return (await callApi(resolved.accessToken, "POST", "ugcPosts", null, body)); | ||
| }; | ||
| const postCompanyShare = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const text = String(args[1] ?? ""); | ||
| const opts = (isPlainObject(args[2]) ? args[2] : {}); | ||
| const resolved = await resolveCredential(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| if (!resolved.urn.startsWith("urn:li:organization:")) { | ||
| return errorReturn(`Credential URN '${resolved.urn}' is not an organization URN. Use linkedin.postShare for person URNs.`, "wrong_urn_type"); | ||
| } | ||
| const body = buildUgcPostBody(resolved.urn, text, opts); | ||
| return (await callApi(resolved.accessToken, "POST", "ugcPosts", null, body)); | ||
| }; | ||
| const deleteShare = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const shareUrn = String(args[1] ?? ""); | ||
| if (!shareUrn) { | ||
| return errorReturn("Share URN is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await callApi(resolved.accessToken, "DELETE", `ugcPosts/${encodeURIComponent(shareUrn)}`, null, null)); | ||
| }; | ||
| const getProfile = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const resolved = await resolveCredential(cred, false); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await callApi(resolved.accessToken, "GET", "me", null, null)); | ||
| }; | ||
| const getCompany = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("Organization ID is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred, false); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| return (await callApi(resolved.accessToken, "GET", `organizations/${encodeURIComponent(id)}`, null, null)); | ||
| }; | ||
| const getCompanyShares = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const opts = (isPlainObject(args[2]) ? args[2] : {}); | ||
| if (!id) { | ||
| return errorReturn("Organization ID is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred, false); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| const countRaw = opts.count !== undefined ? Number(opts.count) | 0 : 25; | ||
| const count = Math.max(1, Math.min(100, countRaw)); | ||
| const startRaw = opts.start !== undefined ? Number(opts.start) | 0 : 0; | ||
| const start = Math.max(0, startRaw); | ||
| // LinkedIn's Rest.li v2 list query — `authors` is an array, encoded as List(urn). | ||
| const query = { | ||
| q: "authors", | ||
| authors: `List(${encodeURIComponent(`urn:li:organization:${id}`)})`, | ||
| count: String(count), | ||
| start: String(start), | ||
| }; | ||
| const result = await callApi(resolved.accessToken, "GET", "ugcPosts", query, null); | ||
| if ("error" in result) | ||
| return result; | ||
| if (Array.isArray(result.elements)) { | ||
| return result.elements; | ||
| } | ||
| return result; | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const LinkedinFunctions = { | ||
| postShare, | ||
| postCompanyShare, | ||
| getProfile, | ||
| getCompany, | ||
| getCompanyShares, | ||
| deleteShare, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const LinkedinCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "LinkedIn OAuth 2.0", | ||
| icon: "linkedin", | ||
| fields: [ | ||
| { | ||
| name: "accessToken", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "AQX…", | ||
| description: "OAuth 2.0 access token from LinkedIn. Required scopes: `w_member_social` (personal posts), `w_organization_social` (company posts), `r_liteprofile` / `r_organization_social` (lookups).", | ||
| }, | ||
| { | ||
| name: "urn", | ||
| title: "Author URN", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "urn:li:person:abc123 OR urn:li:organization:1234", | ||
| description: "The URN that posts will be authored as. Use `urn:li:person:{id}` for personal posts (look up your ID via the GET /me endpoint), or `urn:li:organization:{id}` for company shares. Save one credential per identity.", | ||
| pattern: "^urn:li:(person|organization):.+", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter metadata ────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `linkedin_oauth2` credential. The access token and author URN are decrypted at call time and never appear in logs.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_linkedin", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const shareTextParam = { | ||
| name: "text", | ||
| title: "Text", | ||
| description: "Share text. Up to 3,000 characters. Supports plain text; LinkedIn auto-renders URLs but does not honor Markdown.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| rows: 6, | ||
| placeholder: "Excited to share an update from RobinPath…", | ||
| }; | ||
| const shareOptionsParam = { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Extra share fields. Recognized keys:\n visibility : 'PUBLIC' | 'CONNECTIONS' (default 'PUBLIC')\n mediaUrl : URL of an image/article to attach as the primary media\n mediaTitle : Title shown for the attached link/article\n mediaDescription : Subtitle shown for the attached link/article\n shareCommentary : Override the body text (defaults to `text`)\n shareMediaCategory : 'NONE' | 'ARTICLE' | 'IMAGE' | 'VIDEO' (auto-derived from mediaUrl)", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| advanced: true, | ||
| }; | ||
| const shareUrnParam = { | ||
| name: "shareUrn", | ||
| title: "Share URN", | ||
| description: "Full UGC post URN returned from `postShare` / `postCompanyShare`. E.g. `urn:li:share:7180000000000000000` or `urn:li:ugcPost:…`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "urn:li:share:7180000000000000000", | ||
| validation: { pattern: "^urn:li:(share|ugcPost):.+" }, | ||
| }; | ||
| const organizationParam = { | ||
| name: "organizationId", | ||
| title: "Organization ID", | ||
| description: "Numeric LinkedIn organization (company) ID — the digits after `urn:li:organization:`. E.g. `1337`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "1337", | ||
| validation: { pattern: "^[0-9]+$" }, | ||
| }; | ||
| const linkedinResponseSchema = { | ||
| type: "object", | ||
| properties: { | ||
| id: { | ||
| type: "string", | ||
| description: "Resource ID returned by LinkedIn (e.g. share URN).", | ||
| }, | ||
| data: { | ||
| type: "object", | ||
| description: "LinkedIn payload (varies per endpoint).", | ||
| }, | ||
| elements: { | ||
| type: "array", | ||
| description: "Collection elements for list endpoints.", | ||
| }, | ||
| paging: { | ||
| type: "object", | ||
| description: "LinkedIn paging envelope: { count, start, total }.", | ||
| }, | ||
| error: { | ||
| type: "string", | ||
| description: "Module error (transport, missing credential, etc.).", | ||
| }, | ||
| linkedin_error: { | ||
| type: "string", | ||
| description: "LinkedIn-side error code (e.g. ACCESS_DENIED).", | ||
| }, | ||
| status: { | ||
| type: "number", | ||
| description: "HTTP status returned by LinkedIn.", | ||
| }, | ||
| }, | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but does not have an `accessToken` field.", | ||
| urn_missing: "The credential exists but does not have a `urn` field.", | ||
| transport: "Network failure calling api.linkedin.com — see error message.", | ||
| linkedin_error: "LinkedIn returned a non-2xx response — see linkedin_error / status fields.", | ||
| unauthorized: "LinkedIn returned 401. Token expired, revoked, or missing required scope.", | ||
| forbidden: "LinkedIn returned 403. The credential does not have permission for this resource.", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const LinkedinFunctionMetadata = { | ||
| // ── Shares ───────────────────────────────────────────────────────── | ||
| postShare: { | ||
| title: "Post personal share", | ||
| summary: "Publish a UGC post on the authenticated member's feed", | ||
| description: "Calls `POST /v2/ugcPosts` with the credential's `urn:li:person:…` as the author. Use `options.mediaUrl` to attach a link card or image.\n\nThe credential's URN must start with `urn:li:person:` for this method.", | ||
| group: "share", | ||
| action: "write", | ||
| icon: "send", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "share", "post", "ugc"], | ||
| parameters: [credentialParam, shareTextParam, shareOptionsParam], | ||
| returnType: "object", | ||
| returnDescription: '{ id: "urn:li:share:…" } — store this URN to delete or fetch the post later.', | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Plain text update", | ||
| code: 'linkedin.postShare "my_linkedin" "Just shipped a new automation in RobinPath. "', | ||
| }, | ||
| { | ||
| title: "Article share", | ||
| code: 'linkedin.postShare "my_linkedin" "A great read:" {\n mediaUrl: "https://robinpath.com/blog/automating-wordpress",\n mediaTitle: "Automating WordPress with RobinPath",\n mediaDescription: "How to wire up cross-site workflows in minutes."\n}', | ||
| }, | ||
| ], | ||
| example: 'linkedin.postShare "my_linkedin" "Hello LinkedIn"', | ||
| }, | ||
| postCompanyShare: { | ||
| title: "Post company share", | ||
| summary: "Publish a UGC post on a company page", | ||
| description: "Calls `POST /v2/ugcPosts` with the credential's `urn:li:organization:…` as the author. Requires the `w_organization_social` scope and that the access-token user is an admin of the page.\n\nThe credential's URN must start with `urn:li:organization:` for this method.", | ||
| group: "share", | ||
| action: "write", | ||
| icon: "briefcase", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "company", "organization", "share", "ugc"], | ||
| parameters: [credentialParam, shareTextParam, shareOptionsParam], | ||
| returnType: "object", | ||
| returnDescription: '{ id: "urn:li:share:…" } — store this URN to delete or fetch the post later.', | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: { | ||
| ...commonErrors, | ||
| wrong_urn_type: "The credential's URN is not an `urn:li:organization:…` — use `postShare` for personal posts.", | ||
| }, | ||
| examples: [ | ||
| { | ||
| title: "Company announcement", | ||
| code: 'linkedin.postCompanyShare "acme_corp" "We\'re hiring! Check out our open roles." {\n mediaUrl: "https://acme.com/careers",\n mediaTitle: "Careers at Acme"\n}', | ||
| }, | ||
| ], | ||
| example: 'linkedin.postCompanyShare "acme_corp" "Big news from Acme"', | ||
| }, | ||
| deleteShare: { | ||
| title: "Delete share", | ||
| summary: "Delete a UGC share by URN", | ||
| description: "Calls `DELETE /v2/ugcPosts/{urn}`. Only works for shares authored by the credential's URN.", | ||
| group: "share", | ||
| action: "delete", | ||
| icon: "trash-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "share", "delete"], | ||
| parameters: [credentialParam, shareUrnParam], | ||
| returnType: "object", | ||
| returnDescription: "{ ok: true, status: 204 } on success.", | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'linkedin.deleteShare "my_linkedin" "urn:li:share:7180000000000000000"', | ||
| }, | ||
| // ── Profile ──────────────────────────────────────────────────────── | ||
| getProfile: { | ||
| title: "Get profile", | ||
| summary: "Fetch the authenticated member's lite profile", | ||
| description: "Calls `GET /v2/me`. Useful to discover your own person URN before saving a credential.", | ||
| group: "profile", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "profile", "me"], | ||
| parameters: [credentialParam], | ||
| returnType: "object", | ||
| returnDescription: "{ id, localizedFirstName, localizedLastName, profilePicture?, … }", | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'linkedin.getProfile "my_linkedin"', | ||
| }, | ||
| // ── Company ──────────────────────────────────────────────────────── | ||
| getCompany: { | ||
| title: "Get company", | ||
| summary: "Fetch a company (organization) page by ID", | ||
| description: "Calls `GET /v2/organizations/{id}`. Returns the page's vanity name, localized names, logo refs, etc.", | ||
| group: "company", | ||
| action: "read", | ||
| icon: "briefcase", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "company", "organization"], | ||
| parameters: [credentialParam, organizationParam], | ||
| returnType: "object", | ||
| returnDescription: "LinkedIn organization object.", | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'linkedin.getCompany "my_linkedin" "1337"', | ||
| }, | ||
| getCompanyShares: { | ||
| title: "Get company shares", | ||
| summary: "List UGC posts published by a company page", | ||
| description: "Calls `GET /v2/ugcPosts?q=authors&authors=List(urn:li:organization:{id})`. Returns most recent posts first.", | ||
| group: "company", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linkedin", "company", "shares", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| organizationParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n count : int 1-100 (default 25)\n start : int — pagination offset (default 0)", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of UGC post objects.", | ||
| returnSchema: linkedinResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'linkedin.getCompanyShares "my_linkedin" "1337" {count: 10}', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const LinkedinModuleMetadata = { | ||
| slug: "linkedin", | ||
| title: "LinkedIn", | ||
| summary: "Post personal and company shares, look up profiles and organizations, manage shares via the LinkedIn REST API v2", | ||
| description: "Full LinkedIn REST API v2 integration. All operations require a saved `linkedin_oauth2` credential containing both an OAuth 2.0 access token and an author URN.\n\nEvery method returns the parsed LinkedIn response object so downstream nodes can read share URNs, member IDs, etc. directly. Errors are returned as `{error: '...', linkedin_error?: '...'}` rather than thrown.\n\nThis module sends `LinkedIn-Version: 202405` and `X-Restli-Protocol-Version: 2.0.0` for all requests, matching LinkedIn's current best-practice headers.", | ||
| category: "communication", | ||
| icon: "icon.svg", | ||
| color: "#0A66C2", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/linkedin", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| share: { | ||
| title: "Shares", | ||
| description: "Publish, list, and delete UGC shares.", | ||
| order: 1, | ||
| }, | ||
| profile: { | ||
| title: "Profile", | ||
| description: "Look up the authenticated member profile.", | ||
| order: 2, | ||
| }, | ||
| company: { | ||
| title: "Company", | ||
| description: "Look up organization pages and their content.", | ||
| order: 3, | ||
| }, | ||
| }, | ||
| methods: Object.keys(LinkedinFunctions), | ||
| }; | ||
| //# sourceMappingURL=linkedin.js.map |
| {"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../src/linkedin.ts"],"names":[],"mappings":"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"} |
+19
-8
| { | ||
| "name": "@robinpath/linkedin", | ||
| "version": "0.1.2", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,17 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "LinkedIn module for RobinPath.", | ||
| "description": "LinkedIn REST API v2 integration — post personal and company shares, look up profiles and organizations, list and delete shares. Uses the encrypted credential vault for OAuth 2.0 access tokens.", | ||
| "keywords": [ | ||
| "linkedin", | ||
| "social media" | ||
| "social media", | ||
| "share", | ||
| "social", | ||
| "oauth2", | ||
| "ugc", | ||
| "post" | ||
| ], | ||
@@ -38,7 +43,13 @@ "license": "MIT", | ||
| "category": "social-media", | ||
| "type": "integration", | ||
| "auth": "bearer-token", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 20, | ||
| "baseUrl": "https://api.linkedin.com" | ||
| "baseUrl": "https://api.linkedin.com", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/linkedin | ||
| ```bash | ||
| npm install @robinpath/linkedin | ||
| robinpath add @robinpath/linkedin | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
53604
1010.96%10
400%671
Infinity%2
100%