runline 0.33.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/oauth2.d.ts +7 -1
- package/dist/auth/oauth2.js +10 -0
- package/dist/auth/token.d.ts +1 -0
- package/dist/auth/token.js +19 -1
- package/dist/auth/types.d.ts +22 -1
- package/dist/core/engine.d.ts +7 -0
- package/dist/core/engine.js +21 -8
- package/dist/credentials/policy.d.ts +53 -1
- package/dist/credentials/policy.js +146 -6
- package/dist/credentials/registry.d.ts +9 -0
- package/dist/credentials/registry.js +184 -22
- package/dist/credentials/transport.d.ts +48 -2
- package/dist/credentials/transport.js +248 -70
- package/dist/credentials/types.d.ts +177 -10
- package/dist/index.d.ts +6 -5
- package/dist/index.js +3 -2
- package/dist/plugin/api.d.ts +7 -0
- package/dist/plugin/api.js +7 -0
- package/dist/plugin/schema.d.ts +16 -4
- package/dist/plugin/schema.js +28 -5
- package/dist/plugin/types.d.ts +20 -0
- package/dist/plugins/_shared/base64.js +30 -0
- package/dist/plugins/_shared/credentialAdapter.js +99 -15
- package/dist/plugins/_shared/credentials.js +416 -0
- package/dist/plugins/_shared/googleAuth.js +69 -39
- package/dist/plugins/_shared/googleCredentials.js +68 -14
- package/dist/plugins/_shared/localFile.js +40 -0
- package/dist/plugins/_shared/mediaFile.js +12 -12
- package/dist/plugins/_shared/microsoftAuth.js +31 -47
- package/dist/plugins/_shared/microsoftCredentials.js +42 -15
- package/dist/plugins/_shared/provider.js +2 -14
- package/dist/plugins/_shared/shiftCloud.js +16 -56
- package/dist/plugins/_shared/shiftCredentials.js +83 -0
- package/dist/plugins/_shared/shiftUpload.js +14 -10
- package/dist/plugins/actionNetwork/src/credentials.js +14 -0
- package/dist/plugins/actionNetwork/src/index.js +39 -50
- package/dist/plugins/activeCampaign/src/credentials.js +22 -0
- package/dist/plugins/activeCampaign/src/index.js +61 -132
- package/dist/plugins/adalo/src/credentials.js +16 -0
- package/dist/plugins/adalo/src/index.js +19 -43
- package/dist/plugins/affinity/src/credentials.js +19 -0
- package/dist/plugins/affinity/src/index.js +29 -54
- package/dist/plugins/agentMail/src/credentials.js +35 -0
- package/dist/plugins/agentMail/src/drafts.js +137 -0
- package/dist/plugins/agentMail/src/inboxes.js +95 -0
- package/dist/plugins/agentMail/src/index.js +35 -0
- package/dist/plugins/agentMail/src/messages.js +154 -0
- package/dist/plugins/agentMail/src/schemas.js +156 -0
- package/dist/plugins/agentMail/src/shared.js +203 -0
- package/dist/plugins/agentMail/src/threads.js +75 -0
- package/dist/plugins/agileCrm/src/credentials.js +16 -0
- package/dist/plugins/agileCrm/src/index.js +46 -112
- package/dist/plugins/airtable/src/credentials.js +19 -0
- package/dist/plugins/airtable/src/index.js +37 -50
- package/dist/plugins/airtop/src/credentials.js +20 -0
- package/dist/plugins/airtop/src/index.js +51 -75
- package/dist/plugins/apiTemplateIo/src/credentials.js +19 -0
- package/dist/plugins/apiTemplateIo/src/index.js +14 -31
- package/dist/plugins/asana/src/credentials.js +19 -0
- package/dist/plugins/asana/src/index.js +51 -72
- package/dist/plugins/autopilot/src/credentials.js +19 -0
- package/dist/plugins/autopilot/src/index.js +38 -45
- package/dist/plugins/bambooHr/src/credentials.js +16 -0
- package/dist/plugins/bambooHr/src/index.js +41 -67
- package/dist/plugins/bannerbear/src/credentials.js +19 -0
- package/dist/plugins/bannerbear/src/index.js +15 -27
- package/dist/plugins/baserow/src/credentials.js +17 -0
- package/dist/plugins/baserow/src/index.js +23 -49
- package/dist/plugins/beeminder/src/credentials.js +19 -0
- package/dist/plugins/beeminder/src/index.js +32 -54
- package/dist/plugins/bitly/src/credentials.js +19 -0
- package/dist/plugins/bitly/src/index.js +12 -26
- package/dist/plugins/bitwarden/src/credentials.js +62 -0
- package/dist/plugins/bitwarden/src/index.js +34 -80
- package/dist/plugins/box/src/credentials.js +19 -0
- package/dist/plugins/box/src/index.js +24 -49
- package/dist/plugins/brandfetch/src/credentials.js +13 -0
- package/dist/plugins/brandfetch/src/index.js +12 -17
- package/dist/plugins/brevo/src/credentials.js +19 -0
- package/dist/plugins/brevo/src/index.js +30 -51
- package/dist/plugins/bubble/src/credentials.js +28 -0
- package/dist/plugins/bubble/src/index.js +29 -65
- package/dist/plugins/chargebee/src/credentials.js +16 -0
- package/dist/plugins/chargebee/src/index.js +15 -45
- package/dist/plugins/circleci/src/credentials.js +19 -0
- package/dist/plugins/circleci/src/index.js +19 -39
- package/dist/plugins/ciscoWebex/src/credentials.js +19 -0
- package/dist/plugins/ciscoWebex/src/index.js +43 -61
- package/dist/plugins/clearbit/src/credentials.js +22 -0
- package/dist/plugins/clearbit/src/index.js +11 -21
- package/dist/plugins/clickup/src/credentials.js +19 -0
- package/dist/plugins/clickup/src/index.js +85 -117
- package/dist/plugins/clockify/src/credentials.js +19 -0
- package/dist/plugins/clockify/src/index.js +46 -61
- package/dist/plugins/cloudflare/src/credentials.js +19 -0
- package/dist/plugins/cloudflare/src/index.js +19 -34
- package/dist/plugins/cockpit/src/credentials.js +17 -0
- package/dist/plugins/cockpit/src/index.js +18 -31
- package/dist/plugins/coda/src/credentials.js +19 -0
- package/dist/plugins/coda/src/index.js +33 -50
- package/dist/plugins/coingecko/src/credentials.js +20 -0
- package/dist/plugins/coingecko/src/index.js +24 -34
- package/dist/plugins/contentful/src/credentials.js +26 -0
- package/dist/plugins/contentful/src/index.js +19 -40
- package/dist/plugins/convertkit/src/credentials.js +26 -0
- package/dist/plugins/convertkit/src/index.js +27 -45
- package/dist/plugins/copper/src/credentials.js +17 -0
- package/dist/plugins/copper/src/index.js +25 -47
- package/dist/plugins/cortex/src/credentials.js +28 -0
- package/dist/plugins/cortex/src/index.js +26 -49
- package/dist/plugins/currents/src/credentials.js +19 -0
- package/dist/plugins/currents/src/index.js +46 -59
- package/dist/plugins/customerIo/src/credentials.js +52 -0
- package/dist/plugins/customerIo/src/index.js +30 -58
- package/dist/plugins/databricks/src/credentials.js +13 -0
- package/dist/plugins/databricks/src/index.js +51 -103
- package/dist/plugins/deepl/src/credentials.js +19 -0
- package/dist/plugins/deepl/src/index.js +13 -39
- package/dist/plugins/demio/src/credentials.js +26 -0
- package/dist/plugins/demio/src/index.js +17 -41
- package/dist/plugins/dhl/src/credentials.js +13 -0
- package/dist/plugins/dhl/src/index.js +8 -19
- package/dist/plugins/discord/src/credentials.js +19 -0
- package/dist/plugins/discord/src/index.js +30 -58
- package/dist/plugins/discourse/src/credentials.js +18 -0
- package/dist/plugins/discourse/src/index.js +36 -53
- package/dist/plugins/disqus/src/credentials.js +13 -0
- package/dist/plugins/disqus/src/index.js +14 -32
- package/dist/plugins/drift/src/credentials.js +13 -0
- package/dist/plugins/drift/src/index.js +16 -26
- package/dist/plugins/dropbox/src/credentials.js +13 -0
- package/dist/plugins/dropbox/src/index.js +23 -30
- package/dist/plugins/dropcontact/src/credentials.js +13 -0
- package/dist/plugins/dropcontact/src/index.js +13 -18
- package/dist/plugins/egoi/src/credentials.js +19 -0
- package/dist/plugins/egoi/src/index.js +23 -38
- package/dist/plugins/elasticsearch/src/credentials.js +18 -0
- package/dist/plugins/elasticsearch/src/index.js +27 -48
- package/dist/plugins/elevenlabs/src/credentials.js +30 -0
- package/dist/plugins/elevenlabs/src/index.js +4 -1
- package/dist/plugins/elevenlabs/src/schemas.js +2 -1
- package/dist/plugins/elevenlabs/src/shared.js +87 -62
- package/dist/plugins/elevenlabs/src/workflows.js +2 -2
- package/dist/plugins/emelia/src/credentials.js +14 -0
- package/dist/plugins/emelia/src/index.js +19 -23
- package/dist/plugins/erpnext/src/credentials.js +27 -0
- package/dist/plugins/erpnext/src/index.js +21 -42
- package/dist/plugins/facebookGraph/src/credentials.js +20 -0
- package/dist/plugins/facebookGraph/src/index.js +39 -37
- package/dist/plugins/fal/src/credentials.js +14 -0
- package/dist/plugins/fal/src/index.js +5 -3
- package/dist/plugins/fal/src/shared.js +58 -63
- package/dist/plugins/freshdesk/src/credentials.js +20 -0
- package/dist/plugins/freshdesk/src/index.js +25 -46
- package/dist/plugins/freshservice/src/credentials.js +16 -0
- package/dist/plugins/freshservice/src/index.js +37 -58
- package/dist/plugins/freshworksCrm/src/credentials.js +16 -0
- package/dist/plugins/freshworksCrm/src/index.js +20 -39
- package/dist/plugins/getresponse/src/credentials.js +22 -0
- package/dist/plugins/getresponse/src/index.js +20 -32
- package/dist/plugins/gett/src/credentials.js +64 -0
- package/dist/plugins/gett/src/index.js +11 -6
- package/dist/plugins/gett/src/login.js +24 -0
- package/dist/plugins/gett/src/session.js +15 -38
- package/dist/plugins/gett/src/shared.js +41 -84
- package/dist/plugins/ghost/src/credentials.js +36 -0
- package/dist/plugins/ghost/src/index.js +18 -59
- package/dist/plugins/github/src/credentials.js +18 -0
- package/dist/plugins/github/src/index.js +55 -78
- package/dist/plugins/gitlab/src/credentials.js +24 -0
- package/dist/plugins/gitlab/src/index.js +29 -48
- package/dist/plugins/gmail/src/index.js +47 -108
- package/dist/plugins/gong/src/credentials.js +16 -0
- package/dist/plugins/gong/src/index.js +16 -32
- package/dist/plugins/googleAppsScript/src/index.js +109 -42
- package/dist/plugins/googleCalendar/src/index.js +20 -51
- package/dist/plugins/googleContacts/src/index.js +13 -40
- package/dist/plugins/googleDocs/src/index.js +3 -32
- package/dist/plugins/googleDocs/src/shared.js +2 -1
- package/dist/plugins/googleDrive/src/index.js +68 -97
- package/dist/plugins/googleImage/src/credentials.js +14 -0
- package/dist/plugins/googleImage/src/index.js +15 -26
- package/dist/plugins/googleSheets/src/index.js +27 -60
- package/dist/plugins/googleSlides/src/index.js +7 -35
- package/dist/plugins/googleTasks/src/index.js +14 -42
- package/dist/plugins/gotify/src/credentials.js +32 -0
- package/dist/plugins/gotify/src/index.js +14 -36
- package/dist/plugins/gotowebinar/src/credentials.js +13 -0
- package/dist/plugins/gotowebinar/src/index.js +52 -69
- package/dist/plugins/grafana/src/credentials.js +16 -0
- package/dist/plugins/grafana/src/index.js +34 -53
- package/dist/plugins/graphql/src/credentials.js +42 -0
- package/dist/plugins/graphql/src/index.js +21 -46
- package/dist/plugins/grist/src/credentials.js +30 -0
- package/dist/plugins/grist/src/index.js +14 -43
- package/dist/plugins/halopsa/src/credentials.js +56 -0
- package/dist/plugins/halopsa/src/index.js +20 -47
- package/dist/plugins/harvest/src/credentials.js +20 -0
- package/dist/plugins/harvest/src/index.js +24 -43
- package/dist/plugins/helpscout/src/credentials.js +13 -0
- package/dist/plugins/helpscout/src/index.js +26 -38
- package/dist/plugins/highlevel/src/credentials.js +19 -0
- package/dist/plugins/highlevel/src/index.js +42 -65
- package/dist/plugins/homeAssistant/src/credentials.js +27 -0
- package/dist/plugins/homeAssistant/src/index.js +34 -52
- package/dist/plugins/hubspot/src/credentials.js +16 -0
- package/dist/plugins/hubspot/src/index.js +29 -41
- package/dist/plugins/humanticAi/src/credentials.js +13 -0
- package/dist/plugins/humanticAi/src/index.js +15 -22
- package/dist/plugins/hunter/src/credentials.js +13 -0
- package/dist/plugins/hunter/src/index.js +18 -17
- package/dist/plugins/intercom/src/credentials.js +19 -0
- package/dist/plugins/intercom/src/index.js +25 -38
- package/dist/plugins/iterable/src/credentials.js +17 -0
- package/dist/plugins/iterable/src/index.js +26 -40
- package/dist/plugins/jenkins/src/credentials.js +16 -0
- package/dist/plugins/jenkins/src/index.js +22 -36
- package/dist/plugins/jira/src/credentials.js +16 -0
- package/dist/plugins/jira/src/index.js +35 -61
- package/dist/plugins/keap/src/credentials.js +19 -0
- package/dist/plugins/keap/src/index.js +43 -71
- package/dist/plugins/kobotoolbox/src/credentials.js +13 -0
- package/dist/plugins/kobotoolbox/src/index.js +46 -84
- package/dist/plugins/lemlist/src/credentials.js +19 -0
- package/dist/plugins/lemlist/src/index.js +35 -47
- package/dist/plugins/linear/src/attachments.js +7 -7
- package/dist/plugins/linear/src/comments.js +7 -7
- package/dist/plugins/linear/src/credentials.js +17 -0
- package/dist/plugins/linear/src/cycles.js +5 -5
- package/dist/plugins/linear/src/index.js +2 -0
- package/dist/plugins/linear/src/initiatives.js +6 -6
- package/dist/plugins/linear/src/issues.js +14 -14
- package/dist/plugins/linear/src/labels.js +6 -6
- package/dist/plugins/linear/src/organization.js +2 -2
- package/dist/plugins/linear/src/projects.js +12 -12
- package/dist/plugins/linear/src/shared.js +34 -32
- package/dist/plugins/linear/src/states.js +3 -3
- package/dist/plugins/linear/src/teams.js +4 -4
- package/dist/plugins/linear/src/users.js +3 -3
- package/dist/plugins/linear/src/views.js +5 -5
- package/dist/plugins/linear/src/webhooks.js +5 -5
- package/dist/plugins/lingvanex/src/credentials.js +13 -0
- package/dist/plugins/lingvanex/src/index.js +7 -9
- package/dist/plugins/linkedin/src/credentials.js +17 -0
- package/dist/plugins/linkedin/src/index.js +13 -17
- package/dist/plugins/lonescale/src/credentials.js +13 -0
- package/dist/plugins/lonescale/src/index.js +16 -26
- package/dist/plugins/magento/src/credentials.js +16 -0
- package/dist/plugins/magento/src/index.js +67 -84
- package/dist/plugins/mailcheck/src/credentials.js +17 -0
- package/dist/plugins/mailcheck/src/index.js +7 -9
- package/dist/plugins/mailchimp/src/credentials.js +32 -0
- package/dist/plugins/mailchimp/src/index.js +36 -44
- package/dist/plugins/mailerlite/src/credentials.js +13 -0
- package/dist/plugins/mailerlite/src/index.js +19 -32
- package/dist/plugins/mailgun/src/credentials.js +21 -0
- package/dist/plugins/mailgun/src/index.js +15 -21
- package/dist/plugins/mailjet/src/credentials.js +38 -0
- package/dist/plugins/mailjet/src/index.js +60 -115
- package/dist/plugins/mandrill/src/credentials.js +17 -0
- package/dist/plugins/mandrill/src/index.js +11 -12
- package/dist/plugins/marketstack/src/credentials.js +16 -0
- package/dist/plugins/marketstack/src/index.js +18 -28
- package/dist/plugins/matrix/src/credentials.js +19 -0
- package/dist/plugins/matrix/src/index.js +23 -52
- package/dist/plugins/mattermost/src/credentials.js +19 -0
- package/dist/plugins/mattermost/src/index.js +41 -73
- package/dist/plugins/mautic/src/credentials.js +16 -0
- package/dist/plugins/mautic/src/index.js +46 -62
- package/dist/plugins/medium/src/credentials.js +20 -0
- package/dist/plugins/medium/src/index.js +18 -23
- package/dist/plugins/messagebird/src/credentials.js +22 -0
- package/dist/plugins/messagebird/src/index.js +13 -18
- package/dist/plugins/metabase/src/credentials.js +19 -0
- package/dist/plugins/metabase/src/index.js +24 -40
- package/dist/plugins/microsoftCalendar/src/index.js +49 -18
- package/dist/plugins/microsoftFiles/src/index.js +95 -31
- package/dist/plugins/microsoftMail/src/index.js +63 -21
- package/dist/plugins/misp/src/credentials.js +16 -0
- package/dist/plugins/misp/src/index.js +60 -71
- package/dist/plugins/mocean/src/credentials.js +17 -0
- package/dist/plugins/mocean/src/index.js +11 -23
- package/dist/plugins/monday/src/credentials.js +14 -0
- package/dist/plugins/monday/src/index.js +31 -44
- package/dist/plugins/monicaCrm/src/credentials.js +19 -0
- package/dist/plugins/monicaCrm/src/index.js +25 -42
- package/dist/plugins/msg91/src/credentials.js +10 -0
- package/dist/plugins/msg91/src/index.js +15 -11
- package/dist/plugins/nasa/src/credentials.js +22 -0
- package/dist/plugins/nasa/src/index.js +24 -28
- package/dist/plugins/netlify/src/credentials.js +19 -0
- package/dist/plugins/netlify/src/index.js +27 -51
- package/dist/plugins/netscalerAdc/src/credentials.js +18 -0
- package/dist/plugins/netscalerAdc/src/index.js +16 -31
- package/dist/plugins/nextcloud/src/credentials.js +27 -0
- package/dist/plugins/nextcloud/src/index.js +55 -109
- package/dist/plugins/nocodb/src/credentials.js +16 -0
- package/dist/plugins/nocodb/src/index.js +19 -37
- package/dist/plugins/notion/src/credentials.js +21 -0
- package/dist/plugins/notion/src/index.js +25 -38
- package/dist/plugins/npm/src/credentials.js +19 -0
- package/dist/plugins/npm/src/index.js +22 -32
- package/dist/plugins/odoo/src/credentials.js +21 -0
- package/dist/plugins/odoo/src/index.js +53 -69
- package/dist/plugins/okta/src/credentials.js +23 -0
- package/dist/plugins/okta/src/index.js +30 -35
- package/dist/plugins/oneSimpleApi/src/credentials.js +16 -0
- package/dist/plugins/oneSimpleApi/src/index.js +19 -24
- package/dist/plugins/onfleet/src/credentials.js +23 -0
- package/dist/plugins/onfleet/src/index.js +42 -53
- package/dist/plugins/openai/src/credentials.js +13 -0
- package/dist/plugins/openai/src/index.js +16 -24
- package/dist/plugins/openweathermap/src/credentials.js +16 -0
- package/dist/plugins/openweathermap/src/index.js +22 -22
- package/dist/plugins/oura/src/credentials.js +19 -0
- package/dist/plugins/oura/src/index.js +13 -18
- package/dist/plugins/paddle/src/credentials.js +27 -0
- package/dist/plugins/paddle/src/index.js +20 -36
- package/dist/plugins/pagerduty/src/credentials.js +24 -0
- package/dist/plugins/pagerduty/src/index.js +30 -39
- package/dist/plugins/parallel/src/credentials.js +18 -0
- package/dist/plugins/parallel/src/index.js +16 -22
- package/dist/plugins/paypal/src/credentials.js +44 -0
- package/dist/plugins/paypal/src/index.js +14 -40
- package/dist/plugins/peekalink/src/credentials.js +16 -0
- package/dist/plugins/peekalink/src/index.js +10 -11
- package/dist/plugins/phantombuster/src/credentials.js +19 -0
- package/dist/plugins/phantombuster/src/index.js +19 -32
- package/dist/plugins/philipsHue/src/credentials.js +17 -0
- package/dist/plugins/philipsHue/src/index.js +15 -27
- package/dist/plugins/pipedrive/src/credentials.js +26 -0
- package/dist/plugins/pipedrive/src/index.js +43 -73
- package/dist/plugins/plaud/src/index.js +2 -1
- package/dist/plugins/plaud/src/shared.js +23 -19
- package/dist/plugins/plivo/src/credentials.js +20 -0
- package/dist/plugins/plivo/src/index.js +13 -19
- package/dist/plugins/posthog/src/credentials.js +18 -0
- package/dist/plugins/posthog/src/index.js +14 -20
- package/dist/plugins/profitwell/src/credentials.js +22 -0
- package/dist/plugins/profitwell/src/index.js +10 -17
- package/dist/plugins/pushbullet/src/credentials.js +19 -0
- package/dist/plugins/pushbullet/src/index.js +19 -27
- package/dist/plugins/pushcut/src/credentials.js +19 -0
- package/dist/plugins/pushcut/src/index.js +7 -8
- package/dist/plugins/pushover/src/credentials.js +14 -0
- package/dist/plugins/pushover/src/index.js +7 -12
- package/dist/plugins/quickbase/src/credentials.js +15 -0
- package/dist/plugins/quickbase/src/index.js +24 -34
- package/dist/plugins/quickbooks/src/credentials.js +22 -0
- package/dist/plugins/quickbooks/src/index.js +17 -46
- package/dist/plugins/raindrop/src/credentials.js +19 -0
- package/dist/plugins/raindrop/src/index.js +30 -32
- package/dist/plugins/recraft/src/credentials.js +13 -0
- package/dist/plugins/recraft/src/index.js +39 -28
- package/dist/plugins/reddit/src/credentials.js +26 -0
- package/dist/plugins/reddit/src/index.js +30 -34
- package/dist/plugins/replicate/src/credentials.js +23 -0
- package/dist/plugins/replicate/src/index.js +18 -28
- package/dist/plugins/rocketchat/src/credentials.js +17 -0
- package/dist/plugins/rocketchat/src/index.js +8 -19
- package/dist/plugins/rundeck/src/credentials.js +16 -0
- package/dist/plugins/rundeck/src/index.js +12 -28
- package/dist/plugins/salesforce/src/credentials.js +73 -0
- package/dist/plugins/salesforce/src/index.js +6 -0
- package/dist/plugins/salesforce/src/metadata.js +3 -16
- package/dist/plugins/salesforce/src/shared.js +25 -100
- package/dist/plugins/salesforce/src/sobjects.js +10 -9
- package/dist/plugins/salesmate/src/credentials.js +17 -0
- package/dist/plugins/salesmate/src/index.js +20 -37
- package/dist/plugins/securityScorecard/src/credentials.js +22 -0
- package/dist/plugins/securityScorecard/src/index.js +24 -37
- package/dist/plugins/segment/src/credentials.js +16 -0
- package/dist/plugins/segment/src/index.js +12 -16
- package/dist/plugins/sendgrid/src/credentials.js +13 -0
- package/dist/plugins/sendgrid/src/index.js +31 -35
- package/dist/plugins/sendy/src/credentials.js +18 -0
- package/dist/plugins/sendy/src/index.js +18 -24
- package/dist/plugins/sentry/src/credentials.js +16 -0
- package/dist/plugins/sentry/src/index.js +30 -98
- package/dist/plugins/servicenow/src/credentials.js +13 -0
- package/dist/plugins/servicenow/src/index.js +22 -41
- package/dist/plugins/shiftAtlas/src/graph.js +2 -2
- package/dist/plugins/shiftAtlas/src/index.js +2 -0
- package/dist/plugins/shiftAtlas/src/shared.js +3 -1
- package/dist/plugins/shiftBwm/src/index.js +4 -2
- package/dist/plugins/shiftBwm/src/shared.js +41 -16
- package/dist/plugins/shiftCrm/src/access.js +2 -2
- package/dist/plugins/shiftCrm/src/accounts.js +3 -3
- package/dist/plugins/shiftCrm/src/activities.js +3 -3
- package/dist/plugins/shiftCrm/src/credentials.js +6 -0
- package/dist/plugins/shiftCrm/src/index.js +2 -0
- package/dist/plugins/shiftCrm/src/opportunities.js +3 -3
- package/dist/plugins/shiftCrm/src/people.js +3 -3
- package/dist/plugins/shiftCrm/src/records.js +2 -2
- package/dist/plugins/shiftCrm/src/shared.js +2 -1
- package/dist/plugins/shiftCrm/src/tasks.js +3 -3
- package/dist/plugins/shiftObjects/src/credentials.js +2 -0
- package/dist/plugins/shiftObjects/src/index.js +2 -0
- package/dist/plugins/shiftObjects/src/objects.js +4 -3
- package/dist/plugins/shiftOcr/src/credentials.js +8 -0
- package/dist/plugins/shiftOcr/src/index.js +14 -8
- package/dist/plugins/shiftPages/src/index.js +2 -0
- package/dist/plugins/shiftPages/src/pages.js +5 -3
- package/dist/plugins/shiftPages/src/shared.js +3 -1
- package/dist/plugins/shiftTranscription/src/index.js +2 -0
- package/dist/plugins/shiftTranscription/src/shared.js +11 -1
- package/dist/plugins/shiftTranscription/src/transcription.js +5 -5
- package/dist/plugins/shiftWork/src/index.js +2 -0
- package/dist/plugins/shiftWork/src/issue-views.js +5 -5
- package/dist/plugins/shiftWork/src/issues.js +11 -7
- package/dist/plugins/shiftWork/src/projects.js +3 -3
- package/dist/plugins/shiftWork/src/shared.js +3 -1
- package/dist/plugins/shopify/src/credentials.js +16 -0
- package/dist/plugins/shopify/src/index.js +32 -59
- package/dist/plugins/signl4/src/credentials.js +17 -0
- package/dist/plugins/signl4/src/index.js +28 -29
- package/dist/plugins/slack/src/credentials.js +19 -0
- package/dist/plugins/slack/src/index.js +51 -60
- package/dist/plugins/sms77/src/credentials.js +17 -0
- package/dist/plugins/sms77/src/index.js +11 -16
- package/dist/plugins/splunk/src/credentials.js +19 -0
- package/dist/plugins/splunk/src/index.js +32 -74
- package/dist/plugins/spotify/src/credentials.js +19 -0
- package/dist/plugins/spotify/src/index.js +40 -55
- package/dist/plugins/stackby/src/credentials.js +13 -0
- package/dist/plugins/stackby/src/index.js +14 -23
- package/dist/plugins/steel/src/auth.js +27 -0
- package/dist/plugins/steel/src/browser.js +4 -3
- package/dist/plugins/steel/src/captchas.js +4 -3
- package/dist/plugins/steel/src/extensions.js +3 -2
- package/dist/plugins/steel/src/files.js +9 -10
- package/dist/plugins/steel/src/index.js +2 -0
- package/dist/plugins/steel/src/page/tools.js +3 -3
- package/dist/plugins/steel/src/profiles.js +4 -3
- package/dist/plugins/steel/src/sessions.js +13 -13
- package/dist/plugins/steel/src/shared.js +21 -51
- package/dist/plugins/storyblok/src/credentials.js +37 -0
- package/dist/plugins/storyblok/src/index.js +22 -66
- package/dist/plugins/strapi/src/credentials.js +71 -0
- package/dist/plugins/strapi/src/index.js +36 -70
- package/dist/plugins/strava/src/credentials.js +19 -0
- package/dist/plugins/strava/src/index.js +16 -33
- package/dist/plugins/stripe/src/credentials.js +19 -0
- package/dist/plugins/stripe/src/index.js +44 -58
- package/dist/plugins/supabase/src/credentials.js +30 -0
- package/dist/plugins/supabase/src/index.js +18 -40
- package/dist/plugins/syncromsp/src/credentials.js +16 -0
- package/dist/plugins/syncromsp/src/index.js +37 -70
- package/dist/plugins/tapfiliate/src/credentials.js +13 -0
- package/dist/plugins/tapfiliate/src/index.js +21 -31
- package/dist/plugins/telegram/src/credentials.js +20 -0
- package/dist/plugins/telegram/src/index.js +31 -39
- package/dist/plugins/thehive/src/credentials.js +14 -0
- package/dist/plugins/thehive/src/index.js +33 -50
- package/dist/plugins/thehiveProject/src/credentials.js +16 -0
- package/dist/plugins/thehiveProject/src/index.js +53 -122
- package/dist/plugins/todoist/src/credentials.js +26 -0
- package/dist/plugins/todoist/src/index.js +49 -79
- package/dist/plugins/together/src/credentials.js +16 -0
- package/dist/plugins/together/src/index.js +31 -33
- package/dist/plugins/travisci/src/credentials.js +24 -0
- package/dist/plugins/travisci/src/index.js +16 -30
- package/dist/plugins/trello/src/credentials.js +29 -0
- package/dist/plugins/trello/src/index.js +49 -64
- package/dist/plugins/twake/src/credentials.js +16 -0
- package/dist/plugins/twake/src/index.js +8 -10
- package/dist/plugins/twilio/src/credentials.js +23 -0
- package/dist/plugins/twilio/src/index.js +12 -26
- package/dist/plugins/twist/src/credentials.js +13 -0
- package/dist/plugins/twist/src/index.js +32 -44
- package/dist/plugins/twitter/src/credentials.js +16 -0
- package/dist/plugins/twitter/src/index.js +25 -37
- package/dist/plugins/typesafe/src/credentials.js +28 -0
- package/dist/plugins/typesafe/src/index.js +3 -1
- package/dist/plugins/typesafe/src/shared.js +23 -35
- package/dist/plugins/unleashedSoftware/src/credentials.js +21 -0
- package/dist/plugins/unleashedSoftware/src/index.js +13 -37
- package/dist/plugins/uplead/src/credentials.js +16 -0
- package/dist/plugins/uplead/src/index.js +11 -16
- package/dist/plugins/uproc/src/credentials.js +14 -0
- package/dist/plugins/uproc/src/index.js +7 -10
- package/dist/plugins/uptimerobot/src/credentials.js +14 -0
- package/dist/plugins/uptimerobot/src/index.js +28 -39
- package/dist/plugins/urlscanio/src/credentials.js +13 -0
- package/dist/plugins/urlscanio/src/index.js +13 -22
- package/dist/plugins/vercel/src/credentials.js +19 -0
- package/dist/plugins/vercel/src/deployments.js +27 -11
- package/dist/plugins/vercel/src/env.js +31 -12
- package/dist/plugins/vercel/src/index.js +2 -0
- package/dist/plugins/vercel/src/projects.js +6 -3
- package/dist/plugins/vercel/src/shared.js +32 -37
- package/dist/plugins/vero/src/credentials.js +17 -0
- package/dist/plugins/vero/src/index.js +18 -21
- package/dist/plugins/vonage/src/credentials.js +17 -0
- package/dist/plugins/vonage/src/index.js +14 -18
- package/dist/plugins/wekan/src/credentials.js +16 -0
- package/dist/plugins/wekan/src/index.js +33 -46
- package/dist/plugins/wolt/src/account.js +6 -0
- package/dist/plugins/wolt/src/catalog.js +2 -2
- package/dist/plugins/wolt/src/credentials.js +64 -0
- package/dist/plugins/wolt/src/index.js +8 -3
- package/dist/plugins/wolt/src/orders.js +2 -2
- package/dist/plugins/wolt/src/public.js +91 -0
- package/dist/plugins/wolt/src/shared.js +49 -158
- package/dist/plugins/woocommerce/src/credentials.js +16 -0
- package/dist/plugins/woocommerce/src/index.js +19 -37
- package/dist/plugins/wordpress/src/credentials.js +16 -0
- package/dist/plugins/wordpress/src/index.js +23 -42
- package/dist/plugins/xai/src/credentials.js +13 -0
- package/dist/plugins/xai/src/index.js +32 -31
- package/dist/plugins/xero/src/credentials.js +17 -0
- package/dist/plugins/xero/src/index.js +19 -36
- package/dist/plugins/yourls/src/credentials.js +17 -0
- package/dist/plugins/yourls/src/index.js +13 -23
- package/dist/plugins/zammad/src/credentials.js +15 -0
- package/dist/plugins/zammad/src/index.js +27 -47
- package/dist/plugins/zendesk/src/credentials.js +26 -0
- package/dist/plugins/zendesk/src/index.js +29 -48
- package/dist/plugins/zoho/src/credentials.js +17 -0
- package/dist/plugins/zoho/src/index.js +18 -38
- package/dist/plugins/zoom/src/credentials.js +19 -0
- package/dist/plugins/zoom/src/index.js +15 -30
- package/dist/plugins/zulip/src/credentials.js +16 -0
- package/dist/plugins/zulip/src/index.js +36 -42
- package/dist/sdk.d.ts +8 -0
- package/dist/sdk.js +3 -0
- package/package.json +2 -1
- package/dist/plugins/_shared/authedFetch.js +0 -33
- package/dist/plugins/_shared/tokenRefresh.js +0 -41
- package/dist/tests/helpers/engine-harness.d.ts +0 -1
- package/dist/tests/helpers/engine-harness.js +0 -236
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, LABEL_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerLabelActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -32,7 +32,7 @@ export function registerLabelActions(rl) {
|
|
|
32
32
|
async execute(input, ctx) {
|
|
33
33
|
requireUnscoped(ctx, "label.create");
|
|
34
34
|
const { replaceTeamLabels, ...fields } = input;
|
|
35
|
-
const data = await gql(
|
|
35
|
+
const data = await gql(ctx, `mutation($input: IssueLabelCreateInput!, $replaceTeamLabels: Boolean) { issueLabelCreate(input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
|
|
36
36
|
return data.issueLabelCreate?.issueLabel;
|
|
37
37
|
},
|
|
38
38
|
});
|
|
@@ -56,7 +56,7 @@ export function registerLabelActions(rl) {
|
|
|
56
56
|
async execute(input, ctx) {
|
|
57
57
|
requireUnscoped(ctx, "label.update");
|
|
58
58
|
const { id, replaceTeamLabels, ...fields } = input;
|
|
59
|
-
const data = await gql(
|
|
59
|
+
const data = await gql(ctx, `mutation($id: String!, $input: IssueLabelUpdateInput!, $replaceTeamLabels: Boolean) { issueLabelUpdate(id: $id, input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { id, input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
|
|
60
60
|
return data.issueLabelUpdate?.issueLabel;
|
|
61
61
|
},
|
|
62
62
|
});
|
|
@@ -68,7 +68,7 @@ export function registerLabelActions(rl) {
|
|
|
68
68
|
}),
|
|
69
69
|
async execute(input, ctx) {
|
|
70
70
|
requireUnscoped(ctx, "label.delete");
|
|
71
|
-
const data = await gql(
|
|
71
|
+
const data = await gql(ctx, `mutation($id: String!) { issueLabelDelete(id: $id) { success } }`, { id: input.id });
|
|
72
72
|
return data.issueLabelDelete;
|
|
73
73
|
},
|
|
74
74
|
});
|
|
@@ -80,7 +80,7 @@ export function registerLabelActions(rl) {
|
|
|
80
80
|
}),
|
|
81
81
|
async execute(input, ctx) {
|
|
82
82
|
requireUnscoped(ctx, "label.retire");
|
|
83
|
-
const data = await gql(
|
|
83
|
+
const data = await gql(ctx, `mutation($id: String!) { issueLabelRetire(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
|
|
84
84
|
return data.issueLabelRetire?.issueLabel;
|
|
85
85
|
},
|
|
86
86
|
});
|
|
@@ -92,7 +92,7 @@ export function registerLabelActions(rl) {
|
|
|
92
92
|
}),
|
|
93
93
|
async execute(input, ctx) {
|
|
94
94
|
requireUnscoped(ctx, "label.restore");
|
|
95
|
-
const data = await gql(
|
|
95
|
+
const data = await gql(ctx, `mutation($id: String!) { issueLabelRestore(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
|
|
96
96
|
return data.issueLabelRestore?.issueLabel;
|
|
97
97
|
},
|
|
98
98
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { gql,
|
|
2
|
+
import { gql, ORG_FIELDS, requireUnscoped, withScopedNote } from "./shared.js";
|
|
3
3
|
export function registerOrganizationActions(rl) {
|
|
4
4
|
rl.registerAction("org.get", {
|
|
5
5
|
access: "read",
|
|
@@ -7,7 +7,7 @@ export function registerOrganizationActions(rl) {
|
|
|
7
7
|
inputSchema: t.Object({}),
|
|
8
8
|
async execute(_input, ctx) {
|
|
9
9
|
requireUnscoped(ctx, "org.get");
|
|
10
|
-
const data = await gql(
|
|
10
|
+
const data = await gql(ctx, `query { organization { ${ORG_FIELDS} } }`);
|
|
11
11
|
return data.organization;
|
|
12
12
|
},
|
|
13
13
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, MILESTONE_FIELDS, PROJECT_FIELDS, PROJECT_UPDATE_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerProjectActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -62,7 +62,7 @@ export function registerProjectActions(rl) {
|
|
|
62
62
|
async execute(input, ctx) {
|
|
63
63
|
requireUnscoped(ctx, "projects.*");
|
|
64
64
|
const { slackChannelName, ...fields } = input;
|
|
65
|
-
const data = await gql(
|
|
65
|
+
const data = await gql(ctx, `mutation($input: ProjectCreateInput!, $slackChannelName: String) { projectCreate(input: $input, slackChannelName: $slackChannelName) { success project { ${PROJECT_FIELDS} } } }`, { input: fields, slackChannelName: slackChannelName ?? null });
|
|
66
66
|
return data.projectCreate?.project;
|
|
67
67
|
},
|
|
68
68
|
});
|
|
@@ -120,7 +120,7 @@ export function registerProjectActions(rl) {
|
|
|
120
120
|
async execute(input, ctx) {
|
|
121
121
|
requireUnscoped(ctx, "projects.*");
|
|
122
122
|
const { id, ...fields } = input;
|
|
123
|
-
const data = await gql(
|
|
123
|
+
const data = await gql(ctx, `mutation($id: String!, $input: ProjectUpdateInput!) { projectUpdate(id: $id, input: $input) { success project { ${PROJECT_FIELDS} } } }`, { id, input: fields });
|
|
124
124
|
return data.projectUpdate?.project;
|
|
125
125
|
},
|
|
126
126
|
});
|
|
@@ -132,7 +132,7 @@ export function registerProjectActions(rl) {
|
|
|
132
132
|
}),
|
|
133
133
|
async execute(input, ctx) {
|
|
134
134
|
requireUnscoped(ctx, "projects.*");
|
|
135
|
-
const data = await gql(
|
|
135
|
+
const data = await gql(ctx, `mutation($id: String!) { projectDelete(id: $id) { success } }`, { id: input.id });
|
|
136
136
|
return data.projectDelete;
|
|
137
137
|
},
|
|
138
138
|
});
|
|
@@ -146,7 +146,7 @@ export function registerProjectActions(rl) {
|
|
|
146
146
|
}),
|
|
147
147
|
async execute(input, ctx) {
|
|
148
148
|
requireUnscoped(ctx, "projects.*");
|
|
149
|
-
const data = await gql(
|
|
149
|
+
const data = await gql(ctx, `mutation($id: String!) { projectUnarchive(id: $id) { success } }`, { id: input.id });
|
|
150
150
|
return data.projectUnarchive;
|
|
151
151
|
},
|
|
152
152
|
});
|
|
@@ -166,7 +166,7 @@ export function registerProjectActions(rl) {
|
|
|
166
166
|
async execute(input, ctx) {
|
|
167
167
|
requireUnscoped(ctx, "projects.*");
|
|
168
168
|
const opts = input;
|
|
169
|
-
const data = await gql(
|
|
169
|
+
const data = await gql(ctx, `query($term: String!, $first: Int, $includeComments: Boolean, $teamId: String) {
|
|
170
170
|
searchProjects(term: $term, first: $first, includeComments: $includeComments, teamId: $teamId) {
|
|
171
171
|
nodes { ${PROJECT_FIELDS} }
|
|
172
172
|
totalCount
|
|
@@ -206,7 +206,7 @@ export function registerProjectActions(rl) {
|
|
|
206
206
|
}),
|
|
207
207
|
async execute(input, ctx) {
|
|
208
208
|
requireUnscoped(ctx, "projects.*");
|
|
209
|
-
const data = await gql(
|
|
209
|
+
const data = await gql(ctx, `mutation($input: ProjectMilestoneCreateInput!) { projectMilestoneCreate(input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { input: input });
|
|
210
210
|
return data.projectMilestoneCreate
|
|
211
211
|
?.projectMilestone;
|
|
212
212
|
},
|
|
@@ -235,7 +235,7 @@ export function registerProjectActions(rl) {
|
|
|
235
235
|
async execute(input, ctx) {
|
|
236
236
|
requireUnscoped(ctx, "projects.*");
|
|
237
237
|
const { id, ...fields } = input;
|
|
238
|
-
const data = await gql(
|
|
238
|
+
const data = await gql(ctx, `mutation($id: String!, $input: ProjectMilestoneUpdateInput!) { projectMilestoneUpdate(id: $id, input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { id, input: fields });
|
|
239
239
|
return data.projectMilestoneUpdate
|
|
240
240
|
?.projectMilestone;
|
|
241
241
|
},
|
|
@@ -250,7 +250,7 @@ export function registerProjectActions(rl) {
|
|
|
250
250
|
}),
|
|
251
251
|
async execute(input, ctx) {
|
|
252
252
|
requireUnscoped(ctx, "projects.*");
|
|
253
|
-
const data = await gql(
|
|
253
|
+
const data = await gql(ctx, `mutation($id: String!) { projectMilestoneDelete(id: $id) { success } }`, { id: input.id });
|
|
254
254
|
return data.projectMilestoneDelete;
|
|
255
255
|
},
|
|
256
256
|
});
|
|
@@ -278,7 +278,7 @@ export function registerProjectActions(rl) {
|
|
|
278
278
|
}),
|
|
279
279
|
async execute(input, ctx) {
|
|
280
280
|
requireUnscoped(ctx, "projects.*");
|
|
281
|
-
const data = await gql(
|
|
281
|
+
const data = await gql(ctx, `mutation($input: ProjectUpdateCreateInput!) { projectUpdateCreate(input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { input: input });
|
|
282
282
|
return data.projectUpdateCreate
|
|
283
283
|
?.projectUpdate;
|
|
284
284
|
},
|
|
@@ -303,7 +303,7 @@ export function registerProjectActions(rl) {
|
|
|
303
303
|
async execute(input, ctx) {
|
|
304
304
|
requireUnscoped(ctx, "projects.*");
|
|
305
305
|
const { id, ...fields } = input;
|
|
306
|
-
const data = await gql(
|
|
306
|
+
const data = await gql(ctx, `mutation($id: String!, $input: ProjectUpdateUpdateInput!) { projectUpdateUpdate(id: $id, input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { id, input: fields });
|
|
307
307
|
return data.projectUpdateUpdate
|
|
308
308
|
?.projectUpdate;
|
|
309
309
|
},
|
|
@@ -318,7 +318,7 @@ export function registerProjectActions(rl) {
|
|
|
318
318
|
}),
|
|
319
319
|
async execute(input, ctx) {
|
|
320
320
|
requireUnscoped(ctx, "projects.*");
|
|
321
|
-
const data = await gql(
|
|
321
|
+
const data = await gql(ctx, `mutation($id: String!) { projectUpdateArchive(id: $id) { success } }`, { id: input.id });
|
|
322
322
|
return data.projectUpdateArchive;
|
|
323
323
|
},
|
|
324
324
|
});
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import * as t from "typebox";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
export async function gql(
|
|
3
|
+
import { credentialJson, graphqlFailed } from "../../_shared/credentials.js";
|
|
4
|
+
import { linearCredential } from "./credentials.js";
|
|
5
|
+
export async function gql(ctx, query, variables) {
|
|
6
6
|
const body = { query };
|
|
7
7
|
if (variables)
|
|
8
8
|
body.variables = variables;
|
|
9
|
-
const
|
|
9
|
+
const data = (await credentialJson(ctx, linearCredential, "linear", {
|
|
10
|
+
target: "gql",
|
|
11
|
+
path: "graphql",
|
|
10
12
|
method: "POST",
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
});
|
|
14
|
-
if (!res.ok)
|
|
15
|
-
throw new Error(`Linear API error ${res.status}: ${await res.text()}`);
|
|
16
|
-
const data = (await res.json());
|
|
13
|
+
json: body,
|
|
14
|
+
}));
|
|
17
15
|
if (data.errors)
|
|
18
|
-
throw
|
|
16
|
+
throw graphqlFailed("linear", data.errors);
|
|
19
17
|
return data.data;
|
|
20
18
|
}
|
|
21
|
-
export function key(ctx) {
|
|
22
|
-
return ctx.connection.config.apiKey;
|
|
23
|
-
}
|
|
24
19
|
/**
|
|
25
20
|
* The configured scope values, verbatim. Each is either a label UUID or a
|
|
26
21
|
* label name — `resolveScopeLabelIds` turns the latter into the former.
|
|
@@ -41,22 +36,28 @@ export function scopeLabelValues(ctx) {
|
|
|
41
36
|
}
|
|
42
37
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
43
38
|
/**
|
|
44
|
-
* The workspace's labels
|
|
39
|
+
* The workspace's labels. Linear rejects a non-UUID in
|
|
45
40
|
* `labels: { id: { in: [...] } }` with "each value in in must be a UUID",
|
|
46
41
|
* so a human-written scope value like `requester:yosi` breaks every issue
|
|
47
42
|
* query (SHFT-1644) unless it is resolved to an id first. The directory is
|
|
48
|
-
* fetched once per
|
|
49
|
-
* still resolves.
|
|
43
|
+
* fetched once per locally signed connection and re-read on a miss, so a
|
|
44
|
+
* label created later still resolves.
|
|
50
45
|
*
|
|
51
|
-
* Keyed by
|
|
46
|
+
* Keyed by a digest of the connection config, API key included, so a
|
|
47
|
+
* long-lived Map never holds the key itself. A brokered connection's config
|
|
48
|
+
* holds no key: two people's connections can be identical, and only the
|
|
49
|
+
* broker knows whose workspace answers. Brokered calls read their own
|
|
50
|
+
* directory every time and cache nothing.
|
|
52
51
|
*/
|
|
53
52
|
const labelDirectories = new Map();
|
|
54
|
-
const directoryKey = (
|
|
55
|
-
|
|
53
|
+
const directoryKey = (ctx) => createHash("sha256")
|
|
54
|
+
.update(JSON.stringify(ctx.connection.config))
|
|
55
|
+
.digest("hex");
|
|
56
|
+
async function fetchLabelDirectory(ctx) {
|
|
56
57
|
const byName = new Map();
|
|
57
58
|
let after = null;
|
|
58
59
|
for (;;) {
|
|
59
|
-
const data = await gql(
|
|
60
|
+
const data = await gql(ctx, `query($after: String) { issueLabels(first: 250, after: $after) { nodes { id name team { key } } pageInfo { hasNextPage endCursor } } }`, { after });
|
|
60
61
|
const conn = data.issueLabels;
|
|
61
62
|
for (const node of conn?.nodes ?? []) {
|
|
62
63
|
const name = String(node.name);
|
|
@@ -84,12 +85,14 @@ async function fetchLabelDirectory(apiKey) {
|
|
|
84
85
|
}
|
|
85
86
|
return byName;
|
|
86
87
|
}
|
|
87
|
-
function labelDirectory(
|
|
88
|
-
|
|
88
|
+
function labelDirectory(ctx, { refresh = false } = {}) {
|
|
89
|
+
if (ctx.credentials)
|
|
90
|
+
return fetchLabelDirectory(ctx);
|
|
91
|
+
const cacheKey = directoryKey(ctx);
|
|
89
92
|
const cached = refresh ? undefined : labelDirectories.get(cacheKey);
|
|
90
93
|
if (cached)
|
|
91
94
|
return cached;
|
|
92
|
-
const pending = fetchLabelDirectory(
|
|
95
|
+
const pending = fetchLabelDirectory(ctx);
|
|
93
96
|
labelDirectories.set(cacheKey, pending);
|
|
94
97
|
// A failed lookup must not be cached as the answer for this key.
|
|
95
98
|
pending.catch(() => {
|
|
@@ -124,14 +127,13 @@ export async function resolveScopeLabelIds(ctx) {
|
|
|
124
127
|
return [];
|
|
125
128
|
if (values.every((v) => UUID_RE.test(v)))
|
|
126
129
|
return values;
|
|
127
|
-
const apiKey = key(ctx);
|
|
128
130
|
const missing = (directory) => values.some((v) => !UUID_RE.test(v) && !directory.has(v.toLowerCase()));
|
|
129
|
-
let directory = await labelDirectory(
|
|
131
|
+
let directory = await labelDirectory(ctx);
|
|
130
132
|
// A label created after the directory was cached would otherwise stay
|
|
131
133
|
// unresolvable for the lifetime of the process: re-read once before
|
|
132
134
|
// declaring a name unknown.
|
|
133
135
|
if (missing(directory))
|
|
134
|
-
directory = await labelDirectory(
|
|
136
|
+
directory = await labelDirectory(ctx, { refresh: true });
|
|
135
137
|
return values.map((value) => {
|
|
136
138
|
if (UUID_RE.test(value))
|
|
137
139
|
return value;
|
|
@@ -164,7 +166,7 @@ export async function issueHasScope(ctx, issue) {
|
|
|
164
166
|
labels.some((label) => ids.has(String(label.id))));
|
|
165
167
|
}
|
|
166
168
|
export async function getIssueForScope(ctx, issueId) {
|
|
167
|
-
const data = await gql(
|
|
169
|
+
const data = await gql(ctx, `query($id: String!) { issue(id: $id) { id identifier labels { nodes { id name } } } }`, { id: issueId });
|
|
168
170
|
return data.issue ?? null;
|
|
169
171
|
}
|
|
170
172
|
export async function assertIssueInScope(ctx, issueId) {
|
|
@@ -178,7 +180,7 @@ export async function assertIssueInScope(ctx, issueId) {
|
|
|
178
180
|
export async function assertCommentInScope(ctx, commentId) {
|
|
179
181
|
if (!isScoped(ctx))
|
|
180
182
|
return;
|
|
181
|
-
const data = await gql(
|
|
183
|
+
const data = await gql(ctx, `query($id: String!) { comment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: commentId });
|
|
182
184
|
const issue = data.comment?.issue;
|
|
183
185
|
if (!issue || !(await issueHasScope(ctx, issue)))
|
|
184
186
|
throw new Error("Linear comment is not available to this scoped connection");
|
|
@@ -186,7 +188,7 @@ export async function assertCommentInScope(ctx, commentId) {
|
|
|
186
188
|
export async function assertAttachmentInScope(ctx, attachmentId) {
|
|
187
189
|
if (!isScoped(ctx))
|
|
188
190
|
return;
|
|
189
|
-
const data = await gql(
|
|
191
|
+
const data = await gql(ctx, `query($id: String!) { attachment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: attachmentId });
|
|
190
192
|
const issue = data.attachment?.issue;
|
|
191
193
|
if (!issue || !(await issueHasScope(ctx, issue)))
|
|
192
194
|
throw new Error("Linear attachment is not available to this scoped connection");
|
|
@@ -353,7 +355,7 @@ export function registerListAction(rl, name, description, rootField, filterTypeN
|
|
|
353
355
|
requireRootFieldAvailable(ctx, name, rootField);
|
|
354
356
|
const opts = (input ?? {});
|
|
355
357
|
const { argsDecl, argsCall, vars } = buildConnArgs(opts, filterTypeName);
|
|
356
|
-
const data = await gql(
|
|
358
|
+
const data = await gql(ctx, `query${argsDecl} { ${rootField}${argsCall} { nodes { ${selection} } pageInfo { hasNextPage endCursor } } }`, vars);
|
|
357
359
|
const conn = data[rootField];
|
|
358
360
|
return { nodes: conn.nodes, pageInfo: conn.pageInfo };
|
|
359
361
|
},
|
|
@@ -370,7 +372,7 @@ export function registerGetAction(rl, name, description, rootField, selection) {
|
|
|
370
372
|
}),
|
|
371
373
|
async execute(input, ctx) {
|
|
372
374
|
requireRootFieldAvailable(ctx, name, rootField);
|
|
373
|
-
const data = await gql(
|
|
375
|
+
const data = await gql(ctx, `query($id: String!) { ${rootField}(id: $id) { ${selection} } }`, { id: input.id });
|
|
374
376
|
return data[rootField];
|
|
375
377
|
},
|
|
376
378
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, requireUnscoped, STATE_FIELDS, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerStateActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -25,7 +25,7 @@ export function registerStateActions(rl) {
|
|
|
25
25
|
}),
|
|
26
26
|
async execute(input, ctx) {
|
|
27
27
|
requireUnscoped(ctx, "state.create");
|
|
28
|
-
const data = await gql(
|
|
28
|
+
const data = await gql(ctx, `mutation($input: WorkflowStateCreateInput!) { workflowStateCreate(input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { input: input });
|
|
29
29
|
return data.workflowStateCreate
|
|
30
30
|
?.workflowState;
|
|
31
31
|
},
|
|
@@ -43,7 +43,7 @@ export function registerStateActions(rl) {
|
|
|
43
43
|
async execute(input, ctx) {
|
|
44
44
|
requireUnscoped(ctx, "state.update");
|
|
45
45
|
const { id, ...fields } = input;
|
|
46
|
-
const data = await gql(
|
|
46
|
+
const data = await gql(ctx, `mutation($id: String!, $input: WorkflowStateUpdateInput!) { workflowStateUpdate(id: $id, input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { id, input: fields });
|
|
47
47
|
return data.workflowStateUpdate
|
|
48
48
|
?.workflowState;
|
|
49
49
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, requireUnscoped, TEAM_FIELDS, USER_FIELDS, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerTeamActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -42,7 +42,7 @@ export function registerTeamActions(rl) {
|
|
|
42
42
|
async execute(input, ctx) {
|
|
43
43
|
requireUnscoped(ctx, "team.create");
|
|
44
44
|
const { copySettingsFromTeamId, ...fields } = input;
|
|
45
|
-
const data = await gql(
|
|
45
|
+
const data = await gql(ctx, `mutation($input: TeamCreateInput!, $copySettingsFromTeamId: String) { teamCreate(input: $input, copySettingsFromTeamId: $copySettingsFromTeamId) { success team { ${TEAM_FIELDS} } } }`, {
|
|
46
46
|
input: fields,
|
|
47
47
|
copySettingsFromTeamId: copySettingsFromTeamId ?? null,
|
|
48
48
|
});
|
|
@@ -80,7 +80,7 @@ export function registerTeamActions(rl) {
|
|
|
80
80
|
async execute(input, ctx) {
|
|
81
81
|
requireUnscoped(ctx, "team.update");
|
|
82
82
|
const { id, ...fields } = input;
|
|
83
|
-
const data = await gql(
|
|
83
|
+
const data = await gql(ctx, `mutation($id: String!, $input: TeamUpdateInput!) { teamUpdate(id: $id, input: $input) { success team { ${TEAM_FIELDS} } } }`, { id, input: fields });
|
|
84
84
|
return data.teamUpdate?.team;
|
|
85
85
|
},
|
|
86
86
|
});
|
|
@@ -95,7 +95,7 @@ export function registerTeamActions(rl) {
|
|
|
95
95
|
// Team membership is workspace metadata, like user.list: readable
|
|
96
96
|
// under a scoped connection (SHFT-1644).
|
|
97
97
|
const { teamId, limit } = input;
|
|
98
|
-
const data = await gql(
|
|
98
|
+
const data = await gql(ctx, `query($id: String!, $first: Int) {
|
|
99
99
|
team(id: $id) { members(first: $first) { nodes { ${USER_FIELDS} } } }
|
|
100
100
|
}`, { id: teamId, first: limit ?? 50 });
|
|
101
101
|
return data.team?.members?.nodes;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, requireUnscoped, USER_FIELDS, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerUserActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -10,7 +10,7 @@ export function registerUserActions(rl) {
|
|
|
10
10
|
description: "Get the authenticated user. Use this to resolve 'me' before filtering issues by assignee.",
|
|
11
11
|
inputSchema: t.Object({}),
|
|
12
12
|
async execute(_input, ctx) {
|
|
13
|
-
const data = await gql(
|
|
13
|
+
const data = await gql(ctx, `query { viewer { ${USER_FIELDS} } }`);
|
|
14
14
|
return data.viewer;
|
|
15
15
|
},
|
|
16
16
|
});
|
|
@@ -36,7 +36,7 @@ export function registerUserActions(rl) {
|
|
|
36
36
|
async execute(input, ctx) {
|
|
37
37
|
requireUnscoped(ctx, "user.update");
|
|
38
38
|
const { id, ...fields } = input;
|
|
39
|
-
const data = await gql(
|
|
39
|
+
const data = await gql(ctx, `mutation($id: String!, $input: UserUpdateInput!) { userUpdate(id: $id, input: $input) { success user { ${USER_FIELDS} } } }`, { id, input: fields });
|
|
40
40
|
return data.userUpdate?.user;
|
|
41
41
|
},
|
|
42
42
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, buildConnArgs, CUSTOM_VIEW_FIELDS, FEED_ITEM_FIELDS, gql, INITIATIVE_FIELDS, ISSUE_LITE,
|
|
2
|
+
import { bindGetAction, bindListAction, buildConnArgs, CUSTOM_VIEW_FIELDS, FEED_ITEM_FIELDS, gql, INITIATIVE_FIELDS, ISSUE_LITE, LIST_INPUT_SCHEMA, mergeIssueScopeFilter, PROJECT_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
|
|
3
3
|
const ISSUE_FILTER_DESCRIPTION = "IssueFilter payload. Examples: label { labels: { id: { in: ['label-id'] } } }; project { project: { id: { eq: 'project-id' } } }; assignee { assignee: { id: { eq: 'user-id' } } }; state { state: { id: { eq: 'state-id' } } }; priority { priority: { eq: 1 } }; due window { dueDate: { gte: '2026-06-09', lte: '2026-06-16' } }; combine with and/or arrays.";
|
|
4
4
|
export function registerViewActions(rl) {
|
|
5
5
|
const listAction = bindListAction(rl);
|
|
@@ -36,7 +36,7 @@ export function registerViewActions(rl) {
|
|
|
36
36
|
callParts.push("includeSubTeams: $includeSubTeams");
|
|
37
37
|
vars.includeSubTeams = opts.includeSubTeams;
|
|
38
38
|
}
|
|
39
|
-
const data = await gql(
|
|
39
|
+
const data = await gql(ctx, `query(${declParts.join(", ")}) {
|
|
40
40
|
customView(id: $id) { ${connectionField}(${callParts.join(", ")}) { nodes { ${selection} } pageInfo { hasNextPage endCursor } } }
|
|
41
41
|
}`, { id: opts.viewId, ...vars });
|
|
42
42
|
const conn = (data.customView?.[connectionField] ?? {});
|
|
@@ -73,7 +73,7 @@ export function registerViewActions(rl) {
|
|
|
73
73
|
}),
|
|
74
74
|
async execute(input, ctx) {
|
|
75
75
|
requireUnscoped(ctx, "view.create");
|
|
76
|
-
const data = await gql(
|
|
76
|
+
const data = await gql(ctx, `mutation($input: CustomViewCreateInput!) { customViewCreate(input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { input: input });
|
|
77
77
|
return data.customViewCreate?.customView;
|
|
78
78
|
},
|
|
79
79
|
});
|
|
@@ -105,7 +105,7 @@ export function registerViewActions(rl) {
|
|
|
105
105
|
async execute(input, ctx) {
|
|
106
106
|
requireUnscoped(ctx, "view.update");
|
|
107
107
|
const { id, ...fields } = input;
|
|
108
|
-
const data = await gql(
|
|
108
|
+
const data = await gql(ctx, `mutation($id: String!, $input: CustomViewUpdateInput!) { customViewUpdate(id: $id, input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { id, input: fields });
|
|
109
109
|
return data.customViewUpdate?.customView;
|
|
110
110
|
},
|
|
111
111
|
});
|
|
@@ -119,7 +119,7 @@ export function registerViewActions(rl) {
|
|
|
119
119
|
}),
|
|
120
120
|
async execute(input, ctx) {
|
|
121
121
|
requireUnscoped(ctx, "view.delete");
|
|
122
|
-
const data = await gql(
|
|
122
|
+
const data = await gql(ctx, `mutation($id: String!) { customViewDelete(id: $id) { success } }`, { id: input.id });
|
|
123
123
|
return data.customViewDelete;
|
|
124
124
|
},
|
|
125
125
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from "typebox";
|
|
2
|
-
import { bindGetAction, bindListAction, gql,
|
|
2
|
+
import { bindGetAction, bindListAction, gql, requireUnscoped, WEBHOOK_FIELDS, withScopedNote, } from "./shared.js";
|
|
3
3
|
export function registerWebhookActions(rl) {
|
|
4
4
|
const listAction = bindListAction(rl);
|
|
5
5
|
const getAction = bindGetAction(rl);
|
|
@@ -34,7 +34,7 @@ export function registerWebhookActions(rl) {
|
|
|
34
34
|
}),
|
|
35
35
|
async execute(input, ctx) {
|
|
36
36
|
requireUnscoped(ctx, "webhooks.*");
|
|
37
|
-
const data = await gql(
|
|
37
|
+
const data = await gql(ctx, `mutation($input: WebhookCreateInput!) { webhookCreate(input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { input: input });
|
|
38
38
|
return data.webhookCreate?.webhook;
|
|
39
39
|
},
|
|
40
40
|
});
|
|
@@ -58,7 +58,7 @@ export function registerWebhookActions(rl) {
|
|
|
58
58
|
async execute(input, ctx) {
|
|
59
59
|
requireUnscoped(ctx, "webhooks.*");
|
|
60
60
|
const { id, ...fields } = input;
|
|
61
|
-
const data = await gql(
|
|
61
|
+
const data = await gql(ctx, `mutation($id: String!, $input: WebhookUpdateInput!) { webhookUpdate(id: $id, input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { id, input: fields });
|
|
62
62
|
return data.webhookUpdate?.webhook;
|
|
63
63
|
},
|
|
64
64
|
});
|
|
@@ -70,7 +70,7 @@ export function registerWebhookActions(rl) {
|
|
|
70
70
|
}),
|
|
71
71
|
async execute(input, ctx) {
|
|
72
72
|
requireUnscoped(ctx, "webhooks.*");
|
|
73
|
-
const data = await gql(
|
|
73
|
+
const data = await gql(ctx, `mutation($id: String!) { webhookDelete(id: $id) { success } }`, { id: input.id });
|
|
74
74
|
return data.webhookDelete;
|
|
75
75
|
},
|
|
76
76
|
});
|
|
@@ -84,7 +84,7 @@ export function registerWebhookActions(rl) {
|
|
|
84
84
|
}),
|
|
85
85
|
async execute(input, ctx) {
|
|
86
86
|
requireUnscoped(ctx, "webhooks.*");
|
|
87
|
-
const data = await gql(
|
|
87
|
+
const data = await gql(ctx, `mutation($id: String!) { webhookRotateSecret(id: $id) { success secret } }`, { id: input.id });
|
|
88
88
|
return data.webhookRotateSecret;
|
|
89
89
|
},
|
|
90
90
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { staticCredential } from "../../_shared/credentials.js";
|
|
2
|
+
/** An API key as a bearer to Lingvanex's one translate endpoint. */
|
|
3
|
+
export const lingvanexCredential = staticCredential({
|
|
4
|
+
id: "lingvanex",
|
|
5
|
+
auth: { kind: "bearer" },
|
|
6
|
+
local: { secret: "apiKey" },
|
|
7
|
+
targets: {
|
|
8
|
+
api: {
|
|
9
|
+
baseUrl: "https://api-b2b.backenster.com/b1/api/v3/",
|
|
10
|
+
methods: ["POST"],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { credentialJson } from "../../_shared/credentials.js";
|
|
2
|
+
import { lingvanexCredential } from "./credentials.js";
|
|
1
3
|
export default function lingvanex(rl) {
|
|
2
4
|
rl.setName("lingvanex");
|
|
3
5
|
rl.setVersion("0.1.0");
|
|
6
|
+
rl.setCredential(lingvanexCredential);
|
|
4
7
|
rl.setConnectionSchema({
|
|
5
8
|
apiKey: {
|
|
6
9
|
type: "string",
|
|
@@ -46,17 +49,12 @@ export default function lingvanex(rl) {
|
|
|
46
49
|
body.from = src;
|
|
47
50
|
if (translateMode)
|
|
48
51
|
body.translateMode = translateMode;
|
|
49
|
-
|
|
52
|
+
return credentialJson(ctx, lingvanexCredential, "lingvanex", {
|
|
53
|
+
target: "api",
|
|
54
|
+
path: "translate",
|
|
50
55
|
method: "POST",
|
|
51
|
-
|
|
52
|
-
Authorization: `Bearer ${ctx.connection.config.apiKey}`,
|
|
53
|
-
"Content-Type": "application/json",
|
|
54
|
-
},
|
|
55
|
-
body: JSON.stringify(body),
|
|
56
|
+
json: body,
|
|
56
57
|
});
|
|
57
|
-
if (!res.ok)
|
|
58
|
-
throw new Error(`Lingvanex error ${res.status}: ${await res.text()}`);
|
|
59
|
-
return res.json();
|
|
60
58
|
},
|
|
61
59
|
});
|
|
62
60
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { staticCredential } from "../../_shared/credentials.js";
|
|
2
|
+
/**
|
|
3
|
+
* An OAuth2 access token, sent as a bearer to LinkedIn's versioned REST
|
|
4
|
+
* origin, with the public Restli protocol and API version headers.
|
|
5
|
+
*/
|
|
6
|
+
export const linkedinCredential = staticCredential({
|
|
7
|
+
id: "linkedin",
|
|
8
|
+
auth: { kind: "bearer" },
|
|
9
|
+
local: { secret: "accessToken" },
|
|
10
|
+
targets: {
|
|
11
|
+
api: {
|
|
12
|
+
baseUrl: "https://api.linkedin.com/rest/",
|
|
13
|
+
methods: ["POST"],
|
|
14
|
+
allowedHeaders: ["X-Restli-Protocol-Version", "LinkedIn-Version"],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
1
|
+
import { credentialOk, jsonAnswer } from "../../_shared/credentials.js";
|
|
2
|
+
import { linkedinCredential } from "./credentials.js";
|
|
3
|
+
async function apiRequest(ctx, method, path, body) {
|
|
4
|
+
const res = await credentialOk(ctx, linkedinCredential, "linkedin", {
|
|
5
|
+
target: "api",
|
|
6
|
+
path,
|
|
6
7
|
method,
|
|
7
8
|
headers: {
|
|
8
|
-
Authorization: `Bearer ${token}`,
|
|
9
|
-
Accept: "application/json",
|
|
10
9
|
"X-Restli-Protocol-Version": "2.0.0",
|
|
11
10
|
"LinkedIn-Version": "202504",
|
|
12
|
-
"Content-Type": "application/json",
|
|
13
11
|
},
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
...(body && Object.keys(body).length > 0 && method !== "GET"
|
|
13
|
+
? { json: body }
|
|
14
|
+
: {}),
|
|
15
|
+
});
|
|
18
16
|
if (res.status === 201) {
|
|
19
17
|
return { urn: res.headers.get("x-restli-id") };
|
|
20
18
|
}
|
|
21
|
-
if (!res.ok)
|
|
22
|
-
throw new Error(`LinkedIn API error ${res.status}: ${await res.text()}`);
|
|
23
19
|
if (res.status === 204)
|
|
24
20
|
return { success: true };
|
|
25
|
-
return res
|
|
21
|
+
return jsonAnswer(res);
|
|
26
22
|
}
|
|
27
23
|
// LinkedIn "little text" format escaping
|
|
28
24
|
function escapeText(text) {
|
|
@@ -31,6 +27,7 @@ function escapeText(text) {
|
|
|
31
27
|
export default function linkedin(rl) {
|
|
32
28
|
rl.setName("linkedin");
|
|
33
29
|
rl.setVersion("0.1.0");
|
|
30
|
+
rl.setCredential(linkedinCredential);
|
|
34
31
|
rl.setConnectionSchema({
|
|
35
32
|
accessToken: {
|
|
36
33
|
type: "string",
|
|
@@ -39,7 +36,6 @@ export default function linkedin(rl) {
|
|
|
39
36
|
env: "LINKEDIN_ACCESS_TOKEN",
|
|
40
37
|
},
|
|
41
38
|
});
|
|
42
|
-
const tok = (ctx) => ctx.connection.config.accessToken;
|
|
43
39
|
rl.registerAction("post.create", {
|
|
44
40
|
access: "write",
|
|
45
41
|
description: "Create a post on LinkedIn. Supports text-only, article shares, and text with commentary. Image uploads require binary data and are not supported in this plugin.",
|
|
@@ -104,7 +100,7 @@ export default function linkedin(rl) {
|
|
|
104
100
|
else {
|
|
105
101
|
body.commentary = escapedText;
|
|
106
102
|
}
|
|
107
|
-
return apiRequest(
|
|
103
|
+
return apiRequest(ctx, "POST", "posts", body);
|
|
108
104
|
},
|
|
109
105
|
});
|
|
110
106
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { staticCredential } from "../../_shared/credentials.js";
|
|
2
|
+
/** An API key, sent as the X-API-KEY header to LoneScale's public API. */
|
|
3
|
+
export const lonescaleCredential = staticCredential({
|
|
4
|
+
id: "lonescale",
|
|
5
|
+
auth: { kind: "apiKey", header: "X-API-KEY" },
|
|
6
|
+
local: { secret: "apiKey" },
|
|
7
|
+
targets: {
|
|
8
|
+
api: {
|
|
9
|
+
baseUrl: "https://public-api.lonescale.com/",
|
|
10
|
+
methods: ["GET", "POST"],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|