From f7ee9aaac5a959e82eff6b48ef115067f5abdf75 Mon Sep 17 00:00:00 2001 From: Mathias Vagni Date: Fri, 17 Nov 2023 16:42:49 +0100 Subject: [PATCH 1/3] Add prettier, dependencies and various other clean-up --- .github/workflows/lint.yaml | 48 + .gitignore | 1 + .perttierrc.json | 6 + _snippets/browser/upload-attachment.mdx | 11 +- _snippets/graphql/add-labels.mdx | 5 +- .../graphql/remove-customer-from-groups.mdx | 4 +- _snippets/node/upload-attachment.mdx | 10 +- .../add-customer-to-group-response.mdx | 60 +- .../typescript-sdk/add-customer-to-group.mdx | 10 +- _snippets/typescript-sdk/add-labels.mdx | 8 +- _snippets/typescript-sdk/assign-thread.mdx | 8 +- .../create-attachment-url-response.mdx | 6 +- .../typescript-sdk/create-attachment-url.mdx | 10 +- .../typescript-sdk/create-customer-event.mdx | 20 +- _snippets/typescript-sdk/create-thread.mdx | 10 +- _snippets/typescript-sdk/delete-customer.mdx | 6 +- _snippets/typescript-sdk/error-handling.mdx | 10 +- _snippets/typescript-sdk/first-api-call.mdx | 6 +- .../typescript-sdk/get-customer-by-email.mdx | 4 +- .../typescript-sdk/get-customer-by-id.mdx | 6 +- _snippets/typescript-sdk/get-customers.mdx | 2 +- .../typescript-sdk/mark-thread-as-done.mdx | 6 +- .../typescript-sdk/mark-thread-as-todo.mdx | 6 +- _snippets/typescript-sdk/page-info-after.mdx | 9 +- .../remove-customer-from-groups.mdx | 10 +- _snippets/typescript-sdk/remove-labels.mdx | 8 +- _snippets/typescript-sdk/reply-email.mdx | 12 +- _snippets/typescript-sdk/send-email.mdx | 14 +- _snippets/typescript-sdk/snooze-thread.mdx | 6 +- _snippets/typescript-sdk/ui-badge.mdx | 4 +- _snippets/typescript-sdk/ui-container.mdx | 4 +- _snippets/typescript-sdk/ui-copy-button.mdx | 6 +- _snippets/typescript-sdk/ui-divider.mdx | 8 +- _snippets/typescript-sdk/ui-link-button.mdx | 6 +- _snippets/typescript-sdk/ui-plain-text.mdx | 18 +- _snippets/typescript-sdk/ui-row.mdx | 6 +- _snippets/typescript-sdk/ui-spacer.mdx | 8 +- _snippets/typescript-sdk/ui-text.mdx | 20 +- _snippets/typescript-sdk/unassign-thread.mdx | 6 +- .../upsert-customer-response.mdx | 6 +- _snippets/typescript-sdk/upsert-customer.mdx | 24 +- package.json | 18 + pages/attachments.mdx | 67 +- pages/customer-cards/examples.mdx | 2 +- pages/email-setup.mdx | 16 +- pages/email-setup/receiving-emails.mdx | 12 +- pages/graphql.mdx | 10 +- pages/graphql/api-explorer.mdx | 2 +- pages/graphql/authentication.mdx | 5 +- pages/graphql/customers/customer-groups.mdx | 41 +- pages/graphql/customers/delete.mdx | 8 +- pages/graphql/customers/get.mdx | 6 + pages/graphql/customers/upsert.mdx | 43 +- pages/graphql/error-handling.mdx | 19 +- .../graphql/events/create-customer-event.mdx | 155 +- pages/graphql/labels/add.mdx | 7 +- pages/graphql/labels/remove.mdx | 2 + pages/graphql/messaging.mdx | 16 +- pages/graphql/messaging/reply-email.mdx | 26 +- pages/graphql/messaging/send-email.mdx | 1 + pages/graphql/pagination.mdx | 2 + pages/graphql/threads.mdx | 7 +- pages/graphql/threads/assignment.mdx | 123 +- pages/graphql/threads/create.mdx | 20 +- pages/graphql/threads/status-changes.mdx | 2 + pages/graphql/typescript-sdk.mdx | 2 +- pages/linear-integration-setup.mdx | 5 +- pages/migrate-to-threads.mdx | 9 +- pages/ui-components.mdx | 3 +- pages/ui-components/badge.mdx | 6 +- pages/ui-components/container.mdx | 6 +- pages/ui-components/copy-button.mdx | 2 + pages/ui-components/divider.mdx | 6 +- pages/ui-components/link-button.mdx | 2 + pages/ui-components/plain-text.mdx | 2 + pages/ui-components/row.mdx | 2 + pages/ui-components/spacer.mdx | 6 +- pages/ui-components/text.mdx | 2 + pages/webhooks.mdx | 10 +- pages/webhooks/customer-updated.mdx | 1 - pages/webhooks/email-received.mdx | 9 +- pages/webhooks/email-sent.mdx | 9 +- pages/webhooks/thread-created.mdx | 13 +- pnpm-lock.yaml | 3069 +++++++++++++++++ 84 files changed, 3732 insertions(+), 480 deletions(-) create mode 100644 .github/workflows/lint.yaml create mode 100644 .gitignore create mode 100644 .perttierrc.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..719bc8b --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,48 @@ +name: Lint + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v3 + with: + node-version: '18' + + - uses: pnpm/action-setup@v2 + name: Install pnpm + with: + version: 8 + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install + + - name: Install deps + run: pnpm i + + - name: Lint + run: pnpm run lint diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.perttierrc.json b/.perttierrc.json new file mode 100644 index 0000000..f6ebd00 --- /dev/null +++ b/.perttierrc.json @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "trailingComma": "es5", + "singleQuote": true, + "tabWidth": 2 +} \ No newline at end of file diff --git a/_snippets/browser/upload-attachment.mdx b/_snippets/browser/upload-attachment.mdx index 5b40130..0a65940 100644 --- a/_snippets/browser/upload-attachment.mdx +++ b/_snippets/browser/upload-attachment.mdx @@ -12,13 +12,13 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { form.append(key, value); }); - const file = new File([fileBlob], 'file'); - form.append('file', file); + const file = new File([fileBlob], "file"); + form.append("file", file); console.log(`Uploading attachment to ${uploadFormUrl}`); fetch(uploadFormUrl, { - method: 'POST', + method: "POST", body: form, }) .then((res) => { @@ -28,7 +28,10 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { console.log(`File successfully uploaded! (code=${res.status})`); }) .catch((err) => { - console.log(`There was an error uploading the file: %s`, err.message ? err.message : err); + console.log( + `There was an error uploading the file: %s`, + err.message ? err.message : err, + ); }); } ``` diff --git a/_snippets/graphql/add-labels.mdx b/_snippets/graphql/add-labels.mdx index f80c013..9abd80f 100644 --- a/_snippets/graphql/add-labels.mdx +++ b/_snippets/graphql/add-labels.mdx @@ -14,7 +14,10 @@ mutation addLabels($input: AddLabelsInput!) { ```json filename="Variables" { "input": { - "labelTypeIds": ["lt_01HB8BTNTZ58730MX8H5VMKFD5", "lt_01HB8BTNKSCF1FK5ETFVRSDC6G"], + "labelTypeIds": [ + "lt_01HB8BTNTZ58730MX8H5VMKFD5", + "lt_01HB8BTNKSCF1FK5ETFVRSDC6G" + ], "threadId": "th_01H8H46YPB2S4MAJM382FG9423" } } diff --git a/_snippets/graphql/remove-customer-from-groups.mdx b/_snippets/graphql/remove-customer-from-groups.mdx index a14c6d5..e1e19b3 100644 --- a/_snippets/graphql/remove-customer-from-groups.mdx +++ b/_snippets/graphql/remove-customer-from-groups.mdx @@ -1,5 +1,7 @@ ```graphql filename="Mutation" -mutation removeCustomerFromCustomerGroup($input: RemoveCustomerFromCustomerGroupsInput!) { +mutation removeCustomerFromCustomerGroup( + $input: RemoveCustomerFromCustomerGroupsInput! +) { removeCustomerFromCustomerGroups(input: $input) { error { message diff --git a/_snippets/node/upload-attachment.mdx b/_snippets/node/upload-attachment.mdx index 084444a..9464b7c 100644 --- a/_snippets/node/upload-attachment.mdx +++ b/_snippets/node/upload-attachment.mdx @@ -1,6 +1,6 @@ ```js -const axios = require('axios'); -const FormData = require('form-data'); +const axios = require("axios"); +const FormData = require("form-data"); /** * Upload an attachment. @@ -15,7 +15,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { form.append(key, value); }); - form.append('file', fileBuffer, { filename: 'file' }); + form.append("file", fileBuffer, { filename: "file" }); console.log(`Uploading attachment to ${uploadFormUrl}`); @@ -23,7 +23,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .post(uploadFormUrl, form, { headers: { ...form.getHeaders(), - 'Content-Length': form.getLengthSync(), + "Content-Length": form.getLengthSync(), }, }) .then((res) => { @@ -32,7 +32,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .catch((err) => { console.log( `There was an error uploading the file: %s`, - err.response ? err.response.data : err + err.response ? err.response.data : err, ); }); } diff --git a/_snippets/typescript-sdk/add-customer-to-group-response.mdx b/_snippets/typescript-sdk/add-customer-to-group-response.mdx index 0a35628..878207a 100644 --- a/_snippets/typescript-sdk/add-customer-to-group-response.mdx +++ b/_snippets/typescript-sdk/add-customer-to-group-response.mdx @@ -1,57 +1,57 @@ ```js [ { - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", createdAt: { - __typename: 'DateTime', - iso8601: '2023-06-21T14:20:12.014Z', - unixTimestamp: '1687357212014', + __typename: "DateTime", + iso8601: "2023-06-21T14:20:12.014Z", + unixTimestamp: "1687357212014", }, createdBy: { - __typename: 'MachineUserActor', - machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', + __typename: "MachineUserActor", + machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", }, updatedAt: { - __typename: 'DateTime', - iso8601: '2023-06-21T14:20:12.014Z', - unixTimestamp: '1687357212014', + __typename: "DateTime", + iso8601: "2023-06-21T14:20:12.014Z", + unixTimestamp: "1687357212014", }, updatedBy: { - __typename: 'MachineUserActor', - machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', + __typename: "MachineUserActor", + machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", }, customerGroup: { - id: 'cg_01H1P1RK22WTVMFRY8BX6S6VJX', - name: 'free tier', - key: 'free-tier', - color: '#E78450', + id: "cg_01H1P1RK22WTVMFRY8BX6S6VJX", + name: "free tier", + key: "free-tier", + color: "#E78450", }, }, { - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", createdAt: { - __typename: 'DateTime', - iso8601: '2023-06-21T14:20:12.014Z', - unixTimestamp: '1687357212014', + __typename: "DateTime", + iso8601: "2023-06-21T14:20:12.014Z", + unixTimestamp: "1687357212014", }, createdBy: { - __typename: 'MachineUserActor', - machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', + __typename: "MachineUserActor", + machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", }, updatedAt: { - __typename: 'DateTime', - iso8601: '2023-06-21T14:20:12.014Z', - unixTimestamp: '1687357212014', + __typename: "DateTime", + iso8601: "2023-06-21T14:20:12.014Z", + unixTimestamp: "1687357212014", }, updatedBy: { - __typename: 'MachineUserActor', - machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', + __typename: "MachineUserActor", + machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", }, customerGroup: { - id: 'cg_01H1P1S2HD9PERNNS591ZT28ZZ', - name: 'design partner', - key: 'design-partner', - color: '#FBBF24', + id: "cg_01H1P1S2HD9PERNNS591ZT28ZZ", + name: "design partner", + key: "design-partner", + color: "#FBBF24", }, }, ]; diff --git a/_snippets/typescript-sdk/add-customer-to-group.mdx b/_snippets/typescript-sdk/add-customer-to-group.mdx index e53328f..59a6889 100644 --- a/_snippets/typescript-sdk/add-customer-to-group.mdx +++ b/_snippets/typescript-sdk/add-customer-to-group.mdx @@ -1,16 +1,16 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); const res = await client.addCustomerToCustomerGroups({ - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", customerGroupIdentifiers: [ { - customerGroupKey: 'free-tier', + customerGroupKey: "free-tier", }, { - customerGroupKey: 'design-partner', + customerGroupKey: "design-partner", }, ], }); diff --git a/_snippets/typescript-sdk/add-labels.mdx b/_snippets/typescript-sdk/add-labels.mdx index 2e0899d..0ae8af5 100644 --- a/_snippets/typescript-sdk/add-labels.mdx +++ b/_snippets/typescript-sdk/add-labels.mdx @@ -1,11 +1,11 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); const res = await client.addLabels({ - labelTypeIds: ['lt_01HB8BTNVM7GEBKBEDNC2K8ST7'], - threadId: 'th_01HD1G6649R1DK061W27VBT7QB', + labelTypeIds: ["lt_01HB8BTNVM7GEBKBEDNC2K8ST7"], + threadId: "th_01HD1G6649R1DK061W27VBT7QB", }); if (res.error) { diff --git a/_snippets/typescript-sdk/assign-thread.mdx b/_snippets/typescript-sdk/assign-thread.mdx index 41552b0..99e1ca7 100644 --- a/_snippets/typescript-sdk/assign-thread.mdx +++ b/_snippets/typescript-sdk/assign-thread.mdx @@ -1,13 +1,13 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.assignThread({ - threadId: 'th_01H8H46YPB2S4MAJM382FG9423', - userId: 'u_01FSVKMHFDHJ3H5XFM20EMCBQN', + threadId: "th_01H8H46YPB2S4MAJM382FG9423", + userId: "u_01FSVKMHFDHJ3H5XFM20EMCBQN", // You could instead assign to a machine user by doing: // machineUserId: 'XXX' diff --git a/_snippets/typescript-sdk/create-attachment-url-response.mdx b/_snippets/typescript-sdk/create-attachment-url-response.mdx index 06fb69c..5dd62db 100644 --- a/_snippets/typescript-sdk/create-attachment-url-response.mdx +++ b/_snippets/typescript-sdk/create-attachment-url-response.mdx @@ -5,7 +5,11 @@ "__typename": "Attachment", "id": "att_01H3970W7XG1716AVNGQ6FWYGD", "fileName": "the-filename.jpeg", - "fileSize": { "__typename": "FileSize", "kiloBytes": 32.32, "megaBytes": 0.03 }, + "fileSize": { + "__typename": "FileSize", + "kiloBytes": 32.32, + "megaBytes": 0.03 + }, "fileExtension": null, "updatedAt": { "__typename": "DateTime", diff --git a/_snippets/typescript-sdk/create-attachment-url.mdx b/_snippets/typescript-sdk/create-attachment-url.mdx index f89b496..3d8d277 100644 --- a/_snippets/typescript-sdk/create-attachment-url.mdx +++ b/_snippets/typescript-sdk/create-attachment-url.mdx @@ -1,11 +1,11 @@ ```ts /c_XXXXXXXXXXXXXXXXXXXXXXXXXX/ -import { AttachmentType, PlainClient } from '@team-plain/typescript-sdk'; +import { AttachmentType, PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'XXX' }); +const client = new PlainClient({ apiKey: "XXX" }); const res = await client.createAttachmentUploadUrl({ - customerId: 'c_XXXXXXXXXXXXXXXXXXXXXXXXXX', - fileName: 'the-filename.jpeg', + customerId: "c_XXXXXXXXXXXXXXXXXXXXXXXXXX", + fileName: "the-filename.jpeg", fileSizeBytes: 32318, attachmentType: AttachmentType.CustomTimelineEntry, }); @@ -13,7 +13,7 @@ const res = await client.createAttachmentUploadUrl({ if (res.error) { console.error(res.error); } else { - console.log('Attachment upload url created'); + console.log("Attachment upload url created"); console.log(res.data); } ``` diff --git a/_snippets/typescript-sdk/create-customer-event.mdx b/_snippets/typescript-sdk/create-customer-event.mdx index da5c4cb..ec28252 100644 --- a/_snippets/typescript-sdk/create-customer-event.mdx +++ b/_snippets/typescript-sdk/create-customer-event.mdx @@ -1,17 +1,17 @@ ```tsx -import { PlainClient, uiComponent } from '@team-plain/typescript-sdk'; +import { PlainClient, uiComponent } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", debug: true, }); const res = await client.createCustomerEvent({ - title: 'API key generated', + title: "API key generated", customerIdentifier: { // You can use the email: - email: 'jane@acme.com', + email: "jane@acme.com", // ...or if you set external id on customers: // externalId: 'YOUR_ID', @@ -22,14 +22,14 @@ const res = await client.createCustomerEvent({ components: [ uiComponent.text({ - text: 'New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles.', + text: "New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles.", }), uiComponent.spacer({ - size: 'M', + size: "M", }), uiComponent.linkButton({ - label: 'View in admin', - url: 'https://admin.your-app.com', + label: "View in admin", + url: "https://admin.your-app.com", }), ], @@ -37,11 +37,11 @@ const res = await client.createCustomerEvent({ // be created once and fail on the second time. This external id acts // as an idempotency key while also letting you correlate an event to // something your systems. - externalId: 'XXX', + externalId: "XXX", // Optional - if provided then the event will only be shown // in a single thread vs all threads from a customer - threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', + threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", }); if (res.error) { diff --git a/_snippets/typescript-sdk/create-thread.mdx b/_snippets/typescript-sdk/create-thread.mdx index fb718e7..203a3d8 100644 --- a/_snippets/typescript-sdk/create-thread.mdx +++ b/_snippets/typescript-sdk/create-thread.mdx @@ -1,16 +1,16 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", debug: true, }); const res = await client.createThread({ - title: 'Bug Report', + title: "Bug Report", customerIdentifier: { // You can use the email: - email: 'jane@acme.com', + email: "jane@acme.com", // ...or if you set external id on customers: // externalId: '', @@ -27,7 +27,7 @@ const res = await client.createThread({ ], // Label types are created in settings where you can also copy // their ID. - labelTypeIds: ['lt_01HB924PME9C0YWKW1N4AK3BZA'], + labelTypeIds: ["lt_01HB924PME9C0YWKW1N4AK3BZA"], }); if (res.error) { diff --git a/_snippets/typescript-sdk/delete-customer.mdx b/_snippets/typescript-sdk/delete-customer.mdx index 8ead1e5..ffef4af 100644 --- a/_snippets/typescript-sdk/delete-customer.mdx +++ b/_snippets/typescript-sdk/delete-customer.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from '../client'; +import { PlainClient } from "../client"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.deleteCustomer({ - customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', + customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", }); if (res.error) { diff --git a/_snippets/typescript-sdk/error-handling.mdx b/_snippets/typescript-sdk/error-handling.mdx index cb95f34..33c69d3 100644 --- a/_snippets/typescript-sdk/error-handling.mdx +++ b/_snippets/typescript-sdk/error-handling.mdx @@ -1,17 +1,17 @@ ```tsx {21} -import { PlainClient } from '../client'; +import { PlainClient } from "../client"; export async function createCustomer() { - const client = new PlainClient({ apiKey: 'XXX' }); + const client = new PlainClient({ apiKey: "XXX" }); const res = await client.upsertCustomer({ identifier: { - emailAddress: 'jane@gmail.com', + emailAddress: "jane@gmail.com", }, onCreate: { - fullName: 'Jane Fargate', + fullName: "Jane Fargate", email: { - email: 'jane@gmail.com', + email: "jane@gmail.com", isVerified: true, }, }, diff --git a/_snippets/typescript-sdk/first-api-call.mdx b/_snippets/typescript-sdk/first-api-call.mdx index 30ff6be..cd102fa 100644 --- a/_snippets/typescript-sdk/first-api-call.mdx +++ b/_snippets/typescript-sdk/first-api-call.mdx @@ -1,8 +1,8 @@ ```ts filename="script.js" {3-4} -const { PlainClient } = require('@team-plain/typescript-sdk'); +const { PlainClient } = require("@team-plain/typescript-sdk"); -const apiKey = 'XXX'; -const email = 'XXX'; +const apiKey = "XXX"; +const email = "XXX"; const client = new PlainClient({ apiKey: apiKey, diff --git a/_snippets/typescript-sdk/get-customer-by-email.mdx b/_snippets/typescript-sdk/get-customer-by-email.mdx index 5253d73..e170ea5 100644 --- a/_snippets/typescript-sdk/get-customer-by-email.mdx +++ b/_snippets/typescript-sdk/get-customer-by-email.mdx @@ -1,9 +1,9 @@ ```tsx const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); -const res = await client.getCustomerByEmail({ email: 'bob@example.com' }); +const res = await client.getCustomerByEmail({ email: "bob@example.com" }); if (res.error) { console.error(res.error); diff --git a/_snippets/typescript-sdk/get-customer-by-id.mdx b/_snippets/typescript-sdk/get-customer-by-id.mdx index 8de87c3..415e4f5 100644 --- a/_snippets/typescript-sdk/get-customer-by-id.mdx +++ b/_snippets/typescript-sdk/get-customer-by-id.mdx @@ -1,9 +1,11 @@ ```tsx const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); -const res = await client.getCustomerById({ customerId: 'c_01H14DFQ4PDYBH398J1E99TWSS' }); +const res = await client.getCustomerById({ + customerId: "c_01H14DFQ4PDYBH398J1E99TWSS", +}); if (res.error) { console.error(res.error); diff --git a/_snippets/typescript-sdk/get-customers.mdx b/_snippets/typescript-sdk/get-customers.mdx index b6b8c65..bcca6f3 100644 --- a/_snippets/typescript-sdk/get-customers.mdx +++ b/_snippets/typescript-sdk/get-customers.mdx @@ -1,6 +1,6 @@ ```tsx const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.getCustomers({ diff --git a/_snippets/typescript-sdk/mark-thread-as-done.mdx b/_snippets/typescript-sdk/mark-thread-as-done.mdx index b49caea..34a85ee 100644 --- a/_snippets/typescript-sdk/mark-thread-as-done.mdx +++ b/_snippets/typescript-sdk/mark-thread-as-done.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.markThreadAsDone({ - threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', + threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", }); if (res.error) { diff --git a/_snippets/typescript-sdk/mark-thread-as-todo.mdx b/_snippets/typescript-sdk/mark-thread-as-todo.mdx index be8488f..aeda948 100644 --- a/_snippets/typescript-sdk/mark-thread-as-todo.mdx +++ b/_snippets/typescript-sdk/mark-thread-as-todo.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.markThreadAsTodo({ - threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', + threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", }); if (res.error) { diff --git a/_snippets/typescript-sdk/page-info-after.mdx b/_snippets/typescript-sdk/page-info-after.mdx index 4e0951c..882aa12 100644 --- a/_snippets/typescript-sdk/page-info-after.mdx +++ b/_snippets/typescript-sdk/page-info-after.mdx @@ -1,8 +1,8 @@ ```tsx -import { PlainClient } from '../client'; +import { PlainClient } from "../client"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const firstPage = client.getCustomers({}); @@ -11,6 +11,9 @@ if (firstPage.error) { console.error(firstPage.error); } else { const { pageInfo } = firstPage.data; - const secondPage = await client.getCustomers({ after: pageInfo.endCursor, first: 50 }); + const secondPage = await client.getCustomers({ + after: pageInfo.endCursor, + first: 50, + }); } ``` diff --git a/_snippets/typescript-sdk/remove-customer-from-groups.mdx b/_snippets/typescript-sdk/remove-customer-from-groups.mdx index 3b1bbb4..c05dcce 100644 --- a/_snippets/typescript-sdk/remove-customer-from-groups.mdx +++ b/_snippets/typescript-sdk/remove-customer-from-groups.mdx @@ -1,18 +1,18 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw', + apiKey: "plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw", }); const res = await client.removeCustomerFromCustomerGroups({ - customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', + customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", customerGroupIdentifiers: [ { - customerGroupKey: 'free-tier', + customerGroupKey: "free-tier", }, { - customerGroupKey: 'design-partner', + customerGroupKey: "design-partner", }, ], }); diff --git a/_snippets/typescript-sdk/remove-labels.mdx b/_snippets/typescript-sdk/remove-labels.mdx index f08eabc..f38d6b0 100644 --- a/_snippets/typescript-sdk/remove-labels.mdx +++ b/_snippets/typescript-sdk/remove-labels.mdx @@ -1,9 +1,11 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); -const res = await client.removeLabels({ labelIds: ['l_01HD428Y1TREH5KTXP019K6FPK'] }); +const res = await client.removeLabels({ + labelIds: ["l_01HD428Y1TREH5KTXP019K6FPK"], +}); if (res.error) { console.error(res.error); diff --git a/_snippets/typescript-sdk/reply-email.mdx b/_snippets/typescript-sdk/reply-email.mdx index 855f905..bcab140 100644 --- a/_snippets/typescript-sdk/reply-email.mdx +++ b/_snippets/typescript-sdk/reply-email.mdx @@ -1,13 +1,13 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); client.replyToEmail({ - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', - inReplyToEmailId: 'em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA', - textContent: 'The plain text version of your reply goes here.', - markdownContent: 'The markdown **version** of your _reply_ goes here.', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + inReplyToEmailId: "em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA", + textContent: "The plain text version of your reply goes here.", + markdownContent: "The markdown **version** of your _reply_ goes here.", }); if (res.error) { diff --git a/_snippets/typescript-sdk/send-email.mdx b/_snippets/typescript-sdk/send-email.mdx index 84ee825..8a35966 100644 --- a/_snippets/typescript-sdk/send-email.mdx +++ b/_snippets/typescript-sdk/send-email.mdx @@ -1,14 +1,14 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); client.sendNewEmail({ - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', - threadId: 'th_01HD44FHMCDSSWE38N14FSYV6K', - subject: 'Your account has a problem', - textContent: 'The plain text version of your email goes here.', - markdownContent: 'The markdown **version** of your _email_ goes here.', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + threadId: "th_01HD44FHMCDSSWE38N14FSYV6K", + subject: "Your account has a problem", + textContent: "The plain text version of your email goes here.", + markdownContent: "The markdown **version** of your _email_ goes here.", }); if (res.error) { diff --git a/_snippets/typescript-sdk/snooze-thread.mdx b/_snippets/typescript-sdk/snooze-thread.mdx index 562c41d..ce4c1dd 100644 --- a/_snippets/typescript-sdk/snooze-thread.mdx +++ b/_snippets/typescript-sdk/snooze-thread.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.snoozeThread({ - threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', + threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", durationSeconds: 5 * 24 * 60 * 60, // 5 days }); diff --git a/_snippets/typescript-sdk/ui-badge.mdx b/_snippets/typescript-sdk/ui-badge.mdx index 7a99f34..e9f5e25 100644 --- a/_snippets/typescript-sdk/ui-badge.mdx +++ b/_snippets/typescript-sdk/ui-badge.mdx @@ -1,5 +1,5 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; -uiComponent.badge({ label: 'Subscribed', color: 'GREEN' }); +uiComponent.badge({ label: "Subscribed", color: "GREEN" }); ``` diff --git a/_snippets/typescript-sdk/ui-container.mdx b/_snippets/typescript-sdk/ui-container.mdx index d11ca4f..6ca6cbe 100644 --- a/_snippets/typescript-sdk/ui-container.mdx +++ b/_snippets/typescript-sdk/ui-container.mdx @@ -1,7 +1,7 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; uiComponent.container({ - content: [uiComponent.text({ text: 'Container content' })], + content: [uiComponent.text({ text: "Container content" })], }); ``` diff --git a/_snippets/typescript-sdk/ui-copy-button.mdx b/_snippets/typescript-sdk/ui-copy-button.mdx index 60b36cb..36aeeec 100644 --- a/_snippets/typescript-sdk/ui-copy-button.mdx +++ b/_snippets/typescript-sdk/ui-copy-button.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; uiComponent.copyButton({ - value: '2a8f2dae-3580-402b-aa0a-243efae55e39', - tooltip: 'Order ID', + value: "2a8f2dae-3580-402b-aa0a-243efae55e39", + tooltip: "Order ID", }); ``` diff --git a/_snippets/typescript-sdk/ui-divider.mdx b/_snippets/typescript-sdk/ui-divider.mdx index f79ac81..5f65873 100644 --- a/_snippets/typescript-sdk/ui-divider.mdx +++ b/_snippets/typescript-sdk/ui-divider.mdx @@ -1,9 +1,9 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; [ - uiComponent.text({ text: 'Content before an XS divider' }), - uiComponent.divider({ spacingSize: 'XS' }), - uiComponent.text({ text: 'Content after divider' }), + uiComponent.text({ text: "Content before an XS divider" }), + uiComponent.divider({ spacingSize: "XS" }), + uiComponent.text({ text: "Content after divider" }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-link-button.mdx b/_snippets/typescript-sdk/ui-link-button.mdx index 3a068bf..b427cbf 100644 --- a/_snippets/typescript-sdk/ui-link-button.mdx +++ b/_snippets/typescript-sdk/ui-link-button.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; uiComponent.linkButton({ - label: 'Open in Admin Portal', - url: 'https://example.com', + label: "Open in Admin Portal", + url: "https://example.com", }); ``` diff --git a/_snippets/typescript-sdk/ui-plain-text.mdx b/_snippets/typescript-sdk/ui-plain-text.mdx index 6e87106..bd191ba 100644 --- a/_snippets/typescript-sdk/ui-plain-text.mdx +++ b/_snippets/typescript-sdk/ui-plain-text.mdx @@ -1,21 +1,21 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; [ - uiComponent.plainText({ text: 'Small text', size: 'S' }), + uiComponent.plainText({ text: "Small text", size: "S" }), - uiComponent.plainText({ text: 'Medium text', size: 'M' }), + uiComponent.plainText({ text: "Medium text", size: "M" }), - uiComponent.plainText({ text: 'Large text', size: 'L' }), + uiComponent.plainText({ text: "Large text", size: "L" }), - uiComponent.plainText({ text: 'Normal text', color: 'NORMAL' }), + uiComponent.plainText({ text: "Normal text", color: "NORMAL" }), - uiComponent.plainText({ text: 'Muted text', color: 'MUTED' }), + uiComponent.plainText({ text: "Muted text", color: "MUTED" }), - uiComponent.plainText({ text: 'Success text', color: 'SUCCESS' }), + uiComponent.plainText({ text: "Success text", color: "SUCCESS" }), - uiComponent.plainText({ text: 'Warning text', color: 'WARNING' }), + uiComponent.plainText({ text: "Warning text", color: "WARNING" }), - uiComponent.plainText({ text: 'Error text', color: 'ERROR' }), + uiComponent.plainText({ text: "Error text", color: "ERROR" }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-row.mdx b/_snippets/typescript-sdk/ui-row.mdx index d8b64f2..bf2cc29 100644 --- a/_snippets/typescript-sdk/ui-row.mdx +++ b/_snippets/typescript-sdk/ui-row.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; uiComponent.row({ - mainContent: [uiComponent.text({ text: 'Membership' })], - asideContent: [uiComponent.badge({ label: 'Premium plan', color: 'BLUE' })], + mainContent: [uiComponent.text({ text: "Membership" })], + asideContent: [uiComponent.badge({ label: "Premium plan", color: "BLUE" })], }); ``` diff --git a/_snippets/typescript-sdk/ui-spacer.mdx b/_snippets/typescript-sdk/ui-spacer.mdx index 59ba5dd..b125062 100644 --- a/_snippets/typescript-sdk/ui-spacer.mdx +++ b/_snippets/typescript-sdk/ui-spacer.mdx @@ -1,9 +1,9 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; [ - uiComponent.text({ text: 'Content before an XS spacer' }), - uiComponent.spacer({ spacingSize: 'XS' }), - uiComponent.text({ text: 'Content after spacer' }), + uiComponent.text({ text: "Content before an XS spacer" }), + uiComponent.spacer({ spacingSize: "XS" }), + uiComponent.text({ text: "Content after spacer" }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-text.mdx b/_snippets/typescript-sdk/ui-text.mdx index 94fe86a..9f504ca 100644 --- a/_snippets/typescript-sdk/ui-text.mdx +++ b/_snippets/typescript-sdk/ui-text.mdx @@ -1,25 +1,25 @@ ```tsx -import { uiComponent } from '@team-plain/typescript-sdk'; +import { uiComponent } from "@team-plain/typescript-sdk"; [ uiComponent.text({ - text: 'The **quick** brown fox _jumps_ over the [lazy link](https://plain.com)', + text: "The **quick** brown fox _jumps_ over the [lazy link](https://plain.com)", }), - uiComponent.text({ text: 'Small text', size: 'S' }), + uiComponent.text({ text: "Small text", size: "S" }), - uiComponent.text({ text: 'Medium text', size: 'M' }), + uiComponent.text({ text: "Medium text", size: "M" }), - uiComponent.text({ text: 'Large text', size: 'L' }), + uiComponent.text({ text: "Large text", size: "L" }), - uiComponent.text({ text: 'Normal text', color: 'NORMAL' }), + uiComponent.text({ text: "Normal text", color: "NORMAL" }), - uiComponent.text({ text: 'Muted text', color: 'MUTED' }), + uiComponent.text({ text: "Muted text", color: "MUTED" }), - uiComponent.text({ text: 'Success text', color: 'SUCCESS' }), + uiComponent.text({ text: "Success text", color: "SUCCESS" }), - uiComponent.text({ text: 'Warning text', color: 'WARNING' }), + uiComponent.text({ text: "Warning text", color: "WARNING" }), - uiComponent.text({ text: 'Error text', color: 'ERROR' }), + uiComponent.text({ text: "Error text", color: "ERROR" }), ]; ``` diff --git a/_snippets/typescript-sdk/unassign-thread.mdx b/_snippets/typescript-sdk/unassign-thread.mdx index 28f0152..25db9a3 100644 --- a/_snippets/typescript-sdk/unassign-thread.mdx +++ b/_snippets/typescript-sdk/unassign-thread.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", }); const res = await client.unassignThread({ - threadId: 'th_01H8H46YPB2S4MAJM382FG9423', + threadId: "th_01H8H46YPB2S4MAJM382FG9423", }); if (res.error) { diff --git a/_snippets/typescript-sdk/upsert-customer-response.mdx b/_snippets/typescript-sdk/upsert-customer-response.mdx index 751273e..ac2620d 100644 --- a/_snippets/typescript-sdk/upsert-customer-response.mdx +++ b/_snippets/typescript-sdk/upsert-customer-response.mdx @@ -7,7 +7,11 @@ "fullName": "Donald Duck", "shortName": "Donald", "externalId": "c_123", - "email": { "email": "donald@example.com", "isVerified": false, "verifiedAt": null }, + "email": { + "email": "donald@example.com", + "isVerified": false, + "verifiedAt": null + }, "status": "IDLE", "statusChangedAt": { "__typename": "DateTime", diff --git a/_snippets/typescript-sdk/upsert-customer.mdx b/_snippets/typescript-sdk/upsert-customer.mdx index 5b4d7c9..6f56642 100644 --- a/_snippets/typescript-sdk/upsert-customer.mdx +++ b/_snippets/typescript-sdk/upsert-customer.mdx @@ -1,32 +1,32 @@ ```ts -import { PlainClient } from '@team-plain/typescript-sdk'; +import { PlainClient } from "@team-plain/typescript-sdk"; -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); const res = await client.upsertCustomer({ identifier: { - emailAddress: 'donald@example.com', + emailAddress: "donald@example.com", }, // If the customer is not found and should be created then // these details will be used: onCreate: { - fullName: 'Donald Duck', - shortName: 'Donald', + fullName: "Donald Duck", + shortName: "Donald", email: { - email: 'donald@example.com', + email: "donald@example.com", isVerified: true, }, // This is the id of the customer in your own backend. // Filling this out makes it easy to link customers in Plain // back to customer in your own systems. - externalId: 'c_123', + externalId: "c_123", // This is optional but if you want to put a customer into a group // on creation, this is how you do it. customerGroupIdentifiers: [ { - customerGroupKey: 'enterprise', + customerGroupKey: "enterprise", }, ], }, @@ -35,17 +35,17 @@ const res = await client.upsertCustomer({ // just providing some of the fields below. onUpdate: { fullName: { - value: 'Donald Duck', + value: "Donald Duck", }, shortName: { - value: 'Donald', + value: "Donald", }, email: { - email: 'donald@example.com', + email: "donald@example.com", isVerified: true, }, externalId: { - value: 'c_123', + value: "c_123", }, }, }); diff --git a/package.json b/package.json new file mode 100644 index 0000000..55287cc --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "@team-plain/docs-mintlify", + "version": "1.0.0", + "description": "Documentation for plain.com", + "main": "index.js", + "engines": { + "node": "18.x", + "pnpm": "8.x" + }, + "scripts": { + "dev": "mintlify dev", + "lint": "prettier --check './**/*.{js,ts,tsx,md,mdx}'" + }, + "dependencies": { + "mintlify": "^4.0.58", + "prettier": "^3.1.0" + } +} diff --git a/pages/attachments.mdx b/pages/attachments.mdx index 442df1d..c15ecfa 100644 --- a/pages/attachments.mdx +++ b/pages/attachments.mdx @@ -25,22 +25,23 @@ To try this, you will need an [API key](/graphql/authentication/) with the follo + ```typescript -import { AttachmentType, PlainClient } from '@team-plain/typescript-sdk'; - -const client = new PlainClient({ apiKey: 'XXX' }); - +import { AttachmentType, PlainClient } from "@team-plain/typescript-sdk"; + +const client = new PlainClient({ apiKey: "XXX" }); + const res = await client.createAttachmentUploadUrl({ - customerId: 'c_XXXXXXXXXXXXXXXXXXXXXXXXXX', - fileName: 'the-filename.jpeg', + customerId: "c_XXXXXXXXXXXXXXXXXXXXXXXXXX", + fileName: "the-filename.jpeg", fileSizeBytes: 32318, attachmentType: AttachmentType.CustomTimelineEntry, }); - + if (res.error) { console.error(res.error); } else { - console.log('Attachment upload url created'); + console.log("Attachment upload url created"); console.log(res.data); } ``` @@ -54,7 +55,11 @@ if (res.error) { "__typename": "Attachment", "id": "att_01H3970W7XG1716AVNGQ6FWYGD", "fileName": "the-filename.jpeg", - "fileSize": { "__typename": "FileSize", "kiloBytes": 32.32, "megaBytes": 0.03 }, + "fileSize": { + "__typename": "FileSize", + "kiloBytes": 32.32, + "megaBytes": 0.03 + }, "fileExtension": null, "updatedAt": { "__typename": "DateTime", @@ -101,6 +106,7 @@ if (res.error) { } } ``` + @@ -144,6 +150,7 @@ Variables } } ``` + ```json Response { "data": { @@ -193,6 +200,7 @@ Variables + In the `AttachmentUploadUrl` we created in the previous step we get back 2 fields which are needed to actually upload our attachment: @@ -206,6 +214,7 @@ Variables + ```typescript /** * Upload an attachment. @@ -219,14 +228,14 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { uploadFormData.forEach(({ key, value }) => { form.append(key, value); }); - - const file = new File([fileBlob], 'file'); - form.append('file', file); - + + const file = new File([fileBlob], "file"); + form.append("file", file); + console.log(`Uploading attachment to ${uploadFormUrl}`); - + fetch(uploadFormUrl, { - method: 'POST', + method: "POST", body: form, }) .then((res) => { @@ -236,16 +245,21 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { console.log(`File successfully uploaded! (code=${res.status})`); }) .catch((err) => { - console.log(`There was an error uploading the file: %s`, err.message ? err.message : err); + console.log( + `There was an error uploading the file: %s`, + err.message ? err.message : err, + ); }); } ``` + + ```typescript -const axios = require('axios'); -const FormData = require('form-data'); - +const axios = require("axios"); +const FormData = require("form-data"); + /** * Upload an attachment. * @@ -258,16 +272,16 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { uploadFormData.forEach(({ key, value }) => { form.append(key, value); }); - - form.append('file', fileBuffer, { filename: 'file' }); - + + form.append("file", fileBuffer, { filename: "file" }); + console.log(`Uploading attachment to ${uploadFormUrl}`); - + axios .post(uploadFormUrl, form, { headers: { ...form.getHeaders(), - 'Content-Length': form.getLengthSync(), + "Content-Length": form.getLengthSync(), }, }) .then((res) => { @@ -276,17 +290,18 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .catch((err) => { console.log( `There was an error uploading the file: %s`, - err.response ? err.response.data : err + err.response ? err.response.data : err, ); }); } ``` + + - ## Limitations - On emails and custom timeline entries: diff --git a/pages/customer-cards/examples.mdx b/pages/customer-cards/examples.mdx index cbf6476..dc7044c 100644 --- a/pages/customer-cards/examples.mdx +++ b/pages/customer-cards/examples.mdx @@ -2,4 +2,4 @@ title: "Examples" icon: "link" url: "https://github.com/team-plain/example-customer-cards" ---- \ No newline at end of file +--- diff --git a/pages/email-setup.mdx b/pages/email-setup.mdx index 6b4ea3d..607348b 100644 --- a/pages/email-setup.mdx +++ b/pages/email-setup.mdx @@ -5,10 +5,18 @@ title: "Setting up email" Setting up email requires you to complete two steps: - - - - + + If you follow this guide, bear in mind that: diff --git a/pages/email-setup/receiving-emails.mdx b/pages/email-setup/receiving-emails.mdx index 0acb027..650b353 100644 --- a/pages/email-setup/receiving-emails.mdx +++ b/pages/email-setup/receiving-emails.mdx @@ -1,6 +1,6 @@ -import { Callout, Steps } from 'nextra-theme-docs'; +import { Callout, Steps } from "nextra-theme-docs"; -import { ImageContainer } from '../../components/imageContainer'; +import { ImageContainer } from "../../components/imageContainer"; # Receiving emails in Plain @@ -23,11 +23,13 @@ If your email provider is not Google, you can still set up email forwarding in d Under "Default routing" click on "CONFIGURE" or "ADD ANOTHER RULE" ![Add new rule](/public/images/email-setup/email-setup-0.png) + In the dropdown, select "Single recipient" and write your **support email address** under "Email address" ![Add your support email address](/public/images/email-setup/email-setup-1.png) + @@ -35,15 +37,17 @@ If your email provider is not Google, you can still set up email forwarding in d Choose "Replace recipient" and paste the inbound email address (`@inbound.postmarkapp.com`) ![Replace recipient](/public/images/email-setup/email-setup-2.png) + Scroll further down, and choose "Perform this action on non-recognised and recognised addresses" - ![Apply to all addresses](/public/images/email-setup/email-setup-3.png) +![Apply to all addresses](/public/images/email-setup/email-setup-3.png) + - + And That's it! 💅 diff --git a/pages/graphql.mdx b/pages/graphql.mdx index ba122cf..6f2f29b 100644 --- a/pages/graphql.mdx +++ b/pages/graphql.mdx @@ -58,18 +58,12 @@ You will need an API key with the `customer:read` permission. See [authenticatio - ```shell - npm install @team-plain/typescript-sdk - ``` + ```shell npm install @team-plain/typescript-sdk ``` Make sure to replace the api key and email in the code - - ```shell - node script.js - ``` - + ```shell node script.js ``` diff --git a/pages/graphql/api-explorer.mdx b/pages/graphql/api-explorer.mdx index 4bdd001..278ea5f 100644 --- a/pages/graphql/api-explorer.mdx +++ b/pages/graphql/api-explorer.mdx @@ -2,4 +2,4 @@ title: "API Explorer" icon: "link" url: "https://app.plain.com/developer/api-explorer/?workspaceId=w_01H3FZJ8MG74GFXA5WA3MPB446" ---- \ No newline at end of file +--- diff --git a/pages/graphql/authentication.mdx b/pages/graphql/authentication.mdx index 7bd1f32..919f584 100644 --- a/pages/graphql/authentication.mdx +++ b/pages/graphql/authentication.mdx @@ -13,6 +13,7 @@ Machine Users can have multiple API Keys to make it easy to rotate keys. Every A - **Name:** This is just visible to you and could indicate the usage e.g. "Autoresponder" - **Public name:** This is the name visible to customers (if the Machine User interacts with customers) e.g. "Mr Robot" + Click "Add API Key" and select the permissions you need. When making API calls, if you have insufficient permissions, the error should tell you which permissions you need. @@ -20,6 +21,7 @@ Click "Add API Key" and select the permissions you need. When making API calls, The relevant documentation will tell you which permissions are required for each feature. Once you've made an API key you should copy it and put it somewhere safe, as you will not be able to see it again once you navigate away. + That's it! Now that you have an API key you can use this with our SDKs or within any API call as a header: @@ -27,5 +29,6 @@ That's it! Now that you have an API key you can use this with our SDKs or within ```text Authorization: Bearer plainApiKey_xxx ``` + - \ No newline at end of file + diff --git a/pages/graphql/customers/customer-groups.mdx b/pages/graphql/customers/customer-groups.mdx index cbe5ba3..6544476 100644 --- a/pages/graphql/customers/customer-groups.mdx +++ b/pages/graphql/customers/customer-groups.mdx @@ -23,23 +23,24 @@ This operation requires the following permissions: + ```typescript -import { PlainClient } from '@team-plain/typescript-sdk'; - -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); - +import { PlainClient } from "@team-plain/typescript-sdk"; + +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); + const res = await client.addCustomerToCustomerGroups({ - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", customerGroupIdentifiers: [ { - customerGroupKey: 'free-tier', + customerGroupKey: "free-tier", }, { - customerGroupKey: 'design-partner', + customerGroupKey: "design-partner", }, ], }); - + if (res.error) { console.error(res.error); } else { @@ -48,6 +49,7 @@ if (res.error) { ``` Running the above would console.log: + ```scheme [ { @@ -152,7 +154,6 @@ mutation addCustomerToCustomerGroup($input: AddCustomerToCustomerGroupsInput!) { } ``` - If you prefer you can also use the customer group id instead of the key. You can do this like so: ```json Variables @@ -205,25 +206,26 @@ A customer can be removed from a customer group by using the `removeCustomerFrom + ```typescript -import { PlainClient } from '@team-plain/typescript-sdk'; - +import { PlainClient } from "@team-plain/typescript-sdk"; + const client = new PlainClient({ - apiKey: 'plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw', + apiKey: "plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw", }); - + const res = await client.removeCustomerFromCustomerGroups({ - customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', + customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", customerGroupIdentifiers: [ { - customerGroupKey: 'free-tier', + customerGroupKey: "free-tier", }, { - customerGroupKey: 'design-partner', + customerGroupKey: "design-partner", }, ], }); - + if (res.error) { console.error(res.error); } else { @@ -235,8 +237,11 @@ if (res.error) { + ```graphql Mutation -mutation removeCustomerFromCustomerGroup($input: RemoveCustomerFromCustomerGroupsInput!) { +mutation removeCustomerFromCustomerGroup( + $input: RemoveCustomerFromCustomerGroupsInput! +) { removeCustomerFromCustomerGroups(input: $input) { error { message diff --git a/pages/graphql/customers/delete.mdx b/pages/graphql/customers/delete.mdx index 1ea008e..24f715a 100644 --- a/pages/graphql/customers/delete.mdx +++ b/pages/graphql/customers/delete.mdx @@ -1,6 +1,6 @@ -import DeleteCustomerTypescriptSDK from '../../../snippets/typescript-sdk/delete-customer.mdx'; -import DeleteCustomerGraphQL from '../../../snippets/graphql/delete-customer.mdx'; -import { Tab, Tabs } from 'nextra-theme-docs'; +import DeleteCustomerTypescriptSDK from "../../../snippets/typescript-sdk/delete-customer.mdx"; +import DeleteCustomerGraphQL from "../../../snippets/graphql/delete-customer.mdx"; +import { Tab, Tabs } from "nextra-theme-docs"; # Delete customers @@ -36,6 +36,7 @@ if (res.error) { + ```grapql Mutation mutation deleteCustomer($input: DeleteCustomerInput!) { deleteCustomer(input: $input) { @@ -61,6 +62,7 @@ mutation deleteCustomer($input: DeleteCustomerInput!) { } } ``` + diff --git a/pages/graphql/customers/get.mdx b/pages/graphql/customers/get.mdx index 01e9183..01cf9b6 100644 --- a/pages/graphql/customers/get.mdx +++ b/pages/graphql/customers/get.mdx @@ -40,6 +40,7 @@ if (res.error) { + ```graphql Query query getCustomers($cursor: String!) { customers( @@ -79,6 +80,7 @@ query getCustomers($cursor: String!) { "cursor": "eyJjdXN0b21lcnMuZnVsbF9uYW1lIjoiQWlkYSBTY2hpbm5lciIsImN1c3RvbWVycy5pZCI6ImNfMDFHMThFU01TWkdUWTQwU1pITk03M0hBQkIifQ==" } ``` + @@ -105,6 +107,7 @@ if (res.error) { + ```graphql Query query getCustomerById($customerId: ID!) { customer(customerId: $customerId) { @@ -128,6 +131,7 @@ query getCustomerById($customerId: ID!) { "customerId": "c_01H14DFQ4PDYBH398J1E99TWSS" } ``` + @@ -154,6 +158,7 @@ if (res.error) { + ```graphql Query query getCustomerByEmail($email: String!) { customerByEmail(email: $email) { @@ -177,6 +182,7 @@ query getCustomerByEmail($email: String!) { "email": "bob@example.com" } ``` + diff --git a/pages/graphql/customers/upsert.mdx b/pages/graphql/customers/upsert.mdx index d62d95a..02662c2 100644 --- a/pages/graphql/customers/upsert.mdx +++ b/pages/graphql/customers/upsert.mdx @@ -30,35 +30,36 @@ This will: + ```typescript -import { PlainClient } from '@team-plain/typescript-sdk'; - -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); - +import { PlainClient } from "@team-plain/typescript-sdk"; + +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); + const res = await client.upsertCustomer({ identifier: { - emailAddress: 'donald@example.com', + emailAddress: "donald@example.com", }, // If the customer is not found and should be created then // these details will be used: onCreate: { - fullName: 'Donald Duck', - shortName: 'Donald', + fullName: "Donald Duck", + shortName: "Donald", email: { - email: 'donald@example.com', + email: "donald@example.com", isVerified: true, }, - + // This is the id of the customer in your own backend. // Filling this out makes it easy to link customers in Plain // back to customer in your own systems. - externalId: 'c_123', - + externalId: "c_123", + // This is optional but if you want to put a customer into a group // on creation, this is how you do it. customerGroupIdentifiers: [ { - customerGroupKey: 'enterprise', + customerGroupKey: "enterprise", }, ], }, @@ -67,21 +68,21 @@ const res = await client.upsertCustomer({ // just providing some of the fields below. onUpdate: { fullName: { - value: 'Donald Duck', + value: "Donald Duck", }, shortName: { - value: 'Donald', + value: "Donald", }, email: { - email: 'donald@example.com', + email: "donald@example.com", isVerified: true, }, externalId: { - value: 'c_123', + value: "c_123", }, }, }); - + if (res.error) { console.error(res.error); } else { @@ -100,7 +101,11 @@ if (res.error) { "fullName": "Donald Duck", "shortName": "Donald", "externalId": "c_123", - "email": { "email": "donald@example.com", "isVerified": false, "verifiedAt": null }, + "email": { + "email": "donald@example.com", + "isVerified": false, + "verifiedAt": null + }, "status": "IDLE", "statusChangedAt": { "__typename": "DateTime", @@ -128,6 +133,7 @@ if (res.error) { } } ``` + @@ -244,6 +250,7 @@ mutation upsertCustomer($input: UpsertCustomerInput!) { } } ``` + diff --git a/pages/graphql/error-handling.mdx b/pages/graphql/error-handling.mdx index 1c54cdb..29e28a2 100644 --- a/pages/graphql/error-handling.mdx +++ b/pages/graphql/error-handling.mdx @@ -33,7 +33,7 @@ one for the result and one for the error. If the error is returned then the muta type Example { data: String! } - + type ExampleOutput { # example is the result of the mutation, is only returned if the mutation succeeded example: Example @@ -67,30 +67,29 @@ You can see the [full error types in the code of the Typescript SDK](https://git This is how you can access the error when using the SDK: ```typescript -import { PlainClient } from '../client'; - +import { PlainClient } from "../client"; + export async function createCustomer() { - const client = new PlainClient({ apiKey: 'XXX' }); - + const client = new PlainClient({ apiKey: "XXX" }); + const res = await client.upsertCustomer({ identifier: { - emailAddress: 'jane@gmail.com', + emailAddress: "jane@gmail.com", }, onCreate: { - fullName: 'Jane Fargate', + fullName: "Jane Fargate", email: { - email: 'jane@gmail.com', + email: "jane@gmail.com", isVerified: true, }, }, onUpdate: {}, }); - + if (res.error) { console.error(res.error); } else { console.log(`Created customer with id=${res.data.customer.id}`); } } - ``` diff --git a/pages/graphql/events/create-customer-event.mdx b/pages/graphql/events/create-customer-event.mdx index f8d5853..b0ff89f 100644 --- a/pages/graphql/events/create-customer-event.mdx +++ b/pages/graphql/events/create-customer-event.mdx @@ -3,7 +3,9 @@ title: "Create a customer event" --- - This API is being actively developed and is not yet ready for production usage. If you are interested in using events please get in touch with us at [help@plain.com](mailto:help@plain.com) + This API is being actively developed and is not yet ready for production + usage. If you are interested in using events please get in touch with us at + [help@plain.com](mailto:help@plain.com) To create an event you need a customer ID. @@ -12,9 +14,7 @@ You can get this by [upserting a customer](/pages/graphql/customers/upsert) in P In this example we'll be creating the following event: - - ![Example event](/public/images/events/events-example.png) - +![Example event](/public/images/events/events-example.png) @@ -25,26 +25,26 @@ In this example we'll be creating the following event: ```typescript import { PlainClient, uiComponent } from '@team-plain/typescript-sdk'; - + const client = new PlainClient({ apiKey: 'XXX', debug: true, }); - + const res = await client.createCustomerEvent({ title: 'API key generated', - + customerIdentifier: { // You can use the email: email: 'jane@acme.com', - + // ...or if you set external id on customers: // externalId: 'YOUR_ID', - + // ...or you can use the customer's id in Plain: // customerId: 'c_123' }, - + components: [ uiComponent.text({ text: 'New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles.', @@ -57,18 +57,18 @@ In this example we'll be creating the following event: url: 'https://admin.your-app.com', }), ], - + // Optional - if provided, this will ensure that this event can only // be created once and fail on the second time. This external id acts // as an idempotency key while also letting you correlate an event to // something your systems. externalId: 'XXX', - + // Optional - if provided then the event will only be shown // in a single thread vs all threads from a customer threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', }); - + if (res.error) { console.error(res.error); } else { @@ -120,87 +120,88 @@ In this example we'll be creating the following event: } } ``` + For this you'll need an API key with the following permissions: - `customerEvent:create` - `customerEvent:read` - ```graphql Mutation - mutation createCustomerEvent($input: CreateCustomerEventInput!) { - createCustomerEvent(input: $input) { - customerEvent { +```graphql Mutation +mutation createCustomerEvent($input: CreateCustomerEventInput!) { + createCustomerEvent(input: $input) { + customerEvent { + __typename + id + title + createdAt { __typename - id - title - createdAt { - __typename - iso8601 - unixTimestamp - } + iso8601 + unixTimestamp } - error { - __typename + } + error { + __typename + message + type + code + fields { + field message type - code - fields { - field - message - type - } } } } - ``` +} +``` - ```json Variables - { - "input": { - "title": "API key generated", - - "customerIdentifier": { - // You can use the email: - "email": "jane@acme.com" - - // ...or if you set external id on customers: - // externalId: 'YOUR_ID', - - // ...or you can use the customer's id in Plain: - // customerId: 'c_123' +```json Variables +{ + "input": { + "title": "API key generated", + + "customerIdentifier": { + // You can use the email: + "email": "jane@acme.com" + + // ...or if you set external id on customers: + // externalId: 'YOUR_ID', + + // ...or you can use the customer's id in Plain: + // customerId: 'c_123' + }, + + "components": [ + { + "componentText": { + "text": "New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles." + } }, - - "components": [ - { - "componentText": { - "text": "New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles." - } - }, - { - "componentSpacer": { - "spacerSize": "M" - } - }, - { - "componentLinkButton": { - "linkButtonLabel": "View in admin", - "linkButtonUrl": "https://admin.your-app.com" - } + { + "componentSpacer": { + "spacerSize": "M" } - ], - - // Optional - if provided, this will ensure that this event can only - // be created once and fail on the second time. This external id acts - // as an idempotency key while also letting you correlate an event to - // something your systems. - "externalId": "XXX", - - // Optional - if provided then the event will only be shown - // in a single thread vs all threads from a customer - "threadId": "th_01HB924RWAW8H3Q8KZDFWYBJHZ" - } + }, + { + "componentLinkButton": { + "linkButtonLabel": "View in admin", + "linkButtonUrl": "https://admin.your-app.com" + } + } + ], + + // Optional - if provided, this will ensure that this event can only + // be created once and fail on the second time. This external id acts + // as an idempotency key while also letting you correlate an event to + // something your systems. + "externalId": "XXX", + + // Optional - if provided then the event will only be shown + // in a single thread vs all threads from a customer + "threadId": "th_01HB924RWAW8H3Q8KZDFWYBJHZ" } - ``` +} +``` diff --git a/pages/graphql/labels/add.mdx b/pages/graphql/labels/add.mdx index 259137a..f6cf7e4 100644 --- a/pages/graphql/labels/add.mdx +++ b/pages/graphql/labels/add.mdx @@ -96,6 +96,7 @@ if (res.error) { + ```graphql Mutation mutation addLabels($input: AddLabelsInput!) { addLabels(input: $input) { @@ -112,11 +113,15 @@ mutation addLabels($input: AddLabelsInput!) { ```json Variables { "input": { - "labelTypeIds": ["lt_01HB8BTNTZ58730MX8H5VMKFD5", "lt_01HB8BTNKSCF1FK5ETFVRSDC6G"], + "labelTypeIds": [ + "lt_01HB8BTNTZ58730MX8H5VMKFD5", + "lt_01HB8BTNKSCF1FK5ETFVRSDC6G" + ], "threadId": "th_01H8H46YPB2S4MAJM382FG9423" } } ``` + diff --git a/pages/graphql/labels/remove.mdx b/pages/graphql/labels/remove.mdx index 759c77c..555d802 100644 --- a/pages/graphql/labels/remove.mdx +++ b/pages/graphql/labels/remove.mdx @@ -27,6 +27,7 @@ if (res.error) { + ```graphql Mutation mutation removeLabels($input: RemoveLabelsInput!) { removeLabels(input: $input) { @@ -46,6 +47,7 @@ mutation removeLabels($input: RemoveLabelsInput!) { } } ``` + diff --git a/pages/graphql/messaging.mdx b/pages/graphql/messaging.mdx index c9db9c0..513070e 100644 --- a/pages/graphql/messaging.mdx +++ b/pages/graphql/messaging.mdx @@ -5,8 +5,16 @@ description: "We provide various methods to message your customers with the Plai --- - - - - + + diff --git a/pages/graphql/messaging/reply-email.mdx b/pages/graphql/messaging/reply-email.mdx index ca0169d..cf8f9f5 100644 --- a/pages/graphql/messaging/reply-email.mdx +++ b/pages/graphql/messaging/reply-email.mdx @@ -1,7 +1,7 @@ -import { Tab, Tabs } from 'nextra-theme-docs'; +import { Tab, Tabs } from "nextra-theme-docs"; -import ReplyEmailTypescriptSDK from '../../../snippets/typescript-sdk/reply-email.mdx'; -import ReplyEmailGraphQL from '../../../snippets/graphql/reply-email.mdx'; +import ReplyEmailTypescriptSDK from "../../../snippets/typescript-sdk/reply-email.mdx"; +import ReplyEmailGraphQL from "../../../snippets/graphql/reply-email.mdx"; # Reply to emails @@ -16,23 +16,24 @@ You can reply to an inbound email with the `replyToEmail` API. - `attachment:read` ```typescript -import { PlainClient } from '@team-plain/typescript-sdk'; - -const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); - +import { PlainClient } from "@team-plain/typescript-sdk"; + +const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); + client.replyToEmail({ - customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', - inReplyToEmailId: 'em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA', - textContent: 'The plain text version of your reply goes here.', - markdownContent: 'The markdown **version** of your _reply_ goes here.', + customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + inReplyToEmailId: "em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA", + textContent: "The plain text version of your reply goes here.", + markdownContent: "The markdown **version** of your _reply_ goes here.", }); - + if (res.error) { console.error(res.error); } else { console.log(res.data); } ``` + @@ -66,6 +67,7 @@ mutation replyToEmail($input: ReplyToEmailInput!) { } } ``` + diff --git a/pages/graphql/messaging/send-email.mdx b/pages/graphql/messaging/send-email.mdx index 095fa94..2f443b0 100644 --- a/pages/graphql/messaging/send-email.mdx +++ b/pages/graphql/messaging/send-email.mdx @@ -28,6 +28,7 @@ if (res.error) { + ```graphql Mutation mutation sendNewEmail($input: SendNewEmailInput!) { sendNewEmail(input: $input) { diff --git a/pages/graphql/pagination.mdx b/pages/graphql/pagination.mdx index c633061..f5ce491 100644 --- a/pages/graphql/pagination.mdx +++ b/pages/graphql/pagination.mdx @@ -47,10 +47,12 @@ if (firstPage.error) { } } ``` + This will fetch a subsequent page of 50 entries by passing in the `endCursor` from an initial query. + ```grapql Second page query getCustomers($cursor: String!) { customers(after: $cursor, first: 50) { diff --git a/pages/graphql/threads.mdx b/pages/graphql/threads.mdx index f55a1ef..3b45f7f 100644 --- a/pages/graphql/threads.mdx +++ b/pages/graphql/threads.mdx @@ -13,9 +13,10 @@ Threads belong to one customer but can contain multiple email threads and custom An example thread looks like this: - The below is only showing a subset fields a thread has. Since our API is a GraphQL API you - decide which fields you need when you make API requests. Use our [API - explorer](https://app.plain.com/developer/api-explorer) to discover the full schema of threads. + The below is only showing a subset fields a thread has. Since our API is a + GraphQL API you decide which fields you need when you make API requests. Use + our [API explorer](https://app.plain.com/developer/api-explorer) to discover + the full schema of threads. diff --git a/pages/graphql/threads/assignment.mdx b/pages/graphql/threads/assignment.mdx index 2200251..dd72906 100644 --- a/pages/graphql/threads/assignment.mdx +++ b/pages/graphql/threads/assignment.mdx @@ -1,9 +1,9 @@ -import { Tabs, Tab } from 'nextra-theme-docs'; -import AssignThreadTypescriptSDK from '../../../snippets/typescript-sdk/assign-thread.mdx'; -import AssignThreadResponseTypescriptSDK from '../../../snippets/typescript-sdk/assign-thread-response.mdx'; -import AssignThreadGraphQL from '../../../snippets/graphql/assign-thread.mdx'; -import UnassignThreadTypescriptSDK from '../../../snippets/typescript-sdk/unassign-thread.mdx'; -import UnassignThreadGraphQL from '../../../snippets/graphql/unassign-thread.mdx'; +import { Tabs, Tab } from "nextra-theme-docs"; +import AssignThreadTypescriptSDK from "../../../snippets/typescript-sdk/assign-thread.mdx"; +import AssignThreadResponseTypescriptSDK from "../../../snippets/typescript-sdk/assign-thread-response.mdx"; +import AssignThreadGraphQL from "../../../snippets/graphql/assign-thread.mdx"; +import UnassignThreadTypescriptSDK from "../../../snippets/typescript-sdk/unassign-thread.mdx"; +import UnassignThreadGraphQL from "../../../snippets/graphql/unassign-thread.mdx"; # Assign threads @@ -63,59 +63,60 @@ if (res.error) { Where res.data is the full thread: { - "__typename": "Thread", - "id": "th_01H8H46YPB2S4MAJM382FG9423", - "externalId": null, - "customer": { - "id": "c_01H8H46Y7N69VTSF4WXCJTVATZ" - }, - "status": "TODO", - "statusChangedAt": { - "__typename": "DateTime", - "iso8601": "2023-08-23T11:59:22.315Z", - "unixTimestamp": "1692791962315" - }, - "title": "Support request", - "previewText": "Hello can you please...", - "priority": 2, - "labels": [], - "assignedAt": { - "__typename": "DateTime", - "iso8601": "2023-10-05T13:12:12.050Z", - "unixTimestamp": "1696511532050" - }, - "assignedTo": { - "__typename": "User", - "id": "u_01FSVKMHFDHJ3H5XFM20EMCBQN", - "fullName": "Matt Vagni", - "publicName": "Matt", - "email": "matt@plain.com", - "updatedAt": { - "__typename": "DateTime", - "iso8601": "2023-05-16T12:36:52.266Z", - "unixTimestamp": "1684240612266" - } - }, - "createdAt": { - "__typename": "DateTime", - "iso8601": "2023-08-23T11:59:22.315Z", - "unixTimestamp": "1692791962315" - }, - "createdBy": { - "__typename": "MachineUserActor", - "machineUserId": "mu_01H0J96X3KJ3C2S2W9T5S3CC1R" - }, - "updatedAt": { - "__typename": "DateTime", - "iso8601": "2023-10-05T13:12:12.050Z", - "unixTimestamp": "1696511532050" - }, - "updatedBy": { - "__typename": "MachineUserActor", - "machineUserId": "mu_01HBZM0TZAKAZPJ47NX7X7XMDY" - } +"**typename": "Thread", +"id": "th_01H8H46YPB2S4MAJM382FG9423", +"externalId": null, +"customer": { +"id": "c_01H8H46Y7N69VTSF4WXCJTVATZ" +}, +"status": "TODO", +"statusChangedAt": { +"**typename": "DateTime", +"iso8601": "2023-08-23T11:59:22.315Z", +"unixTimestamp": "1692791962315" +}, +"title": "Support request", +"previewText": "Hello can you please...", +"priority": 2, +"labels": [], +"assignedAt": { +"**typename": "DateTime", +"iso8601": "2023-10-05T13:12:12.050Z", +"unixTimestamp": "1696511532050" +}, +"assignedTo": { +"**typename": "User", +"id": "u_01FSVKMHFDHJ3H5XFM20EMCBQN", +"fullName": "Matt Vagni", +"publicName": "Matt", +"email": "matt@plain.com", +"updatedAt": { +"**typename": "DateTime", +"iso8601": "2023-05-16T12:36:52.266Z", +"unixTimestamp": "1684240612266" } -``` +}, +"createdAt": { +"**typename": "DateTime", +"iso8601": "2023-08-23T11:59:22.315Z", +"unixTimestamp": "1692791962315" +}, +"createdBy": { +"**typename": "MachineUserActor", +"machineUserId": "mu_01H0J96X3KJ3C2S2W9T5S3CC1R" +}, +"updatedAt": { +"**typename": "DateTime", +"iso8601": "2023-10-05T13:12:12.050Z", +"unixTimestamp": "1696511532050" +}, +"updatedBy": { +"\_\_typename": "MachineUserActor", +"machineUserId": "mu_01HBZM0TZAKAZPJ47NX7X7XMDY" +} +} + +```` ```graphql Mutation @@ -127,19 +128,20 @@ mutation assignThread($input: AssignThreadInput!) { } } } -``` +```` ```json Variables { "input": { "threadId": "th_01H8H46YPB2S4MAJM382FG9423", "userId": "u_01FSVKMHFDHJ3H5XFM20EMCBQN" - + // You could instead assign to a machine user by doing: // machineUserId: 'XXX' } } ``` + @@ -190,5 +192,6 @@ mutation unassignThread($input: UnassignThreadInput!) { } } ``` + diff --git a/pages/graphql/threads/create.mdx b/pages/graphql/threads/create.mdx index 73c268d..67d2e72 100644 --- a/pages/graphql/threads/create.mdx +++ b/pages/graphql/threads/create.mdx @@ -25,22 +25,22 @@ To create a thread you need a `customerId`. You can get a customer id by [creati - `user:read` ```typescript -import { PlainClient } from '@team-plain/typescript-sdk'; - +import { PlainClient } from "@team-plain/typescript-sdk"; + const client = new PlainClient({ - apiKey: 'XXX', + apiKey: "XXX", debug: true, }); - + const res = await client.createThread({ - title: 'Bug Report', + title: "Bug Report", customerIdentifier: { // You can use the email: - email: 'jane@acme.com', - + email: "jane@acme.com", + // ...or if you set external id on customers: // externalId: '', - + // ...or you can use the customer's id in Plain: // customerId: 'c_123' }, @@ -53,9 +53,9 @@ const res = await client.createThread({ ], // Label types are created in settings where you can also copy // their ID. - labelTypeIds: ['lt_01HB924PME9C0YWKW1N4AK3BZA'], + labelTypeIds: ["lt_01HB924PME9C0YWKW1N4AK3BZA"], }); - + if (res.error) { console.error(res.error); } else { diff --git a/pages/graphql/threads/status-changes.mdx b/pages/graphql/threads/status-changes.mdx index 0664668..500ff61 100644 --- a/pages/graphql/threads/status-changes.mdx +++ b/pages/graphql/threads/status-changes.mdx @@ -87,6 +87,7 @@ mutation markThreadAsDone($input: MarkThreadAsDoneInput!) { } } ``` + @@ -162,6 +163,7 @@ mutation snoozeThread($input: SnoozeThreadInput!) { } } ``` + diff --git a/pages/graphql/typescript-sdk.mdx b/pages/graphql/typescript-sdk.mdx index 10a08f9..fefbc36 100644 --- a/pages/graphql/typescript-sdk.mdx +++ b/pages/graphql/typescript-sdk.mdx @@ -2,4 +2,4 @@ title: "Typescript SDK" icon: "link" url: "https://github.com/team-plain/typescript-sdk/" ---- \ No newline at end of file +--- diff --git a/pages/linear-integration-setup.mdx b/pages/linear-integration-setup.mdx index 6020a37..0258e72 100644 --- a/pages/linear-integration-setup.mdx +++ b/pages/linear-integration-setup.mdx @@ -5,7 +5,10 @@ description: "To easily keep track of feature requests and bugs reported in Plai This lets you easily link a Linear issue to a thread. -![Screenshot of the floating contact form](/public/images/linear-integration/linear-integration.png) + + ![Screenshot of the floating contact + form](/public/images/linear-integration/linear-integration.png) + To do this, head to **Settings** → **Linear integration** and connect your workspace. diff --git a/pages/migrate-to-threads.mdx b/pages/migrate-to-threads.mdx index 4061cdc..d69e2c8 100644 --- a/pages/migrate-to-threads.mdx +++ b/pages/migrate-to-threads.mdx @@ -3,8 +3,8 @@ title: "Migrating to threads" --- - This only applies to you if you are using the Plain API or webhooks. If you are using neither, - feel free to ignore this! + This only applies to you if you are using the Plain API or webhooks. If you + are using neither, feel free to ignore this! Furthermore, this migration only applies to you if you use _any_ of the following Plain APIs: @@ -29,8 +29,9 @@ Or if you are using _any_ of the following webhooks : If you run into **any** issues, please reach out to us via the app (**⌘ + K** and then search for "Question") or email us at [help@plain.com](mailto:help@plain.com). - Once you have fully migrated across, please let us know and we will enable a feature flag for your - workspace giving you the full benefits of threads within Plain. + Once you have fully migrated across, please let us know and we will enable a + feature flag for your workspace giving you the full benefits of threads within + Plain. ## New data model diff --git a/pages/ui-components.mdx b/pages/ui-components.mdx index 38c19fa..8881660 100644 --- a/pages/ui-components.mdx +++ b/pages/ui-components.mdx @@ -18,7 +18,8 @@ For example - this is a button that links to Stripe. and it looks like this: - ![Example button linking to stripe](/public/images/ui-components/link-button-stripe.png) + ![Example button linking to + stripe](/public/images/ui-components/link-button-stripe.png) In the GraphQL API schema, we have two separate unions for Custom Timeline Entry Components and Customer Card diff --git a/pages/ui-components/badge.mdx b/pages/ui-components/badge.mdx index 01be65a..b9af334 100644 --- a/pages/ui-components/badge.mdx +++ b/pages/ui-components/badge.mdx @@ -3,9 +3,7 @@ title: "Badge" description: "Useful for statuses or when you need to attract attention to something." --- - - ![Example badges](/public/images/ui-components/badge.png) - +![Example badges](/public/images/ui-components/badge.png) A badge has the following properties: @@ -24,6 +22,7 @@ uiComponent.badge({ label: 'Subscribed', color: 'GREEN' }); + ```json { "componentBadge": { @@ -32,6 +31,7 @@ uiComponent.badge({ label: 'Subscribed', color: 'GREEN' }); } } ``` + diff --git a/pages/ui-components/container.mdx b/pages/ui-components/container.mdx index 6f8f062..b4ae097 100644 --- a/pages/ui-components/container.mdx +++ b/pages/ui-components/container.mdx @@ -3,9 +3,7 @@ title: "Container" description: "Useful when you need to create a bit of structure." --- - - ![Example container](/public//images/ui-components/container.png) - +![Example container](/public//images/ui-components/container.png) A container has the following properties: @@ -36,6 +34,7 @@ uiComponent.container({ + ```json { "componentContainer": { @@ -49,6 +48,7 @@ uiComponent.container({ } } ``` + diff --git a/pages/ui-components/copy-button.mdx b/pages/ui-components/copy-button.mdx index ea4aee6..8443a3d 100644 --- a/pages/ui-components/copy-button.mdx +++ b/pages/ui-components/copy-button.mdx @@ -28,6 +28,7 @@ uiComponent.copyButton({ + ```json { "componentCopyButton": { @@ -36,6 +37,7 @@ uiComponent.copyButton({ } } ``` + diff --git a/pages/ui-components/divider.mdx b/pages/ui-components/divider.mdx index 6162fb3..9b6043e 100644 --- a/pages/ui-components/divider.mdx +++ b/pages/ui-components/divider.mdx @@ -3,9 +3,7 @@ title: "Divider" description: "Useful when you need a bit of structure." --- - - ![Example divider](/public/images/ui-components/divider.png) - +![Example divider](/public/images/ui-components/divider.png) A divider has the following properties: @@ -28,6 +26,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; + ```json [ { @@ -46,6 +45,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; } } ``` + diff --git a/pages/ui-components/link-button.mdx b/pages/ui-components/link-button.mdx index ffd9aa2..2e9fa00 100644 --- a/pages/ui-components/link-button.mdx +++ b/pages/ui-components/link-button.mdx @@ -27,6 +27,7 @@ uiComponent.linkButton({ + ```json { "componentLinkButton": { @@ -35,6 +36,7 @@ uiComponent.linkButton({ } } ``` + diff --git a/pages/ui-components/plain-text.mdx b/pages/ui-components/plain-text.mdx index 91d529c..f8b57a5 100644 --- a/pages/ui-components/plain-text.mdx +++ b/pages/ui-components/plain-text.mdx @@ -41,6 +41,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; + ```json [ { @@ -93,6 +94,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; } ] ``` + diff --git a/pages/ui-components/row.mdx b/pages/ui-components/row.mdx index bcec938..b1bbd77 100644 --- a/pages/ui-components/row.mdx +++ b/pages/ui-components/row.mdx @@ -35,6 +35,7 @@ uiComponent.row({ + ```json { "componentRow": { @@ -56,6 +57,7 @@ uiComponent.row({ } } ``` + diff --git a/pages/ui-components/spacer.mdx b/pages/ui-components/spacer.mdx index 19aa38d..17e0f98 100644 --- a/pages/ui-components/spacer.mdx +++ b/pages/ui-components/spacer.mdx @@ -2,9 +2,7 @@ title: "Spacer" --- - - ![Example spacer](/public/images/ui-components/spacer.png) - +![Example spacer](/public/images/ui-components/spacer.png) A link button has the following properties: @@ -26,6 +24,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; + ```json [ { @@ -45,6 +44,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; } ] ``` + diff --git a/pages/ui-components/text.mdx b/pages/ui-components/text.mdx index 3732cc8..ccb99ca 100644 --- a/pages/ui-components/text.mdx +++ b/pages/ui-components/text.mdx @@ -42,6 +42,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; + ```json [ { @@ -99,6 +100,7 @@ import { uiComponent } from '@team-plain/typescript-sdk'; } ] ``` + diff --git a/pages/webhooks.mdx b/pages/webhooks.mdx index 2e767b4..a2a0fb2 100644 --- a/pages/webhooks.mdx +++ b/pages/webhooks.mdx @@ -28,14 +28,14 @@ to receive and whether you want to enable it straight away. You can create up to **25 webhook targets** per workspace. - Plain events may contain Personally Identifiable Information (PII). If you want to test webhooks - with a production workspace, take the necessary precautions to avoid leaking PII to untrusted - parties. + Plain events may contain Personally Identifiable Information (PII). If you + want to test webhooks with a production workspace, take the necessary + precautions to avoid leaking PII to untrusted parties. - We have created a repository where you will find instructions on how to create a webhook endpoint - using different programming languages. You can find it + We have created a repository where you will find instructions on how to create + a webhook endpoint using different programming languages. You can find it [here](https://github.com/team-plain/webhooks-resources/tree/main/servers). diff --git a/pages/webhooks/customer-updated.mdx b/pages/webhooks/customer-updated.mdx index c9730e6..d0ded95 100644 --- a/pages/webhooks/customer-updated.mdx +++ b/pages/webhooks/customer-updated.mdx @@ -88,5 +88,4 @@ Example: }, "type": "customer.customer_updated" } - ``` diff --git a/pages/webhooks/email-received.mdx b/pages/webhooks/email-received.mdx index 8c4e0cb..ab540cc 100644 --- a/pages/webhooks/email-received.mdx +++ b/pages/webhooks/email-received.mdx @@ -4,10 +4,11 @@ description: "This event is fired when an email is received in your workspace." --- - An important field that might go unnoticed is `isStartOfThread`. This will tell you if this email - is the first message of a thread or not, which is useful if you want to build some auto-reply - logic. If you want to build an auto-responder that *only replies* to the first message of a - thread, please check [`thread.thread_created`](/webhooks/thread-created) instead. + An important field that might go unnoticed is `isStartOfThread`. This will + tell you if this email is the first message of a thread or not, which is + useful if you want to build some auto-reply logic. If you want to build an + auto-responder that *only replies* to the first message of a thread, please + check [`thread.thread_created`](/webhooks/thread-created) instead. ## Schema diff --git a/pages/webhooks/email-sent.mdx b/pages/webhooks/email-sent.mdx index e353dac..7422032 100644 --- a/pages/webhooks/email-sent.mdx +++ b/pages/webhooks/email-sent.mdx @@ -4,10 +4,11 @@ description: "This event is fired when an email is received in your workspace." --- - An important field that might go unnoticed is `isStartOfThread`. This will tell you if this email - is the first message of a thread or not, which is useful if you want to build some auto-reply - logic. If you want to build an auto-responder that *only replies* to the first message of a - thread, please check [`thread.thread_created`](/webhooks/thread-created) instead. + An important field that might go unnoticed is `isStartOfThread`. This will + tell you if this email is the first message of a thread or not, which is + useful if you want to build some auto-reply logic. If you want to build an + auto-responder that *only replies* to the first message of a thread, please + check [`thread.thread_created`](/webhooks/thread-created) instead. ## Schema diff --git a/pages/webhooks/thread-created.mdx b/pages/webhooks/thread-created.mdx index 3f2cf2f..ff35fdf 100644 --- a/pages/webhooks/thread-created.mdx +++ b/pages/webhooks/thread-created.mdx @@ -6,12 +6,13 @@ description: "This event is fired when a new thread is created in your workspace You can subscribe to this event **if you want to build an auto-responder**. To do so, when you receive this event, use the `replyToThread` mutation to send a reply back to the customer. - Every email you receive in your workspace is linked to a thread. If we cannot find a matching - thread for an email, we will create one. When this happens, you may receive two events: - `thread.thread_created` and [`thread.email_received`](/webhooks/email-received) (depending on your - webhook target event subscriptions). If you do, and you only care about emails which are not the - first message of the thread, please check the `isStartOfThread` in the - [`thread.email_received`](/webhooks/email-received) payload. + Every email you receive in your workspace is linked to a thread. If we cannot + find a matching thread for an email, we will create one. When this happens, + you may receive two events: `thread.thread_created` and + [`thread.email_received`](/webhooks/email-received) (depending on your webhook + target event subscriptions). If you do, and you only care about emails which + are not the first message of the thread, please check the `isStartOfThread` in + the [`thread.email_received`](/webhooks/email-received) payload. ## Schema diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0e9bfe1 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3069 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + mintlify: + specifier: ^4.0.58 + version: 4.0.58(axios@1.6.2)(openapi-types@12.1.3) + prettier: + specifier: ^3.1.0 + version: 3.1.0 + +packages: + + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} + dependencies: + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/openapi-schemas@2.1.0: + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + dev: false + + /@apidevtools/swagger-methods@3.0.2: + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + dev: false + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): + resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.6 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + dev: false + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: false + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: false + + /@mintlify/cli@4.0.58(axios@1.6.2)(openapi-types@12.1.3): + resolution: {integrity: sha512-bWXn5OpG9YIY6p8Gacks9/nTQAZndxhdqHroewV0faMHt47OeuLU/IiGUF32hyE8NwWWziHOOpk3CVcKm9er6Q==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@mintlify/link-rot': 3.0.80(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2) + '@mintlify/models': 0.0.54(axios@1.6.2)(openapi-types@12.1.3) + '@mintlify/prebuild': 1.0.80(@apidevtools/swagger-parser@10.1.0)(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2)(fs-extra@11.1.1)(gray-matter@4.0.3)(openapi-types@12.1.3)(unist-util-visit@4.1.2) + '@mintlify/previewing': 4.0.57(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2) + '@mintlify/validation': 0.1.101(@mintlify/models@0.0.54)(openapi-types@12.1.3) + chalk: 5.3.0 + detect-port: 1.5.1 + fs-extra: 11.1.1 + gray-matter: 4.0.3 + unist-util-visit: 4.1.2 + yargs: 17.7.2 + transitivePeerDependencies: + - axios + - bufferutil + - encoding + - openapi-types + - supports-color + - utf-8-validate + dev: false + + /@mintlify/common@1.0.15(axios@1.6.2)(openapi-types@12.1.3): + resolution: {integrity: sha512-9w5Km3UqdZXxzSgntab9vzuDW1vqWatk1xY2soc5e0fxVl4075JshSKBejm66SW8KABGyT00CLvQ7toNAWjO2Q==} + dependencies: + '@mintlify/models': 0.0.54(axios@1.6.2)(openapi-types@12.1.3) + remark: 14.0.3 + remark-frontmatter: 4.0.1 + remark-gfm: 3.0.1 + remark-math: 5.1.1 + remark-mdx: 2.3.0 + transitivePeerDependencies: + - axios + - openapi-types + - supports-color + dev: false + + /@mintlify/link-rot@3.0.80(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2): + resolution: {integrity: sha512-ds49vEdhJIJdMZf5H/kf/0i2SuR4Ejpw3UdpEJIxgP1oPkal74nsTwsYYB1ldkrjtgLT8g7xdBM86+V+gsMszA==} + engines: {node: '>=18.0.0'} + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@mintlify/common': 1.0.15(axios@1.6.2)(openapi-types@12.1.3) + '@mintlify/prebuild': 1.0.80(@apidevtools/swagger-parser@10.1.0)(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2)(fs-extra@11.1.1)(gray-matter@4.0.3)(openapi-types@12.1.3)(unist-util-visit@4.1.2) + chalk: 5.3.0 + fs-extra: 11.1.1 + gray-matter: 4.0.3 + is-absolute-url: 4.0.1 + openapi-types: 12.1.3 + unist-util-visit: 4.1.2 + transitivePeerDependencies: + - '@mintlify/models' + - '@mintlify/validation' + - axios + - supports-color + dev: false + + /@mintlify/models@0.0.54(axios@1.6.2)(openapi-types@12.1.3): + resolution: {integrity: sha512-iMIxGKqD8VT4rxYFcD7RlOlKrjkbtwERRSk0T7FURvWh+vi8iTCLoLphHyp+ML5h3JMOH3m/FcHtCcvHklmmQw==} + engines: {node: '>=18.0.0'} + peerDependencies: + axios: ^1.4.0 + openapi-types: 12.x + dependencies: + axios: 1.6.2 + openapi-types: 12.1.3 + dev: false + + /@mintlify/prebuild@1.0.80(@apidevtools/swagger-parser@10.1.0)(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2)(fs-extra@11.1.1)(gray-matter@4.0.3)(openapi-types@12.1.3)(unist-util-visit@4.1.2): + resolution: {integrity: sha512-d6MvLKNmMst3tvZ5cU4FYWmHnWmG6+NLt7VPpXfvZmLsAZDwmSLRhqn7O8/f+LDH1xj2Fq+yBzMPj6h2Z8Rtaw==} + peerDependencies: + '@apidevtools/swagger-parser': 10.x + '@mintlify/models': '>= 0.0.15 < 1' + '@mintlify/validation': '>= 0.1.57 < 1' + fs-extra: 11.x + gray-matter: ^4.0.3 + openapi-types: 12.x + unist-util-visit: ^4.1.1 + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@mintlify/common': 1.0.15(axios@1.6.2)(openapi-types@12.1.3) + '@mintlify/models': 0.0.54(axios@1.6.2)(openapi-types@12.1.3) + '@mintlify/validation': 0.1.101(@mintlify/models@0.0.54)(openapi-types@12.1.3) + favicons: 7.1.4 + fs-extra: 11.1.1 + gray-matter: 4.0.3 + openapi-types: 12.1.3 + unist-util-visit: 4.1.2 + transitivePeerDependencies: + - axios + - supports-color + dev: false + + /@mintlify/previewing@4.0.57(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2): + resolution: {integrity: sha512-EduErRmmFnWYsBqzwoBhSa4yYXnwaqfOvXaZZIhCoQKYQOhdCg7fZkOpojHcQ0caVV8hSE8Qv4YRQsAGiuHMjw==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@mintlify/validation': '>= 0.1.48 < 1' + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + '@mintlify/prebuild': 1.0.80(@apidevtools/swagger-parser@10.1.0)(@mintlify/models@0.0.54)(@mintlify/validation@0.1.101)(axios@1.6.2)(fs-extra@11.1.1)(gray-matter@4.0.3)(openapi-types@12.1.3)(unist-util-visit@4.1.2) + '@mintlify/validation': 0.1.101(@mintlify/models@0.0.54)(openapi-types@12.1.3) + '@octokit/rest': 19.0.13 + chalk: 5.3.0 + chokidar: 3.5.3 + express: 4.18.2 + fs-extra: 11.1.1 + got: 13.0.0 + gray-matter: 4.0.3 + is-absolute-url: 4.0.1 + is-online: 10.0.0 + open: 8.4.2 + openapi-types: 12.1.3 + ora: 6.3.1 + socket.io: 4.7.2 + tar: 6.2.0 + unist-util-visit: 4.1.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@mintlify/models' + - axios + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@mintlify/validation@0.1.101(@mintlify/models@0.0.54)(openapi-types@12.1.3): + resolution: {integrity: sha512-ylrL881NmjewoX9mos1PAujmrD3mWiBjZuO4ffJ6cvoQMFvDbJgyNFttvdCqA4jIl4A2SkZ0JW3RlcaFeJ7Gzg==} + peerDependencies: + '@mintlify/models': '>= 0.0.36 < 1' + openapi-types: 12.x + dependencies: + '@mintlify/models': 0.0.54(axios@1.6.2)(openapi-types@12.1.3) + lcm: 0.0.3 + lodash: 4.17.21 + openapi-types: 12.1.3 + zod: 3.22.4 + zod-to-json-schema: 3.21.4(zod@3.22.4) + dev: false + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: false + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.1 + dev: false + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@18.1.1: + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + dev: false + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: false + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: false + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: false + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: false + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.7.0 + universal-user-agent: 6.0.1 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: false + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: false + + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + dev: false + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: false + + /@types/cors@2.8.16: + resolution: {integrity: sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==} + dependencies: + '@types/node': 20.9.1 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/hast@2.3.8: + resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: false + + /@types/katex@0.16.6: + resolution: {integrity: sha512-rZYO1HInM99rAFYNwGqbYPxHZHxu2IwZYKj4bJ4oh6edVrm1UId8mmbHIZLBtG253qU6y3piag0XYe/joNnwzQ==} + dev: false + + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + + /@types/node@20.9.1: + resolution: {integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: false + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + dev: false + + /aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: false + + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: false + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: false + + /dns-socket@4.2.2: + resolution: {integrity: sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==} + engines: {node: '>=6'} + dependencies: + dns-packet: 5.6.1 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + dev: false + + /engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.16 + '@types/node': 20.9.1 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.2.1 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: false + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 2.0.10 + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + + /favicons@7.1.4: + resolution: {integrity: sha512-lnZpVgT7Fzz+DUjioKF1dMwLYlpqWCaB4gIksIfIKwtlhHO1Q7w23hERwHQjEsec+43iENwbTAPRDW3XvpLhbg==} + engines: {node: '>=14.0.0'} + dependencies: + escape-html: 1.0.3 + sharp: 0.32.6 + xml2js: 0.6.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /gcd@0.0.1: + resolution: {integrity: sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw==} + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: false + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + dependencies: + ip-regex: 4.3.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-online@10.0.0: + resolution: {integrity: sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + p-any: 4.0.0 + p-timeout: 5.1.0 + public-ip: 5.0.0 + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /lcm@0.0.3: + resolution: {integrity: sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ==} + dependencies: + gcd: 0.0.1 + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.15 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-frontmatter@1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.15 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.15 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-math@2.0.2: + resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + dependencies: + '@types/mdast': 3.0.15 + longest-streak: 3.1.0 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 2.3.8 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.15 + unist-util-is: 5.2.1 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.15 + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-frontmatter@1.1.1: + resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + dependencies: + fault: 2.0.1 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-math@2.1.2: + resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + dependencies: + '@types/katex': 0.16.6 + katex: 0.16.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.5 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.5 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.5 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 2.0.10 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mintlify@4.0.58(axios@1.6.2)(openapi-types@12.1.3): + resolution: {integrity: sha512-gY8NeU0Vrx30q0WLkN77oMEd99inVoa6xQeSeg8yCJwN4oNEr60PaDwygOxB9g1ev16CSh4au5XLhj7KZFi1+g==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@mintlify/cli': 4.0.58(axios@1.6.2)(openapi-types@12.1.3) + transitivePeerDependencies: + - axios + - bufferutil + - encoding + - openapi-types + - supports-color + - utf-8-validate + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + + /ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.1 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + dev: false + + /p-any@4.0.0: + resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} + engines: {node: '>=12.20'} + dependencies: + p-cancelable: 3.0.0 + p-some: 6.0.0 + dev: false + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + + /p-some@6.0.0: + resolution: {integrity: sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg==} + engines: {node: '>=12.20'} + dependencies: + aggregate-error: 4.0.1 + p-cancelable: 3.0.0 + dev: false + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /public-ip@5.0.0: + resolution: {integrity: sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw==} + engines: {node: ^14.13.1 || >=16.0.0} + dependencies: + dns-socket: 4.2.2 + got: 12.6.1 + is-ip: 3.1.0 + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /remark-frontmatter@4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 + unified: 10.1.2 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-math@5.1.1: + resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-math: 2.0.2 + micromark-extension-math: 2.1.2 + unified: 10.1.2 + dev: false + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + unified: 10.1.2 + dev: false + + /remark@14.0.3: + resolution: {integrity: sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==} + dependencies: + '@types/mdast': 3.0.15 + remark-parse: 10.0.2 + remark-stringify: 10.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + dependencies: + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io@4.7.2: + resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4 + engine.io: 6.5.4 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /streamx@2.15.5: + resolution: {integrity: sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.5 + dev: false + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.10 + unist-util-visit: 4.1.2 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /zod-to-json-schema@3.21.4(zod@3.22.4): + resolution: {integrity: sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw==} + peerDependencies: + zod: ^3.21.4 + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false From 265ad171df9b2f10bbc73f3341cfa45b0820f6ce Mon Sep 17 00:00:00 2001 From: Mathias Vagni Date: Fri, 17 Nov 2023 16:57:23 +0100 Subject: [PATCH 2/3] Update gitignore --- .gitignore | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b512c09..30dd713 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,13 @@ -node_modules \ No newline at end of file +node_modules + +# Misc +.DS_Store + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log + +# We use pnpm and not npm +package-lock.json \ No newline at end of file From da2d5666b750c3efc2dc93c20f7ddeb4978bcd1a Mon Sep 17 00:00:00 2001 From: Mathias Vagni Date: Fri, 17 Nov 2023 17:05:19 +0100 Subject: [PATCH 3/3] Fix linting --- .perttierrc.json | 6 -- .prettierrc.json | 6 ++ _snippets/browser/upload-attachment.mdx | 11 ++-- _snippets/graphql/add-labels.mdx | 5 +- .../graphql/remove-customer-from-groups.mdx | 4 +- _snippets/node/upload-attachment.mdx | 10 ++-- .../add-customer-to-group-response.mdx | 60 +++++++++---------- .../typescript-sdk/add-customer-to-group.mdx | 10 ++-- _snippets/typescript-sdk/add-labels.mdx | 8 +-- _snippets/typescript-sdk/assign-thread.mdx | 8 +-- .../typescript-sdk/create-attachment-url.mdx | 10 ++-- .../typescript-sdk/create-customer-event.mdx | 20 +++---- _snippets/typescript-sdk/create-thread.mdx | 10 ++-- _snippets/typescript-sdk/delete-customer.mdx | 6 +- _snippets/typescript-sdk/error-handling.mdx | 10 ++-- _snippets/typescript-sdk/first-api-call.mdx | 6 +- .../typescript-sdk/get-customer-by-email.mdx | 4 +- .../typescript-sdk/get-customer-by-id.mdx | 4 +- _snippets/typescript-sdk/get-customers.mdx | 2 +- .../typescript-sdk/mark-thread-as-done.mdx | 6 +- .../typescript-sdk/mark-thread-as-todo.mdx | 6 +- _snippets/typescript-sdk/page-info-after.mdx | 4 +- .../remove-customer-from-groups.mdx | 10 ++-- _snippets/typescript-sdk/remove-labels.mdx | 6 +- _snippets/typescript-sdk/reply-email.mdx | 12 ++-- _snippets/typescript-sdk/send-email.mdx | 14 ++--- _snippets/typescript-sdk/snooze-thread.mdx | 6 +- _snippets/typescript-sdk/ui-badge.mdx | 4 +- _snippets/typescript-sdk/ui-container.mdx | 4 +- _snippets/typescript-sdk/ui-copy-button.mdx | 6 +- _snippets/typescript-sdk/ui-divider.mdx | 8 +-- _snippets/typescript-sdk/ui-link-button.mdx | 6 +- _snippets/typescript-sdk/ui-plain-text.mdx | 18 +++--- _snippets/typescript-sdk/ui-row.mdx | 6 +- _snippets/typescript-sdk/ui-spacer.mdx | 8 +-- _snippets/typescript-sdk/ui-text.mdx | 20 +++---- _snippets/typescript-sdk/unassign-thread.mdx | 6 +- _snippets/typescript-sdk/upsert-customer.mdx | 24 ++++---- pages/attachments.mdx | 33 +++++----- pages/contact-forms-setup.mdx | 4 +- pages/customer-cards-setup.mdx | 4 +- pages/customer-cards.mdx | 6 +- pages/customer-cards/documentation.mdx | 4 +- pages/customer-cards/examples.mdx | 6 +- pages/customer-cards/playground.mdx | 6 +- pages/email-setup.mdx | 2 +- pages/email-setup/receiving-emails.mdx | 5 +- pages/email-setup/sending-emails.mdx | 4 +- pages/events-setup.mdx | 6 +- pages/graphql.mdx | 12 ++-- pages/graphql/api-explorer.mdx | 6 +- pages/graphql/authentication.mdx | 2 +- pages/graphql/customers.mdx | 6 +- pages/graphql/customers/customer-groups.mdx | 28 ++++----- pages/graphql/customers/delete.mdx | 6 +- pages/graphql/customers/get.mdx | 2 +- pages/graphql/customers/upsert.mdx | 28 ++++----- pages/graphql/error-codes.mdx | 4 +- pages/graphql/error-handling.mdx | 14 ++--- pages/graphql/events.mdx | 6 +- .../graphql/events/create-customer-event.mdx | 7 +-- pages/graphql/labels.mdx | 6 +- pages/graphql/labels/add.mdx | 9 +-- pages/graphql/labels/remove.mdx | 4 +- pages/graphql/messaging.mdx | 6 +- pages/graphql/messaging/reply-email.mdx | 18 +++--- pages/graphql/messaging/send-email.mdx | 4 +- pages/graphql/pagination.mdx | 4 +- pages/graphql/schema.mdx | 2 +- pages/graphql/threads.mdx | 9 ++- pages/graphql/threads/assignment.mdx | 12 ++-- pages/graphql/threads/create.mdx | 12 ++-- pages/graphql/threads/status-changes.mdx | 2 +- pages/graphql/typescript-sdk.mdx | 6 +- pages/introduction.mdx | 4 +- pages/labels-setup.mdx | 4 +- pages/linear-integration-setup.mdx | 4 +- pages/migrate-to-threads.mdx | 11 ++-- pages/security.mdx | 4 +- pages/ui-components.mdx | 7 +-- pages/ui-components/badge.mdx | 4 +- pages/ui-components/container.mdx | 4 +- pages/ui-components/copy-button.mdx | 8 +-- pages/ui-components/divider.mdx | 4 +- pages/ui-components/link-button.mdx | 8 +-- pages/ui-components/plain-text.mdx | 8 +-- pages/ui-components/row.mdx | 4 +- pages/ui-components/spacer.mdx | 2 +- pages/ui-components/text.mdx | 2 +- pages/webhooks.mdx | 12 ++-- pages/webhooks/customer-created.mdx | 4 +- pages/webhooks/customer-deleted.mdx | 4 +- .../customer-group-membership-changed.mdx | 4 +- pages/webhooks/customer-updated.mdx | 4 +- pages/webhooks/email-received.mdx | 13 ++-- pages/webhooks/email-sent.mdx | 13 ++-- .../thread-assignment-transitioned.mdx | 4 +- pages/webhooks/thread-created.mdx | 17 +++--- pages/webhooks/thread-labels-changed.mdx | 4 +- pages/webhooks/thread-priority-changed.mdx | 4 +- pages/webhooks/thread-status-transitioned.mdx | 4 +- 101 files changed, 398 insertions(+), 436 deletions(-) delete mode 100644 .perttierrc.json create mode 100644 .prettierrc.json diff --git a/.perttierrc.json b/.perttierrc.json deleted file mode 100644 index f6ebd00..0000000 --- a/.perttierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 100, - "trailingComma": "es5", - "singleQuote": true, - "tabWidth": 2 -} \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..29fe544 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "trailingComma": "es5", + "singleQuote": true, + "tabWidth": 2 +} diff --git a/_snippets/browser/upload-attachment.mdx b/_snippets/browser/upload-attachment.mdx index 0a65940..5b40130 100644 --- a/_snippets/browser/upload-attachment.mdx +++ b/_snippets/browser/upload-attachment.mdx @@ -12,13 +12,13 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { form.append(key, value); }); - const file = new File([fileBlob], "file"); - form.append("file", file); + const file = new File([fileBlob], 'file'); + form.append('file', file); console.log(`Uploading attachment to ${uploadFormUrl}`); fetch(uploadFormUrl, { - method: "POST", + method: 'POST', body: form, }) .then((res) => { @@ -28,10 +28,7 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { console.log(`File successfully uploaded! (code=${res.status})`); }) .catch((err) => { - console.log( - `There was an error uploading the file: %s`, - err.message ? err.message : err, - ); + console.log(`There was an error uploading the file: %s`, err.message ? err.message : err); }); } ``` diff --git a/_snippets/graphql/add-labels.mdx b/_snippets/graphql/add-labels.mdx index 9abd80f..f80c013 100644 --- a/_snippets/graphql/add-labels.mdx +++ b/_snippets/graphql/add-labels.mdx @@ -14,10 +14,7 @@ mutation addLabels($input: AddLabelsInput!) { ```json filename="Variables" { "input": { - "labelTypeIds": [ - "lt_01HB8BTNTZ58730MX8H5VMKFD5", - "lt_01HB8BTNKSCF1FK5ETFVRSDC6G" - ], + "labelTypeIds": ["lt_01HB8BTNTZ58730MX8H5VMKFD5", "lt_01HB8BTNKSCF1FK5ETFVRSDC6G"], "threadId": "th_01H8H46YPB2S4MAJM382FG9423" } } diff --git a/_snippets/graphql/remove-customer-from-groups.mdx b/_snippets/graphql/remove-customer-from-groups.mdx index e1e19b3..a14c6d5 100644 --- a/_snippets/graphql/remove-customer-from-groups.mdx +++ b/_snippets/graphql/remove-customer-from-groups.mdx @@ -1,7 +1,5 @@ ```graphql filename="Mutation" -mutation removeCustomerFromCustomerGroup( - $input: RemoveCustomerFromCustomerGroupsInput! -) { +mutation removeCustomerFromCustomerGroup($input: RemoveCustomerFromCustomerGroupsInput!) { removeCustomerFromCustomerGroups(input: $input) { error { message diff --git a/_snippets/node/upload-attachment.mdx b/_snippets/node/upload-attachment.mdx index 9464b7c..084444a 100644 --- a/_snippets/node/upload-attachment.mdx +++ b/_snippets/node/upload-attachment.mdx @@ -1,6 +1,6 @@ ```js -const axios = require("axios"); -const FormData = require("form-data"); +const axios = require('axios'); +const FormData = require('form-data'); /** * Upload an attachment. @@ -15,7 +15,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { form.append(key, value); }); - form.append("file", fileBuffer, { filename: "file" }); + form.append('file', fileBuffer, { filename: 'file' }); console.log(`Uploading attachment to ${uploadFormUrl}`); @@ -23,7 +23,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .post(uploadFormUrl, form, { headers: { ...form.getHeaders(), - "Content-Length": form.getLengthSync(), + 'Content-Length': form.getLengthSync(), }, }) .then((res) => { @@ -32,7 +32,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .catch((err) => { console.log( `There was an error uploading the file: %s`, - err.response ? err.response.data : err, + err.response ? err.response.data : err ); }); } diff --git a/_snippets/typescript-sdk/add-customer-to-group-response.mdx b/_snippets/typescript-sdk/add-customer-to-group-response.mdx index 878207a..0a35628 100644 --- a/_snippets/typescript-sdk/add-customer-to-group-response.mdx +++ b/_snippets/typescript-sdk/add-customer-to-group-response.mdx @@ -1,57 +1,57 @@ ```js [ { - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', createdAt: { - __typename: "DateTime", - iso8601: "2023-06-21T14:20:12.014Z", - unixTimestamp: "1687357212014", + __typename: 'DateTime', + iso8601: '2023-06-21T14:20:12.014Z', + unixTimestamp: '1687357212014', }, createdBy: { - __typename: "MachineUserActor", - machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", + __typename: 'MachineUserActor', + machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', }, updatedAt: { - __typename: "DateTime", - iso8601: "2023-06-21T14:20:12.014Z", - unixTimestamp: "1687357212014", + __typename: 'DateTime', + iso8601: '2023-06-21T14:20:12.014Z', + unixTimestamp: '1687357212014', }, updatedBy: { - __typename: "MachineUserActor", - machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", + __typename: 'MachineUserActor', + machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', }, customerGroup: { - id: "cg_01H1P1RK22WTVMFRY8BX6S6VJX", - name: "free tier", - key: "free-tier", - color: "#E78450", + id: 'cg_01H1P1RK22WTVMFRY8BX6S6VJX', + name: 'free tier', + key: 'free-tier', + color: '#E78450', }, }, { - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', createdAt: { - __typename: "DateTime", - iso8601: "2023-06-21T14:20:12.014Z", - unixTimestamp: "1687357212014", + __typename: 'DateTime', + iso8601: '2023-06-21T14:20:12.014Z', + unixTimestamp: '1687357212014', }, createdBy: { - __typename: "MachineUserActor", - machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", + __typename: 'MachineUserActor', + machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', }, updatedAt: { - __typename: "DateTime", - iso8601: "2023-06-21T14:20:12.014Z", - unixTimestamp: "1687357212014", + __typename: 'DateTime', + iso8601: '2023-06-21T14:20:12.014Z', + unixTimestamp: '1687357212014', }, updatedBy: { - __typename: "MachineUserActor", - machineUserId: "mu_01H1P0P0PHA2BJRRS7EC02XKCF", + __typename: 'MachineUserActor', + machineUserId: 'mu_01H1P0P0PHA2BJRRS7EC02XKCF', }, customerGroup: { - id: "cg_01H1P1S2HD9PERNNS591ZT28ZZ", - name: "design partner", - key: "design-partner", - color: "#FBBF24", + id: 'cg_01H1P1S2HD9PERNNS591ZT28ZZ', + name: 'design partner', + key: 'design-partner', + color: '#FBBF24', }, }, ]; diff --git a/_snippets/typescript-sdk/add-customer-to-group.mdx b/_snippets/typescript-sdk/add-customer-to-group.mdx index 59a6889..e53328f 100644 --- a/_snippets/typescript-sdk/add-customer-to-group.mdx +++ b/_snippets/typescript-sdk/add-customer-to-group.mdx @@ -1,16 +1,16 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.addCustomerToCustomerGroups({ - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', customerGroupIdentifiers: [ { - customerGroupKey: "free-tier", + customerGroupKey: 'free-tier', }, { - customerGroupKey: "design-partner", + customerGroupKey: 'design-partner', }, ], }); diff --git a/_snippets/typescript-sdk/add-labels.mdx b/_snippets/typescript-sdk/add-labels.mdx index 0ae8af5..2e0899d 100644 --- a/_snippets/typescript-sdk/add-labels.mdx +++ b/_snippets/typescript-sdk/add-labels.mdx @@ -1,11 +1,11 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.addLabels({ - labelTypeIds: ["lt_01HB8BTNVM7GEBKBEDNC2K8ST7"], - threadId: "th_01HD1G6649R1DK061W27VBT7QB", + labelTypeIds: ['lt_01HB8BTNVM7GEBKBEDNC2K8ST7'], + threadId: 'th_01HD1G6649R1DK061W27VBT7QB', }); if (res.error) { diff --git a/_snippets/typescript-sdk/assign-thread.mdx b/_snippets/typescript-sdk/assign-thread.mdx index 99e1ca7..41552b0 100644 --- a/_snippets/typescript-sdk/assign-thread.mdx +++ b/_snippets/typescript-sdk/assign-thread.mdx @@ -1,13 +1,13 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.assignThread({ - threadId: "th_01H8H46YPB2S4MAJM382FG9423", - userId: "u_01FSVKMHFDHJ3H5XFM20EMCBQN", + threadId: 'th_01H8H46YPB2S4MAJM382FG9423', + userId: 'u_01FSVKMHFDHJ3H5XFM20EMCBQN', // You could instead assign to a machine user by doing: // machineUserId: 'XXX' diff --git a/_snippets/typescript-sdk/create-attachment-url.mdx b/_snippets/typescript-sdk/create-attachment-url.mdx index 3d8d277..f89b496 100644 --- a/_snippets/typescript-sdk/create-attachment-url.mdx +++ b/_snippets/typescript-sdk/create-attachment-url.mdx @@ -1,11 +1,11 @@ ```ts /c_XXXXXXXXXXXXXXXXXXXXXXXXXX/ -import { AttachmentType, PlainClient } from "@team-plain/typescript-sdk"; +import { AttachmentType, PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "XXX" }); +const client = new PlainClient({ apiKey: 'XXX' }); const res = await client.createAttachmentUploadUrl({ - customerId: "c_XXXXXXXXXXXXXXXXXXXXXXXXXX", - fileName: "the-filename.jpeg", + customerId: 'c_XXXXXXXXXXXXXXXXXXXXXXXXXX', + fileName: 'the-filename.jpeg', fileSizeBytes: 32318, attachmentType: AttachmentType.CustomTimelineEntry, }); @@ -13,7 +13,7 @@ const res = await client.createAttachmentUploadUrl({ if (res.error) { console.error(res.error); } else { - console.log("Attachment upload url created"); + console.log('Attachment upload url created'); console.log(res.data); } ``` diff --git a/_snippets/typescript-sdk/create-customer-event.mdx b/_snippets/typescript-sdk/create-customer-event.mdx index ec28252..da5c4cb 100644 --- a/_snippets/typescript-sdk/create-customer-event.mdx +++ b/_snippets/typescript-sdk/create-customer-event.mdx @@ -1,17 +1,17 @@ ```tsx -import { PlainClient, uiComponent } from "@team-plain/typescript-sdk"; +import { PlainClient, uiComponent } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', debug: true, }); const res = await client.createCustomerEvent({ - title: "API key generated", + title: 'API key generated', customerIdentifier: { // You can use the email: - email: "jane@acme.com", + email: 'jane@acme.com', // ...or if you set external id on customers: // externalId: 'YOUR_ID', @@ -22,14 +22,14 @@ const res = await client.createCustomerEvent({ components: [ uiComponent.text({ - text: "New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles.", + text: 'New API key was added with the fingerprint **3b7896975ee9fd15eeb7** with 4 associated roles.', }), uiComponent.spacer({ - size: "M", + size: 'M', }), uiComponent.linkButton({ - label: "View in admin", - url: "https://admin.your-app.com", + label: 'View in admin', + url: 'https://admin.your-app.com', }), ], @@ -37,11 +37,11 @@ const res = await client.createCustomerEvent({ // be created once and fail on the second time. This external id acts // as an idempotency key while also letting you correlate an event to // something your systems. - externalId: "XXX", + externalId: 'XXX', // Optional - if provided then the event will only be shown // in a single thread vs all threads from a customer - threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", + threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', }); if (res.error) { diff --git a/_snippets/typescript-sdk/create-thread.mdx b/_snippets/typescript-sdk/create-thread.mdx index 203a3d8..fb718e7 100644 --- a/_snippets/typescript-sdk/create-thread.mdx +++ b/_snippets/typescript-sdk/create-thread.mdx @@ -1,16 +1,16 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', debug: true, }); const res = await client.createThread({ - title: "Bug Report", + title: 'Bug Report', customerIdentifier: { // You can use the email: - email: "jane@acme.com", + email: 'jane@acme.com', // ...or if you set external id on customers: // externalId: '', @@ -27,7 +27,7 @@ const res = await client.createThread({ ], // Label types are created in settings where you can also copy // their ID. - labelTypeIds: ["lt_01HB924PME9C0YWKW1N4AK3BZA"], + labelTypeIds: ['lt_01HB924PME9C0YWKW1N4AK3BZA'], }); if (res.error) { diff --git a/_snippets/typescript-sdk/delete-customer.mdx b/_snippets/typescript-sdk/delete-customer.mdx index ffef4af..8ead1e5 100644 --- a/_snippets/typescript-sdk/delete-customer.mdx +++ b/_snippets/typescript-sdk/delete-customer.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from "../client"; +import { PlainClient } from '../client'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.deleteCustomer({ - customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", + customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', }); if (res.error) { diff --git a/_snippets/typescript-sdk/error-handling.mdx b/_snippets/typescript-sdk/error-handling.mdx index 33c69d3..cb95f34 100644 --- a/_snippets/typescript-sdk/error-handling.mdx +++ b/_snippets/typescript-sdk/error-handling.mdx @@ -1,17 +1,17 @@ ```tsx {21} -import { PlainClient } from "../client"; +import { PlainClient } from '../client'; export async function createCustomer() { - const client = new PlainClient({ apiKey: "XXX" }); + const client = new PlainClient({ apiKey: 'XXX' }); const res = await client.upsertCustomer({ identifier: { - emailAddress: "jane@gmail.com", + emailAddress: 'jane@gmail.com', }, onCreate: { - fullName: "Jane Fargate", + fullName: 'Jane Fargate', email: { - email: "jane@gmail.com", + email: 'jane@gmail.com', isVerified: true, }, }, diff --git a/_snippets/typescript-sdk/first-api-call.mdx b/_snippets/typescript-sdk/first-api-call.mdx index cd102fa..30ff6be 100644 --- a/_snippets/typescript-sdk/first-api-call.mdx +++ b/_snippets/typescript-sdk/first-api-call.mdx @@ -1,8 +1,8 @@ ```ts filename="script.js" {3-4} -const { PlainClient } = require("@team-plain/typescript-sdk"); +const { PlainClient } = require('@team-plain/typescript-sdk'); -const apiKey = "XXX"; -const email = "XXX"; +const apiKey = 'XXX'; +const email = 'XXX'; const client = new PlainClient({ apiKey: apiKey, diff --git a/_snippets/typescript-sdk/get-customer-by-email.mdx b/_snippets/typescript-sdk/get-customer-by-email.mdx index e170ea5..5253d73 100644 --- a/_snippets/typescript-sdk/get-customer-by-email.mdx +++ b/_snippets/typescript-sdk/get-customer-by-email.mdx @@ -1,9 +1,9 @@ ```tsx const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); -const res = await client.getCustomerByEmail({ email: "bob@example.com" }); +const res = await client.getCustomerByEmail({ email: 'bob@example.com' }); if (res.error) { console.error(res.error); diff --git a/_snippets/typescript-sdk/get-customer-by-id.mdx b/_snippets/typescript-sdk/get-customer-by-id.mdx index 415e4f5..08a5ab2 100644 --- a/_snippets/typescript-sdk/get-customer-by-id.mdx +++ b/_snippets/typescript-sdk/get-customer-by-id.mdx @@ -1,10 +1,10 @@ ```tsx const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.getCustomerById({ - customerId: "c_01H14DFQ4PDYBH398J1E99TWSS", + customerId: 'c_01H14DFQ4PDYBH398J1E99TWSS', }); if (res.error) { diff --git a/_snippets/typescript-sdk/get-customers.mdx b/_snippets/typescript-sdk/get-customers.mdx index bcca6f3..b6b8c65 100644 --- a/_snippets/typescript-sdk/get-customers.mdx +++ b/_snippets/typescript-sdk/get-customers.mdx @@ -1,6 +1,6 @@ ```tsx const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.getCustomers({ diff --git a/_snippets/typescript-sdk/mark-thread-as-done.mdx b/_snippets/typescript-sdk/mark-thread-as-done.mdx index 34a85ee..b49caea 100644 --- a/_snippets/typescript-sdk/mark-thread-as-done.mdx +++ b/_snippets/typescript-sdk/mark-thread-as-done.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.markThreadAsDone({ - threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", + threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', }); if (res.error) { diff --git a/_snippets/typescript-sdk/mark-thread-as-todo.mdx b/_snippets/typescript-sdk/mark-thread-as-todo.mdx index aeda948..be8488f 100644 --- a/_snippets/typescript-sdk/mark-thread-as-todo.mdx +++ b/_snippets/typescript-sdk/mark-thread-as-todo.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.markThreadAsTodo({ - threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", + threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', }); if (res.error) { diff --git a/_snippets/typescript-sdk/page-info-after.mdx b/_snippets/typescript-sdk/page-info-after.mdx index 882aa12..855dd15 100644 --- a/_snippets/typescript-sdk/page-info-after.mdx +++ b/_snippets/typescript-sdk/page-info-after.mdx @@ -1,8 +1,8 @@ ```tsx -import { PlainClient } from "../client"; +import { PlainClient } from '../client'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const firstPage = client.getCustomers({}); diff --git a/_snippets/typescript-sdk/remove-customer-from-groups.mdx b/_snippets/typescript-sdk/remove-customer-from-groups.mdx index c05dcce..3b1bbb4 100644 --- a/_snippets/typescript-sdk/remove-customer-from-groups.mdx +++ b/_snippets/typescript-sdk/remove-customer-from-groups.mdx @@ -1,18 +1,18 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw", + apiKey: 'plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw', }); const res = await client.removeCustomerFromCustomerGroups({ - customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", + customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', customerGroupIdentifiers: [ { - customerGroupKey: "free-tier", + customerGroupKey: 'free-tier', }, { - customerGroupKey: "design-partner", + customerGroupKey: 'design-partner', }, ], }); diff --git a/_snippets/typescript-sdk/remove-labels.mdx b/_snippets/typescript-sdk/remove-labels.mdx index f38d6b0..2e9b4bb 100644 --- a/_snippets/typescript-sdk/remove-labels.mdx +++ b/_snippets/typescript-sdk/remove-labels.mdx @@ -1,10 +1,10 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.removeLabels({ - labelIds: ["l_01HD428Y1TREH5KTXP019K6FPK"], + labelIds: ['l_01HD428Y1TREH5KTXP019K6FPK'], }); if (res.error) { diff --git a/_snippets/typescript-sdk/reply-email.mdx b/_snippets/typescript-sdk/reply-email.mdx index bcab140..855f905 100644 --- a/_snippets/typescript-sdk/reply-email.mdx +++ b/_snippets/typescript-sdk/reply-email.mdx @@ -1,13 +1,13 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); client.replyToEmail({ - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", - inReplyToEmailId: "em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA", - textContent: "The plain text version of your reply goes here.", - markdownContent: "The markdown **version** of your _reply_ goes here.", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + inReplyToEmailId: 'em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA', + textContent: 'The plain text version of your reply goes here.', + markdownContent: 'The markdown **version** of your _reply_ goes here.', }); if (res.error) { diff --git a/_snippets/typescript-sdk/send-email.mdx b/_snippets/typescript-sdk/send-email.mdx index 8a35966..84ee825 100644 --- a/_snippets/typescript-sdk/send-email.mdx +++ b/_snippets/typescript-sdk/send-email.mdx @@ -1,14 +1,14 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); client.sendNewEmail({ - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", - threadId: "th_01HD44FHMCDSSWE38N14FSYV6K", - subject: "Your account has a problem", - textContent: "The plain text version of your email goes here.", - markdownContent: "The markdown **version** of your _email_ goes here.", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + threadId: 'th_01HD44FHMCDSSWE38N14FSYV6K', + subject: 'Your account has a problem', + textContent: 'The plain text version of your email goes here.', + markdownContent: 'The markdown **version** of your _email_ goes here.', }); if (res.error) { diff --git a/_snippets/typescript-sdk/snooze-thread.mdx b/_snippets/typescript-sdk/snooze-thread.mdx index ce4c1dd..562c41d 100644 --- a/_snippets/typescript-sdk/snooze-thread.mdx +++ b/_snippets/typescript-sdk/snooze-thread.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.snoozeThread({ - threadId: "th_01HB924RWAW8H3Q8KZDFWYBJHZ", + threadId: 'th_01HB924RWAW8H3Q8KZDFWYBJHZ', durationSeconds: 5 * 24 * 60 * 60, // 5 days }); diff --git a/_snippets/typescript-sdk/ui-badge.mdx b/_snippets/typescript-sdk/ui-badge.mdx index e9f5e25..7a99f34 100644 --- a/_snippets/typescript-sdk/ui-badge.mdx +++ b/_snippets/typescript-sdk/ui-badge.mdx @@ -1,5 +1,5 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; -uiComponent.badge({ label: "Subscribed", color: "GREEN" }); +uiComponent.badge({ label: 'Subscribed', color: 'GREEN' }); ``` diff --git a/_snippets/typescript-sdk/ui-container.mdx b/_snippets/typescript-sdk/ui-container.mdx index 6ca6cbe..d11ca4f 100644 --- a/_snippets/typescript-sdk/ui-container.mdx +++ b/_snippets/typescript-sdk/ui-container.mdx @@ -1,7 +1,7 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; uiComponent.container({ - content: [uiComponent.text({ text: "Container content" })], + content: [uiComponent.text({ text: 'Container content' })], }); ``` diff --git a/_snippets/typescript-sdk/ui-copy-button.mdx b/_snippets/typescript-sdk/ui-copy-button.mdx index 36aeeec..60b36cb 100644 --- a/_snippets/typescript-sdk/ui-copy-button.mdx +++ b/_snippets/typescript-sdk/ui-copy-button.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; uiComponent.copyButton({ - value: "2a8f2dae-3580-402b-aa0a-243efae55e39", - tooltip: "Order ID", + value: '2a8f2dae-3580-402b-aa0a-243efae55e39', + tooltip: 'Order ID', }); ``` diff --git a/_snippets/typescript-sdk/ui-divider.mdx b/_snippets/typescript-sdk/ui-divider.mdx index 5f65873..f79ac81 100644 --- a/_snippets/typescript-sdk/ui-divider.mdx +++ b/_snippets/typescript-sdk/ui-divider.mdx @@ -1,9 +1,9 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; [ - uiComponent.text({ text: "Content before an XS divider" }), - uiComponent.divider({ spacingSize: "XS" }), - uiComponent.text({ text: "Content after divider" }), + uiComponent.text({ text: 'Content before an XS divider' }), + uiComponent.divider({ spacingSize: 'XS' }), + uiComponent.text({ text: 'Content after divider' }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-link-button.mdx b/_snippets/typescript-sdk/ui-link-button.mdx index b427cbf..3a068bf 100644 --- a/_snippets/typescript-sdk/ui-link-button.mdx +++ b/_snippets/typescript-sdk/ui-link-button.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; uiComponent.linkButton({ - label: "Open in Admin Portal", - url: "https://example.com", + label: 'Open in Admin Portal', + url: 'https://example.com', }); ``` diff --git a/_snippets/typescript-sdk/ui-plain-text.mdx b/_snippets/typescript-sdk/ui-plain-text.mdx index bd191ba..6e87106 100644 --- a/_snippets/typescript-sdk/ui-plain-text.mdx +++ b/_snippets/typescript-sdk/ui-plain-text.mdx @@ -1,21 +1,21 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; [ - uiComponent.plainText({ text: "Small text", size: "S" }), + uiComponent.plainText({ text: 'Small text', size: 'S' }), - uiComponent.plainText({ text: "Medium text", size: "M" }), + uiComponent.plainText({ text: 'Medium text', size: 'M' }), - uiComponent.plainText({ text: "Large text", size: "L" }), + uiComponent.plainText({ text: 'Large text', size: 'L' }), - uiComponent.plainText({ text: "Normal text", color: "NORMAL" }), + uiComponent.plainText({ text: 'Normal text', color: 'NORMAL' }), - uiComponent.plainText({ text: "Muted text", color: "MUTED" }), + uiComponent.plainText({ text: 'Muted text', color: 'MUTED' }), - uiComponent.plainText({ text: "Success text", color: "SUCCESS" }), + uiComponent.plainText({ text: 'Success text', color: 'SUCCESS' }), - uiComponent.plainText({ text: "Warning text", color: "WARNING" }), + uiComponent.plainText({ text: 'Warning text', color: 'WARNING' }), - uiComponent.plainText({ text: "Error text", color: "ERROR" }), + uiComponent.plainText({ text: 'Error text', color: 'ERROR' }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-row.mdx b/_snippets/typescript-sdk/ui-row.mdx index bf2cc29..d8b64f2 100644 --- a/_snippets/typescript-sdk/ui-row.mdx +++ b/_snippets/typescript-sdk/ui-row.mdx @@ -1,8 +1,8 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; uiComponent.row({ - mainContent: [uiComponent.text({ text: "Membership" })], - asideContent: [uiComponent.badge({ label: "Premium plan", color: "BLUE" })], + mainContent: [uiComponent.text({ text: 'Membership' })], + asideContent: [uiComponent.badge({ label: 'Premium plan', color: 'BLUE' })], }); ``` diff --git a/_snippets/typescript-sdk/ui-spacer.mdx b/_snippets/typescript-sdk/ui-spacer.mdx index b125062..59ba5dd 100644 --- a/_snippets/typescript-sdk/ui-spacer.mdx +++ b/_snippets/typescript-sdk/ui-spacer.mdx @@ -1,9 +1,9 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; [ - uiComponent.text({ text: "Content before an XS spacer" }), - uiComponent.spacer({ spacingSize: "XS" }), - uiComponent.text({ text: "Content after spacer" }), + uiComponent.text({ text: 'Content before an XS spacer' }), + uiComponent.spacer({ spacingSize: 'XS' }), + uiComponent.text({ text: 'Content after spacer' }), ]; ``` diff --git a/_snippets/typescript-sdk/ui-text.mdx b/_snippets/typescript-sdk/ui-text.mdx index 9f504ca..94fe86a 100644 --- a/_snippets/typescript-sdk/ui-text.mdx +++ b/_snippets/typescript-sdk/ui-text.mdx @@ -1,25 +1,25 @@ ```tsx -import { uiComponent } from "@team-plain/typescript-sdk"; +import { uiComponent } from '@team-plain/typescript-sdk'; [ uiComponent.text({ - text: "The **quick** brown fox _jumps_ over the [lazy link](https://plain.com)", + text: 'The **quick** brown fox _jumps_ over the [lazy link](https://plain.com)', }), - uiComponent.text({ text: "Small text", size: "S" }), + uiComponent.text({ text: 'Small text', size: 'S' }), - uiComponent.text({ text: "Medium text", size: "M" }), + uiComponent.text({ text: 'Medium text', size: 'M' }), - uiComponent.text({ text: "Large text", size: "L" }), + uiComponent.text({ text: 'Large text', size: 'L' }), - uiComponent.text({ text: "Normal text", color: "NORMAL" }), + uiComponent.text({ text: 'Normal text', color: 'NORMAL' }), - uiComponent.text({ text: "Muted text", color: "MUTED" }), + uiComponent.text({ text: 'Muted text', color: 'MUTED' }), - uiComponent.text({ text: "Success text", color: "SUCCESS" }), + uiComponent.text({ text: 'Success text', color: 'SUCCESS' }), - uiComponent.text({ text: "Warning text", color: "WARNING" }), + uiComponent.text({ text: 'Warning text', color: 'WARNING' }), - uiComponent.text({ text: "Error text", color: "ERROR" }), + uiComponent.text({ text: 'Error text', color: 'ERROR' }), ]; ``` diff --git a/_snippets/typescript-sdk/unassign-thread.mdx b/_snippets/typescript-sdk/unassign-thread.mdx index 25db9a3..28f0152 100644 --- a/_snippets/typescript-sdk/unassign-thread.mdx +++ b/_snippets/typescript-sdk/unassign-thread.mdx @@ -1,12 +1,12 @@ ```tsx -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', }); const res = await client.unassignThread({ - threadId: "th_01H8H46YPB2S4MAJM382FG9423", + threadId: 'th_01H8H46YPB2S4MAJM382FG9423', }); if (res.error) { diff --git a/_snippets/typescript-sdk/upsert-customer.mdx b/_snippets/typescript-sdk/upsert-customer.mdx index 6f56642..5b4d7c9 100644 --- a/_snippets/typescript-sdk/upsert-customer.mdx +++ b/_snippets/typescript-sdk/upsert-customer.mdx @@ -1,32 +1,32 @@ ```ts -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.upsertCustomer({ identifier: { - emailAddress: "donald@example.com", + emailAddress: 'donald@example.com', }, // If the customer is not found and should be created then // these details will be used: onCreate: { - fullName: "Donald Duck", - shortName: "Donald", + fullName: 'Donald Duck', + shortName: 'Donald', email: { - email: "donald@example.com", + email: 'donald@example.com', isVerified: true, }, // This is the id of the customer in your own backend. // Filling this out makes it easy to link customers in Plain // back to customer in your own systems. - externalId: "c_123", + externalId: 'c_123', // This is optional but if you want to put a customer into a group // on creation, this is how you do it. customerGroupIdentifiers: [ { - customerGroupKey: "enterprise", + customerGroupKey: 'enterprise', }, ], }, @@ -35,17 +35,17 @@ const res = await client.upsertCustomer({ // just providing some of the fields below. onUpdate: { fullName: { - value: "Donald Duck", + value: 'Donald Duck', }, shortName: { - value: "Donald", + value: 'Donald', }, email: { - email: "donald@example.com", + email: 'donald@example.com', isVerified: true, }, externalId: { - value: "c_123", + value: 'c_123', }, }, }); diff --git a/pages/attachments.mdx b/pages/attachments.mdx index c15ecfa..3c0198b 100644 --- a/pages/attachments.mdx +++ b/pages/attachments.mdx @@ -1,5 +1,5 @@ --- -title: "File Attachments" +title: 'File Attachments' description: "When using Plain's API to send emails or [create threads](/graphql/threads/create), you can add file attachments." --- @@ -27,13 +27,13 @@ To try this, you will need an [API key](/graphql/authentication/) with the follo ```typescript -import { AttachmentType, PlainClient } from "@team-plain/typescript-sdk"; +import { AttachmentType, PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "XXX" }); +const client = new PlainClient({ apiKey: 'XXX' }); const res = await client.createAttachmentUploadUrl({ - customerId: "c_XXXXXXXXXXXXXXXXXXXXXXXXXX", - fileName: "the-filename.jpeg", + customerId: 'c_XXXXXXXXXXXXXXXXXXXXXXXXXX', + fileName: 'the-filename.jpeg', fileSizeBytes: 32318, attachmentType: AttachmentType.CustomTimelineEntry, }); @@ -41,7 +41,7 @@ const res = await client.createAttachmentUploadUrl({ if (res.error) { console.error(res.error); } else { - console.log("Attachment upload url created"); + console.log('Attachment upload url created'); console.log(res.data); } ``` @@ -229,13 +229,13 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { form.append(key, value); }); - const file = new File([fileBlob], "file"); - form.append("file", file); + const file = new File([fileBlob], 'file'); + form.append('file', file); console.log(`Uploading attachment to ${uploadFormUrl}`); fetch(uploadFormUrl, { - method: "POST", + method: 'POST', body: form, }) .then((res) => { @@ -245,10 +245,7 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { console.log(`File successfully uploaded! (code=${res.status})`); }) .catch((err) => { - console.log( - `There was an error uploading the file: %s`, - err.message ? err.message : err, - ); + console.log(`There was an error uploading the file: %s`, err.message ? err.message : err); }); } ``` @@ -257,8 +254,8 @@ function uploadAttachment(fileBlob, uploadFormUrl, uploadFormData) { ```typescript -const axios = require("axios"); -const FormData = require("form-data"); +const axios = require('axios'); +const FormData = require('form-data'); /** * Upload an attachment. @@ -273,7 +270,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { form.append(key, value); }); - form.append("file", fileBuffer, { filename: "file" }); + form.append('file', fileBuffer, { filename: 'file' }); console.log(`Uploading attachment to ${uploadFormUrl}`); @@ -281,7 +278,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .post(uploadFormUrl, form, { headers: { ...form.getHeaders(), - "Content-Length": form.getLengthSync(), + 'Content-Length': form.getLengthSync(), }, }) .then((res) => { @@ -290,7 +287,7 @@ function uploadAttachment(fileBuffer, uploadFormUrl, uploadFormData) { .catch((err) => { console.log( `There was an error uploading the file: %s`, - err.response ? err.response.data : err, + err.response ? err.response.data : err ); }); } diff --git a/pages/contact-forms-setup.mdx b/pages/contact-forms-setup.mdx index 25e1020..0c9932e 100644 --- a/pages/contact-forms-setup.mdx +++ b/pages/contact-forms-setup.mdx @@ -1,6 +1,6 @@ --- -title: "Contact forms" -description: "Contact forms are the best way to offer support at scale. With contact forms, you can pre-triage every support request so that when you know exactly what to prioritize in Plain." +title: 'Contact forms' +description: 'Contact forms are the best way to offer support at scale. With contact forms, you can pre-triage every support request so that when you know exactly what to prioritize in Plain.' --- Plain **does not** provide any UI components or a drop-in script tag. Instead, you use your own UI components and then use Plain's API. diff --git a/pages/customer-cards-setup.mdx b/pages/customer-cards-setup.mdx index 8f40fea..127dd7e 100644 --- a/pages/customer-cards-setup.mdx +++ b/pages/customer-cards-setup.mdx @@ -1,6 +1,6 @@ --- -title: "Customer Cards" -description: "Customer Cards are a powerful feature in Plain that let you show information from your own systems while looking at a customer in Plain. This makes sure you always have important context when helping customers." +title: 'Customer Cards' +description: 'Customer Cards are a powerful feature in Plain that let you show information from your own systems while looking at a customer in Plain. This makes sure you always have important context when helping customers.' --- diff --git a/pages/customer-cards.mdx b/pages/customer-cards.mdx index d1e15cf..b445370 100644 --- a/pages/customer-cards.mdx +++ b/pages/customer-cards.mdx @@ -1,7 +1,7 @@ --- -title: "Customer Cards" -sidebarTitle: "Overview" -description: "Customer Cards are a powerful feature in Plain that let you show information from your own systems while looking at a customer in Plain. This makes sure you always have important context when helping customers." +title: 'Customer Cards' +sidebarTitle: 'Overview' +description: 'Customer Cards are a powerful feature in Plain that let you show information from your own systems while looking at a customer in Plain. This makes sure you always have important context when helping customers.' --- ## How it works diff --git a/pages/customer-cards/documentation.mdx b/pages/customer-cards/documentation.mdx index 5fe459f..4a04cfe 100644 --- a/pages/customer-cards/documentation.mdx +++ b/pages/customer-cards/documentation.mdx @@ -1,6 +1,6 @@ --- -title: "Customer Cards Documentation" -description: "This page is intended for a technical audience that will be implementing a Customer Card API." +title: 'Customer Cards Documentation' +description: 'This page is intended for a technical audience that will be implementing a Customer Card API.' --- Check out the [Customer Cards](/pages/customer-cards) page for an overview. diff --git a/pages/customer-cards/examples.mdx b/pages/customer-cards/examples.mdx index dc7044c..52dbcab 100644 --- a/pages/customer-cards/examples.mdx +++ b/pages/customer-cards/examples.mdx @@ -1,5 +1,5 @@ --- -title: "Examples" -icon: "link" -url: "https://github.com/team-plain/example-customer-cards" +title: 'Examples' +icon: 'link' +url: 'https://github.com/team-plain/example-customer-cards' --- diff --git a/pages/customer-cards/playground.mdx b/pages/customer-cards/playground.mdx index 8d38934..41fdae6 100644 --- a/pages/customer-cards/playground.mdx +++ b/pages/customer-cards/playground.mdx @@ -1,5 +1,5 @@ --- -title: "Playground" -icon: "link" -url: "https://app.plain.com/developer/customer-cards-playground/" +title: 'Playground' +icon: 'link' +url: 'https://app.plain.com/developer/customer-cards-playground/' --- diff --git a/pages/email-setup.mdx b/pages/email-setup.mdx index 607348b..54f3036 100644 --- a/pages/email-setup.mdx +++ b/pages/email-setup.mdx @@ -1,5 +1,5 @@ --- -title: "Setting up email" +title: 'Setting up email' --- Setting up email requires you to complete two steps: diff --git a/pages/email-setup/receiving-emails.mdx b/pages/email-setup/receiving-emails.mdx index 650b353..abdbc4c 100644 --- a/pages/email-setup/receiving-emails.mdx +++ b/pages/email-setup/receiving-emails.mdx @@ -1,6 +1,4 @@ -import { Callout, Steps } from "nextra-theme-docs"; - -import { ImageContainer } from "../../components/imageContainer"; +import { Callout, Steps } from 'nextra-theme-docs'; # Receiving emails in Plain @@ -49,5 +47,4 @@ If your email provider is not Google, you can still set up email forwarding in d - And That's it! 💅 diff --git a/pages/email-setup/sending-emails.mdx b/pages/email-setup/sending-emails.mdx index 4a3b0cd..152b352 100644 --- a/pages/email-setup/sending-emails.mdx +++ b/pages/email-setup/sending-emails.mdx @@ -1,6 +1,6 @@ --- -title: "Sending emails from Plain" -description: "To be able to send emails from Plain using your support email address, you will need to add a couple of DNS records to your domain." +title: 'Sending emails from Plain' +description: 'To be able to send emails from Plain using your support email address, you will need to add a couple of DNS records to your domain.' --- While setting up your email, you will see DNS settings that need to be diff --git a/pages/events-setup.mdx b/pages/events-setup.mdx index cee8373..49f0818 100644 --- a/pages/events-setup.mdx +++ b/pages/events-setup.mdx @@ -1,11 +1,9 @@ --- -title: "Events" +title: 'Events' description: "Events are a powerful API feature of Plain which let you log key events to have more context while you are helping a customer. This includes tracking a customer's usage of your product, latest invoice, error logs, etc." --- - - ![Screenshot of the Events](/public/images/events/events-introduction.png) - +![Screenshot of the Events](/public/images/events/events-introduction.png) When you create an event in Plain, you can specify the content of the event using a simple GraphQL request and our [UI Components](/ui-components). diff --git a/pages/graphql.mdx b/pages/graphql.mdx index 6f2f29b..06797ed 100644 --- a/pages/graphql.mdx +++ b/pages/graphql.mdx @@ -1,6 +1,6 @@ --- -title: "GraphQL API" -sidebarTitle: "Overview" +title: 'GraphQL API' +sidebarTitle: 'Overview' description: "Plain's GraphQL API can be used to manage any aspect of Plain. It's the API we use to build the Plain app which means there are no restrictions on what you can do via the API vs the Plain app." --- @@ -57,12 +57,8 @@ You will need an API key with the `customer:read` permission. See [authenticatio This assumes you've installed our Typescript SDK. - - ```shell npm install @team-plain/typescript-sdk ``` - - - Make sure to replace the api key and email in the code - + ```shell npm install @team-plain/typescript-sdk ``` + Make sure to replace the api key and email in the code ```shell node script.js ``` diff --git a/pages/graphql/api-explorer.mdx b/pages/graphql/api-explorer.mdx index 278ea5f..75e5a1e 100644 --- a/pages/graphql/api-explorer.mdx +++ b/pages/graphql/api-explorer.mdx @@ -1,5 +1,5 @@ --- -title: "API Explorer" -icon: "link" -url: "https://app.plain.com/developer/api-explorer/?workspaceId=w_01H3FZJ8MG74GFXA5WA3MPB446" +title: 'API Explorer' +icon: 'link' +url: 'https://app.plain.com/developer/api-explorer/?workspaceId=w_01H3FZJ8MG74GFXA5WA3MPB446' --- diff --git a/pages/graphql/authentication.mdx b/pages/graphql/authentication.mdx index 919f584..d391396 100644 --- a/pages/graphql/authentication.mdx +++ b/pages/graphql/authentication.mdx @@ -1,5 +1,5 @@ --- -title: "Authentication" +title: 'Authentication' description: "To make API calls you need an API key. To create an API key you'll first need to create a Machine User." --- diff --git a/pages/graphql/customers.mdx b/pages/graphql/customers.mdx index abd9826..075c110 100644 --- a/pages/graphql/customers.mdx +++ b/pages/graphql/customers.mdx @@ -1,7 +1,7 @@ --- -title: "Customers" -sidebarTitle: "Overview" -description: "Customers that reach out to you will automatically be created in Plain without requiring any API integration." +title: 'Customers' +sidebarTitle: 'Overview' +description: 'Customers that reach out to you will automatically be created in Plain without requiring any API integration.' --- However, using our API to manage customers proactively can be helpful when you are optimizing your support workflow. diff --git a/pages/graphql/customers/customer-groups.mdx b/pages/graphql/customers/customer-groups.mdx index 6544476..9a6729e 100644 --- a/pages/graphql/customers/customer-groups.mdx +++ b/pages/graphql/customers/customer-groups.mdx @@ -1,6 +1,6 @@ --- -title: "Customer groups" -description: "Customer groups can be used to group and segment your customers, e.g. pricing tier: free, paying, enterprise etc." +title: 'Customer groups' +description: 'Customer groups can be used to group and segment your customers, e.g. pricing tier: free, paying, enterprise etc.' --- Customers can belong to one or many groups. You can filter your customers by group, allowing you to quickly focus on a subset of your customers. @@ -25,18 +25,18 @@ This operation requires the following permissions: ```typescript -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.addCustomerToCustomerGroups({ - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', customerGroupIdentifiers: [ { - customerGroupKey: "free-tier", + customerGroupKey: 'free-tier', }, { - customerGroupKey: "design-partner", + customerGroupKey: 'design-partner', }, ], }); @@ -208,20 +208,20 @@ A customer can be removed from a customer group by using the `removeCustomerFrom ```typescript -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw", + apiKey: 'plainApiKey_rO6tIKWU2w0gD_ek9HwjsHMiq1MHsgAn7mhVrcC7MGw', }); const res = await client.removeCustomerFromCustomerGroups({ - customerId: "c_01H1P4TE62AS5KZ4CZFC0578ED", + customerId: 'c_01H1P4TE62AS5KZ4CZFC0578ED', customerGroupIdentifiers: [ { - customerGroupKey: "free-tier", + customerGroupKey: 'free-tier', }, { - customerGroupKey: "design-partner", + customerGroupKey: 'design-partner', }, ], }); @@ -239,9 +239,7 @@ if (res.error) { ```graphql Mutation -mutation removeCustomerFromCustomerGroup( - $input: RemoveCustomerFromCustomerGroupsInput! -) { +mutation removeCustomerFromCustomerGroup($input: RemoveCustomerFromCustomerGroupsInput!) { removeCustomerFromCustomerGroups(input: $input) { error { message diff --git a/pages/graphql/customers/delete.mdx b/pages/graphql/customers/delete.mdx index 24f715a..482ef1d 100644 --- a/pages/graphql/customers/delete.mdx +++ b/pages/graphql/customers/delete.mdx @@ -1,6 +1,6 @@ -import DeleteCustomerTypescriptSDK from "../../../snippets/typescript-sdk/delete-customer.mdx"; -import DeleteCustomerGraphQL from "../../../snippets/graphql/delete-customer.mdx"; -import { Tab, Tabs } from "nextra-theme-docs"; +import DeleteCustomerTypescriptSDK from '../../../snippets/typescript-sdk/delete-customer.mdx'; +import DeleteCustomerGraphQL from '../../../snippets/graphql/delete-customer.mdx'; +import { Tab, Tabs } from 'nextra-theme-docs'; # Delete customers diff --git a/pages/graphql/customers/get.mdx b/pages/graphql/customers/get.mdx index 01cf9b6..380f7c6 100644 --- a/pages/graphql/customers/get.mdx +++ b/pages/graphql/customers/get.mdx @@ -1,5 +1,5 @@ --- -title: "Fetch customers" +title: 'Fetch customers' --- We provide a number of methods for fetching customers: diff --git a/pages/graphql/customers/upsert.mdx b/pages/graphql/customers/upsert.mdx index 02662c2..f807911 100644 --- a/pages/graphql/customers/upsert.mdx +++ b/pages/graphql/customers/upsert.mdx @@ -1,6 +1,6 @@ --- -title: "Upserting customers" -description: "Creating and updating customers is handled via a single API called `upsertCustomer`. You will find this name in both our API and our SDKs." +title: 'Upserting customers' +description: 'Creating and updating customers is handled via a single API called `upsertCustomer`. You will find this name in both our API and our SDKs.' --- When you upsert a customer, you define: @@ -32,34 +32,34 @@ This will: ```typescript -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); const res = await client.upsertCustomer({ identifier: { - emailAddress: "donald@example.com", + emailAddress: 'donald@example.com', }, // If the customer is not found and should be created then // these details will be used: onCreate: { - fullName: "Donald Duck", - shortName: "Donald", + fullName: 'Donald Duck', + shortName: 'Donald', email: { - email: "donald@example.com", + email: 'donald@example.com', isVerified: true, }, // This is the id of the customer in your own backend. // Filling this out makes it easy to link customers in Plain // back to customer in your own systems. - externalId: "c_123", + externalId: 'c_123', // This is optional but if you want to put a customer into a group // on creation, this is how you do it. customerGroupIdentifiers: [ { - customerGroupKey: "enterprise", + customerGroupKey: 'enterprise', }, ], }, @@ -68,17 +68,17 @@ const res = await client.upsertCustomer({ // just providing some of the fields below. onUpdate: { fullName: { - value: "Donald Duck", + value: 'Donald Duck', }, shortName: { - value: "Donald", + value: 'Donald', }, email: { - email: "donald@example.com", + email: 'donald@example.com', isVerified: true, }, externalId: { - value: "c_123", + value: 'c_123', }, }, }); diff --git a/pages/graphql/error-codes.mdx b/pages/graphql/error-codes.mdx index ca3d28b..735e712 100644 --- a/pages/graphql/error-codes.mdx +++ b/pages/graphql/error-codes.mdx @@ -1,6 +1,6 @@ --- -title: "Error codes" -description: "If you receive an error code as part of an API call, this is where you can look up what it means:" +title: 'Error codes' +description: 'If you receive an error code as part of an API call, this is where you can look up what it means:' --- #### `input_validation` diff --git a/pages/graphql/error-handling.mdx b/pages/graphql/error-handling.mdx index 29e28a2..bbf5bb8 100644 --- a/pages/graphql/error-handling.mdx +++ b/pages/graphql/error-handling.mdx @@ -1,6 +1,6 @@ --- -title: "Error handling" -description: "GraphQL queries and mutations require different error handling." +title: 'Error handling' +description: 'GraphQL queries and mutations require different error handling.' --- This is because we expect: @@ -67,19 +67,19 @@ You can see the [full error types in the code of the Typescript SDK](https://git This is how you can access the error when using the SDK: ```typescript -import { PlainClient } from "../client"; +import { PlainClient } from '../client'; export async function createCustomer() { - const client = new PlainClient({ apiKey: "XXX" }); + const client = new PlainClient({ apiKey: 'XXX' }); const res = await client.upsertCustomer({ identifier: { - emailAddress: "jane@gmail.com", + emailAddress: 'jane@gmail.com', }, onCreate: { - fullName: "Jane Fargate", + fullName: 'Jane Fargate', email: { - email: "jane@gmail.com", + email: 'jane@gmail.com', isVerified: true, }, }, diff --git a/pages/graphql/events.mdx b/pages/graphql/events.mdx index d437268..16bb9cc 100644 --- a/pages/graphql/events.mdx +++ b/pages/graphql/events.mdx @@ -1,7 +1,7 @@ --- -title: "Events" -sidebarTitle: "Overview" -description: "When helping a customer it can be useful to have context about their recent activity in your product. For example, if someone is getting in touch about a 401 error, it could be important to know that they recently deleted an API key in their settings." +title: 'Events' +sidebarTitle: 'Overview' +description: 'When helping a customer it can be useful to have context about their recent activity in your product. For example, if someone is getting in touch about a 401 error, it could be important to know that they recently deleted an API key in their settings.' --- Events are created via the Plain API and you have full control of what they look like using Plain's UI components. diff --git a/pages/graphql/events/create-customer-event.mdx b/pages/graphql/events/create-customer-event.mdx index b0ff89f..85e37a8 100644 --- a/pages/graphql/events/create-customer-event.mdx +++ b/pages/graphql/events/create-customer-event.mdx @@ -1,11 +1,10 @@ --- -title: "Create a customer event" +title: 'Create a customer event' --- - This API is being actively developed and is not yet ready for production - usage. If you are interested in using events please get in touch with us at - [help@plain.com](mailto:help@plain.com) + This API is being actively developed and is not yet ready for production usage. If you are + interested in using events please get in touch with us at [help@plain.com](mailto:help@plain.com) To create an event you need a customer ID. diff --git a/pages/graphql/labels.mdx b/pages/graphql/labels.mdx index 5f42143..db80e6a 100644 --- a/pages/graphql/labels.mdx +++ b/pages/graphql/labels.mdx @@ -1,7 +1,7 @@ --- -title: "Labels" -sidebarTitle: "Overview" -description: "Labels are a light-weight but powerful way to categorise threads, consisting of label text coupled with an icon. Each thread can have multiple labels." +title: 'Labels' +sidebarTitle: 'Overview' +description: 'Labels are a light-weight but powerful way to categorise threads, consisting of label text coupled with an icon. Each thread can have multiple labels.' --- They can be added manually or programatically. For example when a contact form is submitted, you could automatically add a label to the corresponding thread with the issue category they selected, so that you know upfront why they are getting in touch. diff --git a/pages/graphql/labels/add.mdx b/pages/graphql/labels/add.mdx index f6cf7e4..d1e33bf 100644 --- a/pages/graphql/labels/add.mdx +++ b/pages/graphql/labels/add.mdx @@ -1,6 +1,6 @@ --- -title: "Add labels" -description: "You can add multiple labels to a thread with a call to `addLabels`. Label type IDs passed to this endpoint should not be archived, we return a validation error with code `cannot_add_label_using_archived_label_type` for any which are submitted." +title: 'Add labels' +description: 'You can add multiple labels to a thread with a call to `addLabels`. Label type IDs passed to this endpoint should not be archived, we return a validation error with code `cannot_add_label_using_archived_label_type` for any which are submitted.' --- If a label type you provide is already added to the thread we will return a validation error with code `label_with_given_type_already_added_to_thread`. @@ -113,10 +113,7 @@ mutation addLabels($input: AddLabelsInput!) { ```json Variables { "input": { - "labelTypeIds": [ - "lt_01HB8BTNTZ58730MX8H5VMKFD5", - "lt_01HB8BTNKSCF1FK5ETFVRSDC6G" - ], + "labelTypeIds": ["lt_01HB8BTNTZ58730MX8H5VMKFD5", "lt_01HB8BTNKSCF1FK5ETFVRSDC6G"], "threadId": "th_01H8H46YPB2S4MAJM382FG9423" } } diff --git a/pages/graphql/labels/remove.mdx b/pages/graphql/labels/remove.mdx index 555d802..d8c8c25 100644 --- a/pages/graphql/labels/remove.mdx +++ b/pages/graphql/labels/remove.mdx @@ -1,6 +1,6 @@ --- -title: "Remove labels" -description: "You can remove labels from a thread with a call to `removeLabels`. Label IDs for this call can be retrieved by fetching a thread with the API." +title: 'Remove labels' +description: 'You can remove labels from a thread with a call to `removeLabels`. Label IDs for this call can be retrieved by fetching a thread with the API.' --- This operation requires the following permissions: diff --git a/pages/graphql/messaging.mdx b/pages/graphql/messaging.mdx index 513070e..fd688b5 100644 --- a/pages/graphql/messaging.mdx +++ b/pages/graphql/messaging.mdx @@ -1,7 +1,7 @@ --- -title: "Messaging" -sidebarTitle: "Overview" -description: "We provide various methods to message your customers with the Plain API. You can use this to reach out proactively, build an autoresponder or even to handle things like waiting list access!" +title: 'Messaging' +sidebarTitle: 'Overview' +description: 'We provide various methods to message your customers with the Plain API. You can use this to reach out proactively, build an autoresponder or even to handle things like waiting list access!' --- diff --git a/pages/graphql/messaging/reply-email.mdx b/pages/graphql/messaging/reply-email.mdx index cf8f9f5..6d27c0c 100644 --- a/pages/graphql/messaging/reply-email.mdx +++ b/pages/graphql/messaging/reply-email.mdx @@ -1,7 +1,7 @@ -import { Tab, Tabs } from "nextra-theme-docs"; +import { Tab, Tabs } from 'nextra-theme-docs'; -import ReplyEmailTypescriptSDK from "../../../snippets/typescript-sdk/reply-email.mdx"; -import ReplyEmailGraphQL from "../../../snippets/graphql/reply-email.mdx"; +import ReplyEmailTypescriptSDK from '../../../snippets/typescript-sdk/reply-email.mdx'; +import ReplyEmailGraphQL from '../../../snippets/graphql/reply-email.mdx'; # Reply to emails @@ -16,15 +16,15 @@ You can reply to an inbound email with the `replyToEmail` API. - `attachment:read` ```typescript -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; -const client = new PlainClient({ apiKey: "plainApiKey_xxx" }); +const client = new PlainClient({ apiKey: 'plainApiKey_xxx' }); client.replyToEmail({ - customerId: "c_01GTC6ZHCMAGR06FMPN9VY5J95", - inReplyToEmailId: "em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA", - textContent: "The plain text version of your reply goes here.", - markdownContent: "The markdown **version** of your _reply_ goes here.", + customerId: 'c_01GTC6ZHCMAGR06FMPN9VY5J95', + inReplyToEmailId: 'em_01GM2X8K7D3RZ7ZFGHZ2AYG3SA', + textContent: 'The plain text version of your reply goes here.', + markdownContent: 'The markdown **version** of your _reply_ goes here.', }); if (res.error) { diff --git a/pages/graphql/messaging/send-email.mdx b/pages/graphql/messaging/send-email.mdx index 2f443b0..047aeb5 100644 --- a/pages/graphql/messaging/send-email.mdx +++ b/pages/graphql/messaging/send-email.mdx @@ -1,6 +1,6 @@ --- -title: "Send emails" -description: "You can send new outbound emails to customers with the `sendNewEmail` API. This is useful for proactively reaching out about issues." +title: 'Send emails' +description: 'You can send new outbound emails to customers with the `sendNewEmail` API. This is useful for proactively reaching out about issues.' --- diff --git a/pages/graphql/pagination.mdx b/pages/graphql/pagination.mdx index f5ce491..c6802e5 100644 --- a/pages/graphql/pagination.mdx +++ b/pages/graphql/pagination.mdx @@ -1,6 +1,6 @@ --- -title: "Pagination" -description: "When fetching collections from our API you can use pagination to control how much data is returned. We will return 25 records per request by default and the maximum page size is 100 records." +title: 'Pagination' +description: 'When fetching collections from our API you can use pagination to control how much data is returned. We will return 25 records per request by default and the maximum page size is 100 records.' --- We support two forms of page control arguments: diff --git a/pages/graphql/schema.mdx b/pages/graphql/schema.mdx index 80a1e35..9c80ec0 100644 --- a/pages/graphql/schema.mdx +++ b/pages/graphql/schema.mdx @@ -1,5 +1,5 @@ --- -title: "Schema" +title: 'Schema' description: We build the Plain app using this API so there are no limits in terms of what you can do programmatically vs. using the Plain app." --- diff --git a/pages/graphql/threads.mdx b/pages/graphql/threads.mdx index 3b45f7f..055e8a1 100644 --- a/pages/graphql/threads.mdx +++ b/pages/graphql/threads.mdx @@ -1,5 +1,5 @@ --- -title: "Threads" +title: 'Threads' sidebarTitle: Overview description: "Threads are the core of Plain's data model and equivalent to tickets or conversations in other support platforms. When you use Plain to help a customer you assign yourself to a thread and then mark the thread as done once you're done helping." --- @@ -13,10 +13,9 @@ Threads belong to one customer but can contain multiple email threads and custom An example thread looks like this: - The below is only showing a subset fields a thread has. Since our API is a - GraphQL API you decide which fields you need when you make API requests. Use - our [API explorer](https://app.plain.com/developer/api-explorer) to discover - the full schema of threads. + The below is only showing a subset fields a thread has. Since our API is a GraphQL API you decide + which fields you need when you make API requests. Use our [API + explorer](https://app.plain.com/developer/api-explorer) to discover the full schema of threads. diff --git a/pages/graphql/threads/assignment.mdx b/pages/graphql/threads/assignment.mdx index dd72906..3cf013a 100644 --- a/pages/graphql/threads/assignment.mdx +++ b/pages/graphql/threads/assignment.mdx @@ -1,9 +1,9 @@ -import { Tabs, Tab } from "nextra-theme-docs"; -import AssignThreadTypescriptSDK from "../../../snippets/typescript-sdk/assign-thread.mdx"; -import AssignThreadResponseTypescriptSDK from "../../../snippets/typescript-sdk/assign-thread-response.mdx"; -import AssignThreadGraphQL from "../../../snippets/graphql/assign-thread.mdx"; -import UnassignThreadTypescriptSDK from "../../../snippets/typescript-sdk/unassign-thread.mdx"; -import UnassignThreadGraphQL from "../../../snippets/graphql/unassign-thread.mdx"; +import { Tabs, Tab } from 'nextra-theme-docs'; +import AssignThreadTypescriptSDK from '../../../snippets/typescript-sdk/assign-thread.mdx'; +import AssignThreadResponseTypescriptSDK from '../../../snippets/typescript-sdk/assign-thread-response.mdx'; +import AssignThreadGraphQL from '../../../snippets/graphql/assign-thread.mdx'; +import UnassignThreadTypescriptSDK from '../../../snippets/typescript-sdk/unassign-thread.mdx'; +import UnassignThreadGraphQL from '../../../snippets/graphql/unassign-thread.mdx'; # Assign threads diff --git a/pages/graphql/threads/create.mdx b/pages/graphql/threads/create.mdx index 67d2e72..fee0337 100644 --- a/pages/graphql/threads/create.mdx +++ b/pages/graphql/threads/create.mdx @@ -1,5 +1,5 @@ --- -title: "Create Threads" +title: 'Create Threads' description: Creating a thread is useful in scenarios where you want to programatically start a support interaction." --- @@ -25,18 +25,18 @@ To create a thread you need a `customerId`. You can get a customer id by [creati - `user:read` ```typescript -import { PlainClient } from "@team-plain/typescript-sdk"; +import { PlainClient } from '@team-plain/typescript-sdk'; const client = new PlainClient({ - apiKey: "XXX", + apiKey: 'XXX', debug: true, }); const res = await client.createThread({ - title: "Bug Report", + title: 'Bug Report', customerIdentifier: { // You can use the email: - email: "jane@acme.com", + email: 'jane@acme.com', // ...or if you set external id on customers: // externalId: '', @@ -53,7 +53,7 @@ const res = await client.createThread({ ], // Label types are created in settings where you can also copy // their ID. - labelTypeIds: ["lt_01HB924PME9C0YWKW1N4AK3BZA"], + labelTypeIds: ['lt_01HB924PME9C0YWKW1N4AK3BZA'], }); if (res.error) { diff --git a/pages/graphql/threads/status-changes.mdx b/pages/graphql/threads/status-changes.mdx index 500ff61..cc31643 100644 --- a/pages/graphql/threads/status-changes.mdx +++ b/pages/graphql/threads/status-changes.mdx @@ -1,5 +1,5 @@ --- -title: "Changing thread status" +title: 'Changing thread status' --- Threads can be in one of 3 statuses: diff --git a/pages/graphql/typescript-sdk.mdx b/pages/graphql/typescript-sdk.mdx index fefbc36..1692db0 100644 --- a/pages/graphql/typescript-sdk.mdx +++ b/pages/graphql/typescript-sdk.mdx @@ -1,5 +1,5 @@ --- -title: "Typescript SDK" -icon: "link" -url: "https://github.com/team-plain/typescript-sdk/" +title: 'Typescript SDK' +icon: 'link' +url: 'https://github.com/team-plain/typescript-sdk/' --- diff --git a/pages/introduction.mdx b/pages/introduction.mdx index 94164a3..09953c4 100644 --- a/pages/introduction.mdx +++ b/pages/introduction.mdx @@ -1,6 +1,6 @@ --- -title: "Getting started with Plain" -description: "Plain is the customer support tool for technical B2B products." +title: 'Getting started with Plain' +description: 'Plain is the customer support tool for technical B2B products.' --- We want to bring engineering and support teams together by creating a modern opinionated platform that's fantastic to build with and use. diff --git a/pages/labels-setup.mdx b/pages/labels-setup.mdx index 4beaf11..4235f26 100644 --- a/pages/labels-setup.mdx +++ b/pages/labels-setup.mdx @@ -1,6 +1,6 @@ --- -title: "Labels" -description: "Labels are a light weight and powerful way to categorize threads in Plain." +title: 'Labels' +description: 'Labels are a light weight and powerful way to categorize threads in Plain.' --- ![Example labels](/public/images/labels/labels-introduction.png) diff --git a/pages/linear-integration-setup.mdx b/pages/linear-integration-setup.mdx index 0258e72..a246712 100644 --- a/pages/linear-integration-setup.mdx +++ b/pages/linear-integration-setup.mdx @@ -1,6 +1,6 @@ --- -title: "Linear integration" -description: "To easily keep track of feature requests and bugs reported in Plain, you can connect your Linear workspace with Plain." +title: 'Linear integration' +description: 'To easily keep track of feature requests and bugs reported in Plain, you can connect your Linear workspace with Plain.' --- This lets you easily link a Linear issue to a thread. diff --git a/pages/migrate-to-threads.mdx b/pages/migrate-to-threads.mdx index d69e2c8..f81cdad 100644 --- a/pages/migrate-to-threads.mdx +++ b/pages/migrate-to-threads.mdx @@ -1,10 +1,10 @@ --- -title: "Migrating to threads" +title: 'Migrating to threads' --- - This only applies to you if you are using the Plain API or webhooks. If you - are using neither, feel free to ignore this! + This only applies to you if you are using the Plain API or webhooks. If you are using neither, + feel free to ignore this! Furthermore, this migration only applies to you if you use _any_ of the following Plain APIs: @@ -29,9 +29,8 @@ Or if you are using _any_ of the following webhooks : If you run into **any** issues, please reach out to us via the app (**⌘ + K** and then search for "Question") or email us at [help@plain.com](mailto:help@plain.com). - Once you have fully migrated across, please let us know and we will enable a - feature flag for your workspace giving you the full benefits of threads within - Plain. + Once you have fully migrated across, please let us know and we will enable a feature flag for your + workspace giving you the full benefits of threads within Plain. ## New data model diff --git a/pages/security.mdx b/pages/security.mdx index 3a2bac8..c495205 100644 --- a/pages/security.mdx +++ b/pages/security.mdx @@ -1,6 +1,6 @@ --- -title: "Security" -description: "If you or your team have specific questions about how Plain is built, our processes or how we store and handle data please get in touch at help@plain.com." +title: 'Security' +description: 'If you or your team have specific questions about how Plain is built, our processes or how we store and handle data please get in touch at help@plain.com.' --- We are very happy to answer any questions you have. diff --git a/pages/ui-components.mdx b/pages/ui-components.mdx index 8881660..845c2d5 100644 --- a/pages/ui-components.mdx +++ b/pages/ui-components.mdx @@ -1,6 +1,6 @@ --- -title: "UI Component" -sidebarTitle: "Overview" +title: 'UI Component' +sidebarTitle: 'Overview' description: "UI components are a way of describing some UI when using Plain's [Customer Timeline Entries](/pages/custom-timeline-entries)and [Customer Cards](/pages/customer-cards)." --- @@ -18,8 +18,7 @@ For example - this is a button that links to Stripe. and it looks like this: - ![Example button linking to - stripe](/public/images/ui-components/link-button-stripe.png) + ![Example button linking to stripe](/public/images/ui-components/link-button-stripe.png) In the GraphQL API schema, we have two separate unions for Custom Timeline Entry Components and Customer Card diff --git a/pages/ui-components/badge.mdx b/pages/ui-components/badge.mdx index b9af334..e101da7 100644 --- a/pages/ui-components/badge.mdx +++ b/pages/ui-components/badge.mdx @@ -1,6 +1,6 @@ --- -title: "Badge" -description: "Useful for statuses or when you need to attract attention to something." +title: 'Badge' +description: 'Useful for statuses or when you need to attract attention to something.' --- ![Example badges](/public/images/ui-components/badge.png) diff --git a/pages/ui-components/container.mdx b/pages/ui-components/container.mdx index b4ae097..7289734 100644 --- a/pages/ui-components/container.mdx +++ b/pages/ui-components/container.mdx @@ -1,6 +1,6 @@ --- -title: "Container" -description: "Useful when you need to create a bit of structure." +title: 'Container' +description: 'Useful when you need to create a bit of structure.' --- ![Example container](/public//images/ui-components/container.png) diff --git a/pages/ui-components/copy-button.mdx b/pages/ui-components/copy-button.mdx index 8443a3d..0aa72bc 100644 --- a/pages/ui-components/copy-button.mdx +++ b/pages/ui-components/copy-button.mdx @@ -1,11 +1,9 @@ --- -title: "CopyButton" -description: "Useful if you have any IDs or other details you want to copy for use in messages or outside of Plain." +title: 'CopyButton' +description: 'Useful if you have any IDs or other details you want to copy for use in messages or outside of Plain.' --- - - ![Example copy button](/public/images/ui-components/copy-button.png) - +![Example copy button](/public/images/ui-components/copy-button.png) A copy button has the following properties: diff --git a/pages/ui-components/divider.mdx b/pages/ui-components/divider.mdx index 9b6043e..6d3e1f4 100644 --- a/pages/ui-components/divider.mdx +++ b/pages/ui-components/divider.mdx @@ -1,6 +1,6 @@ --- -title: "Divider" -description: "Useful when you need a bit of structure." +title: 'Divider' +description: 'Useful when you need a bit of structure.' --- ![Example divider](/public/images/ui-components/divider.png) diff --git a/pages/ui-components/link-button.mdx b/pages/ui-components/link-button.mdx index 2e9fa00..01da550 100644 --- a/pages/ui-components/link-button.mdx +++ b/pages/ui-components/link-button.mdx @@ -1,11 +1,9 @@ --- -title: "LinkButton" -description: "Useful when you want to link somewhere external (e.g. your own admin tool or payment provider)" +title: 'LinkButton' +description: 'Useful when you want to link somewhere external (e.g. your own admin tool or payment provider)' --- - - ![Example link button](/public/images/ui-components/link-button.png) - +![Example link button](/public/images/ui-components/link-button.png) A link button has the following properties: diff --git a/pages/ui-components/plain-text.mdx b/pages/ui-components/plain-text.mdx index f8b57a5..6c0dd6f 100644 --- a/pages/ui-components/plain-text.mdx +++ b/pages/ui-components/plain-text.mdx @@ -1,11 +1,9 @@ --- -title: "PlainText" -description: "Useful when you want to show any text that should not have any formatting (is not Markdown). If you want markdown please use [Text](/ui-components/text)." +title: 'PlainText' +description: 'Useful when you want to show any text that should not have any formatting (is not Markdown). If you want markdown please use [Text](/ui-components/text).' --- - - ![Example link button](/public/images/ui-components/plain-text.png) - +![Example link button](/public/images/ui-components/plain-text.png) The plain text component has the following properties: diff --git a/pages/ui-components/row.mdx b/pages/ui-components/row.mdx index b1bbd77..2963ec7 100644 --- a/pages/ui-components/row.mdx +++ b/pages/ui-components/row.mdx @@ -1,6 +1,6 @@ --- -title: "Row" -description: "Useful when you need to show two things next to each-other." +title: 'Row' +description: 'Useful when you need to show two things next to each-other.' --- ![Example row](/public/images/ui-components/row.png) diff --git a/pages/ui-components/spacer.mdx b/pages/ui-components/spacer.mdx index 17e0f98..2aa3b25 100644 --- a/pages/ui-components/spacer.mdx +++ b/pages/ui-components/spacer.mdx @@ -1,5 +1,5 @@ --- -title: "Spacer" +title: 'Spacer' --- ![Example spacer](/public/images/ui-components/spacer.png) diff --git a/pages/ui-components/text.mdx b/pages/ui-components/text.mdx index ccb99ca..0a122d2 100644 --- a/pages/ui-components/text.mdx +++ b/pages/ui-components/text.mdx @@ -1,5 +1,5 @@ --- -title: "Text" +title: 'Text' --- ![Example text](/public/images/ui-components/text.png) diff --git a/pages/webhooks.mdx b/pages/webhooks.mdx index a2a0fb2..9740cda 100644 --- a/pages/webhooks.mdx +++ b/pages/webhooks.mdx @@ -1,5 +1,5 @@ --- -title: "Webhooks" +title: 'Webhooks' --- Webhooks allow you to get notified about events happening in your Plain workspace. You can react to these events in many ways, such as: @@ -28,14 +28,14 @@ to receive and whether you want to enable it straight away. You can create up to **25 webhook targets** per workspace. - Plain events may contain Personally Identifiable Information (PII). If you - want to test webhooks with a production workspace, take the necessary - precautions to avoid leaking PII to untrusted parties. + Plain events may contain Personally Identifiable Information (PII). If you want to test webhooks + with a production workspace, take the necessary precautions to avoid leaking PII to untrusted + parties. - We have created a repository where you will find instructions on how to create - a webhook endpoint using different programming languages. You can find it + We have created a repository where you will find instructions on how to create a webhook endpoint + using different programming languages. You can find it [here](https://github.com/team-plain/webhooks-resources/tree/main/servers). diff --git a/pages/webhooks/customer-created.mdx b/pages/webhooks/customer-created.mdx index 9425295..78ccc3a 100644 --- a/pages/webhooks/customer-created.mdx +++ b/pages/webhooks/customer-created.mdx @@ -1,6 +1,6 @@ --- -title: "Customer created" -description: "This event is fired when a new customer is created in your workspace." +title: 'Customer created' +description: 'This event is fired when a new customer is created in your workspace.' --- ## Schema diff --git a/pages/webhooks/customer-deleted.mdx b/pages/webhooks/customer-deleted.mdx index 0785c36..95c7dfa 100644 --- a/pages/webhooks/customer-deleted.mdx +++ b/pages/webhooks/customer-deleted.mdx @@ -1,6 +1,6 @@ --- -title: "Customer deleted" -description: "This event is fired when a customer is deleted from your workspace." +title: 'Customer deleted' +description: 'This event is fired when a customer is deleted from your workspace.' --- ## Schema diff --git a/pages/webhooks/customer-group-membership-changed.mdx b/pages/webhooks/customer-group-membership-changed.mdx index dabb07e..a1bd6ad 100644 --- a/pages/webhooks/customer-group-membership-changed.mdx +++ b/pages/webhooks/customer-group-membership-changed.mdx @@ -1,6 +1,6 @@ --- -title: "Customer Group Membership Changed Event" -description: "This event is fired whenever a customer is added or removed from a customer group." +title: 'Customer Group Membership Changed Event' +description: 'This event is fired whenever a customer is added or removed from a customer group.' --- The [`changeType`](https://json-schema.app/view/%23%2Fdefinitions%2FcustomerGroupMembershipsChangedPayload?url=https%3A%2F%2Fcore-api.uk.plain.com%2Fwebhooks%2Fschema.json) field allows you to know what kind of change has occurred. It can be one of the following: diff --git a/pages/webhooks/customer-updated.mdx b/pages/webhooks/customer-updated.mdx index d0ded95..d80aeee 100644 --- a/pages/webhooks/customer-updated.mdx +++ b/pages/webhooks/customer-updated.mdx @@ -1,6 +1,6 @@ --- -title: "Customer updated" -description: "This event is fired when a customer is updated in your workspace. You can expect this event:" +title: 'Customer updated' +description: 'This event is fired when a customer is updated in your workspace. You can expect this event:' --- - when a customer is marked as spam diff --git a/pages/webhooks/email-received.mdx b/pages/webhooks/email-received.mdx index ab540cc..a4570d3 100644 --- a/pages/webhooks/email-received.mdx +++ b/pages/webhooks/email-received.mdx @@ -1,14 +1,13 @@ --- -title: "Email received" -description: "This event is fired when an email is received in your workspace." +title: 'Email received' +description: 'This event is fired when an email is received in your workspace.' --- - An important field that might go unnoticed is `isStartOfThread`. This will - tell you if this email is the first message of a thread or not, which is - useful if you want to build some auto-reply logic. If you want to build an - auto-responder that *only replies* to the first message of a thread, please - check [`thread.thread_created`](/webhooks/thread-created) instead. + An important field that might go unnoticed is `isStartOfThread`. This will tell you if this email + is the first message of a thread or not, which is useful if you want to build some auto-reply + logic. If you want to build an auto-responder that *only replies* to the first message of a + thread, please check [`thread.thread_created`](/webhooks/thread-created) instead. ## Schema diff --git a/pages/webhooks/email-sent.mdx b/pages/webhooks/email-sent.mdx index 7422032..1a2218d 100644 --- a/pages/webhooks/email-sent.mdx +++ b/pages/webhooks/email-sent.mdx @@ -1,14 +1,13 @@ --- -title: "Email received" -description: "This event is fired when an email is received in your workspace." +title: 'Email received' +description: 'This event is fired when an email is received in your workspace.' --- - An important field that might go unnoticed is `isStartOfThread`. This will - tell you if this email is the first message of a thread or not, which is - useful if you want to build some auto-reply logic. If you want to build an - auto-responder that *only replies* to the first message of a thread, please - check [`thread.thread_created`](/webhooks/thread-created) instead. + An important field that might go unnoticed is `isStartOfThread`. This will tell you if this email + is the first message of a thread or not, which is useful if you want to build some auto-reply + logic. If you want to build an auto-responder that *only replies* to the first message of a + thread, please check [`thread.thread_created`](/webhooks/thread-created) instead. ## Schema diff --git a/pages/webhooks/thread-assignment-transitioned.mdx b/pages/webhooks/thread-assignment-transitioned.mdx index d31fcda..45f3ea8 100644 --- a/pages/webhooks/thread-assignment-transitioned.mdx +++ b/pages/webhooks/thread-assignment-transitioned.mdx @@ -1,6 +1,6 @@ --- -title: "Thread assignment transitioned" -description: "This event is fired when the assignee of a thread changes or a thread is unassigned." +title: 'Thread assignment transitioned' +description: 'This event is fired when the assignee of a thread changes or a thread is unassigned.' --- ## Schema diff --git a/pages/webhooks/thread-created.mdx b/pages/webhooks/thread-created.mdx index ff35fdf..654b88d 100644 --- a/pages/webhooks/thread-created.mdx +++ b/pages/webhooks/thread-created.mdx @@ -1,18 +1,17 @@ --- -title: "Thread created" -description: "This event is fired when a new thread is created in your workspace." +title: 'Thread created' +description: 'This event is fired when a new thread is created in your workspace.' --- You can subscribe to this event **if you want to build an auto-responder**. To do so, when you receive this event, use the `replyToThread` mutation to send a reply back to the customer. - Every email you receive in your workspace is linked to a thread. If we cannot - find a matching thread for an email, we will create one. When this happens, - you may receive two events: `thread.thread_created` and - [`thread.email_received`](/webhooks/email-received) (depending on your webhook - target event subscriptions). If you do, and you only care about emails which - are not the first message of the thread, please check the `isStartOfThread` in - the [`thread.email_received`](/webhooks/email-received) payload. + Every email you receive in your workspace is linked to a thread. If we cannot find a matching + thread for an email, we will create one. When this happens, you may receive two events: + `thread.thread_created` and [`thread.email_received`](/webhooks/email-received) (depending on your + webhook target event subscriptions). If you do, and you only care about emails which are not the + first message of the thread, please check the `isStartOfThread` in the + [`thread.email_received`](/webhooks/email-received) payload. ## Schema diff --git a/pages/webhooks/thread-labels-changed.mdx b/pages/webhooks/thread-labels-changed.mdx index 63243fb..a45a422 100644 --- a/pages/webhooks/thread-labels-changed.mdx +++ b/pages/webhooks/thread-labels-changed.mdx @@ -1,6 +1,6 @@ --- -title: "Thread labels changed" -description: "This event is fired when labels are added to or removed from a thread." +title: 'Thread labels changed' +description: 'This event is fired when labels are added to or removed from a thread.' --- ## Schema diff --git a/pages/webhooks/thread-priority-changed.mdx b/pages/webhooks/thread-priority-changed.mdx index ea7747b..59ce4e6 100644 --- a/pages/webhooks/thread-priority-changed.mdx +++ b/pages/webhooks/thread-priority-changed.mdx @@ -1,6 +1,6 @@ --- -title: "Thread priority changed" -description: "This event is fired when the priority of a thread changes." +title: 'Thread priority changed' +description: 'This event is fired when the priority of a thread changes.' --- ## Schema diff --git a/pages/webhooks/thread-status-transitioned.mdx b/pages/webhooks/thread-status-transitioned.mdx index 96bb59f..f1cc945 100644 --- a/pages/webhooks/thread-status-transitioned.mdx +++ b/pages/webhooks/thread-status-transitioned.mdx @@ -1,6 +1,6 @@ --- -title: "Thread status transitioned" -description: "This event is fired when the status of a thread changes." +title: 'Thread status transitioned' +description: 'This event is fired when the status of a thread changes.' --- ## Schema