CVE-2023-5572 (TypeScript, published 2023-10-13T10:15Z)
Description: value: Server-Side Request Forgery (SSRF) in GitHub repository vriteio/vrite prior to 0.3.0.
Severity: nan (CVSS v3 base score: 9.8)
Weakness: CWE-918 \u2014 Server-Side Request Forgery (SSRF)
The web server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but it does not sufficiently ensure that the request is being sent to the expected destination.
Repository: https://github.com/vriteio/vrite
Files changed:
.gitignore
apps/backend/api/src/api.ts
apps/backend/api/src/index.ts
apps/backend/app/src/app.ts
apps/backend/app/src/index.ts
apps/backend/assets/src/assets.ts
apps/backend/assets/src/index.ts
apps/backend/collaboration/src/extensions/git-sync.ts
apps/backend/collaboration/src/extensions/search-indexing.ts
apps/backend/collaboration/src/index.ts
apps/backend/collaboration/src/writing.ts
apps/backend/extensions/package.json
apps/backend/extensions/src/extensions.ts
apps/backend/extensions/src/index.ts
apps/backend/extensions/src/routes/dev/transformer.ts
apps/backend/extensions/src/routes/hashnode/transformer.ts
apps/backend/extensions/src/routes/index.ts
apps/backend/extensions/src/routes/mdx/index.ts
apps/backend/extensions/src/routes/mdx/input-transformer.ts
apps/backend/extensions/src/routes/mdx/output-transformer.ts
apps/backend/extensions/src/routes/medium/transformer.ts
apps/docs/.astro/types.d.ts
apps/docs/astro.config.mjs
apps/docs/package.json
apps/docs/src/components/content/card-grid.astro
apps/docs/src/components/content/card.astro
apps/docs/src/components/content/index.ts
apps/docs/src/components/content/info.astro
apps/docs/src/components/content/warning.astro
apps/docs/src/components/fragments/footer.tsx
apps/docs/src/components/fragments/header.tsx
apps/docs/src/components/fragments/index.ts
apps/docs/src/components/fragments/on-this-page.tsx
apps/docs/src/components/fragments/search-palette.tsx
apps/docs/src/components/fragments/side-bar.tsx
apps/docs/src/components/layouts/default.astro
apps/docs/src/components/layouts/menu.json
apps/docs/src/content/config.ts
apps/docs/src/content/docs/javascript-sdk/javascript-sdk.md
apps/docs/src/content/docs/self-hosting/configuration.md
apps/docs/src/content/docs/self-hosting/docker.md
apps/docs/src/content/docs/usage-guide/configuring-vrite.md
apps/docs/src/content/docs/usage-guide/content-editor.md
apps/docs/src/content/docs/usage-guide/getting-started.md
apps/docs/src/content/docs/usage-guide/kanban-dashboard.md
apps/docs/src/content/docs/usage-guide/metadata.md
apps/docs/src/content/docs/usage-guide/publishing.md
apps/docs/src/content/docs/usage-guide/vrite-extensions.md
apps/docs/src/content/recipes/test.mdx
apps/docs/src/env.d.ts
apps/docs/src/pages/[...slug].astro
apps/docs/src/styles/base.css
apps/docs/src/styles/styles.scss
apps/web/package.json
apps/web/public/sandbox.js
apps/web/src/assets/json/light-theme.json
apps/web/src/components/fragments/mini-code-editor.tsx
apps/web/src/context/appearance.tsx
apps/web/src/context/authenticated-user-data.tsx
apps/web/src/context/client.tsx
apps/web/src/context/extensions.tsx
apps/web/src/layout/toolbar/index.tsx
apps/web/src/lib/code-editor/format.ts
apps/web/src/lib/code-editor/suggest-language.ts
apps/web/src/lib/editor/editing.ts
apps/web/src/lib/editor/extensions/block-action-menu/component.tsx
apps/web/src/lib/editor/extensions/block-action-menu/plugin.tsx
apps/web/src/lib/editor/extensions/code-block/menu.tsx
apps/web/src/lib/editor/extensions/code-block/node.tsx
apps/web/src/lib/editor/extensions/code-block/view.tsx
apps/web/src/lib/editor/extensions/collab-cursor.tsx
apps/web/src/lib/editor/extensions/element-menu/component.tsx
apps/web/src/lib/editor/extensions/element-menu/editor.tsx
apps/web/src/lib/editor/extensions/element-menu/index.ts
apps/web/src/lib/editor/extensions/element-menu/plugin.tsx
apps/web/src/lib/editor/extensions/element/node.tsx
apps/web/src/lib/editor/extensions/embed/menu.tsx
apps/web/src/lib/editor/extensions/embed/view.tsx
apps/web/src/lib/editor/extensions/image/menu.tsx
apps/web/src/lib/editor/extensions/image/view.tsx
apps/web/src/lib/editor/extensions/index.ts
apps/web/src/lib/editor/extensions/slash-menu/component.tsx
apps/web/src/lib/monaco.ts
apps/web/src/styles/styles.css
apps/web/src/styles/styles.scss
apps/web/src/views/auth/error-messages.tsx
apps/web/src/views/conflict/index.tsx
apps/web/src/views/content-piece/sections/details/slug.tsx
apps/web/src/views/editor/editor.tsx
apps/web/src/views/editor/menus/bubble/block.tsx
apps/web/src/views/editor/menus/bubble/format.tsx
apps/web/src/views/editor/menus/bubble/index.tsx
apps/web/src/views/editor/menus/bubble/link.tsx
apps/web/src/views/editor/menus/bubble/table.tsx
apps/web/src/views/editor/menus/index.ts
apps/web/src/views/extensions/extension-card.tsx
apps/web/src/views/git/sync-view/index.tsx
apps/web/src/views/settings/api/configure-subsection.tsx
apps/web/src/views/settings/appearance.tsx
apps/web/src/views/settings/editor/index.tsx
apps/web/src/views/settings/editor/options.ts
apps/web/src/views/settings/transformers/index.tsx
apps/web/src/views/settings/webhooks/configure-webhook-subsection.tsx
apps/web/src/views/settings/webhooks/events.ts
apps/web/tsconfig.json
apps/web/vite.config.ts
package.json
packages/backend/src/database/comments.ts
packages/backend/src/database/index.ts
packages/backend/src/database/transformers.ts
packages/backend/src/database/users.ts
packages/backend/src/database/webhooks.ts
packages/backend/src/database/workspace-memberships.ts
packages/backend/src/database/workspace-settings.ts
packages/backend/src/env.ts
packages/backend/src/events/comment.ts
packages/backend/src/events/content-group.ts
packages/backend/src/events/content-piece.ts
packages/backend/src/events/extension.ts
packages/backend/src/events/git-data.ts
packages/backend/src/events/index.ts
packages/backend/src/events/role.ts
packages/backend/src/events/tag.ts
packages/backend/src/events/token.ts
packages/backend/src/events/transformer.ts
packages/backend/src/events/user-settings.ts
packages/backend/src/events/user.ts
packages/backend/src/events/variant.ts
packages/backend/src/events/webhook.ts
packages/backend/src/events/workspace-membership.ts
packages/backend/src/events/workspace-settings.ts
packages/backend/src/events/workspace.ts
packages/backend/src/index.ts
packages/backend/src/lib/auth.ts
packages/backend/src/lib/context.ts
packages/backend/src/lib/git-sync/github/index.ts
packages/backend/src/lib/git-sync/github/process-content.ts
packages/backend/src/lib/git-sync/hooks.ts
packages/backend/src/lib/git-sync/index.ts
packages/backend/src/lib/git-sync/process-content.ts
packages/backend/src/lib/git-sync/types.ts
packages/backend/src/lib/host-config.ts
packages/backend/src/lib/index.ts
packages/backend/src/lib/middleware.ts
packages/backend/src/lib/mongo.ts
packages/backend/src/lib/processing.ts
packages/backend/src/lib/session.ts
packages/backend/src/lib/trpc.ts
packages/backend/src/lib/webhooks.ts
packages/backend/src/plugins/database.ts
packages/backend/src/plugins/email.ts
packages/backend/src/plugins/git-sync.ts
packages/backend/src/plugins/host-config.ts
packages/backend/src/plugins/oauth.ts
packages/backend/src/plugins/pub-sub.ts
packages/backend/src/plugins/s3.ts
packages/backend/src/plugins/search.ts
packages/backend/src/plugins/session.ts
packages/backend/src/plugins/trpc.ts
packages/backend/src/routes/auth.ts
packages/backend/src/routes/comments.ts
packages/backend/src/routes/content-groups.ts
packages/backend/src/routes/content-pieces.ts
packages/backend/src/routes/extensions.ts
packages/backend/src/routes/git/github/index.ts
packages/backend/src/routes/git/github/pull.ts
packages/backend/src/routes/git/github/synced-pieces.ts
packages/backend/src/routes/git/index.ts
packages/backend/src/routes/git/process-records.ts
packages/backend/src/routes/index.ts
packages/backend/src/routes/roles.ts
packages/backend/src/routes/search.ts
packages/backend/src/routes/tags.ts
packages/backend/src/routes/tokens.ts
packages/backend/src/routes/transformers.ts
packages/backend/src/routes/user-settings.ts
packages/backend/src/routes/users.ts
packages/backend/src/routes/utils.ts
packages/backend/src/routes/variants.ts
packages/backend/src/routes/verification.ts
packages/backend/src/routes/webhooks.ts
packages/backend/src/routes/workspace-memberships.ts
packages/backend/src/routes/workspace-settings.ts
packages/backend/src/routes/workspaces.ts
packages/backend/src/server.ts
packages/components/src/primitives/input.tsx
packages/components/src/primitives/tooltip.tsx
packages/editor/src/code-block.ts
packages/editor/src/element.ts
packages/editor/src/embed.ts
packages/editor/src/image.ts
packages/editor/src/index.ts
packages/emails/src/render-email.tsx
packages/extensions/src/dev/spec.json
packages/extensions/src/hashnode/spec.json
packages/extensions/src/mdx/functions/configure.ts
packages/extensions/src/mdx/functions/uninstall.ts
packages/extensions/src/mdx/icon-dark.svg
packages/extensions/src/mdx/icon.svg
packages/extensions/src/mdx/spec.json
packages/extensions/src/medium/spec.json
packages/sdk/javascript/package.json
packages/sdk/javascript/src/api/client.ts
packages/sdk/javascript/src/api/index.ts
packages/sdk/javascript/src/api/request.ts
packages/sdk/javascript/src/transformers/content-walker.ts
packages/sdk/javascript/src/transformers/output-transformers.ts
pnpm-lock.yaml
Commit message: Vrite v0.3 (#45)

- Replace wrapper with element;
- Add XML-like syntax for elements;
- Redesign editor block menus;
- Add MDX extension;
- Allow CORS API access;
- Restructure @vrite/backend;

Vulnerable code:
import corsPlugin from "@fastify/cors";
    methods: ["GET", "DELETE", "PUT", "POST"],
    origin(origin, callback) {
      if (!origin || origin === "null") {
        callback(null, true);

        return;
      }

      const { hostname } = new URL(origin);
      const appHostname = new URL(fastify.config.PUBLIC_APP_URL).hostname;

      if (
        hostname === "localhost" ||
        hostname.endsWith(appHostname) ||
        (fastify.config.VRITE_CLOUD && hostname.endsWith("swagger.io"))
      ) {
        callback(null, true);

        return;
      }

      callback(new Error("Not allowed"), false);
    }
  const server = await createServer();
        version: "0.2.0"
import { appRouter, errors, publicPlugin, trpcPlugin } from "@vrite/backend";
import { processAuth } from "@vrite/backend/src/lib/auth";
    return reply.view("index.html", {
  fastify.get<{ Querystring: { url: string } }>("/proxy*", async (request, reply) => {
    const filterOutRegex =
      /(localhost|\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?::\d{0,4})?\b)/;

    if (request.headers.origin) {
      reply.header("Access-Control-Allow-Origin", fastify.config.PUBLIC_APP_URL);
      reply.header("Access-Control-Allow-Methods", "GET");
      reply.header(
        "Access-Control-Allow-Headers",
        request.headers["access-control-request-headers"]
      );
    } else if (
      fastify.config.NODE_ENV !== "development" &&
      !fastify.config.PUBLIC_APP_URL.includes("localhost")
    ) {
      // Prevent proxy abuse in production
      return reply.status(400).send("Invalid Origin");
    }

    if (
      filterOutRegex.test(request.query.url) &&
      !request.query.url.includes(fastify.config.PUBLIC_ASSETS_URL)
    ) {
      return reply.status(400).send("Invalid URL");
    }

    if (request.method === "OPTIONS") {
      // CORS Preflight
      reply.send();
    } else {
      const targetURL = request.query.url;

      try {
        const response = await axios.get(targetURL, {
          responseType: "arraybuffer"
        });

        if (!`${response.headers["content-type"]}`.includes("image")) {
          return reply.status(400).send("Invalid Content-Type");
        }

        reply.header("content-type", response.headers["content-type"]);
        reply.send(Buffer.from(response.data, "binary"));
      } catch (error) {
        // eslint-disable-next-line no-console
        console.error(error);

        return reply.status(500).send("Could not fetch");
      }
    }
  });
  const server = await createServer();
    reply.header("Access-Control-Allow-Origin", fastify.config.PUBLIC_APP_URL);
import { assetsService } from "./api";
  const server = await createServer();
  GitData,
  ObjectId,
  jsonToBuffer
import { createEventPublisher } from "@vrite/backend/src/lib/pub-sub";
type GitDataEvent = {
  action: "update";
  data: Partial<GitData>;
};

  private publishGitDataEvent = createEventPublisher<GitDataEvent>((workspaceId) => {
    return `gitData:${workspaceId}`;
  });

    this.publishGitDataEvent({ fastify: this.fastify }, `${details.context.workspaceId}`, {
import { ObjectId, docToBuffer, getContentPiecesCollection } from "@vrite/backend";
  const server = await createServer();
import { publicPlugin, getContentsCollection, getContentVariantsCollection } from "@vrite/backend";
import { SessionData } from "@vrite/backend/src/lib/session";
import { unauthorized } from "@vrite/backend/src/lib/errors";
        throw unauthorized();
        throw unauthorized();
    "trpc-openapi": "^1.2.0"
import { publicPlugin, createContext } from "@vrite/backend";
import corsPlugin from "@fastify/cors";
    credentials: true,
      return createContext({ req, res }, fastify);
import { createServer, z } from "@vrite/backend";
  const server = await createServer();
      JSONContentNode["listItem" | "blockquote" | "doc" | "wrapper"]
          case "wrapper":
              child as JSONContentNodeWalker<JSONContentNode["wrapper"]>
      JSONContentNode["listItem" | "blockquote" | "doc" | "wrapper"]
          case "wrapper":
              child as JSONContentNodeWalker<JSONContentNode["wrapper"]>
  gpt: gptRouter
      JSONContentNode["listItem" | "blockquote" | "doc" | "wrapper"]
          case "wrapper":
              child as JSONContentNodeWalker<JSONContentNode["wrapper"]>
  slug: "javascript-sdk/javascript-sdk";
  data: any
  data: any
  data: any
  data: any
  slug: "usage-guide/content-editor";
  data: any
  slug: "usage-guide/getting-started";
  data: any
  slug: "usage-guide/kanban-dashboard";
  data: any
  slug: "usage-guide/metadata";
  data: any
  slug: "usage-guide/publishing";
  data: any
  slug: "usage-guide/vrite-extensions";
  data: any
    })
import { ParentComponent, createSignal } from "solid-js";
import { Button } from "#components/primitives";

interface EndpointCardSectionsProps {
  sections: Array<{ label: string; id: string }>;
}

const EndpointCardSections: ParentComponent<EndpointCardSectionsProps> = (props) => {
  const [activeSection, setActiveSection] = createSignal(props.sections[0].id);

  return (
    <>
      <div class="flex w-full gap-2">
        {props.sections.map((section) => {
          return (
            <Button
              variant={section.id === activeSection() ? "solid" : "text"}
              text={section.id === activeSection() ? "base" : "soft"}
              color="contrast"
              class="py-1 m-0 text-xl font-semibold"
              onClick={() => {
                setActiveSection(section.id);
              }}
            >
              {section.label}
            </Button>
          );
        })}
      </div>
      <div data-active-section={activeSection()}>{props.children}</div>
    </>
  );
};

export { EndpointCardSections };
import { Code } from "astro:components";
import { Button, Card, IconButton } from "#components/primitives";
import curlString from "curl-string";
import { mdiAsterisk } from "@mdi/js";
import { EndpointCardSections } from "./endpoint-card-sections";

interface Props {
    method: string;
    endpoint: string;
    parameters?: Array<{
        name: string;
        required?: boolean;
        description?: string;
        example?:string;
        schema: { type: string; default?:string };
    }>;
    example?: Record<string, any>;
    requestBody?: string;
    response?: string;
}

const body = JSON.stringify( {}, null, 2);
const sections: Array<{ label: string; id: string }> = [];

if (Astro.props.parameters && Astro.props.parameters.length) {
    sections.push({ label: "Parameters", id: "parameters" });
}

if (Astro.props.requestBody) {
    sections.push({ label: "Body", id: "body" });
}

sections.push({ label: "Response", id: "response" });

const queryString = new URLSearchParams(
    (Astro.props.parameters||[]).map((parameter) => {
        return [parameter.name, parameter.example]
    }) as string[][]
).toString();
const url = `https://api.vrite.io${Astro.props.endpoint}${queryString ? `?${queryString}` : ""}`;
const parsedBody = JSON.parse(body);
const curl = curlString(
    `"${url}"`,
    {
        method: Astro.props.method,
        headers: {
            Authorization: `Bearer ${"<YOUR-TOKEN>"}`,
            ...(body === "{}"
                ? {}
                : {
                      "Content-Type": "application/json"
                  }),
            Accept: "application/json"
        },
        ...(body === "{}"
            ? {}
            : {
                  body: parsedBody
              })
    },
    { colorJson: false, jsonIndentWidth: 4 }
);
const code = `${curl}\n`;

<Card class="relative p-4 m-0 gap-2 flex flex-col text-gray-700 dark:text-gray-300 my-4 bg-gray-100 dark:bg-gray-900">
    <div class="flex">
        <Button badge class="m-0 font-mono font-semibold" size="large" color="contrast">
            {Astro.props.method}
            {" "}{Astro.props.endpoint}
        </Button>
    </div>
    <div class="code-block-contrast">
        <Code code={code} lang="shell" />
    </div>
    <EndpointCardSections client:load sections={sections}>
        {
            Astro.props.parameters && Astro.props.parameters.length ? (
                <div class="flex flex-col gap-2 parameters-section">
                    {(Astro.props.parameters || []).map((parameter) => {
                        return (
                            <Card class="m-0 bg-gray-50 dark:bg-gray-800">
                                <div class="flex items-center">
                                    <Button badge text="soft" class="m-0 font-mono font-semibold">
                                        {parameter.name}
                                    </Button>
                                    <span class="!bg-transparent text-sm font-mono px-2 flex-1">
                                        {parameter.schema.type}
                                    </span>
                                    {parameter.required && (
                                        <IconButton
                                            class="m-0"
                                            path={mdiAsterisk}
                                            color="primary"
                                            badge
                                            label="Required"
                                        />
                                    )}
                                </div>
                                {parameter.description && (
                                    <p class="pl-1 m-0 mt-2">{parameter.description}</p>
                                )}
                            </Card>
                        );
                    })}
                </div>
            ): <></>
        }
        {
            Astro.props.requestBody && (
                <div class="code-block-contrast body-section">
                    <Code code={Astro.props.requestBody} lang="typescript"  />
                </div>
            )
        }
        {
            Astro.props.response && (
                <div class="code-block-contrast response-section">
                    <Code code={Astro.props.response} lang="typescript" />
                </div>
            )
        }
    </EndpointCardSections>
</Card>
interface NavigateProps {
  nextEntry?: { label: string; link: string };
  previousEntry?: { label: string; link: string };
const Navigation: Component<NavigateProps> = (props) => {
export { Navigation };
import { mdiAppleKeyboardCommand, mdiMagnify } from "@mdi/js";
import type { Component } from "solid-js";
import { Icon, IconButton } from "#components/primitives";
import { logoIcon } from "#assets/icons";
    <div class="top-0 bg-gray-50 dark:bg-gray-800 border-b-2 border-gray-200 dark:border-gray-700 left-0 z-50 items-center justify-center w-full flex py-2 px-4 md:px-3">
          <div class="hidden xl:flex w-full items-center min-w-48">
            <span class="pl-1 flex-1 text-start">Search</span>
            <kbd class="bg-gray-300 dark:bg-gray-700 group-hover:bg-gray-200 dark:group-hover:bg-gray-800 flex justify-center items-center rounded-md px-1 h-5 text-sm">
              {isAppleDevice() ? <Icon path={mdiAppleKeyboardCommand} class="h-3 w-3" /> : "Ctrl "}K
            </kbd>
        class="@xl:min-w-48 justify-start m-0 group !hidden"
export { Header };
export * from "./navigation";
import { Component, For, onMount, onCleanup, createSignal, createMemo } from "solid-js";
      return heading.depth === 2;
    const observedElements: HTMLElement[] = [];
          "w-56 flex-col justify-start top-0 pt-16 fixed right-0 hidden xl:flex gap-2",
                class="text-start m-0"
                  document.getElementById(heading.slug)?.scrollIntoView({
                    block: "start",
                    inline: "nearest"
                  });
import { mdiMenu, mdiClose, mdiGithub, mdiChevronDown, mdiCodeJson } from "@mdi/js";
import { Component, For, JSX, createSignal } from "solid-js";
import { discordIcon } from "#assets/icons";
  menu: Array<{
    menu: Array<{ label: string; link: string }>;

const externalLinks = [
  {
    label: "GitHub",
    icon: mdiGithub,
    href: "https://github.com/vriteio/vrite"
  },
  {
    label: "Discord",
    icon: discordIcon,
    href: "https://discord.gg/yYqDWyKnqE"
  },
  {
    label: "Vrite Cloud",
    icon: logoIcon,
    href: "https://app.vrite.io"
  },
  {
    label: "API Reference",
    icon: mdiCodeJson,
    href: "https://generator.swagger.io/?url=https://api.vrite.io/swagger.json#"
  }
];
const SideBarNestedMenu: Component<{
  menu: Array<{ label: string; link: string; menu?: Array<{ label: string; link: string }> }>;
}> = (props) => {
    props.menu.filter((item) => {
      return props.currentPath.includes(item.link);
    }).length > 0
                return props.currentPath.includes(item.link);
            menuOpened() ? "" : "translate-y-full md:translate-y-0"
            <For each={externalLinks}>
              {(link) => {
                    target="_blank"
                    href={link.href}
                      path={link.icon}
                      color="contrast"
                      text="soft"
                    <span class=" ml-2 text-gray-500 dark:text-gray-400">{link.label}</span>
          <For each={props.menu}>
                <SideBarNestedMenu currentPath={props.currentPath} menu={menuItem.menu}>
import { Header, BaseHead, SideBar, SVGDefs, OnThisPage } from "#components/fragments";
    <BaseHead description={description} title={title} image={image} />
        <SideBar menu={menu} currentPath={Astro.url.pathname} client:load />
        <div class="flex overflow-hidden w-full relative h-full">
          <div class="flex-1 flex overflow-y-auto overflow-x-hidden justify-center" id="container">
              class="flex-1 prose max-w-screen-md w-full text-lg px-4 pt-4 pb-24 h-fit xl:w-[calc(100%-15rem)]"
[
  {
    "label": "Usage Guide",
    "menu": [
      {
        "label": "Getting Started",
        "link": "/usage-guide/getting-started"
      },
      {
        "label": "Managing Content with Kanban",
        "link": "/usage-guide/kanban-dashboard"
      },
      {
        "label": "Managing metadata",
        "link": "/usage-guide/metadata"
      },
      {
        "label": "Writing in the Vrite Editor",
        "link": "/usage-guide/content-editor"
      },
      {
        "label": "Configuring Vrite",
        "link": "/usage-guide/configuring-vrite"
      },
      {
        "label": "Publishing content",
        "link": "/usage-guide/publishing"
      }
    ]
  },
  {
    "label": "JavaScript SDK",
    "menu": [
      {
        "label": "Introduction",
        "link": "/javascript-sdk/javascript-sdk"
      }
    ]
  },
  {
    "label": "Self-Hosting",
    "menu": [
      {
        "label": "Docker",
        "link": "/self-hosting/docker"
      },
      {
        "label": "Configuration",
        "link": "/self-hosting/configuration"
      }
    ]
  }
]
  type: "content"
  docs: docsCollection
  const blogEntries = await getCollection("docs");
  return blogEntries.map((entry) => ({
    params: { slug: entry.slug },
    props: { entry }
  }));
<DefaultLayout headings={headings} title={entry.data.title}>


    &::before,
    &::before,
    &::before,
    &::before,
    &::before,
    &::before,
    .open-slash-menu > button {
      @apply font-bold dark:bg-gray-900 dark:border-gray-700;
      position: absolute;
      left: -2.5rem;
      background: #f9fafb;
      height: 2rem;
      width: 2rem;
      justify-content: center;
      display: flex;
      align-items: center;
      color: #6b7280;
      border-radius: 25%;
      font-size: 1rem;
      line-height: 1rem;
      text-align: center;
      top: 50%;
      transform: translateY(-50%);
      //border: 2px solid #e5e7eb;
      @apply border-2;
      opacity: 1;
    }

  h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  .open-slash-menu {
    @apply m-0 relative;
    & > button {
      @apply mt-4;
  }
  .open-slash-menu {
    button {
      font-size: 1.25em;
      line-height: 1.25em;
      font-weight: 600;
  :where(h4):not(:where(.not-prose, .not-prose *)) {
    line-height: 2.1rem;
  }
  :where(h5):not(:where(.not-prose, .not-prose *)) {
    line-height: 2.1rem;
  }
  :where(h6):not(:where(.not-prose, .not-prose *)) {
    font-size: 0.875em;
    line-height: 2.1rem;
    "monaco-editor": "^0.40.0",
          for (var i2 = 0; i2 < octets.length; i2 += 1) {
            var octet = octets[i2];
          for (var i2 = 0; i2 < array.length; i2 += 1) {
            var line = array[i2];
            for (var i2 = 0; i2 < length; i2 += 1) {
              var listener = typeListeners[i2];
          for (var i2 = 0; i2 < typeListeners.length; i2 += 1) {
            if (typeListeners[i2] === listener) {
            for (var i2 = 0; i2 < typeListeners.length; i2 += 1) {
              if (typeListeners[i2] !== listener) {
                filtered.push(typeListeners[i2]);
              for (var i2 = 0; i2 < textChunk.length; i2 += 1) {
                var c = textChunk.charCodeAt(i2);
                  n = i2;
                var i2 = url.indexOf("?");
                requestURL = i2 === -1 ? url : url.slice(0, i2 + 1) + url.slice(i2 + 1).replace(/(?:^|&)([^=&]*)(?:=[^&]*)?/g, function(p, paramName) {
          var s = new XMLHttpRequest(), o = [], u2 = [], i2 = {}, a = function() {
              return i2[e2.toLowerCase()];
              return e2.toLowerCase() in i2;
              o.push(n2 = n2.toLowerCase()), u2.push([n2, t2]), i2[n2] = i2[n2] ? i2[n2] + "," + t2 : t2;
    createClient: () => B
  var import_eventsource, i, w, $, U, f, g, L, d, S, D, O, E, R, C, x, m, I, h, j, v, k, q, l, A, u, z, B;
      i = "/content-groups";
      w = (t) => ({ get: (e) => t("GET", `${i}`, { params: e }), list: (e) => t("GET", `${i}/list`, { params: e }), create: (e) => t("POST", `${i}`, { body: e }), update: (e) => t("PUT", `${i}`, { body: e }), delete: (e) => t("DELETE", `${i}`, { params: e }) });
      $ = "/content-pieces";
      U = (t) => ({ get: (e) => t("GET", `${$}`, { params: e }), create: (e) => t("POST", `${$}`, { body: e }), update: (e) => t("PUT", `${$}`, { body: e }), delete: (e) => t("DELETE", `${$}`, { params: e }), list: (e) => t("GET", `${$}/list`, { params: e }) });
        let e = t.baseURL || "https://api.vrite.io", n = t.extensionId || "", c = t.headers || {}, { token: s } = t;
        return { sendRequest: async (a, p, r) => {
            const { default: o } = await Promise.resolve().then(() => __toESM(require_browser2(), 1)), y = await o(`${e}${p}/?${encodeURI(Object.entries(r?.params || {}).filter(([, b]) => b).map(([b, G]) => `${b}=${G}`).join("&"))}`, { headers: { Authorization: `Bearer ${s}`, Accept: "application/json", ...r?.body ? { "Content-Type": "application/json" } : {}, ...n ? { "X-Vrite-Extension-ID": n } : {}, ...c }, body: r?.body ? JSON.stringify(r.body) : null, method: a });
            let T = null;
              if (T = await y.json(), !T)
            if (!y.ok)
              throw T;
            return T;
        }, reconfigure: (a) => {
          e = a.baseURL || e, s = a.token || s, n = a.extensionId || n, c = a.headers || c;
        }, getConfig: () => ({ baseURL: e, token: s, extensionId: n, headers: c }) };
      g = "/user-settings";
      L = (t) => ({ get: () => t("GET", `${g}`), update: (e) => t("PUT", `${g}`, { body: e }) });
      d = "/tags";
      S = (t) => ({ get: (e) => t("GET", `${d}`, { params: e }), update: (e) => t("PUT", `${d}`, { body: e }), create: (e) => t("PUT", `${d}`, { body: e }), delete: (e) => t("DELETE", `${d}`, { params: e }), list: (e) => t("GET", `${d}/list`, { params: e }) });
      D = "/profile";
      O = (t) => ({ get: () => t("GET", `${D}`) });
      E = "/webhooks";
      R = (t) => ({ get: (e) => t("GET", `${E}`, { params: e }), create: (e) => t("POST", `${E}`, { body: e }), update: (e) => t("PUT", `${E}`, { body: e }), delete: (e) => t("DELETE", `${E}`, { params: e }), list: (e) => t("GET", `${E}/list`, { params: e }) });
      x = (t) => ({ get: () => t("GET", `${C}`) });
      m = "/roles";
      I = (t) => ({ get: (e) => t("GET", `${m}`, { params: e }), create: (e) => t("POST", `${m}`, { body: e }), update: (e) => t("PUT", `${m}`, { body: e }), delete: (e) => t("DELETE", `${m}`, { params: e }), list: (e) => t("GET", `${m}/list`, { params: e }) });
      h = "/workspace-settings";
      j = (t) => ({ get: () => t("GET", `${h}`), update: (e) => t("PUT", `${h}`, { body: e }) });
      v = (t) => ({ listMembers: (e) => t("GET", "/workspace-memberships/list-members", { params: e }), listWorkspaces: (e) => t("GET", "/workspace-memberships/list-workspaces", { params: e }), create: (e) => t("POST", "/workspace-memberships", { body: e }), update: (e) => t("PUT", "/workspace-memberships", { body: e }), delete: (e) => t("DELETE", "/workspace-memberships", { params: e }) });
      k = "/extension";
      q = (t) => ({ get: () => t("GET", `${k}`), updateContentPieceData: (e) => t("POST", `${k}/content-piece-data`, { body: e }) });
      l = "/variants";
      A = (t) => ({ create: (e) => t("POST", `${l}`, { body: e }), update: (e) => t("PUT", `${l}`, { body: e }), delete: (e) => t("DELETE", `${l}`, { params: e }), list: () => t("GET", `${l}/list`) });
      u = "/transformers";
      z = (t) => ({ create: (e) => t("POST", `${u}`, { body: e }), delete: (e) => t("DELETE", `${u}`, { params: e }), list: () => t("GET", `${u}/list`) });
      B = (t) => {
        const { sendRequest: e, reconfigure: n, getConfig: c } = f(t);
        return { contentGroups: w(e), contentPieces: U(e), tags: S(e), profile: O(e), userSettings: L(e), webhooks: R(e), workspace: x(e), roles: I(e), workspaceSettings: j(e), workspaceMemberships: v(e), extension: q(e), variants: A(e), transformers: z(e), search(s) {
          return e("GET", "/search", { params: s });
        }, async ask(s) {
          let a = "";
          const p = new import_eventsource.default(`${c().baseURL}/search/ask?query=${encodeURIComponent(s.query)}`, { headers: { Authorization: `Bearer ${c().token}` } });
          p.addEventListener("error", (r) => {
            const o = r;
            return o.message ? s.onError?.(o.message) : (p.close(), s.onEnd?.(a));
          }), p.addEventListener("message", (r) => {
            const o = decodeURIComponent(r.data);
            a += o, s.onChunk?.(o, a);
          });
        }, reconfigure: n };
  "inherit": false,
  "base": "vs-dark",
  "colors": {
    "focusBorder": "#2188ff",
    "foreground": "#444d56",
    "descriptionForeground": "#6a737d",
    "errorForeground": "#cb2431",
    "textLink.foreground": "#0366d6",
    "textLink.activeForeground": "#005cc5",
    "textBlockQuote.background": "#fafbfc",
    "textBlockQuote.border": "#e1e4e8",
    "textCodeBlock.background": "#f6f8fa",
    "textPreformat.foreground": "#586069",
    "textSeparator.foreground": "#d1d5da",
    "button.background": "#159739",
    "button.foreground": "#ffffff",
    "button.hoverBackground": "#138934",
    "checkbox.background": "#fafbfc",
    "checkbox.border": "#d1d5da",
    "dropdown.background": "#fafbfc",
    "dropdown.border": "#e1e4e8",
    "dropdown.foreground": "#2f363d",
    "dropdown.listBackground": "#ffffff",
    "input.background": "#fafbfc",
    "input.border": "#e1e4e8",
    "input.foreground": "#2f363d",
    "input.placeholderForeground": "#959da5",
    "badge.foreground": "#005cc5",
    "badge.background": "#dbedff",
    "progressBar.background": "#2188ff",
    "titleBar.activeForeground": "#2f363d",
    "titleBar.activeBackground": "#ffffff",
    "titleBar.inactiveForeground": "#6a737d",
    "titleBar.inactiveBackground": "#f6f8fa",
    "titleBar.border": "#e1e4e8",
    "activityBar.foreground": "#2f363d",
    "activityBar.inactiveForeground": "#959da5",
    "activityBar.background": "#ffffff",
    "activityBarBadge.foreground": "#ffffff",
    "activityBarBadge.background": "#2188ff",
    "activityBar.activeBorder": "#f9826c",
    "activityBar.border": "#e1e4e8",
    "sideBar.foreground": "#586069",
    "sideBar.background": "#f6f8fa",
    "sideBar.border": "#e1e4e8",
    "sideBarTitle.foreground": "#2f363d",
    "sideBarSectionHeader.foreground": "#2f363d",
    "sideBarSectionHeader.background": "#f6f8fa",
    "sideBarSectionHeader.border": "#e1e4e8",
    "list.hoverForeground": "#2f363d",
    "list.inactiveSelectionForeground": "#2f363d",
    "list.activeSelectionForeground": "#2f363d",
    "list.hoverBackground": "#ebf0f4",
    "list.inactiveSelectionBackground": "#e8eaed",
    "list.activeSelectionBackground": "#e2e5e9",
    "list.inactiveFocusBackground": "#dbedff",
    "list.focusBackground": "#cce5ff",
    "tree.indentGuidesStroke": "#e1e4e8",
    "notificationCenterHeader.foreground": "#6a737d",
    "notificationCenterHeader.background": "#e1e4e8",
    "notifications.foreground": "#2f363d",
    "notifications.background": "#fafbfc",
    "notifications.border": "#e1e4e8",
    "notificationsErrorIcon.foreground": "#d73a49",
    "notificationsWarningIcon.foreground": "#e36209",
    "notificationsInfoIcon.foreground": "#005cc5",
    "pickerGroup.border": "#e1e4e8",
    "pickerGroup.foreground": "#2f363d",
    "quickInput.background": "#fafbfc",
    "quickInput.foreground": "#2f363d",
    "statusBar.foreground": "#586069",
    "statusBar.background": "#ffffff",
    "statusBar.border": "#e1e4e8",
    "statusBar.noFolderBackground": "#ffffff",
    "statusBar.debuggingBackground": "#f9826c",
    "statusBar.debuggingForeground": "#ffffff",
    "editorGroupHeader.tabsBackground": "#f6f8fa",
    "editorGroupHeader.tabsBorder": "#e1e4e8",
    "editorGroup.border": "#e1e4e8",
    "tab.activeForeground": "#2f363d",
    "tab.inactiveForeground": "#6a737d",
    "tab.inactiveBackground": "#f6f8fa",
    "tab.activeBackground": "#ffffff",
    "tab.hoverBackground": "#ffffff",
    "tab.unfocusedHoverBackground": "#ffffff",
    "tab.border": "#e1e4e8",
    "tab.unfocusedActiveBorderTop": "#e1e4e8",
    "tab.activeBorder": "#ffffff",
    "tab.unfocusedActiveBorder": "#ffffff",
    "tab.activeBorderTop": "#f9826c",
    "breadcrumb.foreground": "#6a737d",
    "breadcrumb.focusForeground": "#2f363d",
    "breadcrumb.activeSelectionForeground": "#586069",
    "breadcrumbPicker.background": "#fafbfc",
    "editor.foreground": "#24292e",
    "editor.background": "#f9fafb",
    "editorWidget.background": "#f3f4f6",
    "editorWidget.border": "#e5e7eb",
    "editor.foldBackground": "#fafbfc",
    "editor.lineHighlightBackground": "#f6f8fa",
    "editorLineNumber.foreground": "#1b1f234d",
    "editorLineNumber.activeForeground": "#24292e",
    "editorIndentGuide.background": "#eff2f6",
    "editorIndentGuide.activeBackground": "#d7dbe0",
    "editorWhitespace.foreground": "#d1d5da",
    "editorCursor.foreground": "#044289",
    "editor.findMatchBackground": "#ffdf5d",
    "editor.findMatchHighlightBackground": "#ffdf5d66",
    "editor.inactiveSelectionBackground": "#0366d611",
    "editor.selectionBackground": "#0366d625",
    "editor.selectionHighlightBackground": "#34d05840",
    "editor.selectionHighlightBorder": "#34d05800",
    "editor.wordHighlightBackground": "#34d05800",
    "editor.wordHighlightStrongBackground": "#34d05800",
    "editor.wordHighlightBorder": "#24943e99",
    "editor.wordHighlightStrongBorder": "#24943e50",
    "editorBracketMatch.background": "#34d05840",
    "editorBracketMatch.border": "#34d05800",
    "editorGutter.modifiedBackground": "#2188ff",
    "editorGutter.addedBackground": "#28a745",
    "editorGutter.deletedBackground": "#d73a49",
    "diffEditor.insertedTextBackground": "#34d05822",
    "diffEditor.removedTextBackground": "#d73a4922",
    "scrollbar.shadow": "#6a737d33",
    "scrollbarSlider.background": "#959da533",
    "scrollbarSlider.hoverBackground": "#959da544",
    "scrollbarSlider.activeBackground": "#959da588",
    "editorOverviewRuler.border": "#ffffff",
    "panel.background": "#f6f8fa",
    "panel.border": "#e1e4e8",
    "panelTitle.activeBorder": "#f9826c",
    "panelTitle.activeForeground": "#2f363d",
    "panelTitle.inactiveForeground": "#6a737d",
    "panelInput.border": "#e1e4e8",
    "terminal.foreground": "#586069",
    "gitDecoration.addedResourceForeground": "#28a745",
    "gitDecoration.modifiedResourceForeground": "#005cc5",
    "gitDecoration.deletedResourceForeground": "#d73a49",
    "gitDecoration.untrackedResourceForeground": "#28a745",
    "gitDecoration.ignoredResourceForeground": "#959da5",
    "gitDecoration.conflictingResourceForeground": "#e36209",
    "gitDecoration.submoduleResourceForeground": "#959da5",
    "debugToolBar.background": "#ffffff",
    "editor.stackFrameHighlightBackground": "#fffbdd",
    "editor.focusedStackFrameHighlightBackground": "#fff5b1",
    "settings.headerForeground": "#2f363d",
    "settings.modifiedItemIndicator": "#2188ff",
    "welcomePage.buttonBackground": "#f6f8fa",
    "welcomePage.buttonHoverBackground": "#e1e4e8"
  },
      "foreground": "#6a737d",
      "token": "comment"
    },
    {
      "foreground": "#6a737d",
      "token": "punctuation.definition.comment"
    },
    {
      "foreground": "#6a737d",
      "token": "string.comment"
    },
    {
      "foreground": "#005cc5",
      "token": "constant"
    },
    {
      "foreground": "#005cc5",
      "token": "entity.name.constant"
    },
    {
      "foreground": "#005cc5",
      "token": "variable.other.constant"
    },
    {
      "foreground": "#005cc5",
      "token": "variable.language"
    },
    {
      "foreground": "#6f42c1",
      "token": "entity"
    },
    {
      "foreground": "#6f42c1",
      "token": "entity.name"
    },
    {
      "foreground": "#24292e",
      "token": "variable.parameter.function"
    },
    {
      "foreground": "#22863a",
      "token": "entity.name.tag"
    },
    {
      "foreground": "#d73a49",
      "token": "keyword"
    },
    {
      "foreground": "#d73a49",
      "token": "storage"
    },
    {
      "foreground": "#d73a49",
      "token": "storage.type"
    },
    {
      "foreground": "#24292e",
      "token": "storage.modifier.package"
    },
    {
      "foreground": "#24292e",
      "token": "storage.modifier.import"
    },
    {
      "foreground": "#24292e",
      "token": "storage.type.java"
    },
    {
      "foreground": "#032f62",
      "token": "string"
    },
    {
      "foreground": "#032f62",
      "token": "punctuation.definition.string"
    },
    {
      "foreground": "#032f62",
      "token": "string punctuation.section.embedded source"
    },
    {
      "foreground": "#005cc5",
      "token": "support"
    },
    {
      "foreground": "#005cc5",
      "token": "meta.property-name"
    },
    {
      "foreground": "#e36209",
      "token": "variable"
    },
    {
      "foreground": "#24292e",
      "token": "variable.other"
    },
    {
      "fontStyle": "italic",
      "foreground": "#b31d28",
      "token": "invalid.broken"
    },
    {
      "fontStyle": "italic",
      "foreground": "#b31d28",
      "token": "invalid.deprecated"
    },
    {
      "fontStyle": "italic",
      "foreground": "#b31d28",
      "token": "invalid.illegal"
    },
    {
      "fontStyle": "italic",
      "foreground": "#b31d28",
      "token": "invalid.unimplemented"
    },
    {
      "fontStyle": "italic underline",
      "background": "#d73a49",
      "foreground": "#fafbfc",
      "content": "^M",
      "token": "carriage-return"
    },
    {
      "foreground": "#b31d28",
      "token": "message.error"
    },
    {
      "foreground": "#24292e",
      "token": "string source"
    },
    {
      "foreground": "#005cc5",
      "token": "string variable"
    },
    {
      "foreground": "#032f62",
      "token": "source.regexp"
    },
    {
      "foreground": "#032f62",
      "token": "string.regexp"
    },
    {
      "foreground": "#032f62",
      "token": "string.regexp.character-class"
    },
    {
      "foreground": "#032f62",
      "token": "string.regexp constant.character.escape"
    },
    {
      "foreground": "#032f62",
      "token": "string.regexp source.ruby.embedded"
    },
    {
      "foreground": "#032f62",
      "token": "string.regexp string.regexp.arbitrary-repitition"
    },
    {
      "fontStyle": "bold",
      "foreground": "#22863a",
      "token": "string.regexp constant.character.escape"
    },
    {
      "foreground": "#005cc5",
      "token": "support.constant"
    },
    {
      "foreground": "#005cc5",
      "token": "support.variable"
    },
    {
      "foreground": "#005cc5",
      "token": "meta.module-reference"
    },
    {
      "foreground": "#e36209",
      "token": "punctuation.definition.list.begin.markdown"
    },
    {
      "fontStyle": "bold",
      "foreground": "#005cc5",
      "token": "markup.heading"
    },
    {
      "fontStyle": "bold",
      "foreground": "#005cc5",
      "token": "markup.heading entity.name"
    },
    {
      "foreground": "#22863a",
      "token": "markup.quote"
    },
    {
      "fontStyle": "italic",
      "foreground": "#24292e",
      "token": "markup.italic"
    },
    {
      "fontStyle": "bold",
      "foreground": "#24292e",
      "token": "markup.bold"
    },
    {
      "foreground": "#005cc5",
      "token": "markup.raw"
    },
    {
      "background": "#ffeef0",
      "foreground": "#b31d28",
      "token": "markup.deleted"
    },
    {
      "background": "#ffeef0",
      "foreground": "#b31d28",
      "token": "meta.diff.header.from-file"
    },
    {
      "background": "#ffeef0",
      "foreground": "#b31d28",
      "token": "punctuation.definition.deleted"
    },
    {
      "background": "#f0fff4",
      "foreground": "#22863a",
      "token": "markup.inserted"
    },
    {
      "background": "#f0fff4",
      "foreground": "#22863a",
      "token": "meta.diff.header.to-file"
    },
    {
      "background": "#f0fff4",
      "foreground": "#22863a",
      "token": "punctuation.definition.inserted"
    },
    {
      "background": "#ffebda",
      "foreground": "#e36209",
      "token": "markup.changed"
    },
    {
      "background": "#ffebda",
      "foreground": "#e36209",
      "token": "punctuation.definition.changed"
    },
    {
      "foreground": "#f6f8fa",
      "background": "#005cc5",
      "token": "markup.ignored"
    },
    {
      "foreground": "#f6f8fa",
      "background": "#005cc5",
      "token": "markup.untracked"
    },
    {
      "foreground": "#6f42c1",
      "fontStyle": "bold",
      "token": "meta.diff.range"
    },
    {
      "foreground": "#005cc5",
      "token": "meta.diff.header"
    },
    {
      "fontStyle": "bold",
      "foreground": "#005cc5",
      "token": "meta.separator"
    },
    {
      "foreground": "#005cc5",
      "token": "meta.output"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.tag"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.curly"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.round"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.square"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.angle"
    },
    {
      "foreground": "#586069",
      "token": "brackethighlighter.quote"
    },
    {
      "foreground": "#b31d28",
      "token": "brackethighlighter.unmatched"
    },
    {
      "foreground": "#032f62",
      "fontStyle": "underline",
      "token": "constant.other.reference.link"
    },
    {
      "foreground": "#032f62",
      "fontStyle": "underline",
      "token": "string.other.link"
  "encodedTokensColors": []
        theme: "dark-contrast",
      createEffect(() => {
        props.monaco.editor.setTheme(
          `${codeEditorTheme()}${props.color === "contrast" ? "-contrast" : ""}`
        );
      });
          "w-full bg-gray-100 border-2 not-prose dark:bg-gray-900 rounded-2xl dark:border-gray-700 rounded",
    userSettings = () => ({ accentColor: "energy", codeEditorTheme: "dark", uiTheme: "auto" })
          } else if (action === "createWrapper") {
            setWorkspaceSettings((workspaceSettings) => ({
              ...workspaceSettings!,
              wrappers: [...(workspaceSettings?.wrappers || []), data]
            }));
          } else if (action === "deleteWrapper") {
            setWorkspaceSettings((workspaceSettings) => ({
              ...workspaceSettings!,
              wrappers: (workspaceSettings?.wrappers || []).filter(
                (wrapper) => wrapper.key !== data.key
              )
            }));
          } else if (action === "updateWrapper") {
            setWorkspaceSettings((workspaceSettings) => ({
              ...workspaceSettings!,
              wrappers: (workspaceSettings?.wrappers || []).map((wrapper) => {
                if (wrapper.key === data.key) {
                  return {
                    ...wrapper,
                    ...data
                  };
                }

                return wrapper;
              })
            }));
              if (error.data?.code === "UNAUTHORIZED") {
  "gpt-3.5": () => import("@vrite/extensions/gpt-3.5.json")
        ":base-2: p-1 w-full flex items-center border-b-2 absolute h-12 border-gray-200 dark:border-gray-700 justify-end @container z-1",
  json: "yaml",
  scss: "scss"
    case "json":
      plugins: parserPlugins,
      ...(language === "json" && {
        trailingComma: "none",
        singleQuote: false
      })
const useSuggestLanguage = (
  languages: monaco.languages.ILanguageExtensionPoint[]
): ((query: string) => string[]) => {
  const languageIds = getLanguageIds(languages);
    engine.addAll(languageIds);
import { CodeBlock, Embed, Image, Wrapper } from "./extensions";
    wrapper: Wrapper,
      label: "Wrapper",
      block: "wrapper",
        return editor.chain().focus().deleteRange(range).setWrapper().run();
                    return node()?.hasMarkup(props.state.editor.schema.nodes[block]);
      } catch (e) {
import { useSolidNodeView } from "@vrite/tiptap-solid";
import { mdiCodeTagsCheck } from "@mdi/js";
import type { monaco } from "#lib/monaco";
import { IconButton, Input, Tooltip } from "#components/primitives";
  monaco: typeof monaco;
  changeLanguage(languageId: string | null): void;
  const { state } = useSolidNodeView();
  const attrs = (): CodeBlockAttributes => state().node.attrs;
  const suggestLanguage = useSuggestLanguage(props.monaco.languages.getLanguages());
  const formattingAvailable = createMemo(() => {
    return isFormattable(attrs().lang || "");
  });
    on(attrs, () => {
      setSuggestions(suggestLanguage(attrs().lang || ""));
      props.changeLanguage(attrs().lang || null);
    <div class="flex p-0 transition-shadow duration-200 border-0 rounded-xl">
      <Input
        wrapperClass="flex-1 max-w-full"
        placeholder="Language"
        value={attrs().lang || ""}
        suggestions={suggestions()}
        color="contrast"
        disabled={!state().editor.isEditable}
        setValue={(value) => {
          state().updateAttributes({ lang: value });
        }}
      />
      <Show when={state().editor.isEditable}>
        <Tooltip text={formattingAvailable() ? "Format" : "Formatting unavailable"}>
            path={mdiCodeTagsCheck}
            color="contrast"
            text="soft"
            disabled={!formattingAvailable()}
            onClick={props.format}
      </Show>
          <NodeViewWrapper class="my-5">
import { Component, createEffect, createSignal, onMount } from "solid-js";
import { Card } from "#components/primitives";
import {
  useAppearance,
  useAuthenticatedUserData,
  useNotifications,
  useLocalStorage
} from "#context";
      const formattedCode = await formattingCode;
    const contentHeight = Math.max(200, monacoEditor.getContentHeight());
        theme: "dark",
        "relative rounded-2xl not-prose text-base leading-4",
          "w-full bg-gray-50 dark:bg-gray-900 h-72 not-prose rounded-t-2xl rounded",
          codeEditorTheme() === "light" && "border-2 border-b-0 dark:border-0"
      <Card
          "m-0 rounded-t-none",
          codeEditorTheme() === "dark" && "border-t-0 dark:border-0 dark:border-t-2",
          codeEditorTheme() === "light" && "dark:border-t-0"
        contentEditable={false}
        <CodeBlockMenu monaco={props.monaco} format={format} changeLanguage={changeLanguage} />
      </Card>
          if (container.parentElement?.classList.contains("ProseMirror")) {
            const parentPos = document.getElementById("pm-container")?.getBoundingClientRect();
              top: rect.top - parentPos.top - 20
import { Component } from "solid-js";
import { mdiDotsGrid } from "@mdi/js";
import { IconButton, Input, Tooltip } from "#components/primitives";
import { EmbedType, getEmbedId, getEmbedSrc } from "#lib/utils";
    <div class="flex p-0 transition-shadow duration-200 border-0 rounded-xl">
      <Input
        wrapperClass="flex-1 max-w-full"
        color="contrast"
        placeholder={getInputPlaceholder(attrs().embed as EmbedType)}
        value={attrs().input || ""}
        disabled={!props.state.editor.isEditable}
        setValue={(value) => {
          props.state.updateAttributes({ input: value, src: getSrc(value) });
        }}
      />
import { Card, Icon } from "#components/primitives";
    <NodeViewWrapper class="my-5">
                "pt-[35%] w-full rounded-t-2xl bg-gradient-to-tr flex justify-center items-center relative"
            class="object-contain w-full m-0 transition-opacity duration-300 border-2 border-gray-200 dark:border-gray-700 aspect-video min-h-96 rounded-t-2xl"

        <Card class="m-0 border-t-0 rounded-t-none">
        </Card>
import { Component, createSignal, Show } from "solid-js";
import { uploadFile as uploadFileUtil } from "#lib/utils";
import { Button, IconButton, Input, Loader, Tooltip } from "#components/primitives";
  const inputId = nanoid();
      if (uploadedUrl) {
        props.state.updateAttributes({ src: uploadedUrl });
      }
  const getPlaceholder = (): string => {
    if (inputMode() === "src") {
      return options().cover ? "Cover image URL" : "Image URL";
    }

    return options().cover ? "Cover alt description" : "Alt description";
  };
    <div class="flex p-0 transition-shadow duration-200 border-0 rounded-xl">
      <Tooltip text="Alt">
        <IconButton
          path={mdiText}
          color={inputMode() === "alt" ? "primary" : "contrast"}
          text={inputMode() === "alt" ? "primary" : "soft"}
          onClick={() => {
            setInputMode("alt");
        ></IconButton>
      </Tooltip>
      <Tooltip text="Image URL">
        <IconButton
          path={mdiLinkVariant}
          color={inputMode() === "src" ? "primary" : "contrast"}
          text={inputMode() === "src" ? "primary" : "soft"}
          onClick={() => {
            setInputMode("src");
          }}
        ></IconButton>
      </Tooltip>
      <Input
        color="contrast"
        wrapperClass="flex-1 max-w-full min-w-unset"
        class="w-full"
        placeholder={getPlaceholder()}
        value={attrs()[inputMode()] || ""}
        disabled={!props.state.editor.isEditable}
        setValue={(value) => {
          updateAttribute.clear();
          updateAttribute(inputMode(), value);
        }}
      />
      <Show when={props.state.editor.isEditable}>
          <Tooltip text={uploading() ? "Uploading" : "Upload image"}>
            <Show
              when={!uploading()}
              fallback={
                <Button badge color="contrast" class="flex items-center justify-center w-8 h-8">
                  <Loader class="w-6 h-6" />
                </Button>
              }
            >
              <IconButton path={mdiUpload} color="contrast" text="soft" badge></IconButton>
            </Show>
      </Show>
import { Card, Icon, Loader } from "#components/primitives";
  const [currentSrc, setCurrentSrc] = createRef("");
    if (objectURL()) {
    try {
      if (!src) {
        setError(false);
        setLoading(false);

        return;
      }

      if (!validateURL(src)) {
        setError(true);
        setLoading(false);

        return;
      }

      const response = await fetch(
        src.startsWith(window.env.PUBLIC_ASSETS_URL) ? src : `/proxy?url=${encodeURIComponent(src)}`
      );

      if (!response.ok) {
        setError(true);
        setLoading(false);

        return;
      }
      const blob = await response.blob();
      const objectURL = URL.createObjectURL(blob);
      setCurrentSrc(src);
      setObjectURL(objectURL);
    } catch (error) {
    } finally {
    <NodeViewWrapper class={clsx(!options().cover && "my-5")}>
            options().cover ? "border-b-2" : "border-2 rounded-t-2xl"
          <Show
            when={objectURL()}
            fallback={
              <div
                class={clsx(
                  "w-full bg-gradient-to-tr flex justify-center items-center relative",
                  options().cover ? "min-h-48" : "rounded-t-2xl"
                )}
                style={{
                  "padding-top": getPaddingTop()
                }}
              >
                <div class="absolute flex flex-col items-center justify-center font-bold text-white transform -translate-y-1/2 top-1/2">
                  <Show when={!loading()} fallback={<Loader class="w-8 h-8" />}>
                    <Show
                      when={!error()}
                      fallback={
                        <>
                          <Icon path={mdiAlertCircle} class="w-16 h-16" />
                          <span class="absolute top-full">Error</span>
                        </>
                      }
                    >
                      <Icon path={mdiImage} class="w-16 h-16" />
                    </Show>
                  </Show>
                </div>
              </div>
            }
                "w-full border-gray-200 dark:border-gray-700 flex justify-center items-center overflow-hidden bg-gray-100 dark:bg-gray-800 relative",
                !options().cover && "rounded-t-2xl"
              <div
                class={clsx(
                  "overflow-hidden min-w-40 !h-full",
                  state().editor.isEditable && "resize"
                )}
                ref={handleNewImageContainer}
                style={{ width: attrs().width }}
              >
                <img
                  alt={attrs().alt}
                  src={objectURL()}
                  data-src={currentSrc()}
                  class={clsx("object-contain w-full m-0 transition-opacity duration-300")}
                  onLoad={(event) => {
                    const image = event.currentTarget;
                    const w = image.naturalWidth;
                    const h = image.naturalHeight;
                    const aspectRatio = w / h;

                    updateAspectRatio.clear();
                    updateAspectRatio(`${aspectRatio}`);
                  }}
                  onError={() => {
                    removeImage();
                    setError(true);
                  }}
                />
        <Card
            "m-0 border-0 border-b-2 rounded-t-none",
            options().cover ? "rounded-none" : "border-x-2"
        </Card>
export * from "./wrapper";
  block?: App.WorkspaceSettings["blocks"][number] | "wrapper";
import { Component, createEffect, createSignal } from "solid-js";
import { SearchableSelect } from "#components/fragments";
import { App, useAuthenticatedUserData } from "#context";

interface WrapperMenuProps {
  state: {
    key: string;
    setKey(key: string): void;
  };
}

const WrapperMenu: Component<WrapperMenuProps> = (props) => {
  const { workspaceSettings } = useAuthenticatedUserData();
  const selectedOption = (): App.Wrapper | null => {
    return (
      (workspaceSettings()?.wrappers || []).find((wrapper) => wrapper.key === props.state.key) ||
      null
    );
  };

  props.state.setKey(selectedOption()?.key || "");

  return (
    <div class="w-full flex items-center justify-start text-base" contentEditable={false}>
      <div>
        <SearchableSelect
          extractId={(option) => option.key}
          filterOption={(option, query) => option.label.toLowerCase().includes(query.toLowerCase())}
          options={workspaceSettings()?.wrappers || []}
          renderOption={(option) => <div class="text-start">{option.label}</div>}
          selectOption={(option) => {
            props.state.setKey(option?.key || "");
          }}
          selected={selectedOption()}
          loading={false}
          placeholder="Wrapper"
          buttonProps={{
            class: "bg-gray-100",
            color: "base",
            text: "soft"
          }}
        />
      </div>
    </div>
  );
};

export { WrapperMenu };
import { WrapperMenu } from "./menu";
import { Wrapper as BaseWrapper, WrapperAttributes } from "@vrite/editor";
import { SolidEditor, SolidRenderer } from "@vrite/tiptap-solid";
import { NodeView } from "@tiptap/core";
import { keymap } from "@tiptap/pm/keymap";
import { Node } from "@tiptap/pm/model";
import { EditorState } from "@tiptap/pm/state";

const Wrapper = BaseWrapper.extend({
  addProseMirrorPlugins() {
    const handleDeleteWrapper = (state: EditorState): boolean => {
      if (this.editor.isActive("wrapper")) {
        const currentDepth = state.selection.$from.depth;

        let node: Node | null = null;
        let pos: number | null = null;

        for (let i = currentDepth; i >= 0; i--) {
          const currentNode = state.selection.$from.node(i);

          if (currentNode.type.name === "wrapper") {
            node = currentNode;
            pos = i > 0 ? state.selection.$from.before(i) : 0;
            break;
          }
        }

        if (
          node &&
          !node.textContent &&
          node.content.childCount === 1 &&
          node.content.firstChild?.type.name === "paragraph" &&
          typeof pos === "number"
        ) {
          this.editor
            .chain()
            .deleteRange({
              from: pos,
              to: pos + node.nodeSize
            })
            .focus()
            .run();

          return true;
        }
      }

      return false;
    };

    return [
      keymap({
        Delete: handleDeleteWrapper,
        Backspace: handleDeleteWrapper
      })
    ];
  },
  addNodeView() {
    const editor = this.editor as SolidEditor;

    return (props) => {
      let node = props.node as Node;

      const referenceView = new NodeView(() => {}, props);
      const dom = document.createElement("div");
      const content = document.createElement("div");
      const menu = document.createElement("div");

      dom.setAttribute(
        "class",
        "px-3 pt-3 my-5 rounded-3xl border-gray-300 bg-gray-300 bg-opacity-30 dark:border-gray-700 dark:bg-gray-700 dark:bg-opacity-40 border-2"
      );
      dom.setAttribute("data-wrapper", "true");
      content.setAttribute("class", "relative content mb-3");
      menu.setAttribute("class", "mb-5");
      menu.contentEditable = "false";

      const renderer = new SolidRenderer<{ key: string; setKey(value: string): void }>(
        WrapperMenu,
        {
          editor: this.editor as SolidEditor,
          state: {
            key: node.attrs.key,
            setKey: (key) => {
              if (typeof props.getPos === "function") {
                editor.view.dispatch(
                  editor.view.state.tr.setNodeMarkup(props.getPos(), undefined, {
                    key: key || null
                  })
                );
              }
            }
          }
        }
      );

      menu.append(renderer.element);
      dom.append(menu, content);

      return {
        dom,
        contentDOM: content,
        ignoreMutation(mutation: MutationRecord | { type: "selection"; target: Element }) {
          if (mutation.type === "selection") {
            return false;
          }

          return referenceView.ignoreMutation(mutation);
        },
        stopEvent(event) {
          return referenceView.stopEvent(event);
        },
        destroy() {
          renderer.destroy();
        },
        update(newNode) {
          if (newNode.type.name !== "wrapper") return false;

          node = newNode as Node;
          renderer.setState((state) => ({
            ...state,
            key: node.attrs.key
          }));

          return true;
        }
      };
    };
  }
});

export { Wrapper };
export type { WrapperAttributes };
monaco.editor.defineTheme("light", { ...lightTheme, base: "vs-dark" });
monaco.editor.defineTheme("dark-contrast", {
  ...darkTheme,
  colors: {
    ...darkTheme.colors,
    "editor.background": "#1f2937",
    "editorWidget.background": "#111827"
  },
  base: "vs-dark"
});
monaco.editor.defineTheme("light-contrast", {
  ...lightTheme,
  colors: {
    ...lightTheme.colors,
    "editor.background": "#f3f4f6",
    "editorWidget.background": "#f9fafb"
  },
  base: "vs-dark"
});
  width: 100%;
  width: 100% !important;
  top: -19px !important;
  @apply !border-primary my-2;
  .ProseMirror:not(:where(.not-prose, .not-prose *)) {
    > * + div:not(.tableWrapper) {
      @apply mb-5;
    }

    padding-bottom: 8rem;
      @apply border-2 border-gray-200 dark:border-gray-700;
      @apply text-left font-500 border-2 border-gray-200 dark:border-gray-700 relative p-2 vertical-top;
    @apply my-5;
    @apply m-0;
  --highlighted-thread: "G3JAKWBAsWA1xXnPcJ-Zu";
  :where(div[data-wrapper="true"]) {
    .content > :first-child [data-node-view-wrapper="true"] {
    .content > :last-child:not([data-wrapper="true"]) {
    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
      "Courier New", monospace !important;
.rounded {
  .monaco-editor,
  .monaco-editor > *:first-child {
    @apply rounded-2xl;
  }
  .monaco-editor .editor-widget {
    @apply overflow-hidden rounded-lg;
  }
  .monaco-editor .monaco-hover {
    @apply rounded-lg;
  }
}

.ProseMirror .rounded .monaco-editor,
.ProseMirror .rounded .monaco-editor > *:first-child {
        <div class="h-full w-full absolute top-0 left-0 bg-gray-100 dark:bg-gray-800 flex justify-center items-center">
            props.setSlug(convertToSlug(value));
import { AllSelection } from "@tiptap/pm/state";
    if (!view.hasFocus() || isAllSelection) {
      ["image", "codeBlock", "embed", "horizontalRule"].some((name) => {
      $anchor.depth === 1 || ($anchor.depth === 2 && $anchor.node(1).type.name === "wrapper");
import { SolidEditor } from "@vrite/tiptap-solid";
import {
  mdiFormatBold,
  mdiFormatItalic,
  mdiFormatStrikethrough,
  mdiCodeTags,
  mdiLinkVariant,
  mdiFormatColorHighlight,
  mdiFormatSubscript,
  mdiFormatSuperscript,
  mdiCheck,
  mdiDelete,
  mdiTableColumnRemove,
  mdiTableRowRemove,
  mdiTableMergeCells,
  mdiTableSplitCell,
  mdiTableRemove,
  mdiCommentOutline,
  mdiTableHeadersEyeOff,
  mdiPlus,
  mdiKeyboardCloseOutline
} from "@mdi/js";
import { CellSelection } from "@tiptap/pm/tables";
import { Component, createEffect, createSignal, For, Match, on, Show, Switch } from "solid-js";
import { nanoid } from "nanoid";
import clsx from "clsx";
import { breakpoints, createRef, Ref } from "#lib/utils";
import { Card, IconButton, Input, Tooltip } from "#components/primitives";
import { App, useAuthenticatedUserData, useClient } from "#context";

type BubbleMenuMode = "format" | "link" | "table" | "block";
interface BubbleMenuProps {
  editor: SolidEditor;
  opened: boolean;
  contentPieceId?: string;
  class?: string;
  mode?: BubbleMenuMode;
  ref?: Ref<HTMLElement>[1];
  blur?(): void;
  setBlockMenuOpened?(opened: boolean): void;
}

const BubbleMenu: Component<BubbleMenuProps> = (props) => {
  const [activeMarks, setActiveMarks] = createSignal<string[]>([]);
  const { workspaceSettings = () => null } = useAuthenticatedUserData() || {};
  const client = useClient();
  const [mode, setMode] = createSignal<BubbleMenuMode>("format");
  const [link, setLink] = createSignal("");
  const [linkInputRef, setLinkInputRef] = createRef<HTMLInputElement | null>(null);
  const commentMenuItem = {
    icon: mdiCommentOutline,
    mark: "comment",
    label: "Comment",
    async onClick() {
      if (props.editor.isActive("comment")) {
        props.editor.commands.unsetComment();
      } else {
        const threadFragment = nanoid();

        props.editor.chain().setComment({ thread: threadFragment }).focus().run();

        try {
          await client.comments.createThread.mutate({
            contentPieceId: props.contentPieceId || "",
            fragment: threadFragment
          });
        } catch (error) {
          props.editor.commands.unsetComment();
        }
      }
    }
  };
  const closeKeyboardItem = {
    icon: mdiKeyboardCloseOutline,
    label: "Close keyboard",
    async onClick() {
      props.blur?.();
    }
  };
  const menus = (
    [
      {
        icon: mdiFormatBold,
        mark: "bold",
        label: "Bold"
      },
      {
        icon: mdiFormatItalic,
        mark: "italic",
        label: "Italic"
      },
      {
        icon: mdiFormatStrikethrough,
        mark: "strike",
        label: "Strike"
      },
      {
        icon: mdiCodeTags,
        mark: "code",
        label: "Code"
      },
      {
        icon: mdiLinkVariant,
        mark: "link",
        label: "Link",
        onClick() {
          setMode("link");
        }
      },
      { icon: mdiFormatColorHighlight, mark: "highlight", label: "Highlight" },
      { icon: mdiFormatSubscript, mark: "subscript", label: "Subscript" },
      { icon: mdiFormatSuperscript, mark: "superscript", label: "Superscript" },
      ...(props.contentPieceId && breakpoints.md() ? [commentMenuItem] : []),
      ...(breakpoints.md() ? [] : [closeKeyboardItem])
    ] as Array<{ icon: string; mark?: string; label: string; onClick?(): void }>
  ).filter(({ mark }) => {
    if (!mark || mark === "comment") return true;

    if (!workspaceSettings()) {
      return true;
    }

    return workspaceSettings()!.marks.includes(mark as App.WorkspaceSettings["marks"][number]);
  });
  const tableMenus = [
    {
      icon: mdiTableHeadersEyeOff,
      label: "Toggle header cell off",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);
          const rowNode = selection.$anchorCell.node(2);

          if (tableNode.child(0) === rowNode) {
            return false;
          }

          return selection.$anchorCell.nodeAfter?.type.name === "tableHeader";
        }

        return false;
      },
      onClick() {
        props.editor.chain().toggleHeaderCell().focus().run();
      }
    },
    {
      icon: mdiTableMergeCells,
      label: "Merge cells",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          return selection.$anchorCell.pos !== selection.$headCell.pos;
        }

        return false;
      },
      onClick() {
        props.editor.chain().mergeCells().run();
      }
    },
    {
      icon: mdiTableSplitCell,
      label: "Split cell",
      show() {
        const { selection } = props.editor.state;

        if (
          selection instanceof CellSelection &&
          selection.$anchorCell.pos === selection.$headCell.pos
        ) {
          return (
            selection.$anchorCell.nodeAfter?.attrs.colspan > 1 ||
            selection.$anchorCell.nodeAfter?.attrs.rowspan > 1
          );
        }

        return false;
      },
      onClick() {
        props.editor.chain().splitCell().run();
      }
    },
    {
      icon: mdiTableColumnRemove,
      label: "Delete column(s)",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          let isSingleColumn = false;

          tableNode.content.forEach((rowNode) => {
            isSingleColumn = rowNode.childCount === 1;
          });

          return !isSingleColumn;
        }

        return true;
      },
      onClick() {
        props.editor.chain().deleteColumn().focus().run();
      }
    },
    {
      icon: mdiTableRowRemove,
      label: "Delete row(s)",

      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          if (tableNode.content.childCount === 1) {
            return false;
          }
        }

        return true;
      },
      onClick() {
        props.editor.chain().deleteRow().focus().run();
      }
    },
    {
      icon: mdiTableRemove,
      label: "Delete table",

      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          if (tableNode.childCount === 1) return true;

          let isSingleColumn = false;

          tableNode.content.forEach((rowNode) => {
            isSingleColumn = rowNode.childCount === 1;
          });

          return isSingleColumn;
        }

        return false;
      },
      onClick() {
        props.editor.chain().deleteTable().focus().run();
      }
    }
  ];
  const marks = menus.map((menu) => menu.mark);
  const saveLink = (): void => {
    props.editor.chain().unsetCode().setLink({ href: link() }).focus().run();
    setMode("format");
  };

  props.editor.on("update", () => {
    setActiveMarks(marks.filter((mark) => mark && props.editor.isActive(mark)) as string[]);
  });
  props.editor.on("selectionUpdate", () => {
    setActiveMarks(marks.filter((mark) => mark && props.editor.isActive(mark)) as string[]);

    if (props.editor.state.selection instanceof CellSelection) {
      setMode("table");
    } else if (!props.editor.state.selection.empty) {
      setMode("format");
    }
  });
  createEffect(
    on(mode, (mode) => {
      if (mode === "link") {
        setLink(props.editor.getAttributes("link").href || "");
        setTimeout(() => {
          const linkInput = linkInputRef();

          linkInput?.focus();
        }, 300);
      } else {
        setLink("");
      }
    })
  );
  createEffect(
    on(
      () => props.mode,
      (mode) => {
        setMode((currentMode) => mode || currentMode);
      }
    )
  );
  createEffect(
    on(
      () => props.opened,
      (opened) => {
        if (!opened) {
          setLink("");
          setTimeout(() => {
            setMode("format");
          }, 300);
        }
      }
    )
  );

  return (
    <Card
      class={clsx(
        "relative flex p-0 overflow-x-auto scrollbar-hidden md:overflow-initial",
        props.class
      )}
      ref={props.ref}
    >
      <Switch>
        <Match when={mode() === "block"}>
          <IconButton
            path={mdiPlus}
            text="soft"
            variant="text"
            label="Insert block"
            onClick={(event) => {
              props.setBlockMenuOpened?.(true);
              event.preventDefault();
              event.stopPropagation();
            }}
          />
          <IconButton
            path={mdiKeyboardCloseOutline}
            text="soft"
            variant="text"
            onClick={(event) => {
              props.blur?.();
              event.preventDefault();
              event.stopPropagation();
            }}
          />
        </Match>
        <Match when={mode() === "table"}>
          <For
            each={tableMenus}
            fallback={<span class="px-1.5 py-0.5 text-base">No available options</span>}
          >
            {(menuItem) => {
              return (
                <Show when={!menuItem.show || menuItem.show()}>
                  <Tooltip text={menuItem.label} side="bottom" wrapperClass="snap-start">
                    <IconButton
                      path={menuItem.icon}
                      text="soft"
                      variant="text"
                      color="base"
                      onClick={(event) => {
                        menuItem.onClick();
                        event.preventDefault();
                        event.stopPropagation();
                      }}
                    />
                  </Tooltip>
                </Show>
              );
            }}
          </For>
        </Match>
        <Match when={mode() === "format"}>
          <div class="flex">
            <For
              each={menus}
              fallback={<span class="px-1.5 py-0.5 text-base">No available options</span>}
            >
              {(menu) => {
                const active = (): boolean => {
                  return Boolean(menu.mark && activeMarks().includes(menu.mark));
                };

                return (
                  <Tooltip text={menu.label} side="bottom" wrapperClass="snap-start">
                    <IconButton
                      path={menu.icon}
                      text={active() ? "primary" : "soft"}
                      variant={active() ? "solid" : "text"}
                      color={active() ? "primary" : "base"}
                      onClick={(event) => {
                        const chain = props.editor.chain();

                        if (menu.onClick) {
                          menu.onClick();
                        } else if (menu.mark) {
                          if (menu.mark !== "code") {
                            chain.unsetCode();
                          }

                          chain.toggleMark(menu.mark).focus().run();
                        }

                        event.preventDefault();
                        event.stopPropagation();
                      }}
                    />
                  </Tooltip>
                );
              }}
            </For>
          </div>
        </Match>
        <Match when={mode() === "link"}>
          <Input
            ref={setLinkInputRef}
            value={link()}
            placeholder="Paste a link..."
            wrapperClass="w-full md:w-auto"
            setValue={(value) => {
              setLink(value);
            }}
            onEnter={saveLink}
            class="py-0 my-0 bg-transparent"
          />
          <IconButton path={mdiCheck} text="soft" variant="text" onClick={saveLink} />
          <IconButton
            path={mdiDelete}
            text="soft"
            variant="text"
            onClick={() => {
              props.editor.chain().unsetLink().focus().run();
              setMode("format");
            }}
          />
        </Match>
      </Switch>
    </Card>
  );
};

export { BubbleMenu };
export * from "./bubble-menu";
export * from "./export-menu";
export * from "./floating-menu";
export * from "./link-preview-menu";
export * from "./stats-menu";
export * from "./comment-threads-menu";
import { ExtensionDetails, hasPermission, useClient } from "#context";
            await client.git.github.initialSync.mutate();
import { Component, For, Show, createEffect, createResource } from "solid-js";
      <TitledCard icon={mdiThemeLightDark} label="UI theme">
      <TitledCard label="Code editor theme" icon={mdiCodeTags}>
        <ThemePicker
          theme={userSettings()?.codeEditorTheme || "dark"}
          setTheme={async (theme) => {
            await client.userSettings.update.mutate({ codeEditorTheme: theme });
          }}
        />
      </TitledCard>
import { mdiCheck, mdiInformation } from "@mdi/js";
import { Component, createEffect, createMemo, createSignal } from "solid-js";
import { createStore } from "solid-js/store";
import { InputField, TitledCard } from "#components/fragments";
import { Button, IconButton, Tooltip } from "#components/primitives";
import { useClient, App, useNotifications } from "#context";
import { validateKey } from "#lib/utils";

interface ConfigureWrapperSubSectionProps {
  setActionComponent(component: Component<{}> | null): void;
  onWrapperConfigured(): void;
}

const ConfigureWrapperSubSection: Component<ConfigureWrapperSubSectionProps> = (props) => {
  const client = useClient();
  const { notify } = useNotifications();
  const [loading, setLoading] = createSignal(false);
  const [wrapperData, setWrapperData] = createStore<App.Wrapper>({
    key: "",
    label: ""
  });
  const filled = createMemo(() => {
    return Boolean(wrapperData.label && validateKey(wrapperData.key));
  });
  const onClick = async (): Promise<void> => {
    try {
      setLoading(true);
      await client.workspaceSettings.createWrapper.mutate(wrapperData);
      notify({ text: "New Wrapper created", type: "success" });
      props.onWrapperConfigured();
      setLoading(false);
    } catch (error) {
      notify({ text: "Failed to create new Wrapper", type: "error" });
      setLoading(false);
    }
  };

  createEffect(() => {
    setWrapperData("key", wrapperData.label.toLowerCase().replace(/\s|-/g, "_").slice(0, 20));
  });
  props.setActionComponent(() => {
    return (
      <>
        <Button
          color="primary"
          class="m-0 hidden @md:flex"
          loading={loading()}
          disabled={!filled()}
          onClick={onClick}
        >
          Create Wrapper
        </Button>
        <Tooltip text="Create Wrapper" wrapperClass="flex @md:hidden" class="mt-1" fixed>
          <IconButton
            color="primary"
            path={mdiCheck}
            class="m-0"
            loading={loading()}
            disabled={!filled()}
            onClick={onClick}
          />
        </Tooltip>
      </>
    );
  });

  return (
    <>
      <TitledCard icon={mdiInformation} label="Details">
        <InputField
          label="Wrapper label"
          color="contrast"
          placeholder="Label"
          type="text"
          value={wrapperData.label}
          inputProps={{ maxLength: 50 }}
          setValue={(value) => setWrapperData("label", value)}
        >
          Descriptive label for the wrapper.
        </InputField>
        <InputField
          label="Wrapper key"
          color="contrast"
          placeholder="wrapper_key"
          type="text"
          value={wrapperData.key}
          inputProps={{ maxLength: 20 }}
          setValue={(value) => setWrapperData("key", value)}
        >
          Key identifying the Wrapper in JSON content. Has to be unique, and can only contain
          letters, numbers and underscores.
        </InputField>
      </TitledCard>
    </>
  );
};

export { ConfigureWrapperSubSection };
import { ConfigureWrapperSubSection } from "./configure-wrapper-subsection";
const WrapperDetails: Component<{
  wrapper: App.Wrapper;
  onEdit?(): void;
  onDelete?(): void;
}> = (props) => {
  const [loading, setLoading] = createSignal(false);
  const { notify } = useNotifications();
  const client = useClient();

  return (
    <Card class="flex flex-col gap-0 w-full m-0" color="contrast">
      <div class="flex items-start justify-center gap-2 w-full">
        <Heading level={3} class="break-anywhere flex-1">
          {props.wrapper.label || "[No name]"}
        </Heading>
        <Show
          when={!props.wrapper.extension}
          fallback={
            <Tooltip text="Extension" class="mt-1">
              <IconButton path={mdiPuzzle} text="soft" class="m-0" badge />
            </Tooltip>
          }
        >
          <Show when={hasPermission("manageWorkspace")}>
            <Tooltip text="Delete" class="mt-1">
              <IconButton
                path={mdiTrashCan}
                text="soft"
                class="m-0"
                loading={loading()}
                onClick={async () => {
                  try {
                    setLoading(true);
                    await client.workspaceSettings.deleteWrapper.mutate({
                      key: props.wrapper.key
                    });
                    setLoading(false);
                    props.onDelete?.();
                    notify({
                      text: "Wrapper deleted",
                      type: "success"
                    });
                  } catch (error) {
                    setLoading(false);
                    notify({
                      text: "Failed to delete wrapper",
                      type: "error"
                    });
                  }
                }}
              />
            </Tooltip>
          </Show>
        </Show>
      </div>
    </Card>
  );
};
  const [openedSubsection, setOpenedSubsection] = createSignal<"none" | "configure-wrapper">(
    "none"
  );
  const [wrappers, setWrappers] = createSignal<App.WorkspaceSettings["wrappers"]>([]);
  const handleNewWrapper = (): void => {
    setOpenedSubsection("configure-wrapper");
    props.setSubSection({
      label: "New wrapper",
      icon: mdiCube,
      goBack() {
        setOpenedSubsection("none");
      }
    });
  };
    setWrappers(workspaceSettings()?.wrappers || []);
        <Show when={enabledBlocks().includes("wrapper")}>
          <TitledCard
            label="Wrappers"
            icon={mdiCube}
            action={
              <Show when={hasPermission("manageWorkspace")}>
                <>
                  <Button color="primary" class="m-0 hidden @md:flex" onClick={handleNewWrapper}>
                    New Wrapper
                  </Button>
                  <Tooltip text="New Wrapper" wrapperClass="flex @md:hidden" class="mt-1" fixed>
                    <IconButton
                      path={mdiPlus}
                      class="m-0"
                      color="primary"
                      onClick={handleNewWrapper}
                    />
                  </Tooltip>
                </>
              </Show>
            }
          >
            <div class="flex flex-col gap-2 w-full">
              <For
                each={wrappers()}
                fallback={
                  <p class="px-2 w-full text-start text-gray-500 dark:text-gray-400">
                    No wrappers found
                  </p>
                }
              >
                {(wrapper) => {
                  return <WrapperDetails wrapper={wrapper} />;
                }}
              </For>
            </div>
          </TitledCard>
        </Show>
      <Match when={openedSubsection() === "configure-wrapper"}>
        <ConfigureWrapperSubSection
          setActionComponent={props.setActionComponent}
          onWrapperConfigured={() => {
            setOpenedSubsection("none");
          }}
        />
      </Match>
    { label: "Wrapper", icon: mdiCubeOutline, value: "wrapper" }
import { mdiFormatListBulleted, mdiPlusCircle, mdiTrashCan, mdiTune } from "@mdi/js";
  transformer: App.Transformer & { inUse?: boolean };
  transformers(): Array<App.Transformer & { inUse?: boolean }>;
    transformers: Array<App.Transformer>;
      <Show when={hasPermission("manageWorkspace")}>
        <div class="flex gap-2">
          <Tooltip text="Delete" class="mt-1" enabled={!props.transformer.inUse}>
            <IconButton
              path={mdiTrashCan}
              loading={loading()}
              disabled={props.transformer.inUse}
              class="m-0"
              text="soft"
              onClick={async () => {
                setLoading(true);
                await client.transformers.delete.mutate({ id: props.transformer.id });
                setLoading(false);
                props.onDelete?.();
                notify({ text: "Transformer deleted", type: "success" });
              }}
            />
        </div>
    event: "" as App.WebhookEvent,
            setWebhookData("event", value as App.WebhookEvent);
const webhookEvents: Array<{ label: string; value: App.WebhookEvent }> = [
    "types": ["vite/client", "mdx", "@vrite/extensions"],
          target: "http://localhost:3333",
        "/session": { target: "http://localhost:3333", ws: true },
        "/login": { target: "http://localhost:3333", ws: true },
        "/github": { target: "http://localhost:3333", ws: true },
        "/proxy": { target: "http://localhost:3333", ws: true },
        "/upload": { target: "http://localhost:3333", ws: true }
  "version": "0.2.1",
import { Collection, Db, ObjectId } from "mongodb";
import { UnderscoreID, zodId } from "#lib/mongo";
export * from "./versions";
  email: z.string().email(),
import { ContentPiece, contentPiece } from "./content-pieces";
import { ContentPieceVariant, contentPieceVariant } from "./content-piece-variants";
import { Binary, Collection, Db, ObjectId } from "mongodb";
import { z } from "zod";
import { UnderscoreID, zodId } from "#lib/mongo";

const version = z.object({
  id: zodId(),
  name: z.string(),
  date: z.string(),
  content: z.any().optional(),
  contentPiece: contentPieceVariant.omit({ variantId: true, contentPieceId: true, id: true }),
  contentPieceId: zodId(),
  variantId: zodId().optional()
});

interface Version<ID extends string | ObjectId = string>
  extends Omit<
    z.infer<typeof version>,
    "id" | "date" | "contentPieceId" | "variantId" | "content" | "contentPiece"
  > {
  date: ID extends string ? string : Date;
  content?: Binary;
  contentPiece: Omit<ContentPieceVariant<ID>, "id" | "variantId" | "contentPieceId">;
  contentPieceId: ID;
  variantId?: ID;
  id: ID;
}
interface FullVersion<ID extends string | ObjectId = string> extends Version<ID> {
  workspaceId: ID;
}

const getVersionsCollection = (db: Db): Collection<UnderscoreID<FullVersion<ObjectId>>> => {
  return db.collection("contents");
};

export { getVersionsCollection, version };
export type { Version, FullVersion };
const webhookEvent = z.enum([...contentPieceEvents, ...contentGroupEvents, ...memberEvents]);
  event: webhookEvent
type WebhookEvent = z.infer<typeof webhookEvent>;
  webhookEvent,
export type { WebhookEvent, Webhook, FullWebhook };
  email: z.string().email().optional(),
const wrapper = z.object({
  label: z.string().min(1).max(50),
  key: z
    .string()
    .min(1)
    .max(20)
    .regex(/^[a-z0-9_]*$/),
  extension: z.boolean().optional()
});
  "wrapper"
  embeds: z.array(z.enum(embeds)),
  wrappers: z.array(wrapper).optional()
interface Wrapper extends z.infer<typeof wrapper> {}
  extends Omit<z.infer<typeof workspaceSettings>, "id" | "wrappers"> {
  wrappers?: Wrapper[];
  wrapper,
export type { MetadataField, MetadataSettings, WorkspaceSettings, FullWorkspaceSettings, Wrapper };
import { optional, z } from "zod";
export * from "./server";
export * from "./routes";
import { TokenPermission, getTokensCollection } from "#database/tokens";
interface Context {
  return { req, res, db, fastify };
export { createContext };
export type { Context };
import { ObjectId, Binary } from "mongodb";
import { convert as convertToSlug } from "url-slug";
  FullContentPiece,
  FullContents,
import { UnderscoreID, jsonToBuffer, htmlToJSON, bufferToJSON, AuthenticatedContext } from "#lib";

interface ProcessInputResult {
  buffer: Buffer;
  contentHash: string;
  metadata: Partial<
    Pick<FullContentPiece, keyof NonNullable<ReturnType<InputTransformer>["contentPiece"]>>
  >;
}
interface OutputContentProcessorInput {
  buffer: Buffer;
  contentPiece: UnderscoreID<FullContentPiece<ObjectId>>;
}

interface InputContentProcessor {
  process(inputContent: string): Promise<ProcessInputResult>;
  processBatch(inputContent: string[]): Promise<ProcessInputResult[]>;
}

interface OutputContentProcessor {
  process(input: OutputContentProcessorInput): Promise<string>;
  processBatch(input: OutputContentProcessorInput[]): Promise<string[]>;
}
const createSyncedPieces = async (
  inputs: Array<{
    path: string;
    content: string;
    workspaceId: ObjectId;
    contentGroupId: ObjectId;
    order: string;
  }>,
  inputContentProcessor: InputContentProcessor
): Promise<
  Array<{
    contentPiece: UnderscoreID<FullContentPiece<ObjectId>>;
    content: UnderscoreID<FullContents<ObjectId>>;
    contentHash: string;
  }>
> => {
  const inputContentProcessorOutput = await inputContentProcessor.processBatch(
    inputs.map((input) => input.content)
  );

  return inputs.map((input, index) => {
    const filename = input.path.split("/").pop() || "";
    const { buffer, contentHash, metadata } = inputContentProcessorOutput[index];
    const { members, tags, date, ...inputMetadata } = metadata;
    const contentPiece: UnderscoreID<FullContentPiece<ObjectId>> = {
      _id: new ObjectId(),
      workspaceId: input.workspaceId,
      contentGroupId: input.contentGroupId,
      order: input.order,
      members: [],
      slug: convertToSlug(filename),
      tags: [],
      title: filename,
      filename,
      ...inputMetadata,
      ...(date && { date: new Date(date) }),
      ...(members && { members: members.map((memberId) => new ObjectId(memberId)) }),
      ...(tags && { tags: tags.map((tagId) => new ObjectId(tagId)) })
    };
    const content = {
      _id: new ObjectId(),
      contentPieceId: contentPiece._id,
      content: new Binary(buffer)
    };

    return {
      contentPiece,
      contentHash,
      content
    };
  });
};
export { createSyncedPieces, createInputContentProcessor, createOutputContentProcessor };
export type { OutputContentProcessorInput, OutputContentProcessor, InputContentProcessor };
import { AuthenticatedContext } from "./middleware";
import { ObjectId, UnderscoreID } from "./mongo";
import { jsonToBuffer } from "./processing";
import {
  OutputContentProcessor,
  createOutputContentProcessor as createOutputContentProcessorGitHub
} from "#routes/git/github/process-content";
import { publishGitDataEvent } from "#routes/git/events";
const createGenericOutputContentProcessor = async (
  ctx: AuthenticatedContext,
  gitData: UnderscoreID<FullGitData<ObjectId>>
): Promise<OutputContentProcessor> => {
  if (gitData.provider === "github") {
    return await createOutputContentProcessorGitHub(ctx, gitData);
  }

  return {
    process() {
      return Promise.resolve("");
    },
    processBatch(input) {
      return Promise.resolve(input.map(() => ""));
    }
  };
};
import {
  OutputContentProcessor,
  InputContentProcessor,
  createOutputContentProcessor as createOutputContentProcessorGitHub,
  createInputContentProcessor as createInputContentProcessorGitHub
} from "./github";
export * from "./utils";
export * from "./hash";
export * from "./middleware";
export * from "./git-sync-hooks";
export * as errors from "./errors";
import { Meta, middleware } from "#lib/trpc";
import * as errors from "#lib/errors";
  if (requiredConfig.some((property) => !ctx.fastify.hostConfig[property])) {
import { ObjectId, Db, Collection } from "mongodb";
export { zodId, ObjectId };
export type { UnderscoreID, Db, Collection };
  Wrapper
    Wrapper,
    Wrapper,
import { getUserSettingsCollection } from "#database/user-settings";
import { getWorkspaceMembershipsCollection } from "#database/workspace-memberships";
import { BaseRoleType, FullRole, Permission, getRolesCollection } from "#database/roles";
import * as errors from "#lib/errors";
import { HostConfig } from "#plugins/host-config";
import { ObjectId, zodId } from "#lib/mongo";
import { WebhookEvent, getWebhooksCollection } from "#database/webhooks";
import { contentGroup, contentPiece, getContentGroupsCollection } from "#database";
import { workspaceMembership } from "#database/workspace-memberships";
      // eslint-disable-next-line no-console
      console.error("Failed to run webhook", error);
import { publicPlugin } from "#lib/plugin";
import { getContentPiecesCollection } from "#database/content-pieces";
import { getRolesCollection } from "#database/roles";
import { getTagsCollection } from "#database/tags";
import { getTokensCollection } from "#database/tokens";
import { getUserSettingsCollection } from "#database/user-settings";
import { getWebhooksCollection } from "#database/webhooks";
import { getWorkspaceSettingsCollection } from "#database/workspace-settings";
import { getContentsCollection } from "#database/contents";
import { getUsersCollection } from "#database/users";
import { getCommentThreadsCollection } from "#database/comment-threads";
import { getCommentsCollection } from "#database/comments";
import { publicPlugin } from "../lib/plugin";
import { getWorkspacesCollection } from "#database/workspaces";
import { getUsersCollection } from "#database/users";
import * as errors from "#lib/errors";
        // eslint-disable-next-line no-console
        console.error(error);
        // eslint-disable-next-line no-console
        console.error(error);
    console.error("No email service configured");
import { publicPlugin } from "#lib/plugin";
import { publicPlugin } from "../lib/plugin";
import { z } from "zod";

const hostConfig = z.object({
  githubOAuth: z.boolean(),
  githubApp: z.boolean(),
  sendgrid: z.boolean(),
  smtp: z.boolean(),
  search: z.boolean(),
  aiSearch: z.boolean(),
  extensions: z.boolean()
});

interface HostConfig extends z.infer<typeof hostConfig> {}
export { hostConfigPlugin, hostConfig };
export type { HostConfig };
import { publicPlugin } from "#lib/plugin";
import { generateSalt } from "#lib/hash";
import { createSession } from "#lib/session";
import { createWorkspace } from "#lib/workspace";
import { getUsersCollection } from "#database/users";
import { getUserSettingsCollection } from "#database";
          codeEditorTheme: "dark",
      // eslint-disable-next-line no-console
      console.error(error);
import { publicPlugin } from "../lib/plugin";
import { publicPlugin } from "../lib/plugin";
import {
  S3Client,
  CreateBucketCommand,
  PutBucketCorsCommand,
  HeadBucketCommand
} from "@aws-sdk/client-s3";
import { Db, ObjectId, UnderscoreID, bufferToJSON, publicPlugin } from "#lib";
import { appRouter } from "../routes";
import { publicPlugin } from "#lib/plugin";
import { CustomError } from "#lib/errors";
      const error = e as CustomError;
      const error = e as CustomError;
import { publicPlugin } from "../lib/plugin";
import { createContext } from "../lib/context";
import { appRouter } from "../routes";
import { FullUser, getUsersCollection } from "#database/users";
import { UnderscoreID } from "#lib/mongo";
import { generateSalt, hashValue, verifyValue } from "#lib/hash";
import { procedure, router } from "#lib/trpc";
  updateSession
} from "#lib/session";
import { processAuth } from "#lib/auth";
import * as errors from "#lib/errors";
import { isAuthenticated, isAuthenticatedUser } from "#lib/middleware";
import { getUserSettingsCollection } from "#database";
        email: z.string().email(),
        password: z.string().regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/),
        email: z.string().email(),
        email: z.string().email(),
        password: z.string(),
import { UnderscoreID, zodId } from "#lib/mongo";
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
  getUsersCollection,
  CommentMember

type CommentEvent =
  | { action: "createThread"; data: CommentThread }
  | { action: "resolveThread"; data: Pick<CommentThread, "id" | "fragment" | "resolved"> }
  | { action: "deleteThread"; data: Pick<CommentThread, "id" | "fragment"> }
  | {
      action: "createComment";
      data: Omit<Comment, "memberId"> & { member: CommentMember | null };
    }
  | {
      action: "updateComment";
      data: Pick<Comment, "id" | "content">;
    }
  | {
      action: "deleteComment";
      data: Pick<Comment, "id">;
    };
const publishEvent = createEventPublisher<CommentEvent>((contentPieceId) => {
  return `comments:${contentPieceId}`;
});
      publishEvent(ctx, `${input.contentPieceId}`, {
      publishEvent(ctx, `${existingThread.contentPieceId}`, {
      publishEvent(ctx, `${existingThread.contentPieceId}`, {
      publishEvent(ctx, `${existingThread.contentPieceId}`, {
      publishEvent(ctx, `${existingThread.contentPieceId}`, {
      publishEvent(ctx, `${existingThread.contentPieceId}`, {
      return createEventSubscription<CommentEvent>(ctx, `comments:${input.contentPieceId}`);
import { procedure, router } from "#lib/trpc";
import { isAuthenticated } from "#lib/middleware";
import { UnderscoreID, zodId } from "#lib/mongo";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { runWebhooks } from "#lib/webhooks";
import { runGitSyncHook } from "#lib";

type ContentGroupEvent =
  | {
      action: "create";
      data: ContentGroup;
    }
  | {
      action: "update";
      data: Partial<ContentGroup> & { id: string };
    }
  | { action: "delete"; data: { id: string } }
  | { action: "move"; data: ContentGroup }
  | { action: "reorder"; data: { id: string; index: number } };

const publishEvent = createEventPublisher<ContentGroupEvent>(
  (workspaceId) => `contentGroups:${workspaceId}`
);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, { action: "update", data: { id, ...update } });
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
    return createEventSubscription<ContentGroupEvent>(ctx, `contentGroups:${ctx.auth.workspaceId}`);
export { contentGroupsRouter, publishEvent as publishContentGroupEvent };
import { stringToRegex } from "#lib/utils";
import { UnderscoreID, zodId } from "#lib/mongo";
import { bufferToJSON, DocJSON, htmlToJSON, jsonToBuffer } from "#lib/processing";
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
  FullContentPieceWithAdditionalData,
  getContentPiecesCollection
} from "#database/content-pieces";
import { Tag, getTagsCollection, tag } from "#database/tags";
import * as errors from "#lib/errors";
import { getContentsCollection } from "#database/contents";
import { runWebhooks } from "#lib/webhooks";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { runGitSyncHook } from "#lib";

type ContentPieceEvent =
  | { action: "delete"; userId: string; data: { id: string } }
  | { action: "create"; userId: string; data: FullContentPieceWithAdditionalData }
  | {
      action: "update";
      userId: string;
      variantId?: string;
      data: Partial<FullContentPieceWithAdditionalData> & { id: string };
    }
  | {
      action: "move";
      userId: string;
      data: {
        contentPiece: FullContentPieceWithAdditionalData;
        nextReferenceId?: string;
        previousReferenceId?: string;
      };
    };
const publishEvent = createEventPublisher<ContentPieceEvent>((contentGroupId) => {
  return `contentPieces:${contentGroupId}`;
});
  variantIdOrName?: string
): Promise<{ variantId: ObjectId | null; variantName: string | null }> => {
  if (!variantIdOrName) return { variantId: null, variantName: null };
  const isId = ObjectId.isValid(variantIdOrName);
    ...(isId && { _id: new ObjectId(variantIdOrName) }),
    ...(!isId && { name: variantIdOrName })
  return { variantId: variant._id || null, variantName: variant.name || null };
      const { variantId, variantName } = await getVariantDetails(ctx.db, input.variant);
              { slug: contentPiece.slug, variant: variantName }
      const { variantId, variantName } = await getVariantDetails(ctx.db, input.variant);
                  { slug: contentPiece.slug, variant: variantName }
      publishEvent(ctx, `${contentPiece.contentGroupId}`, {
      const { variantId, variantName } = await getVariantDetails(ctx.db, variant);
        contentPieceUpdates.slug = convertToSlug(update.slug || update.title || contentPiece.title);
      publishEvent(ctx, `${newContentPiece.contentGroupId}`, {
                { slug: newContentPiece.slug, variant: variantName }
      publishEvent(ctx, `${contentPiece.contentGroupId}`, {
      publishEvent(
      return createEventSubscription<ContentPieceEvent>(
        ctx,
        `contentPieces:${input.contentGroupId}`
      );
export type { ContentPieceEvent };
import { isAuthenticated, isEnabled } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
  Extension,
  ContextObject,
  getContentPiecesCollection,
  FullContentPieceWithAdditionalData
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import * as errors from "#lib/errors";
import { zodId } from "#lib";
type ExtensionEvent =
  | { action: "delete"; data: { id: string } }
  | { action: "create"; data: Extension & { id: string } }
  | { action: "update"; data: { id: string; config: ContextObject } };

const publishEvent = createEventPublisher<ExtensionEvent>((workspaceId) => {
  return `extensions:${workspaceId}`;
});
const publishContentPieceEvent = createEventPublisher<{
  action: "update";
  userId: string;
  data: Partial<FullContentPieceWithAdditionalData> & { id: string };
}>((contentGroupId) => {
  return `contentPieces:${contentGroupId}`;
});
    return createEventSubscription<ExtensionEvent>(ctx, `extensions:${ctx.auth.workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
import { GitData } from "#database";
import { createEventPublisher } from "#lib/pub-sub";

type GitDataEvent =
  | {
      action: "configure";
      data: GitData;
    }
  | {
      action: "update";
      data: Partial<GitData>;
    }
  | {
      action: "reset";
      data: {};
    };

const publishGitDataEvent = createEventPublisher<GitDataEvent>((workspaceId) => {
  return `gitData:${workspaceId}`;
});

export { publishGitDataEvent };
export type { GitDataEvent };
import {
  createSyncedPieces,
  createInputContentProcessor,
  createOutputContentProcessor,
  OutputContentProcessorInput,
  OutputContentProcessor,
  InputContentProcessor
} from "./process-content";
import { publishGitDataEvent } from "../events";
import { Binary } from "mongodb";
import { AuthenticatedContext, isAuthenticated, isEnabled } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { ObjectId, UnderscoreID, zodId } from "#lib";
import { publishContentGroupEvent } from "#routes/content-groups";
import { publishWorkspaceSettingsEvent } from "#routes/workspace-settings";
      const inputContentProcessor = await createInputContentProcessor(ctx, gitData);
        const outputContentProcessor = await createOutputContentProcessor(ctx, gitData);
      const outputContentProcessor = await createOutputContentProcessor(ctx, gitData);
      const outputContentProcessor = await createOutputContentProcessor(ctx, gitData);
      const inputContentProcessor = await createInputContentProcessor(ctx, gitData);
export { githubRouter, createInputContentProcessor, createOutputContentProcessor };
export type { OutputContentProcessor, InputContentProcessor };
import { createSyncedPieces, createInputContentProcessor } from "./process-content";
  const inputContentProcessor = await createInputContentProcessor(ctx, gitData);
import { GitDataEvent, publishGitDataEvent } from "./events";
import {
  createGenericInputContentProcessor,
  createGenericOutputContentProcessor
} from "./process-content";
import { procedure, router } from "#lib/trpc";
import { errors, isAuthenticated } from "#lib";
import { createEventSubscription } from "#lib/pub-sub";
    return createEventSubscription<GitDataEvent>(ctx, `gitData:${ctx.auth.workspaceId}`);
export { gitRouter, createGenericInputContentProcessor, createGenericOutputContentProcessor };
import { ObjectId, UnderscoreID } from "#lib";
import {
  createGenericInputContentProcessor,
  createGenericOutputContentProcessor,
  gitRouter
} from "./git";
import { Context, createContext } from "#lib/context";
import { router } from "#lib/trpc";
export {
  appRouter,
  createContext,
  createGenericInputContentProcessor,
  createGenericOutputContentProcessor
};
import { procedure, router } from "#lib/trpc";
import { isAuthenticated } from "#lib/middleware";
import { zodId } from "#lib/mongo";
  Role,
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { updateSessionRole } from "#lib/session";

type RoleEvent =
  | {
      action: "create";
      data: Role;
    }
  | { action: "update"; data: Partial<Role> & { id: string } }
  | { action: "delete"; data: { id: string; newRole: Role } };

const publishEvent = createEventPublisher((workspaceId) => `roles:${workspaceId}`);
    return createEventSubscription<RoleEvent>(ctx, `roles:${ctx.auth.workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
import { isAuthenticated, isEnabled } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import { errors, zodId } from "#lib";
      return results.data.Get.Content.map(({ _additional, ...result }) => result);
import { zodId } from "#lib/mongo";
import { stringToRegex } from "#lib/utils";
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { ExtendedTag, Tag, getTagsCollection, tag, getContentPiecesCollection } from "#database";

type TagEvent =
  | { action: "create"; data: Tag }
  | { action: "update"; data: Partial<Tag> & { id: string } }
  | {
      action: "delete";
      data: { id: string };
    };
const publishEvent = createEventPublisher<TagEvent>((workspaceId) => `tags:${workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
    return createEventSubscription<TagEvent>(ctx, `tags:${ctx.auth.workspaceId}`);
import { procedure, router } from "#lib/trpc";
import { AuthenticatedContext, isAuthenticated } from "#lib/middleware";
import { generateSalt, hashValue } from "#lib/hash";
import { UnderscoreID, zodId } from "#lib/mongo";
import { Token, FullToken, getTokensCollection, token } from "#database/tokens";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type TokenEvent =
  | {
      action: "create";
      data: Token;
    }
  | { action: "update"; data: Partial<Token> & { id: string } }
  | { action: "delete"; data: { id: string } };

const publishEvent = createEventPublisher<TokenEvent>((workspaceId) => `tokens:${workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
    return createEventSubscription<TokenEvent>(ctx, `tokens:${ctx.auth.workspaceId}`);
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { Transformer, getGitDataCollection, transformer } from "#database";
import { ObjectId, zodId } from "#lib/mongo";
import { getTransformersCollection } from "#database/transformers";
type TransformersEvent =
  | {
      action: "create";
      data: Transformer & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishEvent = createEventPublisher<TransformersEvent>(
  (workspaceId) => `transformers:${workspaceId}`
);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, { action: "delete", data: input });
    .output(z.array(transformer.extend({ inUse: z.boolean().optional() })))
      return transformers.map(({ _id, workspaceId, ...transformerData }) => {
    return createEventSubscription<TransformersEvent>(ctx, `transformers:${ctx.auth.workspaceId}`);
export type { TransformersEvent };
import { isAuthenticated, isAuthenticatedUser } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
  AppearanceSettings,
import { zodId } from "#lib";
type UserSettingsEvent = { action: "update"; data: Partial<AppearanceSettings> };

const publishEvent = createEventPublisher<UserSettingsEvent>((userId) => `userSettings:${userId}`);
    .input(appearanceSettings.partial())
      publishEvent(ctx, `${ctx.auth.userId}`, { action: "update", data: input });
        codeEditorTheme: userSettings.codeEditorTheme,
    return createEventSubscription<UserSettingsEvent>(ctx, `userSettings:${ctx.auth.userId}`);
export type { UserSettingsEvent };
import { hashValue } from "#lib/hash";
import { isAuthenticated } from "#lib/middleware";
import { UnderscoreID } from "#lib/mongo";
import { procedure, router } from "#lib/trpc";
import {
  FullUser,
  Profile,
  VerificationDetails,
  getUsersCollection,
  profile,
  verificationDetails
} from "#database/users";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { stringToRegex } from "#lib/utils";
type UserEvent = {
  action: "update";
  data: Partial<Profile> & { id: string } & Partial<VerificationDetails>;
};

const publishEvent = createEventPublisher<UserEvent>((userId: string) => `user:${userId}`);
    return createEventSubscription<UserEvent>(ctx, `user:${ctx.auth.userId}`);
      publishEvent(ctx, `${ctx.auth.userId}`, {
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import { nanoid } from "nanoid";
import mime from "mime-types";
import { extractPreviewDataFromOpenGraph } from "#lib/utils";
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { hostConfig, HostConfig } from "#plugins/host-config";
const authenticatedProcedure = procedure.use(isAuthenticated);
import { isAuthenticated } from "#lib/middleware";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
  Variant,
import { ObjectId, zodId } from "#lib/mongo";
type VariantsEvent =
  | {
      action: "create";
      data: Variant & { id: string };
    }
  | {
      action: "update";
      data: Partial<Variant> & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishEvent = createEventPublisher<VariantsEvent>(
  (workspaceId) => `variants:${workspaceId}`
);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, { action: "update", data: input });
      publishEvent(ctx, `${ctx.auth.workspaceId}`, { action: "delete", data: input });
    return createEventSubscription<VariantsEvent>(ctx, `variants:${ctx.auth.workspaceId}`);
export type { VariantsEvent };
import { VerificationDetails, getUsersCollection } from "#database/users";
import { procedure, router } from "#lib/trpc";
import { createWorkspace } from "#lib/workspace";
import * as errors from "#lib/errors";
import { createSession } from "#lib/session";
import { isAuthenticatedUser } from "#lib/middleware";
import { verifyValue } from "#lib";
  WorkspaceMembership,
} from "#database/workspace-memberships";
import { runWebhooks } from "#lib/webhooks";
import { createEventPublisher } from "#lib/pub-sub";
import { getUserSettingsCollection } from "#database";

type VerifyUserEvent = {
  action: "update";
  data: { id: string } & Partial<VerificationDetails & { email: string }>;
};
type VerifyWorkspaceInviteEvent = {
  action: "update";
  data: {
    id: string;
    userId: string;
    pendingInvite?: boolean;
    profile?: {
      fullName?: string;
      username?: string;
      avatar?: string;
    };
  } & Partial<WorkspaceMembership>;
};
const publishUserEvent = createEventPublisher<VerifyUserEvent>(
  (userId: string) => `user:${userId}`
);
const publishWorkspaceMembershipEvent = createEventPublisher<VerifyWorkspaceInviteEvent>(
  (workspaceId: string) => `workspaceMemberships:${workspaceId}`
);
          codeEditorTheme: "dark",
        console.error(error);
import { Db, ObjectId } from "mongodb";
import { z } from "zod";
import { isAuthenticated } from "#lib/middleware";
import { UnderscoreID } from "#lib/mongo";
import { procedure, router } from "#lib/trpc";
import * as errors from "#lib/errors";
import {
  FullVersion,
  getContentPieceVariantsCollection,
  getContentPiecesCollection,
  getContentVariantsCollection,
  getContentsCollection,
  getVersionsCollection,
  version
} from "#database";

const authenticatedProcedure = procedure.use(isAuthenticated);
const basePath = "/versions";
const createVersion = async (
  db: Db,
  data: Pick<FullVersion<ObjectId>, "name" | "contentPieceId" | "variantId" | "workspaceId">
): Promise<ObjectId> => {
  const versionsCollection = getVersionsCollection(db);
  const contentPiecesCollection = getContentPiecesCollection(db);
  const contentsCollection = getContentsCollection(db);
  const contentPieceVariantsCollection = getContentPieceVariantsCollection(db);
  const contentVariantsCollection = getContentVariantsCollection(db);

  let contentPiece = await contentPiecesCollection.findOne({
    _id: data.contentPieceId,
    workspaceId: data.workspaceId
  });

  if (!contentPiece) throw errors.notFound("contentPiece");

  let content = await contentsCollection.findOne({
    contentPieceId: contentPiece._id
  });

  if (!content) throw errors.notFound("content");

  if (data.variantId) {
    const contentPieceVariant = await contentPieceVariantsCollection.findOne({
      contentPieceId: contentPiece._id,
      variantId: data.variantId,
      workspaceId: data.workspaceId
    });

    if (!contentPieceVariant) throw errors.notFound("contentPieceVariant");

    const contentVariant = await contentVariantsCollection.findOne({
      contentPieceId: contentPiece._id,
      variantId: data.variantId
    });

    if (!contentVariant) throw errors.notFound("contentVariant");

    contentPiece = { ...contentPiece, ...contentPieceVariant };
    content = { ...content, ...contentVariant };
  }

  const version: UnderscoreID<FullVersion<ObjectId>> = {
    _id: new ObjectId(),
    name: data.name,
    date: new Date(),
    content: content.content,
    contentPiece: {
      members: contentPiece.members,
      tags: contentPiece.tags,
      title: contentPiece.title,
      description: contentPiece.description,
      slug: contentPiece.slug,
      canonicalLink: contentPiece.canonicalLink,
      coverAlt: contentPiece.coverAlt,
      coverUrl: contentPiece.coverUrl,
      customData: contentPiece.customData,
      date: contentPiece.date
    },
    contentPieceId: contentPiece._id,
    variantId: data.variantId,
    workspaceId: data.workspaceId
  };

  await versionsCollection.insertOne(version);

  return version._id;
};
const versionsRouter = router({
  create: authenticatedProcedure
    .input(version.pick({ name: true, contentPieceId: true, variantId: true }))
    .output(version.pick({ id: true }))
    .mutation(async ({ ctx, input }) => {
      const versionId = await createVersion(ctx.db, {
        name: input.name,
        contentPieceId: new ObjectId(input.contentPieceId),
        variantId: new ObjectId(input.variantId),
        workspaceId: ctx.auth.workspaceId
      });

      return { id: `${versionId}` };
    }),
  delete: authenticatedProcedure
    .input(
      version.pick({
        id: true
      })
    )
    .output(z.void())
    .mutation(async ({ ctx, input }) => {
      const versionsCollection = getVersionsCollection(ctx.db);
      const { deletedCount } = await versionsCollection.deleteOne({
        _id: new ObjectId(input.id),
        workspaceId: ctx.auth.workspaceId
      });

      if (!deletedCount) throw errors.notFound("version");
    }),
  restore: authenticatedProcedure
    .input(
      version.pick({
        id: true
      })
    )
    .output(z.void())
    .mutation(async ({ ctx, input }) => {
      const versionsCollection = getVersionsCollection(ctx.db);
      const contentPiecesCollection = getContentPiecesCollection(ctx.db);
      const contentsCollection = getContentsCollection(ctx.db);
      const contentPieceVariantsCollection = getContentPieceVariantsCollection(ctx.db);
      const contentVariantsCollection = getContentVariantsCollection(ctx.db);
      const version = await versionsCollection.findOne({
        _id: new ObjectId(input.id),
        workspaceId: ctx.auth.workspaceId
      });

      if (!version) throw errors.notFound("version");

      if (version.variantId) {
        const contentPieceVariantUpdateResult = await contentPieceVariantsCollection.updateOne(
          {
            contentPieceId: version.contentPieceId,
            variantId: version.variantId,
            workspaceId: ctx.auth.workspaceId
          },
          {
            $set: version.contentPiece
          }
        );

        if (!contentPieceVariantUpdateResult.matchedCount) {
          throw errors.notFound("contentPieceVariant");
        }

        const contentVariantUpdateResult = await contentVariantsCollection.updateOne(
          {
            contentPieceId: version.contentPieceId,
            variantId: version.variantId
          },
          {
            $set: {
              content: version.content
            }
          }
        );

        if (!contentVariantUpdateResult.matchedCount) throw errors.notFound("contentVariant");

        return;
      }

      const contentPieceUpdateResult = await contentPiecesCollection.updateOne(
        {
          _id: version.contentPieceId,
          workspaceId: ctx.auth.workspaceId
        },
        { $set: version.contentPiece }
      );

      if (!contentPieceUpdateResult.matchedCount) throw errors.notFound("contentPiece");

      const contentUpdateResult = await contentsCollection.updateOne(
        {
          contentPieceId: version.contentPieceId
        },
        { $set: { content: version.content } }
      );

      if (!contentUpdateResult.matchedCount) throw errors.notFound("content");
    })
});

export { versionsRouter, createVersion };
import { procedure, router } from "#lib/trpc";
import { isAuthenticated } from "#lib/middleware";
import { UnderscoreID, zodId } from "#lib/mongo";
import { FullWebhook, Webhook, getWebhooksCollection, webhook } from "#database/webhooks";
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type WebhookEvent =
  | {
      action: "create";
      data: Webhook & { id: string };
    }
  | {
      action: "update";
      data: Partial<Webhook> & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishEvent = createEventPublisher<WebhookEvent>((workspaceId) => {
  return `webhooks:${workspaceId}`;
});
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
    return createEventSubscription<WebhookEvent>(ctx, `webhooks:${ctx.auth.workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
import { procedure, router } from "../lib/trpc";
import { AuthenticatedContext, isAuthenticated, isAuthenticatedUser } from "../lib/middleware";
import { UnderscoreID, generateSalt, hashValue, stringToRegex, zodId } from "../lib";
  WorkspaceMembership,
  workspaceMembership
} from "#database/workspace-memberships";
import * as errors from "#lib/errors";
import { getWorkspacesCollection, workspace } from "#database/workspaces";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { runWebhooks } from "#lib/webhooks";
import {
  Role,
  contentPieceMember,
  profile,
  role
import { updateSessionUser } from "#lib/session";

type WorkspaceMembershipEvent =
  | { action: "create"; data: { id: string; pendingInvite: boolean } & WorkspaceMembership }
  | {
      action: "update";
      data: {
        id: string;
        userId: string;
        role?: Role;
        pendingInvite?: boolean;
        profile?: {
          fullName?: string;
          username?: string;
          avatar?: string;
        };
      } & Partial<WorkspaceMembership>;
    }
  | {
      action: "delete";
      data: { id: string; userId: string };
    };

const publishEvent = createEventPublisher<WorkspaceMembershipEvent>(
  (workspaceId) => `workspaceMemberships:${workspaceId}`
);
  publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
        email: z.string().email(),
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
    return createEventSubscription<WorkspaceMembershipEvent>(
      ctx,
      `workspaceMemberships:${ctx.auth.workspaceId}`
    );
import { procedure, router } from "../lib/trpc";
import { isAuthenticated } from "../lib/middleware";
  WorkspaceSettings,
  wrapper,
  workspaceSettings,
  Wrapper
import * as errors from "#lib/errors";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
type WorkspaceSettingsEvent =
  | {
      action: "update";
      data: Partial<Omit<WorkspaceSettings, "id">>;
    }
  | {
      action: "createWrapper";
      data: Wrapper;
    }
  | {
      action: "deleteWrapper";
      data: Pick<Wrapper, "key">;
    };

const publishEvent = createEventPublisher<WorkspaceSettingsEvent>((workspaceId) => {
  return `workspaceSettings:${workspaceId}`;
});
        embeds: workspaceSettings.embeds,
        wrappers: workspaceSettings.wrappers || []
      };
    }),
  createWrapper: authenticatedProcedure
    .meta({
      openapi: { method: "POST", path: `${basePath}/wrapper`, protect: true },
      permissions: { session: ["manageWorkspace"], token: ["workspace:write"] }
    })
    .input(wrapper)
    .output(z.object({ key: wrapper.shape.key }))
    .mutation(async ({ input, ctx }) => {
      const extensionId = ctx.req.headers["x-vrite-extension-id"] as string | undefined;
      const workspaceSettingsCollection = getWorkspaceSettingsCollection(ctx.db);
      const workspaceSettings = await workspaceSettingsCollection.findOne({
        workspaceId: ctx.auth.workspaceId
      });

      if (!workspaceSettings) throw errors.notFound("workspaceSettings");

      const sameKeyWrapperIndex =
        workspaceSettings.wrappers?.findIndex((wrapper) => wrapper.key === input.key) || -1;

      if (sameKeyWrapperIndex >= 0) {
        await workspaceSettingsCollection.updateOne(
          {
            workspaceId: ctx.auth.workspaceId
          },
          {
            $set: {
              wrappers: (workspaceSettings.wrappers || []).map((item, index) => {
                if (index === sameKeyWrapperIndex) {
                  return {
                    ...item,
                    ...input,
                    ...(extensionId && { extension: item.extension || true })
                  };
                }

                return item;
              })
            }
          }
        );
      } else {
        await workspaceSettingsCollection.updateOne(
          {
            workspaceId: ctx.auth.workspaceId
          },
          {
            $push: {
              wrappers: {
                ...input,
                ...(extensionId && { extension: true })
              }
            }
          }
        );
      }

      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
        action: "createWrapper",
        data: input
      });

      return {
        key: input.key
  deleteWrapper: authenticatedProcedure
    .meta({
      openapi: { method: "DELETE", path: `${basePath}/wrapper`, protect: true },
      permissions: { session: ["manageWorkspace"], token: ["workspace:write"] }
    })
    .input(wrapper.pick({ key: true }))
    .output(z.void())
    .mutation(async ({ input, ctx }) => {
      const workspaceSettingsCollection = getWorkspaceSettingsCollection(ctx.db);

      await workspaceSettingsCollection.updateOne(
        {
          workspaceId: ctx.auth.workspaceId
        },
        {
          $pull: {
            wrappers: {
              key: input.key
            }
          }
        }
      );
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
        action: "deleteWrapper",
        data: input
      });
    }),
    return createEventSubscription<WorkspaceSettingsEvent>(
      ctx,
      `workspaceSettings:${ctx.auth.workspaceId}`
    );
        .omit({ id: true, prettierConfig: true, wrappers: true })
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
export { workspaceSettingsRouter, publishEvent as publishWorkspaceSettingsEvent };
import { procedure, router } from "../lib/trpc";
import { isAuthenticated, isAuthenticatedUser } from "../lib/middleware";
import { zodId } from "../lib";
import * as errors from "#lib/errors";
import { Workspace, getWorkspacesCollection, workspace } from "#database/workspaces";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { createWorkspace, deleteWorkspace } from "#lib/workspace";
import { getUsersCollection } from "#database";
type WorkspaceEvent =
  | { action: "update"; data: Partial<Workspace> & { id: string } }
  | { action: "delete"; data: { id: string } };

const publishEvent = createEventPublisher<WorkspaceEvent>((workspaceId) => {
  return `workspace:${workspaceId}`;
});
    return createEventSubscription<WorkspaceEvent>(ctx, `workspace:${ctx.auth.workspaceId}`);
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishEvent(ctx, `${ctx.auth.workspaceId}`, {
import { OAuthPlugin } from "./plugins/oauth";
import { s3Plugin } from "./plugins/s3";
import { mailPlugin } from "./plugins/email";
import { sessionPlugin } from "./plugins/session";
import { pubSubPlugin } from "./plugins/pub-sub";
import { databasePlugin } from "./plugins/database";
import { ZodRawShape } from "zod";
import { gitSyncPlugin, hostConfigPlugin, searchPlugin } from "#plugins";
const createServer = async (envSchemaExtension?: ZodRawShape): Promise<FastifyInstance> => {
      schema: zodToJsonSchema(envSchema.extend(envSchemaExtension || {}))
  await server
    .register(mongoPlugin, {
    })
    .register(redisPlugin, { url: server.config.REDIS_URL })
    .register(redisPlugin, { url: server.config.REDIS_URL, namespace: "sub" });
  await server.register(databasePlugin).register(pubSubPlugin).register(s3Plugin);
  await server
    .register(cookiePlugin, { secret: server.config.SECRET })
    .register(jwtPlugin, {
      secret: server.config.SECRET,
      cookie: { cookieName: "accessToken", signed: true }
    })
    .register(sessionPlugin)
    .register(OAuthPlugin);
  await server.register(mailPlugin);
  await server.register(gitSyncPlugin);
  await server.register(searchPlugin);
            `:base-2: absolute z-50 flex flex-col p-1 overflow-hidden transition-all duration-300 transform shadow-2xl w-full`
  document.body.addEventListener("pointermove", onPointerMove);
    document.body.removeEventListener("pointermove", onPointerMove);







          class: node.attrs.lang ? `language-${node.attrs.lang}` : null
export * from "./wrapper";
import { nodeInputRule } from "./node-input-rule";
import { Node, mergeAttributes, wrappingInputRule } from "@tiptap/core";

interface WrapperAttributes {
  name?: string;
}
interface WrapperOptions {
  HTMLAttributes: WrapperAttributes;
}

declare module "@tiptap/core" {
  interface Commands<ReturnType> {
    wrapper: {
      setWrapper: (attrs?: WrapperAttributes) => ReturnType;
      toggleWrapper: (attrs?: WrapperAttributes) => ReturnType;
      unsetWrapper: () => ReturnType;
    };
  }
}

const Wrapper = Node.create<WrapperOptions>({
  name: "wrapper",
  content: "block+",
  group: "block",
  isolating: true,
  defining: true,
  addOptions() {
    return {
      HTMLAttributes: {}
    };
  },
  addAttributes() {
    return {
      key: {
        default: null,
        parseHTML: (element) => {
          return element.getAttribute("data-key");
        }
      }
    };
  },
  parseHTML() {
    return [
      {
        tag: "div[data-wrapper=true]"
      }
    ];
  },
  renderHTML({ node, HTMLAttributes }) {
    return [
      "div",
      mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
        "data-wrapper": "true",
        "data-key": node.attrs.key
      }),
      0
    ];
  },
  addCommands() {
    return {
      setWrapper: (attrs) => {
        return ({ commands }) => {
          return commands.wrapIn(this.name, attrs);
        };
      },
      toggleWrapper: (attrs) => {
        return ({ commands }) => {
          return commands.toggleWrap(this.name, attrs);
        };
      },
      unsetWrapper: () => {
        return ({ commands }) => {
          return commands.lift(this.name);
        };
      }
    };
  },
  addInputRules() {
    return [
      wrappingInputRule({
        find: /(^:::(.*?)\s$)/,
        type: this.type,
        getAttributes: (match) => {
          const [, , key] = match;

          return { key: key.trim() };
        }
      })
    ];
  }
});

export { Wrapper };
export type { WrapperAttributes, WrapperOptions };
type RenderEmail = typeof renderEmail;

const renderEmail = (<T extends keyof typeof templateMap>(
}) as (test: string) => string;
    "on:install": "install",
    "on:install": "install",
    "on:install": "install",
  "version": "0.2.0",
import { ContentPiecesEndpoints, createContentPiecesEndpoints } from "./content-pieces";
    contentPieceID?: string;
  }): Promise<
    Array<{
      contentPieceId: string;
      breadcrumb: string[];
      content: string;
    }>
  >;
  reconfigure(config: ClientConfig): void;
  const { sendRequest, reconfigure, getConfig } = createAPIFetcher(config);

  return {
    reconfigure
export type { Client };
export type { Client } from "./client";
  return { sendRequest, reconfigure, getConfig };
    | WrapperNode
type WrapperNode = {
  type: "wrapper";
  attrs?: {
    key?: string;
    | WrapperNode
    lang: string;
    | WrapperNode
  wrapper: WrapperNode;
      JSONContentNode["listItem" | "taskItem" | "blockquote" | "doc" | "wrapper"]
          case "wrapper":
              child as JSONContentNodeWalker<JSONContentNode["wrapper"]>
      case "wrapper":
          "data-key": nodeWalker.node.attrs?.key
        })}>${(nodeWalker as JSONContentNodeWalker<JSONContentNode["wrapper"]>).children
        version: 6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.45.0)(typescript@5.1.6)
        version: 6.2.0(eslint@8.45.0)(typescript@5.1.6)
        version: 3.0.1(eslint@8.45.0)(prettier@3.0.2)(typescript@5.1.6)
        version: 0.12.1(eslint@8.45.0)(typescript@5.1.6)
        version: 5.1.6
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.2)
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.2)
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.2)
        version: 0.55.7(postcss@8.4.29)(vite@4.4.9)
        version: 4.4.9(sass@1.64.1)
        version: 2.2.1(@babel/core@7.22.15)(solid-js@1.7.11)(vite@4.4.9)
        version: 0.55.7(postcss@8.4.29)(vite@4.4.9)
        version: 4.4.9(sass@1.64.1)
        version: 10.16.2(solid-js@1.7.8)
        version: 2.0.15(solid-js@1.7.8)
        version: 0.3.15(solid-js@1.7.8)
        version: 2.2.3(solid-js@1.7.8)
        version: 1.3.2(solid-js@1.7.8)
        version: 1.4.0(solid-js@1.7.8)
        version: 0.8.2(solid-js@1.7.8)
        version: 1.0.0(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)(solid-js@1.7.8)
        specifier: ^0.40.0
        version: 0.40.0
        version: 1.7.8
        version: 1.2.1(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
        version: 5.1.6
        version: 0.55.7(postcss@8.4.29)(vite@4.4.7)
        version: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
        version: 2.7.0(solid-js@1.7.8)(vite@4.4.7)
        version: 4.2.0(typescript@5.1.6)(vite@4.4.7)
        version: 1.4.0(typescript@5.1.6)
        version: 5.1.6
        version: 1.4.0(graphql@16.7.1)
        version: 2.0.15(solid-js@1.7.8)
        version: 2.2.3(solid-js@1.7.8)
        version: 1.7.8
        version: 2.1.8(@tiptap/core@2.1.8)(@tiptap/extension-code-block@2.0.3)(@tiptap/pm@2.1.8)
        version: 1.7.8
        version: 2.9.2
        version: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      '@jridgewell/trace-mapping': 0.3.18
  /@astrojs/compiler@1.6.2:
    resolution: {integrity: sha512-2grH0lSm/Su88ZUd1kF0OdR/CT4ClWKvCwVz4yDdpgLgpzXhs1LdO2V58YfSqnx/z+G5EBWv6yEkp3tDG3GQYQ==}
    dev: true

  /@astrojs/compiler@2.1.0:
    resolution: {integrity: sha512-Mp+qrNhly+27bL/Zq8lGeUY+YrdoU0eDfIlAeGIPrzt0PnI/jGpvPUdCaugv4zbCrDkOUScFfcbeEiYumrdJnw==}

  /@astrojs/internal-helpers@0.1.1:
    resolution: {integrity: sha512-+LySbvFbjv2nO2m/e78suleQOGEru4Cnx73VsZbrQgB2u7A4ddsQg3P2T0zC0e10jgcT+c6nNlKeLpa6nRhQIg==}
    dev: true
    dev: false
      '@jridgewell/trace-mapping': 0.3.18
      '@vscode/emmet-helper': 2.8.9
      vscode-css-languageservice: 6.2.6
      vscode-html-languageservice: 5.0.6
      vscode-languageserver-protocol: 3.17.3
      vscode-languageserver-textdocument: 1.0.8
      vscode-languageserver-types: 3.17.3
      vscode-uri: 3.0.7
    dev: false
  /@astrojs/markdown-remark@2.2.1(astro@2.9.2):
    resolution: {integrity: sha512-VF0HRv4GpC1XEMLnsKf6jth7JSmlt9qpqP0josQgA2eSpCIAC/Et+y94mgdBIZVBYH/yFnMoIxgKVe93xfO2GA==}
      astro: ^2.5.0
      '@astrojs/prism': 2.1.2
      astro: 2.9.2
      github-slugger: 1.5.0
      import-meta-resolve: 2.2.2
    dev: true
  /@astrojs/markdown-remark@3.2.0(astro@3.1.0):
    resolution: {integrity: sha512-jigyLfefUZPKgVmmraCkVpdUuFH1R3SrpgQO13axsgwLDBgkggaQpNR5Ag4O9PDualeBtbdt30aYSfvnBKx9Hg==}
      astro: ^3.1.0
      zod: 3.22.2
  /@astrojs/solid-js@2.2.1(@babel/core@7.22.15)(solid-js@1.7.11)(vite@4.4.9):
      babel-preset-solid: 1.7.7(@babel/core@7.22.15)
      ci-info: 3.8.0
      undici: 5.23.0
      ci-info: 3.8.0
      is-wsl: 3.0.0
      undici: 5.23.0
      undici: 5.23.0
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      '@babel/highlight': 7.22.13
  /@babel/code-frame@7.22.5:
    resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/highlight': 7.22.13

  /@babel/compat-data@7.22.9:
    resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==}
  /@babel/core@7.22.15:
    resolution: {integrity: sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==}
      '@babel/generator': 7.22.15
      '@babel/helper-module-transforms': 7.22.15(@babel/core@7.22.15)
      '@babel/helpers': 7.22.15
      '@babel/parser': 7.22.16
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
      convert-source-map: 1.9.0
      debug: 4.3.4
      gensync: 1.0.0-beta.2
      json5: 2.2.3
      semver: 6.3.1
    transitivePeerDependencies:
      - supports-color

  /@babel/core@7.22.5:
    resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@ampproject/remapping': 2.2.1
      '@babel/code-frame': 7.22.5
      '@babel/generator': 7.22.5
      '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5)
      '@babel/helper-module-transforms': 7.22.5
      '@babel/helpers': 7.22.5
      '@babel/parser': 7.22.5
      '@babel/template': 7.22.5
      '@babel/traverse': 7.22.5
      '@babel/types': 7.22.5
      convert-source-map: 1.9.0
  /@babel/eslint-parser@7.22.5(@babel/core@7.22.5)(eslint@8.45.0):
    resolution: {integrity: sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==}
      '@babel/core': '>=7.11.0'
      '@babel/core': 7.22.5
  /@babel/generator@7.22.15:
    resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/types': 7.22.15
      '@jridgewell/gen-mapping': 0.3.3
      '@jridgewell/trace-mapping': 0.3.18
      jsesc: 2.5.2

  /@babel/generator@7.22.5:
    resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==}
      '@babel/types': 7.22.15
      '@jridgewell/trace-mapping': 0.3.18
      '@babel/types': 7.22.15
      '@babel/compat-data': 7.22.9
      '@babel/helper-validator-option': 7.22.15
      browserslist: 4.21.10
      lru-cache: 5.1.1
      semver: 6.3.1

  /@babel/helper-compilation-targets@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==}
    engines: {node: '>=6.9.0'}
    peerDependencies:
      '@babel/core': ^7.0.0
    dependencies:
      '@babel/compat-data': 7.22.9
      '@babel/core': 7.22.5
      browserslist: 4.21.10
  /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==}
      '@babel/core': 7.22.5
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-function-name': 7.22.5
      '@babel/helper-member-expression-to-functions': 7.22.5
      '@babel/helper-replace-supers': 7.22.5
      '@babel/helper-split-export-declaration': 7.22.5
    transitivePeerDependencies:
      - supports-color
  /@babel/helper-environment-visitor@7.22.5:
    resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
  /@babel/helper-function-name@7.22.5:
    resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
      '@babel/template': 7.22.5
      '@babel/types': 7.22.15
      '@babel/types': 7.22.15
  /@babel/helper-member-expression-to-functions@7.22.5:
    resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==}
      '@babel/types': 7.22.15
      '@babel/types': 7.22.15
      '@babel/types': 7.22.15

  /@babel/helper-module-imports@7.22.5:
    resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/types': 7.22.15
  /@babel/helper-module-transforms@7.22.15(@babel/core@7.22.15):
    resolution: {integrity: sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==}
      '@babel/core': 7.22.15
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-module-imports': 7.22.15
      '@babel/helper-simple-access': 7.22.5
      '@babel/helper-split-export-declaration': 7.22.6
      '@babel/helper-validator-identifier': 7.22.15

  /@babel/helper-module-transforms@7.22.5:
    resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-validator-identifier': 7.22.15
      '@babel/template': 7.22.15
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
    transitivePeerDependencies:
      - supports-color
      '@babel/types': 7.22.15
  /@babel/helper-replace-supers@7.22.5:
    resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==}
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-member-expression-to-functions': 7.22.5
      '@babel/template': 7.22.15
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
    transitivePeerDependencies:
      - supports-color
      '@babel/types': 7.22.15
      '@babel/types': 7.22.15

  /@babel/helper-split-export-declaration@7.22.5:
    resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/types': 7.22.15
      '@babel/types': 7.22.15
  /@babel/helper-validator-identifier@7.22.15:
    resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==}
    engines: {node: '>=6.9.0'}

  /@babel/helper-validator-identifier@7.22.5:
    resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
  /@babel/helper-validator-option@7.22.5:
    resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
    engines: {node: '>=6.9.0'}

  /@babel/helpers@7.22.15:
    resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==}
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
    transitivePeerDependencies:
      - supports-color

  /@babel/helpers@7.22.5:
    resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/template': 7.22.5
      '@babel/traverse': 7.22.5
      '@babel/types': 7.22.15
  /@babel/highlight@7.22.13:
    resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==}
      '@babel/helper-validator-identifier': 7.22.15
  /@babel/parser@7.22.16:
    resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==}
      '@babel/types': 7.22.15
  /@babel/parser@7.22.5:
    resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==}
    engines: {node: '>=6.0.0'}
    hasBin: true
    dependencies:
      '@babel/types': 7.22.15

  /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.15):
    resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
    engines: {node: '>=6.9.0'}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-plugin-utils': 7.22.5
      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.15)
    dev: false

  /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.15):
    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-plugin-utils': 7.22.5
    dev: false

  /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.15):
    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-plugin-utils': 7.22.5
    dev: false

  /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.15):
    resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==}
    engines: {node: '>=6.9.0'}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-plugin-utils': 7.22.5

  /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5):
      '@babel/core': 7.22.5
  /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5):
      '@babel/core': 7.22.5
      '@babel/helper-plugin-utils': 7.22.5

  /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.15):
    resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==}
    engines: {node: '>=6.9.0'}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-module-transforms': 7.22.5
      '@babel/helper-simple-access': 7.22.5
    transitivePeerDependencies:
      - supports-color
    dev: false
  /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==}
      '@babel/core': 7.22.5
      '@babel/helper-module-transforms': 7.22.5
    transitivePeerDependencies:
      - supports-color

  /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.15):
    resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==}
    engines: {node: '>=6.9.0'}
    peerDependencies:
      '@babel/core': ^7.0.0-0
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-annotate-as-pure': 7.22.5
      '@babel/helper-module-imports': 7.22.15
      '@babel/helper-plugin-utils': 7.22.5
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.15)
      '@babel/types': 7.22.15
  /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==}
      '@babel/core': 7.22.5
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5)
      '@babel/types': 7.22.15
    dev: true
  /@babel/plugin-transform-typescript@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==}
      '@babel/core': 7.22.5
      '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5)
      '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.5)
    transitivePeerDependencies:
      - supports-color
  /@babel/preset-typescript@7.22.5(@babel/core@7.22.5):
    resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==}
      '@babel/core': 7.22.5
      '@babel/helper-validator-option': 7.22.5
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5)
      '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5)
      '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.22.5)
    transitivePeerDependencies:
      - supports-color
  /@babel/runtime@7.22.5:
    resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==}
      regenerator-runtime: 0.13.11
  /@babel/standalone@7.22.5:
    resolution: {integrity: sha512-6Lwhzral4YDEbIM3dBC8/w0BMDvOosGBGaJWSORLkerx8byawkmwwzXKUB0jGlI1Zp90+cK2uyTl62UPtLbUjQ==}
      '@babel/parser': 7.22.16
      '@babel/types': 7.22.15

  /@babel/template@7.22.5:
    resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/code-frame': 7.22.5
      '@babel/parser': 7.22.5
      '@babel/types': 7.22.15

  /@babel/traverse@7.22.15:
    resolution: {integrity: sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/code-frame': 7.22.13
      '@babel/generator': 7.22.15
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-function-name': 7.22.5
      '@babel/helper-hoist-variables': 7.22.5
      '@babel/helper-split-export-declaration': 7.22.6
      '@babel/parser': 7.22.16
      '@babel/types': 7.22.15
      debug: 4.3.4
      globals: 11.12.0
    transitivePeerDependencies:
      - supports-color
  /@babel/traverse@7.22.5:
    resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==}
      '@babel/generator': 7.22.15
      '@babel/helper-environment-visitor': 7.22.5
      '@babel/helper-function-name': 7.22.5
      '@babel/parser': 7.22.16
      '@babel/types': 7.22.15
  /@babel/types@7.22.15:
    resolution: {integrity: sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==}
    engines: {node: '>=6.9.0'}
    dependencies:
      '@babel/helper-string-parser': 7.22.5
      '@babel/helper-validator-identifier': 7.22.15
      to-fast-properties: 2.0.0

  /@babel/types@7.22.5:
    resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
      '@babel/helper-validator-identifier': 7.22.5
  /@bufbuild/connect-node@0.9.1(@bufbuild/protobuf@1.3.0):
      '@bufbuild/connect': 0.9.1(@bufbuild/protobuf@1.3.0)
      '@bufbuild/protobuf': 1.3.0
      headers-polyfill: 3.1.2
  /@bufbuild/connect@0.9.1(@bufbuild/protobuf@1.3.0):
      '@bufbuild/protobuf': 1.3.0
  /@bufbuild/protobuf@1.3.0:
    resolution: {integrity: sha512-G372ods0pLt46yxVRsnP/e2btVPuuzArcMPFpIDeIwiGPuuglEs9y75iG0HMvZgncsj5TvbYRWqbVyOe3PLCWQ==}
  /@esbuild/android-arm64@0.19.3:
    resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==}
  /@esbuild/android-arm@0.19.3:
    resolution: {integrity: sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==}
  /@esbuild/android-x64@0.19.3:
    resolution: {integrity: sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==}
  /@esbuild/darwin-arm64@0.19.3:
    resolution: {integrity: sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==}
  /@esbuild/darwin-x64@0.19.3:
    resolution: {integrity: sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==}
  /@esbuild/freebsd-arm64@0.19.3:
    resolution: {integrity: sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==}
  /@esbuild/freebsd-x64@0.19.3:
    resolution: {integrity: sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==}
  /@esbuild/linux-arm64@0.19.3:
    resolution: {integrity: sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==}
  /@esbuild/linux-arm@0.19.3:
    resolution: {integrity: sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==}
  /@esbuild/linux-ia32@0.19.3:
    resolution: {integrity: sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==}
  /@esbuild/linux-loong64@0.19.3:
    resolution: {integrity: sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==}
  /@esbuild/linux-mips64el@0.19.3:
    resolution: {integrity: sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==}
  /@esbuild/linux-ppc64@0.19.3:
    resolution: {integrity: sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==}
  /@esbuild/linux-riscv64@0.19.3:
    resolution: {integrity: sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==}
  /@esbuild/linux-s390x@0.19.3:
    resolution: {integrity: sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==}
  /@esbuild/linux-x64@0.19.3:
    resolution: {integrity: sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==}
  /@esbuild/netbsd-x64@0.19.3:
    resolution: {integrity: sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==}
  /@esbuild/openbsd-x64@0.19.3:
    resolution: {integrity: sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==}
  /@esbuild/sunos-x64@0.19.3:
    resolution: {integrity: sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==}
  /@esbuild/win32-arm64@0.19.3:
    resolution: {integrity: sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==}
  /@esbuild/win32-ia32@0.19.3:
    resolution: {integrity: sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==}
  /@esbuild/win32-x64@0.19.3:
    resolution: {integrity: sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==}
      eslint-visitor-keys: 3.4.1
  /@eslint-community/regexpp@4.6.1:
    resolution: {integrity: sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A==}
  /@eslint/eslintrc@2.1.0:
    resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==}
      globals: 13.20.0
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
  /@fastify/error@3.2.1:
    resolution: {integrity: sha512-scZVbcpPNWw/yyFmzzO7cf1daTeJp53spN2n7dBTHZd+cV7791fcWJCPP1Tfhdbre+8vDiCyQyqqXfQnYMntYQ==}
      fast-json-stringify: 5.7.0
      '@fastify/error': 3.2.1
      fast-jwt: 3.1.1
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      '@fastify/error': 3.2.1
      '@fastify/swagger': 8.10.0
      '@fastify/swagger-ui': 1.9.3
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      tiny-lru: 11.0.1
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      readable-stream: 4.4.0
  /@fastify/swagger-ui@1.9.3:
    resolution: {integrity: sha512-YYqce4CydjDIEry6Zo4JLjVPe5rjS8iGnk3fHiIQnth9sFSLeyG0U1DCH+IyYmLddNDg1uWJOuErlVqnu/jI3w==}
      fastify-plugin: 4.5.0
  /@fastify/swagger@8.10.0:
    resolution: {integrity: sha512-0o6nd0qWpJbVSv/vbK4bzHSYe7l+PTGPqrQVwWIXVGd7CvXr585SBx+h8EgrMOY80bcOnGreqnjYFOV0osGP5A==}
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      fastify-plugin: 4.5.0
      ws: 8.13.0
  /@floating-ui/core@1.3.1:
    resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==}
      '@floating-ui/core': 1.3.1
  /@graphql-typed-document-node/core@3.2.0(graphql@16.7.1):
      graphql: 16.7.1
  /@hocuspocus/common@2.5.0:
    resolution: {integrity: sha512-TpnQAb1Rtff1trwURFWaUEYZwqykaIGo6NNnMr6ZISdDZFWNHMAMUmy7dwJDS9ECnEtcjXhpPxXeLV+MVQXVnw==}
      lib0: 0.2.78
      uuid: 9.0.0
      '@hocuspocus/common': 2.5.0
      lib0: 0.2.78
      '@hocuspocus/common': 2.5.0
      lib0: 0.2.78
      uuid: 9.0.0
      ws: 8.13.0
      '@tiptap/starter-kit': 2.0.3(@tiptap/pm@2.1.8)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
  /@humanwhocodes/config-array@0.11.10:
    resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==}
  /@iconify/utils@2.1.9:
    resolution: {integrity: sha512-mo+A4n3MwLlWlg1SoSO+Dt6pOPWKElk9sSJ6ZpuzbB9OcjxN8RUWxU3ulPwB1nglErWKRam2x4BAohbYF7FiFA==}
      '@jridgewell/trace-mapping': 0.3.18
  /@jridgewell/resolve-uri@3.1.0:
    resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
  /@jridgewell/source-map@0.3.3:
    resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==}
      '@jridgewell/trace-mapping': 0.3.18
    dev: true

  /@jridgewell/sourcemap-codec@1.4.14:
    resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
  /@jridgewell/trace-mapping@0.3.18:
    resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
      '@jridgewell/resolve-uri': 3.1.0
      '@jridgewell/sourcemap-codec': 1.4.14
  /@linaria/core@4.2.9:
    resolution: {integrity: sha512-ELcu37VNVOT/PU0L6WDIN+aLzNFyJrqoBYT0CucGOCAmODbojUMCv8oJYRbWzA3N34w1t199dN4UFdfRWFG2rg==}
    engines: {node: ^12.16.0 || >=13.7.0}
    dependencies:
      '@linaria/logger': 4.0.0
      '@linaria/tags': 4.3.5
      '@linaria/utils': 4.3.4
    transitivePeerDependencies:
      - supports-color
  /@linaria/logger@4.0.0:
    resolution: {integrity: sha512-YnBq0JlDWMEkTOK+tMo5yEVR0f5V//6qMLToGcLhTyM9g9i+IDFn51Z+5q2hLk7RdG4NBPgbcCXYi2w4RKsPeg==}
    engines: {node: ^12.16.0 || >=13.7.0}
    dependencies:
      debug: 4.3.4
      picocolors: 1.0.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /@linaria/tags@4.3.5:
    resolution: {integrity: sha512-PgaIi8Vv89YOjc6rpKL/uPg2w4k0rAwAYxcqeXqzKqsEAste5rgB8xp1/KUOG0oAOkPd3MRL6Duj+m0ZwJ3g+g==}
    engines: {node: ^12.16.0 || >=13.7.0}
    dependencies:
      '@babel/generator': 7.22.15
      '@linaria/logger': 4.0.0
      '@linaria/utils': 4.3.4
    transitivePeerDependencies:
      - supports-color
    dev: false

  /@linaria/utils@4.3.4:
    resolution: {integrity: sha512-vt6WJG54n+KANaqxOfzIIU7aSfFHEWFbnGLsgxL7nASHqO0zezrNA2y2Rrp80zSeTW+wSpbmDM4uJyC9UW1qoA==}
    engines: {node: ^12.16.0 || >=13.7.0}
    dependencies:
      '@babel/core': 7.22.15
      '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.15)
      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.15)
      '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.15)
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
      '@linaria/logger': 4.0.0
      babel-merge: 3.0.0(@babel/core@7.22.15)
    transitivePeerDependencies:
      - supports-color
    dev: false

  /@lukeed/ms@2.0.1:
    resolution: {integrity: sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==}
    engines: {node: '>=8'}
    dev: false

  /@manypkg/find-root@2.1.0:
    resolution: {integrity: sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==}
    engines: {node: '>=14.18.0'}
  /@motionone/animation@10.15.1:
    resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==}
      '@motionone/easing': 10.15.1
      '@motionone/types': 10.15.1
      '@motionone/utils': 10.15.1
      tslib: 2.5.3
  /@motionone/dom@10.16.2:
    resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==}
      '@motionone/animation': 10.15.1
      '@motionone/generators': 10.15.1
      '@motionone/types': 10.15.1
      '@motionone/utils': 10.15.1
      tslib: 2.5.3
  /@motionone/easing@10.15.1:
    resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==}
      '@motionone/utils': 10.15.1
      tslib: 2.5.3
  /@motionone/generators@10.15.1:
    resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==}
      '@motionone/types': 10.15.1
      '@motionone/utils': 10.15.1
      tslib: 2.5.3
  /@motionone/solid@10.16.2(solid-js@1.7.8):
      '@motionone/dom': 10.16.2
      '@motionone/utils': 10.15.1
      '@solid-primitives/props': 3.1.6(solid-js@1.7.8)
      '@solid-primitives/refs': 1.0.4(solid-js@1.7.8)
      '@solid-primitives/transition-group': 1.0.2(solid-js@1.7.8)
      solid-js: 1.7.8
  /@motionone/types@10.15.1:
    resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==}
  /@motionone/utils@10.15.1:
    resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==}
      '@motionone/types': 10.15.1
      tslib: 2.5.3
  /@octokit/app@14.0.0:
    resolution: {integrity: sha512-g/zDXttroZ9Se08shK0d0d/j0cgSA+h4WV7qGUevNEM0piNBkIlfb4Fm6bSwCNAZhNf72mBgERmYOoxicPkqdw==}
      '@octokit/auth-app': 6.0.0
      '@octokit/auth-unauthenticated': 5.0.0
      '@octokit/core': 5.0.0
      '@octokit/plugin-paginate-rest': 8.0.0(@octokit/core@5.0.0)
      '@octokit/types': 11.1.0
  /@octokit/auth-app@6.0.0:
    resolution: {integrity: sha512-OKct7Rukf3g9DjpzcpdacQsdmd6oPrJ7fZND22JkjzhDvfhttUOnmh+qPS4kHhaNNyTxqSThnfrUWvkqNLd1nw==}
      '@octokit/auth-oauth-app': 7.0.0
      '@octokit/auth-oauth-user': 4.0.0
      '@octokit/request': 8.1.1
      '@octokit/request-error': 5.0.0
      '@octokit/types': 11.1.0
      lru-cache: 10.0.0
  /@octokit/auth-oauth-app@7.0.0:
    resolution: {integrity: sha512-8JvJEXGoEqrbzLwt3SwIUvkDd+1wrM8up0KawvDIElB8rbxPbvWppGO0SLKAWSJ0q8ILcVq+mWck6pDcZ3a9KA==}
      '@octokit/auth-oauth-device': 6.0.0
      '@octokit/auth-oauth-user': 4.0.0
      '@octokit/request': 8.1.1
      '@octokit/types': 11.1.0
  /@octokit/auth-oauth-device@6.0.0:
    resolution: {integrity: sha512-Zgf/LKhwWk54rJaTGYVYtbKgUty+ouil6VQeRd+pCw7Gd0ECoSWaZuHK6uDGC/HtnWHjpSWFhzxPauDoHcNRtg==}
      '@octokit/request': 8.1.1
      '@octokit/types': 11.1.0
  /@octokit/auth-oauth-user@4.0.0:
    resolution: {integrity: sha512-VOm5aIkVGHaOhIvsF/4YmSjoYDzzrKbbYkdSEO0KqHK7I8SlO3ZndSikQ1fBlNPUEH0ve2BOTxLrVvI1qBf9/Q==}
      '@octokit/auth-oauth-device': 6.0.0
      '@octokit/request': 8.1.1
      '@octokit/types': 11.1.0
  /@octokit/auth-unauthenticated@5.0.0:
    resolution: {integrity: sha512-AjOI6FNB2dweJ85p6rf7D4EhE4y6VBcwYfX/7KJkR5Q9fD9ET6NABAjajUTSNFfCxmNIaQgISggZ3pkgwtTqsA==}
      '@octokit/request-error': 5.0.0
      '@octokit/types': 11.1.0
  /@octokit/core@5.0.0:
    resolution: {integrity: sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==}
      '@octokit/graphql': 7.0.1
      '@octokit/request': 8.1.1
      '@octokit/request-error': 5.0.0
      '@octokit/types': 11.1.0
  /@octokit/endpoint@9.0.0:
    resolution: {integrity: sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==}
      '@octokit/types': 11.1.0
  /@octokit/graphql@7.0.1:
    resolution: {integrity: sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==}
      '@octokit/request': 8.1.1
      '@octokit/types': 11.1.0
      '@octokit/auth-oauth-app': 7.0.0
      '@octokit/auth-oauth-user': 4.0.0
      '@octokit/auth-unauthenticated': 5.0.0
      '@octokit/core': 5.0.0
      '@types/aws-lambda': 8.10.119
      '@octokit/request': 8.1.1
      '@octokit/request-error': 5.0.0
  /@octokit/openapi-types@18.0.0:
    resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==}
  /@octokit/plugin-paginate-rest@8.0.0(@octokit/core@5.0.0):
      '@octokit/core': 5.0.0
  /@octokit/plugin-request-log@4.0.0(@octokit/core@5.0.0):
      '@octokit/core': 5.0.0
  /@octokit/plugin-rest-endpoint-methods@9.0.0(@octokit/core@5.0.0):
      '@octokit/core': 5.0.0
  /@octokit/plugin-retry@6.0.0(@octokit/core@5.0.0):
    resolution: {integrity: sha512-a1/A4A+PB1QoAHQfLJxGHhLfSAT03bR1jJz3GgQJZvty2ozawFWs93MiBQXO7SL2YbO7CIq0Goj4qLOBj8JeMQ==}
      '@octokit/core': 5.0.0
      '@octokit/request-error': 5.0.0
      '@octokit/types': 11.1.0
  /@octokit/plugin-throttling@7.0.0(@octokit/core@5.0.0):
      '@octokit/core': 5.0.0
  /@octokit/request-error@5.0.0:
    resolution: {integrity: sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==}
      '@octokit/types': 11.1.0
      node-fetch: 2.6.12
  /@octokit/request@8.1.1:
    resolution: {integrity: sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==}
      '@octokit/endpoint': 9.0.0
      '@octokit/request-error': 5.0.0
      '@octokit/types': 11.1.0
      '@octokit/core': 5.0.0
      '@octokit/plugin-paginate-rest': 8.0.0(@octokit/core@5.0.0)
      '@octokit/plugin-request-log': 4.0.0(@octokit/core@5.0.0)
      '@octokit/plugin-rest-endpoint-methods': 9.0.0(@octokit/core@5.0.0)
      '@octokit/openapi-types': 18.0.0
      '@octokit/openapi-types': 18.0.0
      '@octokit/openapi-types': 18.0.0
      '@octokit/request-error': 5.0.0
  /@pkgr/utils@2.4.1:
    resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==}
      tslib: 2.5.3
  /@polka/url@1.0.0-next.21:
    resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
  /@qdrant/js-client-grpc@1.4.0(typescript@5.1.6):
      '@bufbuild/connect': 0.9.1(@bufbuild/protobuf@1.3.0)
      '@bufbuild/connect-node': 0.9.1(@bufbuild/protobuf@1.3.0)
      '@bufbuild/protobuf': 1.3.0
      typescript: 5.1.6
  /@qdrant/js-client-rest@1.4.0(typescript@5.1.6):
      typescript: 5.1.6
      undici: 5.22.1
  /@qdrant/qdrant-js@1.4.0(typescript@5.1.6):
      '@qdrant/js-client-grpc': 1.4.0(typescript@5.1.6)
      '@qdrant/js-client-rest': 1.4.0(typescript@5.1.6)
      typescript: 5.1.6
      '@babel/runtime': 7.22.5
      '@babel/runtime': 7.22.5
  /@remirror/core-constants@2.0.1:
    resolution: {integrity: sha512-ZR4aihtnnT9lMbhh5DEbsriJRlukRXmLZe7HmM+6ufJNNUDoazc75UX26xbgQlNUqgAqMcUdGFAnPc1JwgAdLQ==}
    dependencies:
      '@babel/runtime': 7.22.5
  /@remirror/core-helpers@2.0.3:
    resolution: {integrity: sha512-LqIPF4stGG69l9qu/FFicv9d9B+YaItzgDMC5A0CEvDQfKkGD3BfabLmfpnuWbsc06oKGdTduilgWcALLZoYLg==}
      '@babel/runtime': 7.22.5
      '@linaria/core': 4.2.9
      '@remirror/core-constants': 2.0.1
      '@types/object.omit': 3.0.0
    transitivePeerDependencies:
      - supports-color
  /@rollup/plugin-alias@5.0.0(rollup@3.26.2):
    resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==}
      rollup: ^1.20.0||^2.0.0||^3.0.0
      rollup: 3.26.2
  /@rollup/plugin-commonjs@24.1.0(rollup@3.26.2):
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      rollup: 3.26.2
  /@rollup/plugin-json@6.0.0(rollup@3.26.2):
    resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==}
      rollup: ^1.20.0||^2.0.0||^3.0.0
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      rollup: 3.26.2
  /@rollup/plugin-node-resolve@15.1.0(rollup@3.26.2):
    resolution: {integrity: sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==}
      rollup: ^2.78.0||^3.0.0
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      resolve: 1.22.2
      rollup: 3.26.2
  /@rollup/plugin-replace@5.0.2(rollup@3.26.2):
    resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
      rollup: ^1.20.0||^2.0.0||^3.0.0
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      rollup: 3.26.2
    dev: true

  /@rollup/pluginutils@5.0.2(rollup@3.26.2):
    resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
    engines: {node: '>=14.0.0'}
    peerDependencies:
      rollup: ^1.20.0||^2.0.0||^3.0.0
    peerDependenciesMeta:
      rollup:
        optional: true
    dependencies:
      '@types/estree': 1.0.1
      estree-walker: 2.0.2
      picomatch: 2.3.1
      rollup: 3.26.2
  /@rollup/pluginutils@5.0.4(rollup@3.26.2):
    resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==}
      rollup: ^1.20.0||^2.0.0||^3.0.0
      '@types/estree': 1.0.1
      rollup: 3.26.2
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
      tslib: 2.5.3
  /@solid-primitives/active-element@2.0.15(solid-js@1.7.8):
      '@solid-primitives/event-listener': 2.2.13(solid-js@1.7.8)
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/connectivity@0.3.15(solid-js@1.7.8):
      '@solid-primitives/event-listener': 2.2.13(solid-js@1.7.8)
      '@solid-primitives/rootless': 1.4.1(solid-js@1.7.8)
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/event-listener@2.2.13(solid-js@1.7.8):
    resolution: {integrity: sha512-8GtVEq0ECZoa5Klo1jjfGPfwg0zVJ8TNnNkWu8FqRkh0CkhbhCVJAKwjleem9K/qL6zUDfJihLjhqGBTBbb+8w==}
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/media@2.2.3(solid-js@1.7.8):
      '@solid-primitives/event-listener': 2.2.13(solid-js@1.7.8)
      '@solid-primitives/rootless': 1.4.1(solid-js@1.7.8)
      '@solid-primitives/static-store': 0.0.4(solid-js@1.7.8)
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/memo@1.3.2(solid-js@1.7.8):
      '@solid-primitives/scheduled': 1.4.0(solid-js@1.7.8)
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/props@3.1.6(solid-js@1.7.8):
    resolution: {integrity: sha512-ChtvXBDxASR+zZgH0ysoBstbVJdqJk6LITb78CScgHd+Uc8C6eaHKLmhNeuVCd36FGAuyj9vylDHe2GhmFlecA==}
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/refs@1.0.4(solid-js@1.7.8):
    resolution: {integrity: sha512-BxZKkct0OIyADWIoA9UITm+3G5Xb3IkOa0nZd40SgOK5DtMqpXFIEPUkJ/woPB90WqlM9UvvuiJHUyAjMeAmCw==}
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/rootless@1.4.1(solid-js@1.7.8):
    resolution: {integrity: sha512-h7VBUk8usD76Eh1a4wT17PcGtIRxGPlLuJ4Mf7roCNu46W5cc9DAoz8M6XebuZWVKeUkML/JuPMZQSV0mLo2Fw==}
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/scheduled@1.4.0(solid-js@1.7.8):
      solid-js: 1.7.8
  /@solid-primitives/static-store@0.0.4(solid-js@1.7.8):
      '@solid-primitives/utils': 6.2.0(solid-js@1.7.8)
      solid-js: 1.7.8
  /@solid-primitives/transition-group@1.0.2(solid-js@1.7.8):
    resolution: {integrity: sha512-+o3J7TnU0/Sok+LKA0z0wvhim88dpd2eFBk8/05adE6wVypVlME8sKqTMO+xRv8HoT4Kq3sczmvwV07FKg2n+g==}
      solid-js: 1.7.8
  /@solid-primitives/utils@6.2.0(solid-js@1.7.8):
    resolution: {integrity: sha512-T62WlLwKkbmicsw/xpwMQyv9MmZRSaVyutXfS5icc9v0cb8qGMUxRxr5LVvZHYQCZ9DEFboZB0r711xsbVBbeA==}
      solid-js: 1.7.8
  /@solidjs/router@0.8.2(solid-js@1.7.8):
      solid-js: 1.7.8
  /@tiptap/extension-code-block-lowlight@2.1.8(@tiptap/core@2.1.8)(@tiptap/extension-code-block@2.0.3)(@tiptap/pm@2.1.8):
      '@tiptap/extension-code-block': 2.0.3(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
  /@tiptap/extension-code-block@2.0.3(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-F4xMy18EwgpyY9f5Te7UuF7UwxRLptOtCq1p2c2DfxBvHDWhAjQqVqcW/sq/I/WuED7FwCnPLyyAasPiVPkLPw==}
      y-prosemirror: 1.0.20(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.0.20(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7)
  /@tiptap/extension-heading@2.0.3(@tiptap/core@2.1.8):
    resolution: {integrity: sha512-f0IEv5ms6aCzL80WeZ1qLCXTkRVwbpRr1qAETjg3gG4eoJN18+lZNOJYpyZy3P92C5KwF2T3Av00eFyVLIbb8Q==}
      '@tiptap/core': 2.1.8(@tiptap/pm@2.1.8)
      prosemirror-markdown: 1.11.0
      prosemirror-menu: 1.2.2
      prosemirror-model: 1.19.2
      prosemirror-tables: 1.3.3
      prosemirror-trailing-node: 2.0.4(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)
      prosemirror-transform: 1.7.3
      prosemirror-view: 1.31.4
    transitivePeerDependencies:
      - supports-color
    dev: false

  /@tiptap/starter-kit@2.0.3(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-t4WG4w93zTpL2VxhVyJJvl3kdLF001ZrhpOuEiZqEMBMUMbM56Uiigv1CnUQpTFrjDAh3IM8hkqzAh20TYw2iQ==}
    dependencies:
      '@tiptap/core': 2.1.8(@tiptap/pm@2.1.8)
      '@tiptap/extension-blockquote': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-bold': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-bullet-list': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-code': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-code-block': 2.0.3(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/extension-document': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-dropcursor': 2.1.8(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/extension-gapcursor': 2.1.8(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/extension-hard-break': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-heading': 2.0.3(@tiptap/core@2.1.8)
      '@tiptap/extension-history': 2.1.8(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/extension-horizontal-rule': 2.1.8(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/extension-italic': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-list-item': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-ordered-list': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-paragraph': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-strike': 2.1.8(@tiptap/core@2.1.8)
      '@tiptap/extension-text': 2.1.8(@tiptap/core@2.1.8)
  /@types/aws-lambda@8.10.119:
    resolution: {integrity: sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw==}
  /@types/babel__core@7.20.1:
    resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
      '@babel/parser': 7.22.16
      '@babel/types': 7.22.15
      '@types/babel__generator': 7.6.4
      '@types/babel__template': 7.4.1
      '@types/babel__traverse': 7.20.1
  /@types/babel__generator@7.6.4:
    resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
      '@babel/types': 7.22.15
  /@types/babel__template@7.4.1:
    resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
      '@babel/parser': 7.22.5
      '@babel/types': 7.22.15
  /@types/babel__traverse@7.20.1:
    resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==}
      '@babel/types': 7.22.15
  /@types/debug@4.1.8:
    resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==}
      '@types/ms': 0.7.31
  /@types/dom-view-transitions@1.0.1:
    resolution: {integrity: sha512-A9S1ijj/4MX06I1W/6on8lhaYyq1Ir7gaOvfllW1o4RzVWW88HAeqX0pUx9VgOLnNpdiGeUW2CTkg18p5LWIrA==}
      '@types/trusted-types': 2.0.3
  /@types/estree@1.0.1:
    resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
  /@types/hast@2.3.4:
    resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==}
      '@types/unist': 2.0.6
  /@types/json-schema@7.0.12:
    resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
  /@types/jsonwebtoken@9.0.2:
    resolution: {integrity: sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==}
  /@types/mdast@3.0.11:
    resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==}
      '@types/unist': 2.0.6
  /@types/mdast@4.0.0:
    resolution: {integrity: sha512-YLeG8CujC9adtj/kuDzq1N4tCDYKoZ5l/bnjq8d74+t/3q/tHquJOJKUQXJrLCflOHpKjXgcI/a929gpmLOEng==}
  /@types/ms@0.7.31:
    resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
  /@types/nlcst@1.0.0:
    resolution: {integrity: sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==}
      '@types/unist': 3.0.0
  /@types/node-fetch@2.6.4:
    resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
      form-data: 3.0.1
  /@types/node@18.17.5:
    resolution: {integrity: sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==}
    dev: true
  /@types/normalize-package-data@2.4.1:
    resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
  /@types/object.omit@3.0.0:
    resolution: {integrity: sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==}
  /@types/prop-types@15.7.5:
    resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
      '@types/prop-types': 15.7.5
      '@types/scheduler': 0.16.3
  /@types/sax@1.2.4:
    resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==}
  /@types/scheduler@0.16.3:
    resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
  /@types/semver@7.5.0:
    resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
  /@types/trusted-types@2.0.3:
    resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==}
  /@types/unist@2.0.6:
    resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
  /@types/webidl-conversions@7.0.0:
    resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==}
      '@types/webidl-conversions': 7.0.0
  /@types/yargs-parser@21.0.0:
    resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
  /@typescript-eslint/eslint-plugin@3.10.1(@typescript-eslint/parser@3.10.1)(eslint@8.45.0)(typescript@5.1.6):
      '@typescript-eslint/experimental-utils': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      tsutils: 3.21.0(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/eslint-plugin@6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.45.0)(typescript@5.1.6):
      '@eslint-community/regexpp': 4.6.1
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      '@typescript-eslint/type-utils': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      '@typescript-eslint/utils': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      ts-api-utils: 1.0.1(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/experimental-utils@3.10.1(eslint@8.45.0)(typescript@5.1.6):
      '@types/json-schema': 7.0.12
      '@typescript-eslint/typescript-estree': 3.10.1(typescript@5.1.6)
  /@typescript-eslint/parser@3.10.1(eslint@8.45.0)(typescript@5.1.6):
      '@typescript-eslint/experimental-utils': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      '@typescript-eslint/typescript-estree': 3.10.1(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/parser@6.2.0(eslint@8.45.0)(typescript@5.1.6):
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/scope-manager@5.59.11:
    resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==}
      '@typescript-eslint/types': 5.59.11
      '@typescript-eslint/visitor-keys': 5.59.11
  /@typescript-eslint/type-utils@6.2.0(eslint@8.45.0)(typescript@5.1.6):
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6)
      '@typescript-eslint/utils': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      ts-api-utils: 1.0.1(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/types@5.59.11:
    resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==}
  /@typescript-eslint/typescript-estree@3.10.1(typescript@5.1.6):
      tsutils: 3.21.0(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/typescript-estree@5.59.11(typescript@5.1.6):
    resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==}
      '@typescript-eslint/types': 5.59.11
      '@typescript-eslint/visitor-keys': 5.59.11
      tsutils: 3.21.0(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/typescript-estree@6.2.0(typescript@5.1.6):
      ts-api-utils: 1.0.1(typescript@5.1.6)
      typescript: 5.1.6
  /@typescript-eslint/utils@5.59.11(eslint@8.45.0)(typescript@5.1.6):
    resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==}
      '@types/json-schema': 7.0.12
      '@types/semver': 7.5.0
      '@typescript-eslint/scope-manager': 5.59.11
      '@typescript-eslint/types': 5.59.11
      '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.6)
  /@typescript-eslint/utils@6.2.0(eslint@8.45.0)(typescript@5.1.6):
      '@types/json-schema': 7.0.12
      '@types/semver': 7.5.0
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.1.6)
  /@typescript-eslint/visitor-keys@5.59.11:
    resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==}
      '@typescript-eslint/types': 5.59.11
      eslint-visitor-keys: 3.4.1
      eslint-visitor-keys: 3.4.1
  /@unocss/astro@0.55.7(vite@4.4.7):
    resolution: {integrity: sha512-mw8r14ArxUQBVCCisAJlF/WsZb650iBsduD/lXMk56N/nQ3MMArCcn62kcAxgZSb5tfIOQGQu/tbR8hEcD8y2g==}
    peerDependencies:
      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0
    peerDependenciesMeta:
      vite:
        optional: true
    dependencies:
      '@unocss/core': 0.55.7
      '@unocss/reset': 0.55.7
      '@unocss/vite': 0.55.7(vite@4.4.7)
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
    transitivePeerDependencies:
      - rollup
    dev: true
      vite: 4.4.9(sass@1.64.1)
    dev: false
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      magic-string: 0.30.3
      unconfig: 0.3.10
  /@unocss/postcss@0.55.7(postcss@8.4.29):
      magic-string: 0.30.3
      postcss: 8.4.29
      '@iconify/utils': 2.1.9
  /@unocss/vite@0.55.7(vite@4.4.7):
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      magic-string: 0.30.3
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
    dev: true
  /@unocss/vite@0.55.7(vite@4.4.9):
    resolution: {integrity: sha512-xmdyDnt9Ag4o7DGl22/P6MaB+HSjWOQw9qYYzIefSv3SVUvn3cEhIX/PCWqFp8Kts2HyvAoJLbZmygSf1XdZNQ==}
      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0
    dependencies:
      '@ampproject/remapping': 2.2.1
      '@rollup/pluginutils': 5.0.4(rollup@3.26.2)
      '@unocss/config': 0.55.7
      '@unocss/core': 0.55.7
      '@unocss/inspector': 0.55.7
      '@unocss/scope': 0.55.7
      '@unocss/transformer-directives': 0.55.7
      chokidar: 3.5.3
      fast-glob: 3.3.1
      magic-string: 0.30.3
      vite: 4.4.9(sass@1.64.1)
    transitivePeerDependencies:
      - rollup
    dev: false

  /@vrite/tiptap-solid@1.0.0(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)(solid-js@1.7.8):
    resolution: {integrity: sha512-eSv3kr8VAjyZ8aVEfhzIGe/LLDAcdBS0GEcWr+Eaab3tM6N11PIhI/1vlufU02uAF0JFY4yx/NA1jvGLU8jEWw==}
    peerDependencies:
      '@tiptap/core': 2.1.8
      '@tiptap/pm': 2.1.8
      solid-js: ^1.7.11
      solid-js: 1.7.8
  /@vscode/emmet-helper@2.8.9:
    resolution: {integrity: sha512-ygpVStaePHt9aI9zk4NNJWI/NsRaeDSW1vQsZVmtpVRVCOdwYlsc3BfB/eppUu1OucT0x3OHDAzKcxnitjcSXQ==}
      emmet: 2.4.4
      vscode-languageserver-textdocument: 1.0.8
      vscode-languageserver-types: 3.17.3
  /@vscode/l10n@0.0.14:
    resolution: {integrity: sha512-/yrv59IEnmh655z1oeDnGcvMYwnEzNzHLgeYcQCkhYX0xBvYWrAuefoiLcPBUkMpJsb46bqQ6Yv4pwTTQ4d3Qg==}
    dev: true
  /ansi-sequence-parser@1.1.0:
    resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==}
  /array-includes@3.1.6:
    resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
  /array.prototype.flat@1.3.1:
    resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
  /array.prototype.flatmap@1.3.1:
    resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
      zod: 3.22.2
      '@babel/core': 7.22.15
      '@babel/generator': 7.22.15
      '@babel/parser': 7.22.16
      '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.15)
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
      '@types/babel__core': 7.20.1
      '@types/dom-view-transitions': 1.0.1
      '@types/yargs-parser': 21.0.0
      ci-info: 3.8.0
      es-module-lexer: 1.3.0
      magic-string: 0.30.3
      vite: 4.4.9(sass@1.64.1)
      zod: 3.22.2
    transitivePeerDependencies:
      - '@types/node'
      - less
      - lightningcss
      - sass
      - stylus
      - sugarss
      - supports-color
      - terser
    dev: false

  /astro@2.9.2:
    resolution: {integrity: sha512-ejdGM9SbK58AvJS8lbkre/d5CoW8JftqaRxc9rGqzpiZQ8iU8gfdFmi3Hzkcvd2HrGvYYsJku88pM6tkBPniJQ==}
    engines: {node: '>=16.12.0', npm: '>=6.14.0'}
    hasBin: true
    peerDependencies:
      sharp: '>=0.31.0'
    peerDependenciesMeta:
      sharp:
        optional: true
    dependencies:
      '@astrojs/compiler': 1.6.2
      '@astrojs/internal-helpers': 0.1.1
      '@astrojs/language-server': 1.0.8
      '@astrojs/markdown-remark': 2.2.1(astro@2.9.2)
      '@astrojs/telemetry': 2.1.1
      '@astrojs/webapi': 2.2.0
      '@babel/core': 7.22.5
      '@babel/generator': 7.22.5
      '@babel/parser': 7.22.5
      '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5)
      '@babel/traverse': 7.22.5
      '@babel/types': 7.22.5
      '@types/babel__core': 7.20.1
      '@types/dom-view-transitions': 1.0.1
      '@types/yargs-parser': 21.0.0
      acorn: 8.10.0
      boxen: 6.2.1
      chokidar: 3.5.3
      ci-info: 3.8.0
      common-ancestor-path: 1.0.1
      cookie: 0.5.0
      debug: 4.3.4
      deepmerge-ts: 4.3.0
      devalue: 4.3.2
      diff: 5.1.0
      es-module-lexer: 1.3.0
      esbuild: 0.17.19
      estree-walker: 3.0.0
      execa: 6.1.0
      fast-glob: 3.3.1
      github-slugger: 2.0.0
      gray-matter: 4.0.3
      html-escaper: 3.0.3
      js-yaml: 4.1.0
      kleur: 4.1.5
      magic-string: 0.27.0
      mime: 3.0.0
      network-information-types: 0.1.1(typescript@5.2.2)
      ora: 6.3.1
      p-limit: 4.0.0
      path-to-regexp: 6.2.1
      preferred-pm: 3.0.3
      prompts: 2.4.2
      rehype: 12.0.1
      semver: 7.5.4
      server-destroy: 1.0.1
      shiki: 0.14.4
      string-width: 5.1.2
      strip-ansi: 7.1.0
      tsconfig-resolver: 3.0.1
      typescript: 5.2.2
      unist-util-visit: 4.1.2
      vfile: 5.3.7
      vite: 4.4.9(sass@1.64.1)
      vitefu: 0.2.4(vite@4.4.9)
      which-pm: 2.0.0
      yargs-parser: 21.1.1
    dev: true
      '@astrojs/compiler': 2.1.0
      '@babel/core': 7.22.15
      '@babel/generator': 7.22.15
      '@babel/parser': 7.22.16
      '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.15)
      '@babel/traverse': 7.22.15
      '@babel/types': 7.22.15
      '@types/babel__core': 7.20.1
      ci-info: 3.8.0
      es-module-lexer: 1.3.0
      esbuild: 0.19.3
      magic-string: 0.30.3
      resolve: 1.22.4
      undici: 5.23.0
      vite: 4.4.9(sass@1.64.1)
      follow-redirects: 1.15.2
      follow-redirects: 1.15.2
  /babel-merge@3.0.0(@babel/core@7.22.15):
    resolution: {integrity: sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==}
    peerDependencies:
      '@babel/core': ^7.0.0
    dependencies:
      '@babel/core': 7.22.15
      deepmerge: 2.2.1
      object.omit: 3.0.0
    dev: false

  /babel-plugin-jsx-dom-expressions@0.36.10(@babel/core@7.22.15):
    resolution: {integrity: sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==}
    peerDependencies:
      '@babel/core': ^7.20.12
    dependencies:
      '@babel/core': 7.22.15
      '@babel/helper-module-imports': 7.18.6
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.15)
      '@babel/types': 7.22.15
      html-entities: 2.3.3
      validate-html-nesting: 1.2.2
    dev: false

  /babel-plugin-jsx-dom-expressions@0.36.10(@babel/core@7.22.5):
    resolution: {integrity: sha512-QA2k/14WGw+RgcGGnEuLWwnu4em6CGhjeXtjvgOYyFHYS2a+CzPeaVQHDOlfuiBcjq/3hWMspHMIMnPEOIzdBg==}
      '@babel/core': 7.22.5
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5)
      '@babel/types': 7.22.15
  /babel-preset-solid@1.7.4(@babel/core@7.22.5):
    resolution: {integrity: sha512-0mbHNYkbOVYhH6L95VlHVkBEVQjOXSzUqLDiFxUcsg/tU4yTM/qx7FI8C+kmos9LHckQBSm3wtwoe1BZLNJR1w==}
    peerDependencies:
      '@babel/core': ^7.0.0
    dependencies:
      '@babel/core': 7.22.5
      babel-plugin-jsx-dom-expressions: 0.36.10(@babel/core@7.22.5)

  /babel-preset-solid@1.7.7(@babel/core@7.22.15):
    resolution: {integrity: sha512-tdxVzx3kgcIjNXAOmGRbzIhFBPeJjSakiN9yM+IYdL/+LtXNnbGqb0Va5tJb8Sjbk+QVEriovCyuzB5T7jeTvg==}
      '@babel/core': 7.22.15
      babel-plugin-jsx-dom-expressions: 0.36.10(@babel/core@7.22.15)
    dev: false
  /browserslist@4.21.10:
    resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==}
      caniuse-lite: 1.0.30001528
      electron-to-chromium: 1.4.510
      update-browserslist-db: 1.0.11(browserslist@4.21.10)
  /bson@5.4.0:
    resolution: {integrity: sha512-WRZ5SQI5GfUuKnPTNmAYPiKIof3ORXAF4IRU5UcgmivNIon01rWQlw5RUH954dpu8yGL8T59YShVddIPaU/gFA==}
    dev: true
  /busboy@1.6.0:
    resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
    engines: {node: '>=10.16.0'}
    dependencies:
      streamsearch: 1.1.0

  /caniuse-lite@1.0.30001528:
    resolution: {integrity: sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==}
      fsevents: 2.3.2
  /ci-info@3.8.0:
    resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
  /cli-spinners@2.9.0:
    resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==}
    dev: true
  /convert-source-map@1.9.0:
    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
      node-fetch: 2.6.12
      '@babel/runtime': 7.22.5
  /deepmerge-ts@4.3.0:
    resolution: {integrity: sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==}
    engines: {node: '>=12.4.0'}
    dev: true

  /deepmerge@2.2.1:
    resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==}
    engines: {node: '>=0.10.0'}
    dev: false

      execa: 7.1.1
  /define-properties@1.2.0:
    resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
  /destr@2.0.0:
    resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==}
    dev: false

      dotenv: 16.1.4
  /dotenv@16.1.4:
    resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==}
  /electron-to-chromium@1.4.510:
    resolution: {integrity: sha512-xPfLIPFcN/WLXBpQ/K4UgE98oUBO5Tia6BD4rkSR0wE7ep/PwBVlgvPJQrIBpmJGVAmUzwPKuDbVt9XV6+uC2g==}
  /emmet@2.4.4:
    resolution: {integrity: sha512-v8Mwpjym55CS3EjJgiCLWUB3J2HSR93jhzXW325720u8KvYxdI2voYLstW3pHBxFz54H6jFjayR9G4LfTG0q+g==}
      dotenv: 16.1.4
  /es-abstract@1.21.2:
    resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
      function.prototype.name: 1.1.5
      has: 1.0.3
      is-typed-array: 1.1.10
      regexp.prototype.flags: 1.5.0
      string.prototype.trim: 1.2.7
      string.prototype.trimend: 1.0.6
      string.prototype.trimstart: 1.0.6
      which-typed-array: 1.1.9
  /es-module-lexer@1.3.0:
    resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==}
      has: 1.0.3
      has: 1.0.3
  /esbuild@0.19.3:
    resolution: {integrity: sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==}
      '@esbuild/android-arm': 0.19.3
      '@esbuild/android-arm64': 0.19.3
      '@esbuild/android-x64': 0.19.3
      '@esbuild/darwin-arm64': 0.19.3
      '@esbuild/darwin-x64': 0.19.3
      '@esbuild/freebsd-arm64': 0.19.3
      '@esbuild/freebsd-x64': 0.19.3
      '@esbuild/linux-arm': 0.19.3
      '@esbuild/linux-arm64': 0.19.3
      '@esbuild/linux-ia32': 0.19.3
      '@esbuild/linux-loong64': 0.19.3
      '@esbuild/linux-mips64el': 0.19.3
      '@esbuild/linux-ppc64': 0.19.3
      '@esbuild/linux-riscv64': 0.19.3
      '@esbuild/linux-s390x': 0.19.3
      '@esbuild/linux-x64': 0.19.3
      '@esbuild/netbsd-x64': 0.19.3
      '@esbuild/openbsd-x64': 0.19.3
      '@esbuild/sunos-x64': 0.19.3
      '@esbuild/win32-arm64': 0.19.3
      '@esbuild/win32-ia32': 0.19.3
      '@esbuild/win32-x64': 0.19.3
  /eslint-config-xtrict@3.0.1(eslint@8.45.0)(prettier@3.0.2)(typescript@5.1.6):
      '@typescript-eslint/eslint-plugin': 3.10.1(@typescript-eslint/parser@3.10.1)(eslint@8.45.0)(typescript@5.1.6)
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      typescript: 5.1.6
  /eslint-import-resolver-node@0.3.7:
    resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
      is-core-module: 2.12.1
      resolve: 1.22.2
  /eslint-module-utils@2.8.0(@typescript-eslint/parser@3.10.1)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0):
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      eslint-import-resolver-node: 0.3.7
  /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0):
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      eslint-import-resolver-node: 0.3.7
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.1.6)
      array-includes: 3.1.6
      array.prototype.flat: 1.3.1
      array.prototype.flatmap: 1.3.1
      eslint-import-resolver-node: 0.3.7
      eslint-module-utils: 2.8.0(@typescript-eslint/parser@3.10.1)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0)
      has: 1.0.3
      is-core-module: 2.12.1
      object.values: 1.1.6
      resolve: 1.22.2
      semver: 6.3.0
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.1.6)
      array-includes: 3.1.6
      array.prototype.flat: 1.3.1
      array.prototype.flatmap: 1.3.1
      eslint-import-resolver-node: 0.3.7
      eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0)
      has: 1.0.3
      is-core-module: 2.12.1
      object.values: 1.1.6
      resolve: 1.22.2
      semver: 6.3.0
  /eslint-plugin-solid@0.12.1(eslint@8.45.0)(typescript@5.1.6):
      '@typescript-eslint/utils': 5.59.11(eslint@8.45.0)(typescript@5.1.6)
      jsx-ast-utils: 3.3.3
  /eslint-scope@7.2.0:
    resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==}
      '@babel/core': 7.22.5
      '@babel/eslint-parser': 7.22.5(@babel/core@7.22.5)(eslint@8.45.0)
  /eslint-visitor-keys@3.4.1:
    resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==}
      '@eslint-community/regexpp': 4.6.1
      '@eslint/eslintrc': 2.1.0
      '@humanwhocodes/config-array': 0.11.10
      eslint-scope: 7.2.0
      eslint-visitor-keys: 3.4.1
      globals: 13.20.0
      eslint-visitor-keys: 3.4.1
      '@types/estree': 1.0.1
  /execa@7.1.1:
    resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==}
  /fast-content-type-parse@1.0.0:
    resolution: {integrity: sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==}
  /fast-json-stringify@5.7.0:
    resolution: {integrity: sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==}
  /fast-jwt@3.1.1:
    resolution: {integrity: sha512-c6gqmiMU9kUIMs0XcsnnpBMA4A+zi/XULA47r6hYoLR7s1teJ+LwviwZdttCeTZ+F5ZuHlRigNe98C4qN6h4pw==}
    engines: {node: '>=14 <22'}
  /fast-redact@3.2.0:
    resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==}
  /fastify-plugin@4.5.0:
    resolution: {integrity: sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==}
      '@fastify/error': 3.2.1
      fast-content-type-parse: 1.0.0
      fast-json-stringify: 5.7.0
      light-my-request: 5.10.0
      pino: 8.14.1
      tiny-lru: 11.0.1
      flat-cache: 3.0.4
  /flat-cache@3.0.4:
    resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
    engines: {node: ^10.12.0 || >=12.0.0}
      flatted: 3.2.7
  /flatted@3.2.7:
    resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
  /follow-redirects@1.15.2:
    resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
      signal-exit: 4.0.2
  /fsevents@2.3.2:
    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
  /function.prototype.name@1.1.5:
    resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
      has: 1.0.3
      jackspeak: 2.2.2
      minipass: 6.0.2
  /globals@13.20.0:
    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
      define-properties: 1.2.0
  /globby@13.1.4:
    resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==}
  /graphql-request@5.2.0(graphql@16.7.1):
      '@graphql-typed-document-node/core': 3.2.0(graphql@16.7.1)
      graphql: 16.7.1
  /graphql@16.7.1:
    resolution: {integrity: sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==}
  /h3@1.7.1:
    resolution: {integrity: sha512-A9V2NEDNHet7v1gCg7CMwerSigLi0SRbhTy7C3lGb0N4YKIpPmLDjedTUopqp4dnn7COHfqUjjaz3zbtz4QduA==}
      destr: 2.0.0
      iron-webcrypto: 0.7.1
      radix3: 1.0.1
      ufo: 1.1.2
  /has@1.0.3:
    resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
    dependencies:
      function-bind: 1.1.1
      '@types/hast': 2.3.4
      '@types/unist': 2.0.6
      property-information: 6.2.0
      '@types/hast': 2.3.4
      '@types/hast': 2.3.4
      '@types/hast': 2.3.4
      '@types/unist': 2.0.6
      property-information: 6.2.0
  /hast-util-to-parse5@7.1.0:
    resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
      '@types/hast': 2.3.4
      property-information: 6.2.0
      web-namespaces: 2.0.1
      '@types/hast': 2.3.4
      property-information: 6.2.0
  /headers-polyfill@3.1.2:
    resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==}
  /immutable@4.3.0:
    resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==}
      has: 1.0.3
  /iron-webcrypto@0.7.1:
    resolution: {integrity: sha512-K/UmlEhPCPXEHV5hAtH5C0tI5JnFuOrv4yO/j7ODPl3HaiiHBLbOLTde+ieUaAyfCATe4LoAnclyF+hmSCOVmQ==}
      is-typed-array: 1.1.10
  /is-core-module@2.12.1:
    resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
    dependencies:
      has: 1.0.3
    dev: true

      has: 1.0.3
      '@types/estree': 1.0.1
  /is-typed-array@1.1.10:
    resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
      available-typed-arrays: 1.0.5
      call-bind: 1.0.2
      for-each: 0.3.3
      gopd: 1.0.1
      has-tostringtag: 1.0.0
  /is-wsl@3.0.0:
    resolution: {integrity: sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==}
      is-docker: 3.0.0
      node-fetch: 2.6.12
      whatwg-fetch: 3.6.17
      node-fetch: 2.6.12
  /jackspeak@2.2.2:
    resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==}
  /jiti@1.18.2:
    resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
    hasBin: true
    dev: true

  /jiti@1.19.3:
    resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==}
  /joi@17.9.2:
    resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==}
  /jsonwebtoken@9.0.1:
    resolution: {integrity: sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==}
      lodash: 4.17.21
  /jssha@3.3.0:
    resolution: {integrity: sha512-w9OtT4ALL+fbbwG3gw7erAO0jvS5nfvrukGPMWIAoea359B26ALXGpzy4YJSp9yGnpUvuvOw1nSjSoHDfWSr1w==}
  /jsx-ast-utils@3.3.3:
    resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
      array-includes: 3.1.6
  /lib0@0.2.78:
    resolution: {integrity: sha512-SV2nU43/6eaYnGH3l0lg2wg1ziB/TH3sAd2E8quXPGwrqo+aX98SNT2ZKucpUr5B8A52jD7ZMjAl+r87Fa/bLQ==}
  /light-my-request@5.10.0:
    resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==}
  /lru-cache@10.0.0:
    resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==}
  /lru-cache@9.1.2:
    resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==}
    engines: {node: 14 || >=16.14}
    dev: false

  /magic-string@0.30.1:
    resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==}
    engines: {node: '>=12'}
    dependencies:
      '@jridgewell/sourcemap-codec': 1.4.15
    dev: true

  /magic-string@0.30.3:
    resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==}
  /markdown-it@13.0.1:
    resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==}
      '@types/mdast': 3.0.11
      '@types/unist': 2.0.6
      '@types/mdast': 4.0.0
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/unist': 2.0.6
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/hast': 2.3.4
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/unist': 2.0.6
      '@types/mdast': 3.0.11
      '@types/debug': 4.1.8
  /minipass@6.0.2:
    resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==}
  /mkdist@1.2.0(typescript@5.2.2):
    resolution: {integrity: sha512-UTqu/bXmIk/+VKNVgufAeMyjUcNy1dn9Bl7wL1zZlCKVrpDgj/VllmZBeh3ZCC/2HWqUrt6frNFTKt9TRZbNvQ==}
      sass: ^1.60.0
      typescript: '>=4.9.5'
      esbuild: 0.17.19
      globby: 13.1.4
      jiti: 1.19.3
  /mlly@1.3.0:
    resolution: {integrity: sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==}
    dependencies:
      acorn: 8.10.0
      pathe: 1.1.1
      pkg-types: 1.0.3
      ufo: 1.3.0
    dev: true

      ufo: 1.3.0
  /monaco-editor@0.40.0:
    resolution: {integrity: sha512-1wymccLEuFSMBvCk/jT1YDW/GuxMLYwnFwF9CDyYCxoTw2Pt379J3FUhwy9c43j51JdcxVPjwk0jm0EVDsBS2g==}
      bson: 5.4.0
      sax: 1.2.4
      '@types/nlcst': 1.0.0
  /node-fetch@2.6.12:
    resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==}
  /node-mocks-http@1.12.2:
    resolution: {integrity: sha512-xhWwC0dh35R9rf0j3bRZXuISXdHxxtMx0ywZQBwjrg3yl7KpRETzogfeCamUIjltpn0Fxvs/ZhGJul1vPLrdJQ==}
    engines: {node: '>=0.6'}
      resolve: 1.22.4
      semver: 5.7.1
      define-properties: 1.2.0
  /object.values@1.1.6:
    resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
      '@octokit/app': 14.0.0
      '@octokit/core': 5.0.0
      '@octokit/plugin-paginate-rest': 8.0.0(@octokit/core@5.0.0)
      '@octokit/plugin-rest-endpoint-methods': 9.0.0(@octokit/core@5.0.0)
      '@octokit/plugin-retry': 6.0.0(@octokit/core@5.0.0)
      '@octokit/plugin-throttling': 7.0.0(@octokit/core@5.0.0)
      '@octokit/request-error': 5.0.0
      ufo: 1.3.0
  /on-exit-leak-free@2.1.0:
    resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==}
      undici: 5.22.1
      validator: 13.9.0
      '@types/node': 18.17.5
      '@types/node-fetch': 2.6.4
      node-fetch: 2.6.12
      cli-spinners: 2.9.0
      cli-spinners: 2.9.0
      cli-spinners: 2.9.0
      jssha: 3.3.0
      lru-cache: 9.1.2
      minipass: 6.0.2
  /pino-abstract-transport@1.0.0:
    resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==}
      readable-stream: 4.4.0
  /pino-std-serializers@6.2.1:
    resolution: {integrity: sha512-wHuWB+CvSVb2XqXM0W/WOYUkVSPbiJb9S5fNB7TBhd8s892Xq910bRxwHtC4l71hgztObTjXL6ZheZXFjhDrDQ==}
  /pino@8.14.1:
    resolution: {integrity: sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==}
      fast-redact: 3.2.0
      on-exit-leak-free: 2.1.0
      pino-abstract-transport: 1.0.0
      pino-std-serializers: 6.2.1
      sonic-boom: 3.3.0
      thread-stream: 2.3.0
      resolve: 1.22.4
  /postcss@8.4.26:
    resolution: {integrity: sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==}
    engines: {node: ^10 || ^12 || >=14}
    dependencies:
      nanoid: 3.3.6
      picocolors: 1.0.0
      source-map-js: 1.0.2
    dev: true

  /postcss@8.4.29:
    resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==}
  /preferred-pm@3.0.3:
    resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==}
    engines: {node: '>=10'}
    dependencies:
      find-up: 5.0.0
      find-yarn-workspace-root2: 1.2.16
      path-exists: 4.0.0
      which-pm: 2.0.0
    dev: true

      '@astrojs/compiler': 1.6.2
      sass-formatter: 0.7.6
      sass-formatter: 0.7.6
  /pretty-bytes@6.1.0:
    resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==}
  /property-information@6.2.0:
    resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
      prosemirror-transform: 1.7.3
      prosemirror-model: 1.19.2
      prosemirror-transform: 1.7.3
      prosemirror-transform: 1.7.3
      prosemirror-view: 1.31.4
      prosemirror-model: 1.19.2
      prosemirror-view: 1.31.4
      prosemirror-transform: 1.7.3
      prosemirror-view: 1.31.4
      prosemirror-transform: 1.7.3
  /prosemirror-markdown@1.11.0:
    resolution: {integrity: sha512-yP9mZqPRstjZhhf3yykCQNE3AijxARrHe4e7esV9A+gp4cnGOH4QvrKYPpXLHspNWyvJJ+0URH+iIvV5qP1I2Q==}
      markdown-it: 13.0.1
      prosemirror-model: 1.19.2
  /prosemirror-menu@1.2.2:
    resolution: {integrity: sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw==}
  /prosemirror-model@1.19.2:
    resolution: {integrity: sha512-RXl0Waiss4YtJAUY3NzKH0xkJmsZupCIccqcIFoLTIKFlKNbIvFDRl27/kQy1FP8iUAxrjRRfIVvOebnnXJgqQ==}
      prosemirror-model: 1.19.2
      prosemirror-model: 1.19.2
      prosemirror-transform: 1.7.3
      prosemirror-model: 1.19.2
      prosemirror-transform: 1.7.3
      prosemirror-view: 1.31.4
  /prosemirror-tables@1.3.3:
    resolution: {integrity: sha512-t10hbu4sNDInic3AQYd8ouPN457zVJIhVDqSdqgsVXNoa1watYXBxqNSVrNQoGOFG4Ivreyp3hQE3KG1f9bSpw==}
      prosemirror-model: 1.19.2
      prosemirror-transform: 1.7.3
      prosemirror-view: 1.31.4
  /prosemirror-trailing-node@2.0.4(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4):
    resolution: {integrity: sha512-0Yl9w7IdHkaCdqR+NE3FOucePME4OmiGcybnF1iasarEILP5U8+4xTnl53yafULjmwcg1SrSG65Hg7Zk2H2v3g==}
      prosemirror-view: ^1.30.2
      '@babel/runtime': 7.22.5
      '@remirror/core-constants': 2.0.1
      '@remirror/core-helpers': 2.0.3
      prosemirror-model: 1.19.2
      prosemirror-view: 1.31.4
    transitivePeerDependencies:
      - supports-color
  /prosemirror-transform@1.7.3:
    resolution: {integrity: sha512-qDapyx5lqYfxVeUWEw0xTGgeP2S8346QtE7DxkalsXlX89lpzkY6GZfulgfHyk1n4tf74sZ7CcXgcaCcGjsUtA==}
      prosemirror-model: 1.19.2
  /prosemirror-view@1.31.4:
    resolution: {integrity: sha512-nJzH2LpYbonSTYFqQ1BUdEhbd1WPN/rp/K9T9qxBEYpgg3jK3BvEUCR45Ymc9IHpO0m3nBJwPm19RBxZdoBVuw==}
      prosemirror-model: 1.19.2
      prosemirror-transform: 1.7.3
  /radix3@1.0.1:
    resolution: {integrity: sha512-y+AcwZ3HcUIGc9zGsNVf5+BY/LxL+z+4h4J3/pp8jxSmy1STaCocPS3qrj4tA5ehUSzqtqK+0Aygvz/r/8vy4g==}
      '@types/normalize-package-data': 2.4.1
  /readable-stream@4.4.0:
    resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==}
      resolve: 1.22.4
  /regenerator-runtime@0.13.11:
    resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
  /regexp.prototype.flags@1.5.0:
    resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
      define-properties: 1.2.0
      functions-have-names: 1.2.3
  /rehype-parse@8.0.4:
    resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==}
      '@types/hast': 2.3.4
      '@types/hast': 2.3.4
      '@types/hast': 2.3.4
      '@types/hast': 2.3.4
      rehype-parse: 8.0.4
      '@types/mdast': 3.0.11
      '@types/mdast': 3.0.11
      '@types/hast': 2.3.4
      '@types/mdast': 3.0.11
  /resolve@1.22.2:
    resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
    hasBin: true
      is-core-module: 2.12.1
      path-parse: 1.0.7
      supports-preserve-symlinks-flag: 1.0.0
    dev: true
  /resolve@1.22.4:
    resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==}
      '@types/nlcst': 1.0.0
      '@types/nlcst': 1.0.0
      '@types/nlcst': 1.0.0
      '@types/nlcst': 1.0.0
  /rollup-plugin-dts@5.3.0(rollup@3.26.2)(typescript@5.2.2):
    resolution: {integrity: sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==}
    engines: {node: '>=v14'}
      rollup: ^3.0.0
      magic-string: 0.30.3
      rollup: 3.26.2
  /rollup@3.26.2:
    resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==}
      fsevents: 2.3.2

  /rollup@3.29.0:
    resolution: {integrity: sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==}
    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
    hasBin: true
    optionalDependencies:
      fsevents: 2.3.2
    requiresBuild: true
  /sass-formatter@0.7.6:
    resolution: {integrity: sha512-hXdxU6PCkiV3XAiSnX+XLqz2ohHoEnVUlrd8LEVMAI80uB1+OTScIkH9n6qQwImZpTye1r1WG1rbGUteHNhoHg==}
      immutable: 4.3.0
  /sax@1.2.4:
    resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
  /semver@5.7.1:
    resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
  /semver@6.3.0:
    resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
    hasBin: true
    dev: true

      ansi-sequence-parser: 1.1.0
  /signal-exit@4.0.2:
    resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==}
    engines: {node: '>=14'}
    dev: false

      joi: 17.9.2
      '@polka/url': 1.0.0-next.21
      '@types/sax': 1.2.4
      sax: 1.2.4
    dev: false

  /solid-js@1.7.8:
    resolution: {integrity: sha512-XHBWk1FvFd0JMKljko7FfhefJMTSgYEuVKcQ2a8hzRXfiuSJAGsrPPafqEo+f6l+e8Oe3cROSpIL6kbzjC1fjQ==}
    dependencies:
      csstype: 3.1.2
      seroval: 0.5.1
      '@babel/generator': 7.22.5
      '@babel/helper-module-imports': 7.22.5
      '@babel/types': 7.22.5
    dev: false

  /solid-refresh@0.5.3(solid-js@1.7.8):
    resolution: {integrity: sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==}
    peerDependencies:
      solid-js: ^1.3
    dependencies:
      '@babel/generator': 7.22.5
      '@babel/helper-module-imports': 7.22.5
      '@babel/types': 7.22.5
      solid-js: 1.7.8
    dev: true
  /sonic-boom@3.3.0:
    resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==}
    dev: true
      spdx-license-ids: 3.0.13
      spdx-license-ids: 3.0.13
  /spdx-license-ids@3.0.13:
    resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
  /streamsearch@1.1.0:
    resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
    engines: {node: '>=10.0.0'}

  /string.prototype.trim@1.2.7:
    resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
  /string.prototype.trimend@1.0.6:
    resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
  /string.prototype.trimstart@1.0.6:
    resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
      define-properties: 1.2.0
      es-abstract: 1.21.2
      '@pkgr/utils': 2.4.1
      tslib: 2.5.3
      resolve: 1.22.4
      '@jridgewell/source-map': 0.3.3
    dev: true
  /thread-stream@2.3.0:
    resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==}
  /tiny-lru@11.0.1:
    resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==}
      h3: 1.7.1
      node-mocks-http: 1.12.2
  /trpc-openapi@1.2.0(@trpc/server@10.35.0)(zod@3.22.2):
      h3: 1.7.1
      node-mocks-http: 1.12.2
      zod: 3.22.2
      zod-to-json-schema: 3.21.4(zod@3.22.2)
  /ts-api-utils@1.0.1(typescript@5.1.6):
    resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==}
      typescript: 5.1.6
  /tsconfck@2.1.2(typescript@5.1.6):
      typescript: 5.1.6
      '@types/resolve': 1.20.2
      resolve: 1.22.4
  /tslib@2.5.3:
    resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==}
  /tsutils@3.21.0(typescript@5.1.6):
      typescript: 5.1.6
      is-typed-array: 1.1.10
  /typescript@5.1.6:
    resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
    engines: {node: '>=14.17'}
    hasBin: true

  /ufo@1.1.2:
    resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==}
    dev: false

  /ufo@1.3.0:
    resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==}
      '@rollup/plugin-alias': 5.0.0(rollup@3.26.2)
      '@rollup/plugin-commonjs': 24.1.0(rollup@3.26.2)
      '@rollup/plugin-json': 6.0.0(rollup@3.26.2)
      '@rollup/plugin-node-resolve': 15.1.0(rollup@3.26.2)
      '@rollup/plugin-replace': 5.0.2(rollup@3.26.2)
      '@rollup/pluginutils': 5.0.2(rollup@3.26.2)
      globby: 13.1.4
      jiti: 1.18.2
      magic-string: 0.30.1
      mkdist: 1.2.0(typescript@5.2.2)
      mlly: 1.3.0
      pretty-bytes: 6.1.0
      rollup: 3.26.2
      rollup-plugin-dts: 5.3.0(rollup@3.26.2)(typescript@5.2.2)
      untyped: 1.3.2
  /unconfig@0.3.10:
    resolution: {integrity: sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==}
      jiti: 1.19.3
  /undici@5.22.1:
    resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==}
      busboy: 1.6.0
    dev: false
  /undici@5.23.0:
    resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==}
    engines: {node: '>=14.0'}
      busboy: 1.6.0
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/jsonwebtoken': 9.0.2
      jsonwebtoken: 9.0.1
  /unocss@0.55.7(postcss@8.4.29)(vite@4.4.7):
    resolution: {integrity: sha512-3W9P7vj2EhSk/4oPCHBS0VgrwSf5zZL6Az1/XARVOpBnRJtCM2szFInYxHkMgt9pkZTsW8SFCuk/g+QIJ6A8tg==}
    engines: {node: '>=14'}
    peerDependencies:
      '@unocss/webpack': 0.55.7
      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0
    peerDependenciesMeta:
      '@unocss/webpack':
        optional: true
      vite:
        optional: true
    dependencies:
      '@unocss/astro': 0.55.7(vite@4.4.7)
      '@unocss/cli': 0.55.7
      '@unocss/core': 0.55.7
      '@unocss/extractor-arbitrary-variants': 0.55.7
      '@unocss/postcss': 0.55.7(postcss@8.4.29)
      '@unocss/preset-attributify': 0.55.7
      '@unocss/preset-icons': 0.55.7
      '@unocss/preset-mini': 0.55.7
      '@unocss/preset-tagify': 0.55.7
      '@unocss/preset-typography': 0.55.7
      '@unocss/preset-uno': 0.55.7
      '@unocss/preset-web-fonts': 0.55.7
      '@unocss/preset-wind': 0.55.7
      '@unocss/reset': 0.55.7
      '@unocss/transformer-attributify-jsx': 0.55.7
      '@unocss/transformer-attributify-jsx-babel': 0.55.7
      '@unocss/transformer-compile-class': 0.55.7
      '@unocss/transformer-directives': 0.55.7
      '@unocss/transformer-variant-group': 0.55.7
      '@unocss/vite': 0.55.7(vite@4.4.7)
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
    transitivePeerDependencies:
      - postcss
      - rollup
      - supports-color
    dev: true

  /unocss@0.55.7(postcss@8.4.29)(vite@4.4.9):
      '@unocss/postcss': 0.55.7(postcss@8.4.29)
      vite: 4.4.9(sass@1.64.1)
    dev: false
  /untyped@1.3.2:
    resolution: {integrity: sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==}
      '@babel/core': 7.22.5
      '@babel/standalone': 7.22.5
      '@babel/types': 7.22.15
      jiti: 1.19.3
  /update-browserslist-db@1.0.11(browserslist@4.21.10):
    resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
      browserslist: 4.21.10
  /uuid@9.0.0:
    resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
  /validator@13.9.0:
    resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==}
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@types/unist': 2.0.6
      '@babel/core': 7.22.5
      '@babel/preset-typescript': 7.22.5(@babel/core@7.22.5)
      '@types/babel__core': 7.20.1
      babel-preset-solid: 1.7.4(@babel/core@7.22.5)
      vite: 4.4.9(sass@1.64.1)
    dev: false

  /vite-plugin-solid@2.7.0(solid-js@1.7.8)(vite@4.4.7):
    resolution: {integrity: sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==}
    peerDependencies:
      solid-js: ^1.7.2
      vite: ^3.0.0 || ^4.0.0
    dependencies:
      '@babel/core': 7.22.5
      '@babel/preset-typescript': 7.22.5(@babel/core@7.22.5)
      '@types/babel__core': 7.20.1
      babel-preset-solid: 1.7.4(@babel/core@7.22.5)
      merge-anything: 5.1.7
      solid-js: 1.7.8
      solid-refresh: 0.5.3(solid-js@1.7.8)
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      vitefu: 0.2.4(vite@4.4.7)
    transitivePeerDependencies:
      - supports-color
    dev: true
  /vite-tsconfig-paths@4.2.0(typescript@5.1.6)(vite@4.4.7):
      tsconfck: 2.1.2(typescript@5.1.6)
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /vite@4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2):
    resolution: {integrity: sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==}
      postcss: 8.4.26
      rollup: 3.26.2
      fsevents: 2.3.2
    dev: true

  /vite@4.4.9(sass@1.64.1):
    resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
    engines: {node: ^14.18.0 || >=16.0.0}
    hasBin: true
    peerDependencies:
      '@types/node': '>= 14'
      less: '*'
      lightningcss: ^1.21.0
      sass: '*'
      stylus: '*'
      sugarss: '*'
      terser: ^5.4.0
    peerDependenciesMeta:
      '@types/node':
        optional: true
      less:
        optional: true
      lightningcss:
        optional: true
      sass:
        optional: true
      stylus:
        optional: true
      sugarss:
        optional: true
      terser:
        optional: true
    dependencies:
      esbuild: 0.18.16
      postcss: 8.4.29
      rollup: 3.29.0
      sass: 1.64.1
    optionalDependencies:
      fsevents: 2.3.2

  /vitefu@0.2.4(vite@4.4.7):
    resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
    peerDependencies:
      vite: ^3.0.0 || ^4.0.0
    peerDependenciesMeta:
      vite:
        optional: true
    dependencies:
      vite: 4.4.7(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
    dev: true
      vite: 4.4.9(sass@1.64.1)
  /vscode-css-languageservice@6.2.6:
    resolution: {integrity: sha512-SA2WkeOecIpUiEbZnjOsP/fI5CRITZEiQGSHXKiDQDwLApfKcnLhZwMtOBbIifSzESVcQa7b/shX/nbnF4NoCg==}
      '@vscode/l10n': 0.0.14
      vscode-languageserver-textdocument: 1.0.8
      vscode-uri: 3.0.7
  /vscode-html-languageservice@5.0.6:
    resolution: {integrity: sha512-gCixNg6fjPO7+kwSMBAVXcwDRHdjz1WOyNfI0n5Wx0J7dfHG8ggb3zD1FI8E2daTZrwS1cooOiSoc1Xxph4qRQ==}
      '@vscode/l10n': 0.0.14
      vscode-languageserver-textdocument: 1.0.8
      vscode-languageserver-types: 3.17.3
      vscode-uri: 3.0.7
  /vscode-languageserver-textdocument@1.0.8:
    resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==}
  /vscode-uri@3.0.7:
    resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==}
  /weaviate-ts-client@1.4.0(graphql@16.7.1):
      graphql-request: 5.2.0(graphql@16.7.1)
      uuid: 9.0.0
  /whatwg-fetch@3.6.17:
    resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==}
  /which-typed-array@1.1.9:
    resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
      is-typed-array: 1.1.10
  /ws@8.13.0:
    resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
  /y-prosemirror@1.0.20(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7):
      lib0: 0.2.78
      prosemirror-model: 1.19.2
      prosemirror-view: 1.31.4
  /y-prosemirror@1.2.1(prosemirror-model@1.19.2)(prosemirror-state@1.4.3)(prosemirror-view@1.31.4)(y-protocols@1.0.5)(yjs@13.6.7):
      lib0: 0.2.78
      prosemirror-model: 1.19.2
      prosemirror-view: 1.31.4
      lib0: 0.2.78
      lib0: 0.2.78
  /zod-to-json-schema@3.21.4(zod@3.22.2):
      zod: 3.22.2
  /zod@3.22.2:
    resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==}

Fixed code:
docker.env
import corsPlugin, { OriginFunction } from "@fastify/cors";
  const originCallback: OriginFunction = (origin, callback) => {
    if (!origin || origin === "null") {
      callback(null, true);

      return;
    }

    const { hostname } = new URL(origin);
    const appHostname = new URL(fastify.config.PUBLIC_APP_URL).hostname;

    if (
      hostname === "localhost" ||
      hostname.endsWith(appHostname) ||
      (fastify.config.VRITE_CLOUD && hostname.endsWith("swagger.io"))
    ) {
      callback(null, true);

      return;
    }

    callback(new Error("Not allowed"), false);
  };

    origin: true,
    methods: ["GET", "DELETE", "PUT", "POST"]
  const server = await createServer({
    database: true,
    pubSub: true,
    auth: true,
    email: true,
    gitSync: true,
    search: true
  });
        version: "0.3.0"
import { errors, publicPlugin, trpcPlugin, processAuth } from "@vrite/backend";
    return reply.header("X-Frame-Options", "SAMEORIGIN").view("index.html", {
  const server = await createServer({
    database: true,
    pubSub: true,
    auth: true,
    email: true,
    gitSync: true,
    search: true,
    storage: true
  });
    reply.header(
      "Access-Control-Allow-Origin",
      fastify.config.NODE_ENV === "development" ? "*" : fastify.config.PUBLIC_APP_URL
    );
import { assetsService } from "./assets";
  const server = await createServer({
    storage: true
  });
  jsonToBuffer,
  publishGitDataEvent
import { ObjectId } from "mongodb";
    publishGitDataEvent({ fastify: this.fastify }, `${details.context.workspaceId}`, {
import { docToBuffer, getContentPiecesCollection } from "@vrite/backend";
import { ObjectId } from "mongodb";
  const server = await createServer({
    database: true,
    auth: true,
    pubSub: true,
    search: true
  });
import {
  publicPlugin,
  getContentsCollection,
  getContentVariantsCollection,
  errors,
  SessionData
} from "@vrite/backend";
        throw errors.unauthorized();
        throw errors.unauthorized();
    "@prettier/sync": "^0.3.0",
    "@types/hast": "^3.0.1",
    "@types/html-to-text": "^9.0.1",
    "@types/js-yaml": "^4.0.6",
    "@types/mdast": "^4.0.1",
    "dayjs": "^1.11.9",
    "hast-util-to-html": "^9.0.0",
    "html-to-text": "^9.0.5",
    "js-yaml": "^4.1.0",
    "mdast-util-from-markdown": "^2.0.0",
    "mdast-util-frontmatter": "^2.0.1",
    "mdast-util-gfm": "^3.0.0",
    "mdast-util-mdx": "^3.0.0",
    "mdast-util-to-hast": "^13.0.2",
    "micromark-extension-frontmatter": "^2.0.0",
    "micromark-extension-gfm": "^3.0.0",
    "micromark-extension-mdxjs": "^2.0.0",
    "prettier": "^3.0.2",
    "remark": "^15.0.1",
    "remark-mdx": "^2.3.0",
    "remark-parse": "^11.0.0",
    "trpc-openapi": "^1.2.0",
    "unist-util-visit": "^5.0.0"
import { publicPlugin, createFastifyContext } from "@vrite/backend";
import corsPlugin from "@fastify/cors";
    credentials: true,
      return createFastifyContext({ req, res }, fastify);
import { createServer } from "@vrite/backend";
  const server = await createServer({});
      JSONContentNode["listItem" | "blockquote" | "doc" | "element"]
          case "element":
              child as JSONContentNodeWalker<JSONContentNode["element"]>
      JSONContentNode["listItem" | "blockquote" | "doc" | "element"]
          case "element":
              child as JSONContentNodeWalker<JSONContentNode["element"]>
import { mdxRouter } from "./mdx";
  gpt: gptRouter,
  mdx: mdxRouter
import { mdxAsyncInputTransformer } from "./input-transformer";
import { mdxAsyncOutputTransformer } from "./output-transformer";
import { procedure, router, z } from "@vrite/backend";
import { InputTransformer } from "@vrite/sdk/transformers";

const basePath = "/mdx";
const mdxRouter = router({
  input: procedure
    .meta({
      openapi: {
        method: "POST",
        path: `${basePath}/input`
      }
    })
    .input(z.object({ data: z.array(z.string()) }))
    .output(
      z.array(
        z.object({
          content: z.string(),
          contentPiece: z.any()
        })
      )
    )
    .mutation(async ({ input }) => {
      const output: Array<ReturnType<InputTransformer>> = [];

      for await (const content of input.data) {
        output.push(await mdxAsyncInputTransformer(content));
      }

      return output;
    }),
  output: procedure
    .meta({
      openapi: {
        method: "POST",
        path: `${basePath}/output`
      }
    })
    .input(
      z.object({
        data: z.array(
          z.object({
            content: z.any(),
            metadata: z.any()
          })
        )
      })
    )
    .output(z.array(z.string()))
    .mutation(async ({ ctx, input }) => {
      const output: string[] = [];

      for await (const { content, metadata } of input.data) {
        output.push(await mdxAsyncOutputTransformer(content, metadata));
      }

      return output;
    })
});

export { mdxRouter };
import { InputTransformer } from "@vrite/sdk/transformers";
import { mdxjs } from "micromark-extension-mdxjs";
import { fromMarkdown } from "mdast-util-from-markdown";
import { MdxJsxAttribute, MdxJsxExpressionAttribute, mdxFromMarkdown } from "mdast-util-mdx";
import { frontmatter } from "micromark-extension-frontmatter";
import { frontmatterFromMarkdown } from "mdast-util-frontmatter";
import { gfmFromMarkdown } from "mdast-util-gfm";
import { gfm } from "micromark-extension-gfm";
import { toHtml } from "hast-util-to-html";
import { toHast, defaultHandlers } from "mdast-util-to-hast";
import babelPlugin from "prettier/plugins/babel";
import estreePlugin from "prettier/plugins/estree";
import { format } from "prettier/standalone";
import { load } from "js-yaml";
import dayjs from "dayjs";
import type { Plugin } from "prettier";
import type { RootContentMap } from "mdast";
import type { Element, Text } from "hast";

const attributeProcessingPromises: Array<Promise<any>> = [];
const processAttribute = async (value: string): Promise<any> => {
  try {
    const processedValue = await format(value, {
      parser: "json-stringify",
      plugins: [babelPlugin, estreePlugin as Plugin]
    });

    return JSON.parse(processedValue);
  } catch (error) {
    try {
      return JSON.parse(value);
    } catch (error) {
      return value;
    }
  }
};
const attributesToJSON = async (
  attributes: Array<MdxJsxAttribute | MdxJsxExpressionAttribute>
): Promise<Record<string, any>> => {
  const output: Record<string, any> = {};

  for await (const attribute of attributes) {
    if (attribute.type === "mdxJsxAttribute") {
      if (typeof attribute.value === "string") {
        output[attribute.name] = attribute.value;
      } else if (attribute.value === null) {
        output[attribute.name] = true;
      } else if (attribute.value?.value) {
        const value = await processAttribute(attribute.value.value);

        output[attribute.name] = value;
      }
    }
  }

  return output;
};
const mdxAsyncInputTransformer = async (input: string): Promise<ReturnType<InputTransformer>> => {
  const mdast = fromMarkdown(input, {
    extensions: [gfm(), frontmatter(), mdxjs()],
    mdastExtensions: [gfmFromMarkdown(), frontmatterFromMarkdown(), mdxFromMarkdown()]
  });
  const hast = toHast(mdast, {
    handlers: {
      mdxjsEsm(state, node: RootContentMap["mdxjsEsm"]) {
        const result: Element = {
          tagName: "div",
          type: "element",
          properties: {
            "data-element": "true",
            "data-type": "Import"
          },
          children: state.all({
            children: [{ type: "code", lang: "mdx", value: node.value.trim() }],
            type: "root"
          })
        };

        state.patch(node, result);

        return state.applyData(node, result);
      },
      paragraph(state, node: RootContentMap["paragraph"]) {
        if (node.children.length === 1 && node.children[0].type === "image") {
          return defaultHandlers.image(state, node.children[0]);
        } else if (node.children.length === 1 && node.children[0].type === "mdxJsxTextElement") {
          return state.all({ type: "root", children: [node.children[0]] })[0];
        }

        return defaultHandlers.paragraph(state, node);
      },
      code(state, node: RootContentMap["code"]) {
        const result = defaultHandlers.code(state, { ...node, value: node.value.trim() });
        const meta: string[] = [];

        let title = "";

        (node.meta || "").split(" ").forEach((item) => {
          if (item.startsWith("title=")) {
            const match = item.match(/title="(.+?)"/);

            if (match) {
              title = match[1] || title;
            }
          } else {
            meta.push(item);
          }
        });

        const codeElement = result.children[0] as Element;
        const textElement = codeElement.children[0] as Text;

        result.properties["data-title"] = title;
        result.properties["data-meta"] = meta.join(" ");
        textElement.value = textElement.value.trim();

        return result;
      },
      list(state, node: RootContentMap["list"]) {
        const result = defaultHandlers.list(state, node);
        const className = `${result.properties.className || ""}`;

        if (className.includes("contains-task-list")) {
          result.properties.className = className.replace("contains-task-list", "").trim();
          if (!result.properties.className) delete result.properties.className;

          result.properties["data-type"] = "taskList";
        }

        return result;
      },
      mdxFlowExpression() {
        return undefined;
      },
      mdxJsxTextElement(state, node: RootContentMap["mdxJsxTextElement"], parent) {
        if (parent?.children.length === 1) {
          return state.all({
            type: "root",
            children: [
              {
                type: "mdxJsxFlowElement",
                name: node.name,
                attributes: node.attributes,
                children: [{ type: "paragraph", children: node.children }]
              }
            ]
          })[0];
        }

        return undefined;
      },
      mdxTextExpression() {
        return undefined;
      },
      mdxJsxFlowElement(state, node: RootContentMap["mdxJsxFlowElement"]) {
        const result: Element = {
          tagName: "div",
          type: "element",
          properties: {
            "data-element": "true",
            "data-type": node.name
          },
          children: state.all(node)
        };
        const promise = attributesToJSON(node.attributes).then((attributes) => {
          result.properties["data-props"] = JSON.stringify(attributes);
        });

        attributeProcessingPromises.push(promise);
        state.patch(node, result);

        return state.applyData(node, result);
      }
    }
  });
  const frontmatterYAML = mdast.children.find(
    (child) => child.type === "yaml"
  ) as RootContentMap["yaml"];
  const { canonicalLink, coverUrl, description, date, slug, title, ...customData } = (
    frontmatterYAML ? load(frontmatterYAML.value) : {}
  ) as Record<string, any>;

  await Promise.all(attributeProcessingPromises);

  const content = toHtml(hast);

  return {
    content,
    contentPiece: {
      ...(canonicalLink && { canonicalLink }),
      ...(coverUrl && { coverUrl }),
      ...(description && { description: `<p>${description}</p>` }),
      ...(date && { date: dayjs(date).toISOString() }),
      ...(slug && { slug }),
      ...(title && { title }),
      customData
    }
  };
};

export { mdxAsyncInputTransformer };
/* eslint-disable no-use-before-define */
import {
  createContentWalker,
  JSONContentNodeWalker,
  JSONContentNode,
  GenericJSONContentNode
} from "@vrite/sdk/transformers";
import { format } from "prettier/standalone";
import babelPlugin from "prettier/plugins/babel";
import estreePlugin from "prettier/plugins/estree";
import markdownPlugin from "prettier/plugins/markdown";
import { ContentPiece } from "@vrite/sdk/api";
import { convert as convertToText } from "html-to-text";
import { dump } from "js-yaml";
import dayjs from "dayjs";
import type { Plugin } from "prettier";

const processCode = async (code: string, hasContent?: boolean): Promise<string> => {
  const codeTagClosed = code?.trim().replace(/>$/, "/>") || "";
  const formattedCode = await format(codeTagClosed, {
    parser: "babel-ts",
    plugins: [babelPlugin, estreePlugin as Plugin],
    printWidth: 60,
    trailingComma: "none",
    singleQuote: false
  });

  return formattedCode.replace(/ *?\/>;/gm, hasContent ? ">" : "/>").trim();
};
const mdxAsyncOutputTransformer = async (
  contentNode: GenericJSONContentNode,
  contentPiece?: Pick<
    ContentPiece<Record<string, any>>,
    | "date"
    | "title"
    | "description"
    | "tags"
    | "members"
    | "slug"
    | "filename"
    | "coverUrl"
    | "coverAlt"
    | "customData"
    | "canonicalLink"
    | "coverWidth"
  >
): Promise<string> => {
  const contentWalker = createContentWalker(contentNode);
  const transformText = (textWalker: JSONContentNodeWalker<JSONContentNode["text"]>): string => {
    let output = "";

    if (textWalker.node.type === "text") {
      output = textWalker.node.text;
      textWalker.node.marks?.forEach((mark) => {
        switch (mark.type) {
          case "link":
            output = `[${output}](${mark.attrs.href})`;
            break;
          case "bold":
            output = `**${output}**`;
            break;
          case "code":
            output = `\`${output}\``;
            break;
          case "italic":
            output = `_${output}_`;
            break;
          case "strike":
            output = `~~${output}~~`;
            break;
          default:
            break;
        }
      });
    }

    return output;
  };
  const transformTextNode = (
    paragraphWalker: JSONContentNodeWalker<JSONContentNode["paragraph" | "heading" | "codeBlock"]>
  ): string => {
    return `${paragraphWalker.children
      .map((child) => {
        if (child.node.type === "text") {
          return transformText(child as JSONContentNodeWalker<JSONContentNode["text"]>);
        }

        return "\n";
      })
      .join("")}`;
  };
  const transformTable = (tableWalker: JSONContentNodeWalker<JSONContentNode["table"]>): string => {
    let output = "";

    tableWalker.children.forEach((tableRowWalker, rowIndex) => {
      let isHeader = false;

      const columns = tableRowWalker.children.map((tableCellWalker) => {
        if (tableCellWalker.node.type === "tableHeader") {
          isHeader = true;
        }

        return tableCellWalker.children.map(transformTextNode).join("\n");
      });

      if (rowIndex === tableWalker.children.length - 1) {
        output += `| ${columns.map((row) => row.replace(/\n/g, " ")).join(" | ")} |`;
      } else {
        output += `| ${columns.map((row) => row.replace(/\n/g, " ")).join(" | ")} |\n`;
      }

      if (isHeader && rowIndex === 0) {
        output += `| ${columns.map(() => "---").join(" | ")} |\n`;
      }
    });

    return output;
  };
  const transformCodeBlock = (
    codeBlockWalker: JSONContentNodeWalker<JSONContentNode["codeBlock"]>
  ): string => {
    const attrs = codeBlockWalker.node.attrs || {};

    let openingTag = `${attrs?.lang || ""}`;

    if (attrs?.title) {
      openingTag += ` title="${attrs.title}"`;
    }

    if (attrs?.meta) {
      openingTag += ` ${attrs.meta}`;
    }

    return `\`\`\`${openingTag}\n${transformTextNode(codeBlockWalker)}\n\`\`\``;
  };
  const transformElement = async (
    elementWalker: JSONContentNodeWalker<JSONContentNode["element"]>
  ): Promise<string> => {
    const { attrs } = elementWalker.node;

    if (attrs.type === "Import" && elementWalker.children[0]?.node?.type === "codeBlock") {
      return `${transformTextNode(
        elementWalker.children[0] as JSONContentNodeWalker<JSONContentNode["codeBlock"]>
      ).trim()}`;
    }

    const keyValueProps = Object.entries(attrs.props).map(([key, value]) => {
      if (value === true) return key;

      const useBrackets = typeof value !== "string" || value.includes("\n") || value.includes(`"`);

      return `${key}=${useBrackets ? "{" : ""}${JSON.stringify(value)}${useBrackets ? "}" : ""}`;
    });
    const openingTag = await processCode(
      `<${attrs.type}${keyValueProps.length ? " " : ""}${keyValueProps.join(" ")}>`,
      elementWalker.children.length > 0
    );

    if (elementWalker.children.length > 0) {
      return `${openingTag}\n${(
        await transformContentNode(
          elementWalker as JSONContentNodeWalker<JSONContentNode["element"]>
        )
      )
        .split("\n")
        .map((line) => `  ${line}`)
        .join("\n")}\n</${attrs.type}>`;
    }

    return openingTag;
  };
  const transformContentNode = async (
    nodeWalker: JSONContentNodeWalker<
      JSONContentNode["listItem" | "taskItem" | "blockquote" | "doc" | "element"]
    >
  ): Promise<string> => {
    const output: string[] = [];

    for await (const child of nodeWalker.children) {
      const processChildNode = async (): Promise<string> => {
        const nodeType = child.node.type;
        const previousSibling = child.previousSibling();
        const isPreviousSiblingList = ["bulletList", "orderedList", "taskList"].includes(
          previousSibling?.node.type || ""
        );

        switch (nodeType) {
          case "paragraph":
            return `\n${transformTextNode(
              child as JSONContentNodeWalker<JSONContentNode["paragraph"]>
            )}\n`;
          case "bulletList":
          case "orderedList":
          case "taskList":
            return `${isPreviousSiblingList ? "\n" : ""}${await transformList(
              child as JSONContentNodeWalker<
                JSONContentNode["bulletList" | "orderedList" | "taskList"]
              >
            )}\n`;
          case "table":
            return `\n${transformTable(
              child as JSONContentNodeWalker<JSONContentNode["table"]>
            )}\n`;
          case "horizontalRule":
            return "\n---\n";
          case "image":
            return `\n![${child.node.attrs?.alt || ""}](${child.node.attrs?.src || ""})\n`;
          case "heading":
            return `\n${"#".repeat(child.node.attrs?.level || 1)} ${transformTextNode(
              child as JSONContentNodeWalker<JSONContentNode["heading"]>
            )}\n`;
          case "codeBlock":
            return `\n${transformCodeBlock(
              child as JSONContentNodeWalker<JSONContentNode["codeBlock"]>
            )}\n`;
          case "element":
            return `${child.node.attrs.type === "Import" ? "" : "\n"}${await transformElement(
              child as JSONContentNodeWalker<JSONContentNode["element"]>
            )}\n`;
          case "blockquote":
            return `\n${(
              await transformContentNode(
                child as JSONContentNodeWalker<JSONContentNode["blockquote"]>
              )
            )
              .split("\n")
              .map((line) => `> ${line}`)
              .join("\n")}\n`;
          default:
            return "";
        }
      };

      output.push(await processChildNode());
    }

    return output.join("").trim();
  };
  const transformList = async (
    listWalker: JSONContentNodeWalker<JSONContentNode["bulletList" | "orderedList" | "taskList"]>
  ): Promise<string> => {
    const listItems: Array<{ content: string; node: JSONContentNode["listItem" | "taskItem"] }> =
      [];

    for await (const nodeWalker of listWalker.children) {
      listItems.push({
        content: await transformContentNode(nodeWalker),
        node: nodeWalker.node
      });
    }

    return listItems
      .map(({ content, node }, index) => {
        let prefix = "";
        let indent = 0;

        if (listWalker.node.type === "taskList" && node.type === "taskItem") {
          prefix = `${node.attrs?.checked ? "- [x] " : "- [ ] "} `;
          indent = 2;
        }

        if (listWalker.node.type === "orderedList") {
          const start = listWalker.node.attrs?.start || 1;

          prefix = `${start + index}. `;
          indent = prefix.length;
        }

        if (listWalker.node.type === "bulletList") {
          prefix = "- ";
          indent = prefix.length;
        }

        return content
          .split("\n")
          .map((line, lineIndex) => {
            if (lineIndex === 0) {
              return `${prefix}${line}`;
            }

            return `${" ".repeat(indent)}${line}`;
          })
          .join("\n");
      })
      .join("\n");
  };
  const content = await transformContentNode(
    contentWalker as JSONContentNodeWalker<JSONContentNode["doc"]>
  );
  const frontmatter = dump(
    {
      ...(contentPiece?.canonicalLink && { canonicalLink: contentPiece.canonicalLink }),
      ...(contentPiece?.coverUrl && { coverUrl: contentPiece.coverUrl }),
      ...(contentPiece?.description && {
        description: convertToText(contentPiece.description, { wordwrap: false })
      }),
      ...(contentPiece?.date && { date: dayjs(contentPiece.date).format("YYYY-MM-DD") }),
      ...(contentPiece?.slug && { slug: contentPiece.slug }),
      ...(contentPiece?.title && { title: contentPiece.title }),
      ...(contentPiece?.customData || {})
    },
    { skipInvalid: true, forceQuotes: true, quotingType: '"' }
  );

  return (
    await format(
      `${frontmatter ? "---" : ""}\n${frontmatter.trim()}\n${
        frontmatter ? "---" : ""
      }\n\n${content.trim()}`,
      { plugins: [markdownPlugin], parser: "mdx" }
    )
  ).trim();
};

export { mdxAsyncOutputTransformer };
      JSONContentNode["listItem" | "blockquote" | "doc" | "element"]
          case "element":
              child as JSONContentNodeWalker<JSONContentNode["element"]>
declare module 'astro:content' {
	interface Render {
		'.mdx': Promise<{
			Content: import('astro').MarkdownInstance<{}>['Content'];
			headings: import('astro').MarkdownHeading[];
			remarkPluginFrontmatter: Record<string, any>;
		}>;
	}
}

  slug: "javascript-sdk/introduction";
  data: InferEntrySchema<"docs">
  data: InferEntrySchema<"docs">
  data: InferEntrySchema<"docs">
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/content-editor";
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/getting-started";
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/kanban-dashboard";
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/metadata";
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/publishing";
  data: InferEntrySchema<"docs">
  slug: "/usage-guide/vrite-extensions";
  data: InferEntrySchema<"docs">
};
"recipes": {
"test.mdx": {
	id: "test.mdx";
  slug: "/recipes/content-pieces";
  body: string;
  collection: "recipes";
  data: InferEntrySchema<"recipes">
} & { render(): Render[".mdx"] };
import mdx from "@astrojs/mdx";
import autoImport from "astro-auto-import";
    autoImport({
      imports: [{ "#components/content": ["Card", "CardGrid", "Warning", "Info"] }]
    }),
    }),
    mdx()
    "@astrojs/mdx": "^1.1.1",
    "@solid-primitives/scheduled": "^1.4.0",
    "@vrite/sdk": "workspace:*",
    "astro-auto-import": "^0.3.1",
    "astro-icon": "^0.8.1",
    "seamless-scroll-polyfill": "^2.3.4",
    "tinykeys": "^2.1.0",
    "url-slug": "^4.0.1",
---
import clsx from "clsx";
interface Props {
  cols?: 2 | 3 | 4;
}

const { props } = Astro;
---

<div
  class={clsx("grid grid-reset-margin gap-2 my-4", {
    "sm:grid-cols-2": !props.cols || props.cols === 2,
    "sm:grid-cols-3": props.cols === 3,
    "sm:grid-cols-4": props.cols === 4
  })}
>
  <slot />
</div>
---
import { Card as BaseCard, Heading, IconButton } from "#components/primitives";
import { Icon } from "astro-icon";
import clsx from "clsx";

interface Props {
  icon: string;
  label: string;
  gradient?: boolean;
  link: string;
}

const { props } = Astro;
---

<a href={props.link} class="not-prose cursor-pointer block my-4"
  ><BaseCard
    class={clsx(
      "w-full flex flex-col m-0 p-0 gap-2 items-start h-full",
      props.gradient ? "hover:bg-gradient-to-bl" : "!hover:bg-gray-200"
    )}
    color={props.gradient ? "primary" : "contrast"}
  >
    <div class="flex justify-center items-center pl-3 pr-4 pt-3 w-full">
      <div class="pr-1 py-1">
        <Icon
          name={props.icon}
          class={clsx("h-6 w-6", props.gradient ? "fill-current" : "fill-[url(#gradient)]")}
        />
      </div>
      <Heading level={2} class="pl-1 flex-1">
        {props.label}
      </Heading>
    </div>
    <div
      class={clsx(
        "flex flex-col justify-center items-start gap-2 w-full px-4 pb-4",
        props.gradient ? "" : "text-gray-500 dark:text-gray-400"
      )}
    >
      <slot />
    </div>
  </BaseCard></a
>
export { default as Card } from "./card.astro";
export { default as CardGrid } from "./card-grid.astro";
export { default as Warning } from "./warning.astro";
export { default as Info } from "./info.astro";
---
import { Card, Icon } from "#components/primitives";
import { mdiInformationSlabCircleOutline } from "@mdi/js";
---

<Card class="flex items-center justify-start mx-0 my-4" color="contrast">
  <Icon path={mdiInformationSlabCircleOutline} class="w-6 h-6 mr-2 fill-[url(#gradient)]" />
  <div class="flex-1 not-prose"><slot /></div>
</Card>
---
import { Card, Icon } from "#components/primitives";
import { mdiAlertCircleOutline } from "@mdi/js";
---

<Card class="flex items-center justify-start m-0 my-4" color="primary">
  <Icon path={mdiAlertCircleOutline} class="w-6 h-6 mr-2" />
  <div class="flex-1 not-prose"><slot /></div>
</Card>
interface FooterProps {
  nextEntry?: { label: string; link: string } | null;
  previousEntry?: { label: string; link: string } | null;
const Footer: Component<FooterProps> = (props) => {
            text="soft"
            text="soft"
export { Footer };
import { SearchPaletteProvider, useSearchPalette } from "./search-palette";
import { mdiAppleKeyboardCommand, mdiGithub, mdiMagnify } from "@mdi/js";
import { For, type Component, Show } from "solid-js";
import clsx from "clsx";
import { Button, Icon, IconButton, Tooltip } from "#components/primitives";
import { discordIcon, logoIcon } from "#assets/icons";
const externalLinks = [
  {
    label: "GitHub",
    icon: mdiGithub,
    href: "https://github.com/vriteio/vrite"
  },
  {
    label: "Discord",
    icon: discordIcon,
    href: "https://discord.gg/yYqDWyKnqE"
  }
];
  const { opened, setOpened } = useSearchPalette();

    <div
      class={clsx(
        "top-0 gap-2 h-12 fixed bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700 border-b-2 right-0 z-1 items-center justify-center w-full flex py-2 px-4 md:px-8",
        "!pr-[max(1rem,calc((100%-(1536px))/2))]"
      )}
    >
      <div class="flex md:hidden items-center justify-start px-1">
        <IconButton
          path={logoIcon}
          color="primary"
          link="/"
          class="bg-gradient-to-tr from-red-500 to-orange-500 m-0 mr-1"
        />
        <span class="flex-1 text-2xl font-extrabold text-gray-600 dark:text-gray-200">rite</span>
      </div>
      <For each={externalLinks}>
        {(link) => {
          return (
            <a
              class="flex justify-start items-center group cursor-pointer"
              target="_blank"
              href={link.href}
            >
              <Tooltip text={link.label} class="mt-1">
                <IconButton
                  path={link.icon}
                  class="m-0 h-8 min-w-8"
                  iconProps={{ class: "h-5 w-5" }}
                  text="soft"
                />
              </Tooltip>
            </a>
          );
        }}
      </For>
          <div class="hidden md:flex w-full items-center">
            <span class="pl-1 flex-1 text-start pr-3">Search</span>
            <Show when={typeof window === "object"}>
              <kbd class="bg-gray-300 dark:bg-gray-700 group-hover:bg-gray-200 dark:group-hover:bg-gray-800 flex justify-center items-center rounded-md px-1 h-5 text-sm">
                {isAppleDevice() ? (
                  <Icon path={mdiAppleKeyboardCommand} class="h-3 w-3" />
                ) : (
                  "Ctrl "
                )}
                K
              </kbd>
            </Show>
        class="lg:min-w-48 justify-start m-0 group"
        onClick={() => {
          setOpened(!opened());
        }}
      <Button color="primary" class="m-0" link="https://app.vrite.io">
        Sign in
      </Button>
const HeaderWrapper: Component = () => {
  return (
    <SearchPaletteProvider>
      <Header />
    </SearchPaletteProvider>
  );
};
export { HeaderWrapper as Header };
export * from "./footer";
export * from "./search-palette";
export * from "./footer";
import {
  Component,
  For,
  onMount,
  onCleanup,
  createSignal,
  createMemo,
  createEffect
} from "solid-js";
import { scroll } from "seamless-scroll-polyfill";
      return heading.depth === 2 || heading.depth === 3;
  const scrollToActiveHeading = (smooth?: boolean): void => {
    const heading = activeHeading();
    const element = document.getElementById(heading);

    if (!element) return;

    const rect = element.getBoundingClientRect();
    const y = rect.top + window.scrollY - 60;

    scroll(window, {
      top: y,
      behavior: smooth === false ? "instant" : "smooth"
    });
  };
  const handleClick = (event: MouseEvent): void => {
    const target = event.target as HTMLElement;

    if (target.matches("h2, h3")) {
      const { id } = target;

      if (id) {
        setActiveHeading(id);
        scrollToActiveHeading();
        history.replaceState(null, "", `#${id}`);
        navigator.clipboard.writeText(window.location.href);
      }
    }
  };
    const hash = location.hash.slice(1);
    document.body.addEventListener("click", handleClick);
      document.body.removeEventListener("click", handleClick);

    if (hash) {
      setActiveHeading(hash);
      scrollToActiveHeading(false);
    }
          "w-56 flex-col justify-start top-0 pt-24 xl:fixed right-0 hidden xl:flex gap-2",
                class={clsx("text-start m-0", heading.depth === 3 && "ml-6")}
                size={heading.depth === 2 ? "medium" : "small"}
                  scrollToActiveHeading();
import {
  Accessor,
  Component,
  For,
  Match,
  ParentComponent,
  Setter,
  Show,
  Switch,
  createEffect,
  createSignal,
  on,
  onCleanup,
  useContext
} from "solid-js";
import {
  mdiChevronRight,
  mdiCreationOutline,
  mdiFileDocumentOutline,
  mdiHeadSnowflakeOutline,
  mdiInformationOutline,
  mdiKeyboardEsc,
  mdiKeyboardReturn,
  mdiMagnify,
  mdiSwapVertical
} from "@mdi/js";
import clsx from "clsx";
import { scrollIntoView } from "seamless-scroll-polyfill";
import { createContext } from "solid-js";
import { debounce } from "@solid-primitives/scheduled";
import { convert as convertToSlug } from "url-slug";
import { marked } from "marked";
import { createClient, SearchResult } from "@vrite/sdk/api";
import {
  Button,
  Card,
  Icon,
  IconButton,
  Input,
  Loader,
  Overlay,
  Tooltip
} from "#components/primitives";

interface SearchPaletteProps {
  opened: boolean;
  setOpened(opened: boolean): void;
}
interface SearchPaletteContextData {
  opened: Accessor<boolean>;
  setOpened: Setter<boolean>;
}

const SearchPaletteContext = createContext<SearchPaletteContextData>();
const SearchPalette: Component<SearchPaletteProps> = (props) => {
  const client = createClient({
    token: import.meta.env.PUBLIC_VRITE_SEARCH_TOKEN
  });
  const [inputRef, setInputRef] = createSignal<HTMLInputElement | null>(null);
  const [abortControllerRef, setAbortControllerRef] = createSignal<AbortController | null>(null);
  const [mode, setMode] = createSignal<"search" | "ask">("search");
  const [searchResults, setSearchResults] = createSignal<SearchResult[]>([]);
  const [answer, setAnswer] = createSignal<string>("");
  const [loading, setLoading] = createSignal(false);
  const [mouseHoverEnabled, setMouseHoverEnabled] = createSignal(false);
  const [selectedIndex, setSelectedIndex] = createSignal(0);
  const [query, setQuery] = createSignal("");
  const ask = async (): Promise<void> => {
    let content = "";

    client.useSignal(abortControllerRef()?.signal || null).ask({
      query: query(),
      onError(error) {
        setLoading(false);
        throw error;
      },
      onChunk(chunk) {
        content += chunk;
        setAnswer(marked.parse(content, { gfm: true }));
      },
      onEnd() {
        setLoading(false);
      }
    });
    setLoading(false);
  };
  const search = debounce(async () => {
    setSearchResults([]);

    if (abortControllerRef()) abortControllerRef()?.abort();

    if (!query()) {
      setLoading(false);
      setSearchResults([]);

      return;
    }

    setAbortControllerRef(new AbortController());

    try {
      const search = await client
        .useSignal(abortControllerRef()?.signal || null)
        .search({ query: query() });

      setSearchResults(search);
      setLoading(false);

      return;
    } catch (error) {
      const trpcError = error as any;
      const causeErrorName = trpcError.cause?.name?.toLowerCase() || "";

      if (!causeErrorName.includes("aborterror") && abortControllerRef()?.signal.aborted) {
        setLoading(false);
      }
    }
  }, 150);
  const scrollToSelectedResult = (smooth?: boolean): void => {
    const selectedResultElement = document.querySelector("[data-selected=true]");

    if (selectedResultElement) {
      scrollIntoView(selectedResultElement, {
        behavior: smooth ? "smooth" : "instant",
        block: "center"
      });
    }
  };
  const goToContentPiece = (searchResult: SearchResult): void => {
    // eslint-disable-next-line no-console
    props.setOpened(false);

    const { slug } = searchResult.contentPiece;
    const [title, subHeading1, subHeading2] = searchResult.breadcrumb;

    window.location.href = `/${slug.startsWith("/") ? slug.slice(1) : slug}#${convertToSlug(
      subHeading2 || subHeading1
    )}`;
  };

  createEffect(
    on(
      query,
      () => {
        if (mode() === "search") {
          search.clear();
          search();
        }
      },
      { defer: true }
    )
  );
  createEffect(
    on(mode, () => {
      setMouseHoverEnabled(false);
      setSelectedIndex(0);
      setLoading(false);
      setAnswer("");
      setSearchResults([]);
      setQuery("");
    })
  );
  createEffect(() => {
    if (inputRef() && props.opened && mode()) {
      setTimeout(() => {
        inputRef()?.focus();
      }, 300);
    }
  });
  createEffect(() => {
    import("tinykeys").then(({ createKeybindingsHandler }) => {
      const keyShortcutHandler = createKeybindingsHandler({
        "$mod+KeyK": (event) => {
          props.setOpened(!props.opened);
        },
        "escape": (event) => {
          if (!props.opened) return;

          props.setOpened(false);
        },
        "ArrowUp": (event) => {
          if (!props.opened) return;

          setMouseHoverEnabled(false);
          event.preventDefault();
          event.stopPropagation();

          if (selectedIndex() > 0) {
            setSelectedIndex(selectedIndex() - 1);
            scrollToSelectedResult();
          } else if (mode() === "search") {
            setSelectedIndex(searchResults().length - 1);
            scrollToSelectedResult(true);
          }
        },
        "ArrowDown": (event) => {
          if (!props.opened) return;

          setMouseHoverEnabled(false);
          event.preventDefault();
          event.stopPropagation();

          if (mode() === "search" && selectedIndex() < searchResults().length - 1) {
            setSelectedIndex(selectedIndex() + 1);
            scrollToSelectedResult();
          } else {
            setSelectedIndex(0);
            scrollToSelectedResult(true);
          }
        },
        "Enter": (event) => {
          if (!props.opened) return;

          if (mode() === "search") {
            goToContentPiece(searchResults()[selectedIndex()]);
          }
        }
      });

      window.addEventListener("keydown", keyShortcutHandler);
      onCleanup(() => {
        window.removeEventListener("keydown", keyShortcutHandler);
      });
    });
  });

  const getIcon = (): string => {
    switch (mode()) {
      case "search":
        return mdiMagnify;
      case "ask":
        return mdiHeadSnowflakeOutline;
    }
  };
  const getLabel = (): string => {
    switch (mode()) {
      case "ask":
        return "Just ask";
      case "search":
      default:
        return "Search";
    }
  };

  return (
    <Overlay
      opened={props.opened}
      class="items-start"
      shadeClass="bg-opacity-50"
      wrapperClass="mt-32"
      onOverlayClick={() => {
        props.setOpened(false);
      }}
    >
      <Card
        class="w-2xl max-w-[calc(100vw-2rem)] max-h-[calc(100vh-16rem)] flex flex-col p-0 overflow-hidden shadow-xl"
        color="base"
        onPointerMove={() => {
          setMouseHoverEnabled(true);
        }}
      >
        <div class="flex w-full justify-center items-center p-2 border-b-2 dark:border-gray-700">
          <IconButton path={getIcon()} text="soft" variant="text" badge hover={false} class="m-0" />
          <Input
            value={query()}
            setValue={(value) => {
              if (mode() === "search") {
                setLoading(true);
              }

              setQuery(value);
            }}
            ref={setInputRef}
            tabIndex={0}
            placeholder={getLabel()}
            wrapperClass="flex-1 m-0"
            class="m-0 bg-transparent"
            onEnter={() => {
              if (mode() === "ask") {
                setLoading(true);
                setAnswer("");
                ask();
              }
            }}
            onKeyDown={(event) => {
              if (event.key === "Backspace" && !query()) {
                setMode("search");
              }
            }}
            adornment={() => (
              <Show when={mode() === "search" || mode() === "ask"}>
                <Tooltip text="Ask" side="left" class="-ml-1">
                  <IconButton
                    path={mdiCreationOutline}
                    class="m-0"
                    text={mode() === "ask" ? "base" : "soft"}
                    color={mode() === "ask" ? "primary" : "base"}
                    onClick={() => {
                      setMode((mode) => (mode === "ask" ? "search" : "ask"));
                    }}
                    variant="text"
                  />
                </Tooltip>
              </Show>
            )}
          />
        </div>
        <div class="relative overflow-hidden">
          <div class="flex-1 flex flex-col overflow-auto  max-h-[calc(100vh-21.5rem)] scrollbar-sm">
            <Switch>
              <Match when={mode() === "search"}>
                <Show
                  when={!loading()}
                  fallback={
                    <div class="flex justify-center items-center p-4">
                      <Loader />
                    </div>
                  }
                >
                  <For
                    each={searchResults()}
                    fallback={
                      <span class="p-4 text-center text-gray-500 dark:text-gray-400">
                        <Show when={query()} fallback="Type to search">
                          No results
                        </Show>
                      </span>
                    }
                  >
                    {(result, index) => {
                      return (
                        <Card
                          class={clsx(
                            "flex justify-start items-center py-2 px-3 m-0 rounded-none border-none",
                            index() === selectedIndex() &&
                              "bg-gray-300 dark:bg-gray-700 cursor-pointer",
                            index() !== selectedIndex() && "bg-transparent"
                          )}
                          color="base"
                          onClick={() => {
                            goToContentPiece(result);
                          }}
                          onPointerEnter={() => {
                            if (!mouseHoverEnabled()) return;

                            setSelectedIndex(index());
                          }}
                        >
                          <div class="flex w-full">
                            <Icon
                              path={mdiFileDocumentOutline}
                              class="h-6 w-6 mr-2 justify-start items-center"
                            />
                            <div class="flex flex-col justify-start flex-1">
                              <p class="flex items-center justify-start flex-wrap font-semibold">
                                <For each={result.breadcrumb}>
                                  {(breadcrumb, index) => {
                                    return (
                                      <>
                                        <Show when={index()}>
                                          <Icon
                                            path={mdiChevronRight}
                                            class="flex-inline h-5 w-5 text-gray-500 dark:text-gray-400"
                                          />
                                        </Show>
                                        {breadcrumb}
                                      </>
                                    );
                                  }}
                                </For>
                              </p>
                              <p class="prose flex-1 text-sm clamp-2 whitespace-pre-wrap text-gray-500 dark:text-gray-400">
                                {result.content}
                              </p>
                            </div>
                          </div>
                        </Card>
                      );
                    }}
                  </For>
                </Show>
              </Match>
              <Match when={mode() === "ask"}>
                <Show
                  when={answer()}
                  fallback={
                    <Show
                      when={!loading()}
                      fallback={
                        <div class="flex justify-center items-center p-4">
                          <Loader />
                        </div>
                      }
                    >
                      <span class="p-4 text-center text-gray-500 dark:text-gray-400">
                        What do you want to know?
                      </span>
                    </Show>
                  }
                >
                  <Card
                    class={clsx(
                      "flex flex-col items-center py-2 px-3 m-0 rounded-none border-none"
                    )}
                    color="base"
                  >
                    <div
                      class="flex flex-col w-full prose whitespace-pre-wrap"
                      innerHTML={answer()}
                    />
                    <Show when={!loading()}>
                      <IconButton
                        color="contrast"
                        text="soft"
                        size="small"
                        badge
                        class="mt-4"
                        path={mdiInformationOutline}
                        label="The information produced may be inaccurate."
                      />
                    </Show>
                  </Card>
                </Show>
              </Match>
            </Switch>
          </div>
        </div>
        <div class="border-t-2 dark:border-gray-700 px-2 py-1 flex gap-2 bg-gray-100 dark:bg-gray-800">
          <div class="hidden md:flex gap-2">
            <IconButton
              path={mdiSwapVertical}
              hover={false}
              badge
              label="Select"
              size="small"
              variant="text"
              text="soft"
            />
            <IconButton
              path={mdiKeyboardReturn}
              hover={false}
              badge
              label="Open"
              size="small"
              variant="text"
              text="soft"
            />
            <IconButton
              path={mdiKeyboardEsc}
              hover={false}
              badge
              label="Close"
              size="small"
              variant="text"
              text="soft"
            />
          </div>
          <div class="flex-1" />
          <Button
            size="small"
            variant="text"
            color={mode() === "ask" ? "primary" : "base"}
            text={mode() === "ask" ? "base" : "soft"}
            onClick={() => {
              setMode((mode) => (mode === "search" ? "ask" : "search"));
            }}
          >
            Ask a question
          </Button>
        </div>
      </Card>
    </Overlay>
  );
};
const SearchPaletteProvider: ParentComponent = (props) => {
  const [opened, setOpened] = createSignal(false);

  createEffect(() => {
    if (opened()) {
      document.body.style.overflow = "hidden";
    } else {
      document.body.style.overflow = "auto";
    }
  });

  return (
    <SearchPaletteContext.Provider
      value={{
        opened,
        setOpened
      }}
    >
      {props.children}
      <SearchPalette opened={opened()} setOpened={setOpened} />
    </SearchPaletteContext.Provider>
  );
};
const useSearchPalette = (): SearchPaletteContextData => {
  return useContext(SearchPaletteContext)!;
};

export { SearchPaletteProvider, useSearchPalette };
import { mdiMenu, mdiClose, mdiChevronDown } from "@mdi/js";
import { Component, For, JSX, createEffect, createSignal } from "solid-js";
  currentSection: string;
  sections: Array<{
    icon: string;
    link: string;
    id: string;
  menu: Record<
    string,
    Array<{
      label: string;
      menu: Array<{ label: string; link?: string; menu?: Array<{ label: string; link: string }> }>;
    }>
  >;
interface SideBarNestedMenuProps {
  menu: Array<{ label: string; link?: string; menu?: Array<{ label: string; link: string }> }>;
  openedByDefault?: boolean;
}

const SideBarNestedMenu: Component<SideBarNestedMenuProps> = (props) => {
    props.openedByDefault ||
      props.menu.filter((item) => {
        return item.link && props.currentPath.includes(item.link);
      }).length > 0
                return Boolean(item.link && props.currentPath.includes(item.link));
  createEffect(() => {
    if (menuOpened()) {
      document.body.style.overflow = "hidden";
    } else {
      document.body.style.overflow = "auto";
    }
  });

            menuOpened() ? "" : "translate-y-[100vh] md:translate-y-0"
            <For each={props.sections}>
              {(section) => {
                    target={section.link.startsWith("http") ? "_blank" : "_self"}
                    href={section.link}
                      path={section.icon}
                      color={section.id === props.currentSection ? "primary" : "contrast"}
                      text={section.id === props.currentSection ? "primary" : "soft"}
                    <span class=" ml-2 text-gray-500 dark:text-gray-400">{section.label}</span>
          <For each={props.menu[props.currentSection]}>
                <SideBarNestedMenu
                  currentPath={props.currentPath}
                  menu={menuItem.menu}
                  openedByDefault
                >
import { Header, BaseHead, SideBar, SVGDefs, OnThisPage, Footer } from "#components/fragments";
import { Button } from "#components/primitives";
import { mdiBookOpenBlankVariant, mdiConsoleLine, mdiTextBoxMultiple } from "@mdi/js";
const flattenMenu = (
  menu: Array<{
    label: string;
    link?: string;
    menu?: Array<{ label: string; link: string }>;
  }>,
  section: string,
  labels: string[]
): Array<{ label: string; link: string; section: string; labels: string[] }> => {
  return menu.flatMap((item) => {
    if (item.link) {
      return [{ label: item.label, link: item.link, section, labels: [...labels, item.label] }];
    }
    if (item.menu) {
      return flattenMenu(item.menu, section, [...labels, item.label]);
    }
    return [];
  });
};
const sections = [
  {
    label: "Documentation",
    link: "/usage-guide/getting-started",
    icon: mdiBookOpenBlankVariant,
    id: "docs"
  },
  {
    label: "API reference",
    link: "https://generator.swagger.io/?url=https://api.vrite.io/swagger.json",
    icon: mdiConsoleLine,
    id: "api"
  }
  /*{
    label: "Recipes",
    link: "/self-hosting/docker",
    icon: mdiTextBoxMultiple,
    id: "recipes"
  }*/
];
const flatMenu = [
  ...flattenMenu(menu.docs, "docs", []),
  ...flattenMenu(menu.recipes, "recipes", [])
];
const currentEntry = flatMenu.find((item) => item.link === Astro.url.pathname);
const nextEntry = currentEntry ? flatMenu[flatMenu.indexOf(currentEntry) + 1] : null;
const prevEntry = currentEntry ? flatMenu[flatMenu.indexOf(currentEntry) - 1] : null;
  description?: string;
    <BaseHead
      description={Astro.props.description || description}
      title={Astro.props.title ? `${Astro.props.title} | Vrite Documentation` : title}
      image={image}
    />
        <Header client:load />
        <SideBar
          menu={menu}
          sections={sections}
          currentSection={currentEntry?.section || "docs"}
          currentPath={Astro.url.pathname}
          client:load
        />
        <div class="flex overflow-hidden w-full relative h-full pt-12">
          <div
            class="flex-1 flex overflow-y-auto overflow-x-hidden justify-center min-h-[calc(100vh-3rem)]"
            id="container"
          >
              class="flex-1 prose max-w-screen-md w-full text-lg px-4 md:px-8 pt-4 pb-24 h-fit xl:w-[calc(100%-15rem)]"
              {
                (currentEntry?.labels.length || 0) > 1 && (
                  <Button badge color="primary" variant="text" class="m-0 pl-1 py-0" hover={false}>
                    {currentEntry?.labels.at(-2)}
                  </Button>
                )
              }
              <h1>{Astro.props.title}</h1>
              <Footer nextEntry={nextEntry} previousEntry={prevEntry} />
{
  "docs": [
    {
      "label": "Usage Guide",
      "menu": [
        {
          "label": "Getting Started",
          "link": "/usage-guide/getting-started"
        },
        {
          "label": "Managing Content with Kanban",
          "link": "/usage-guide/kanban-dashboard"
        },
        {
          "label": "Managing metadata",
          "link": "/usage-guide/metadata"
        },
        {
          "label": "Writing in the Vrite Editor",
          "link": "/usage-guide/content-editor"
        },
        {
          "label": "Configuring Vrite",
          "link": "/usage-guide/configuring-vrite"
        },
        {
          "label": "Publishing content",
          "link": "/usage-guide/publishing"
        },
        {
          "label": "Vrite Extensions",
          "link": "/usage-guide/vrite-extensions"
        }
      ]
    },
    {
      "label": "JavaScript SDK",
      "menu": [
        {
          "label": "Introduction",
          "link": "/javascript-sdk/introduction"
        }
      ]
    },
    {
      "label": "Self-Hosting",
      "menu": [
        {
          "label": "Docker",
          "link": "/self-hosting/docker"
        },
        {
          "label": "Configuration",
          "link": "/self-hosting/configuration"
        }
      ]
    }
  ],
  "recipes": []
}
  type: "content",
  schema: z.object({
    title: z.string().optional(),
    description: z.string().optional()
  })
});
const recipesCollection = defineCollection({
  type: "content",
  schema: z.object({
    title: z.string().optional(),
    description: z.string().optional()
  })
  docs: docsCollection,
  recipes: recipesCollection
---
title: "Introduction"
slug: "javascript-sdk/introduction"
---

---
title: "Configuring Self-Hosted Vrite"
slug: "self-hosting/configuration"
---

---
title: "Self-Hosting Vrite with Docker"
slug: "self-hosting/docker"
---

---
title: "Configuring Vrite"
slug: "usage-guide/configuring-vrite"
---

---
title: "Writing in Vrite Editor"
slug: "/usage-guide/content-editor"
---

---
title: "Getting Started"
slug: "/usage-guide/getting-started"
---

---
title: "Managing Content in Kanban"
slug: "/usage-guide/kanban-dashboard"
---

---
title: "Managing Metadata"
slug: "/usage-guide/metadata"
---

---
title: "Publishing Content"
slug: "/usage-guide/publishing"
---

---
title: "Vrite Extensions"
slug: "/usage-guide/vrite-extensions"
---

---
title: "Content Pieces API"
slug: "/recipes/content-pieces"
---

Content
interface ImportMetaEnv {
  readonly PUBLIC_VRITE_SEARCH_TOKEN: string;
}

interface ImportMeta {
  readonly env: ImportMetaEnv;
}
  const docsEntries = await getCollection("docs");
  const recipesEntries = await getCollection("recipes");
  return [
    ...docsEntries.map((entry) => ({
      params: { slug: entry.slug },
      props: { entry }
    })),
    ...recipesEntries.map((entry) => ({
      params: { slug: entry.slug },
      props: { entry }
    }))
  ];
<DefaultLayout headings={headings} title={entry.data.title} description={entry.data.description}>

.clamp-1 {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  overflow-wrap: break-word;
  -webkit-line-clamp: 1;
  line-clamp: 1;
  -webkit-box-orient: vertical;
}
.clamp-2 {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  overflow-wrap: break-word;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
}
.clamp-3 {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  overflow-wrap: break-word;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  -webkit-box-orient: vertical;
}
.font-jetbrains {
  font-family: "JetBrainsMonoVariable", monospace;
}
svg > path {
  fill: inherit;
}
.grid-reset-margin {
  & > * {
    margin: 0;
  }
}
    @apply relative;
    margin: 0 !important;
  :where(h2, h3):not(:where(.not-prose, .not-prose *)) {
    @apply hover:cursor-pointer;
    &::before {
      @apply hidden md:block absolute pr-6 -left-6 transform scale-90 text-gray-500 dark:text-gray-400 opacity-0;
      content: "#";
    &:hover::before {
      @apply opacity-100;
  h3:not(:where(.not-prose, .not-prose *))::before {
    @apply pr-5 -left-5;

    "monaco-editor": "^0.43.0",
          for (var i = 0; i < octets.length; i += 1) {
            var octet = octets[i];
          for (var i = 0; i < array.length; i += 1) {
            var line = array[i];
            for (var i = 0; i < length; i += 1) {
              var listener = typeListeners[i];
          for (var i = 0; i < typeListeners.length; i += 1) {
            if (typeListeners[i] === listener) {
            for (var i = 0; i < typeListeners.length; i += 1) {
              if (typeListeners[i] !== listener) {
                filtered.push(typeListeners[i]);
              for (var i = 0; i < textChunk.length; i += 1) {
                var c = textChunk.charCodeAt(i);
                  n = i;
                var i = url.indexOf("?");
                requestURL = i === -1 ? url : url.slice(0, i + 1) + url.slice(i + 1).replace(/(?:^|&)([^=&]*)(?:=[^&]*)?/g, function(p, paramName) {
          var s = new XMLHttpRequest(), o = [], u2 = [], i = {}, a = function() {
              return i[e2.toLowerCase()];
              return e2.toLowerCase() in i;
              o.push(n2 = n2.toLowerCase()), u2.push([n2, t2]), i[n2] = i[n2] ? i[n2] + "," + t2 : t2;
    createClient: () => M
  var import_eventsource, l, U, E, S, f, h, L, m, D, O, R, T, x, C, I, u, v, k, j, q, G, A, b, z, y, B, M;
      l = "/content-groups";
      U = (t) => ({ get: (e) => t("GET", `${l}`, { params: e }), list: (e) => t("GET", `${l}/list`, { params: e }), create: (e) => t("POST", `${l}`, { body: e }), update: (e) => t("PUT", `${l}`, { body: e }), delete: (e) => t("DELETE", `${l}`, { params: e }) });
      E = "/content-pieces";
      S = (t) => ({ get: (e) => t("GET", `${E}`, { params: e }), create: (e) => t("POST", `${E}`, { body: e }), update: (e) => t("PUT", `${E}`, { body: e }), delete: (e) => t("DELETE", `${E}`, { params: e }), list: (e) => t("GET", `${E}/list`, { params: e }) });
        let e = t.baseURL || "https://api.vrite.io", c = t.extensionId || "", i = t.headers || {}, $ = null, { token: p } = t;
        return { sendRequest: async (s, a, n) => {
            const { default: o } = await Promise.resolve().then(() => __toESM(require_browser2(), 1)), d = await o(`${e}${a}/?${encodeURI(Object.entries(n?.params || {}).filter(([, g]) => g).map(([g, w]) => `${g}=${w}`).join("&"))}`, { headers: { Authorization: `Bearer ${p}`, Accept: "application/json", ...n?.body ? { "Content-Type": "application/json" } : {}, ...c ? { "X-Vrite-Extension-ID": c } : {}, ...i }, body: n?.body ? JSON.stringify(n.body) : null, signal: $, method: s });
            $ = null;
            let r = null;
              if (r = await d.json(), !r)
            if (!d.ok)
              throw r;
            return r;
        }, reconfigure: (s) => {
          e = s.baseURL || e, p = s.token || p, c = s.extensionId || c, i = s.headers || i;
        }, useSignal: (s) => {
          $ = s;
        }, getConfig: () => ({ baseURL: e, token: p, extensionId: c, headers: i }), getSignal: () => $ };
      h = "/user-settings";
      L = (t) => ({ get: () => t("GET", `${h}`), update: (e) => t("PUT", `${h}`, { body: e }) });
      m = "/tags";
      D = (t) => ({ get: (e) => t("GET", `${m}`, { params: e }), update: (e) => t("PUT", `${m}`, { body: e }), create: (e) => t("PUT", `${m}`, { body: e }), delete: (e) => t("DELETE", `${m}`, { params: e }), list: (e) => t("GET", `${m}/list`, { params: e }) });
      O = "/profile";
      R = (t) => ({ get: () => t("GET", `${O}`) });
      T = "/webhooks";
      x = (t) => ({ get: (e) => t("GET", `${T}`, { params: e }), create: (e) => t("POST", `${T}`, { body: e }), update: (e) => t("PUT", `${T}`, { body: e }), delete: (e) => t("DELETE", `${T}`, { params: e }), list: (e) => t("GET", `${T}/list`, { params: e }) });
      I = (t) => ({ get: () => t("GET", `${C}`) });
      u = "/roles";
      v = (t) => ({ get: (e) => t("GET", `${u}`, { params: e }), create: (e) => t("POST", `${u}`, { body: e }), update: (e) => t("PUT", `${u}`, { body: e }), delete: (e) => t("DELETE", `${u}`, { params: e }), list: (e) => t("GET", `${u}/list`, { params: e }) });
      k = "/workspace-settings";
      j = (t) => ({ get: () => t("GET", `${k}`), update: (e) => t("PUT", `${k}`, { body: e }) });
      q = (t) => ({ listMembers: (e) => t("GET", "/workspace-memberships/list-members", { params: e }), listWorkspaces: (e) => t("GET", "/workspace-memberships/list-workspaces", { params: e }), create: (e) => t("POST", "/workspace-memberships", { body: e }), update: (e) => t("PUT", "/workspace-memberships", { body: e }), delete: (e) => t("DELETE", "/workspace-memberships", { params: e }) });
      G = "/extension";
      A = (t) => ({ get: () => t("GET", `${G}`), updateContentPieceData: (e) => t("POST", `${G}/content-piece-data`, { body: e }) });
      b = "/variants";
      z = (t) => ({ create: (e) => t("POST", `${b}`, { body: e }), update: (e) => t("PUT", `${b}`, { body: e }), delete: (e) => t("DELETE", `${b}`, { params: e }), list: () => t("GET", `${b}/list`) });
      y = "/transformers";
      B = (t) => ({ create: (e) => t("POST", `${y}`, { body: e }), delete: (e) => t("DELETE", `${y}`, { params: e }), list: () => t("GET", `${y}/list`) });
      M = (t) => {
        const { sendRequest: e, reconfigure: c, getConfig: i, getSignal: $, useSignal: p } = f(t), s = { contentGroups: U(e), contentPieces: S(e), tags: D(e), profile: R(e), userSettings: L(e), webhooks: x(e), workspace: I(e), roles: v(e), workspaceSettings: j(e), workspaceMemberships: q(e), extension: A(e), variants: z(e), transformers: B(e), search(a) {
          return e("GET", "/search", { params: a });
        }, async ask(a) {
          let n = "";
          const o = new import_eventsource.default(`${i().baseURL}/search/ask?query=${encodeURIComponent(a.query)}`, { headers: { Authorization: `Bearer ${i().token}` } });
          o.addEventListener("error", (d) => {
            const r = d;
            return r.message ? a.onError?.(r.message) : (o.close(), a.onEnd?.(n));
          }), o.addEventListener("message", (d) => {
            const r = decodeURIComponent(d.data);
            n += r, a.onChunk?.(r, n);
          }), $()?.addEventListener("abort", () => {
            o.close();
          }), p(null);
        }, useSignal(a) {
          return p(a), s;
        }, reconfigure(a) {
          return c(a), s;
        } };
        return s;
  "base": "vs",
  "inherit": true,
      "token": "",
      "settings": {
        "foreground": "#000000",
        "background": "#FFFFFF"
      }
  "colors": {
    "editor.background": "#f9fafb",
    "editorWidget.background": "#f3f4f6",
    "editor.foreground": "#000000",
    "editor.inactiveSelectionBackground": "#E5EBF1",
    "editorIndentGuide.background": "#D3D3D3",
    "editorIndentGuide.activeBackground": "#939393",
    "editor.selectionHighlightBackground": "#ADD6FF80",
    "editorSuggestWidget.background": "#F3F3F3",
    "activityBarBadge.background": "#007ACC",
    "sideBarTitle.foreground": "#6F6F6F",
    "list.hoverBackground": "#E8E8E8",
    "input.placeholderForeground": "#767676",
    "searchEditor.textInputBorder": "#CECECE",
    "settings.textInputBorder": "#CECECE",
    "settings.numberInputBorder": "#CECECE",
    "statusBarItem.remoteForeground": "#FFF",
    "statusBarItem.remoteBackground": "#16825D",
    "sideBarSectionHeader.background": "#0000",
    "sideBarSectionHeader.border": "#61616130",
    "tab.lastPinnedBorder": "#61616130",
    "notebook.cellBorderColor": "#E8E8E8",
    "statusBarItem.errorBackground": "#c72e0f"
  }
          "w-full bg-gray-100 border-2 not-prose dark:bg-gray-900 rounded-2xl dark:border-gray-700 rounded-editor-2xl customized-editor box-content",
          props.color === "contrast" && "customized-editor-contrast",
    userSettings = () => ({ accentColor: "energy", codeEditorTheme: "auto", uiTheme: "auto" })
              if (error.data?.code === "UNAUTHORIZED" && window.location.pathname !== "/auth") {
  "gpt-3.5": () => import("@vrite/extensions/gpt-3.5.json"),
  "mdx": () => import("@vrite/extensions/mdx.json")
        ":base-2: p-1 w-full flex items-center border-b-2 absolute h-12 border-gray-200 dark:border-gray-700 justify-end @container z-10",
  json: "json-stringify",
  scss: "scss",
  mdx: "mdx"
    case "json":
    case "mdx":
      plugins: parserPlugins
const useSuggestLanguage = (): ((query: string) => string[]) => {
    import("#lib/monaco").then(({ monaco }) => {
      const languageIds = getLanguageIds(monaco.languages.getLanguages());

      engine.addAll(languageIds);
    });
import { CodeBlock, Embed, Image, Element } from "./extensions";
    element: Element,
      label: "Element",
      block: "element",
        return editor.chain().focus().deleteRange(range).setElement().run();
                    return node()?.type.name === props.state.editor.schema.nodes[block].name;
      } catch (error) {
import { SolidNodeViewProps } from "@vrite/tiptap-solid";
import { mdiCodeTags, mdiCodeTagsCheck, mdiFileOutline } from "@mdi/js";
import { debounce } from "@solid-primitives/scheduled";
import { Card, IconButton, Input, Tooltip } from "#components/primitives";
import { createRef } from "#lib/utils";
  state: SolidNodeViewProps<CodeBlockAttributes>;
  changeLanguage(lang: string | null): void;
  const [mode, setMode] = createSignal<"title" | "lang">("lang");
  const [menuRef, setMenuRef] = createRef<HTMLElement | null>(null);
  const [left, setLeft] = createSignal(0);
  const attrs = (): CodeBlockAttributes => props.state.node.attrs;
  const suggestLanguage = useSuggestLanguage();
  const formattingAvailable = createMemo(() => isFormattable(attrs().lang?.split(" ")?.[0] || ""));
  const updateAttribute = debounce((attributes: CodeBlockAttributes) => {
    return props.state.updateAttributes(attributes);
  }, 200);
  const currentValue = (): string => {
    if (mode() === "lang") {
      return [attrs().lang, attrs().meta].filter(Boolean).join(" ");
    }

    return attrs().title || "";
  };
    on(attrs, (attrs) => {
      setSuggestions(suggestLanguage(attrs.lang || ""));
      props.changeLanguage(attrs.lang?.split(" ")?.[0] || null);
  createEffect(
    on(
      () => props.state.selected,
      () => {
        const element = menuRef();

        if (!element || !element.parentElement) return;

        const { left, width } = element.parentElement.getBoundingClientRect();
        const right = window.innerWidth - left - width;

        setLeft(-Math.abs((right - left) / 2));
      }
    )
  );
    <div
      class="pointer-events-auto flex bg-gray-50 dark:bg-gray-900 !md:bg-transparent border-gray-200 dark:border-gray-700 border-y-2 md:border-0 backdrop-blur-sm md:gap-2 w-screen md:w-auto !md:left-unset relative md:rounded-2xl"
      style={{ left: `${left()}px` }}
      ref={setMenuRef}
    >
      <Card class="flex py-0 m-0 border-0 md:border-2 px-1 gap-1">
        <Tooltip text="Title">
            path={mdiFileOutline}
            color={mode() === "title" ? "primary" : "contrast"}
            text={mode() === "title" ? "primary" : "soft"}
            variant={mode() === "title" ? "solid" : "text"}
            class="m-0"
            onClick={() => {
              setMode("title");
            }}
        <Tooltip text="Language">
          <IconButton
            path={mdiCodeTags}
            color={mode() === "lang" ? "primary" : "contrast"}
            text={mode() === "lang" ? "primary" : "soft"}
            variant={mode() === "lang" ? "solid" : "text"}
            class="m-0"
            onClick={() => {
              setMode("lang");
            }}
          ></IconButton>
        </Tooltip>
      </Card>
      <Card class="flex m-0 border-0 md:border-2 p-1 gap-1 flex-1">
        <Input
          wrapperClass="flex-1 max-w-full md:w-72"
          placeholder={mode() === "title" ? "Snippet title" : "Language meta"}
          value={currentValue()}
          suggestions={mode() === "lang" ? suggestions() : []}
          suggestionsBoxClass="mt-3 mx-0 mb-0"
          class="m-0 !bg-transparent text-lg"
          color="contrast"
          disabled={!props.state.editor.isEditable}
          setValue={(value) => {
            updateAttribute.clear();

            if (mode() === "lang") {
              const [lang, ...meta] = value.split(" ");

              updateAttribute({ meta: meta.join(" "), lang });
            } else {
              updateAttribute({ title: value });
            }
          }}
        />
      </Card>
      <Card class="flex m-0 border-0 md:border-2 p-1">
        <Show when={props.state.editor.isEditable}>
          <Tooltip text={formattingAvailable() ? "Format" : "Formatting unavailable"} class="mt-1">
            <IconButton
              path={mdiCodeTagsCheck}
              color="contrast"
              text="soft"
              variant="text"
              class="m-0"
              disabled={!formattingAvailable()}
              onClick={props.format}
            ></IconButton>
          </Tooltip>
        </Show>
      </Card>
          <NodeViewWrapper>
import { Component, createEffect, createSignal, on, onMount } from "solid-js";
import { useAppearance, useAuthenticatedUserData, useNotifications } from "#context";
  const [codeEditorActive, setCodeEditorActive] = createSignal(false);
      const formattedCode = (await formattingCode).trim();
    const contentHeight = Math.max(20, monacoEditor.getContentHeight());
        setCodeEditorActive(false);
      });
      codeEditor.onDidFocusEditorText(() => {
        setCodeEditorActive(true);
  createEffect(
    on(codeEditorActive, (active) => {
      if (active) {
        state().editor.commands.setNodeSelection(state().getPos());
      }
    })
  );
        "relative rounded-2xl text-base leading-4 not-prose",
          "bg-gray-50 dark:bg-gray-900 h-72 rounded-2xl rounded-editor-2xl border-2 border-gray-300 dark:border-gray-700 box-content customized-editor"
      <div
          "absolute w-full justify-center items-center -bottom-14 z-1 pointer-events-none",
          selected() ? "grid" : "hidden"
        <CodeBlockMenu changeLanguage={changeLanguage} format={format} state={state()} />
      </div>
      <div data-type="draggable-item" />
          if (
            container.parentElement?.classList.contains("ProseMirror") ||
            container.parentElement?.classList.contains("content") ||
            container.parentElement?.tagName === "TH" ||
            container.parentElement?.tagName === "TD" ||
            container.parentElement?.tagName === "LI" ||
            container.parentElement?.tagName === "BLOCKQUOTE"
          ) {

            let parentPos = document.getElementById("pm-container")?.getBoundingClientRect();

            if (container.parentElement?.classList.contains("content")) {
              parentPos = container.parentElement?.getBoundingClientRect();
            }
              top: rect.top - parentPos.top
import { ElementMenuEditor } from "./editor";
import { SolidEditor } from "@vrite/tiptap-solid";
import { Component, Show, createEffect, createSignal } from "solid-js";
import { Node as PMNode } from "@tiptap/pm/model";

interface ElementMenuProps {
  state: {
    pos: number;
    node: PMNode | null;
    container: HTMLElement | null;
    editor: SolidEditor;
    active: boolean;
  };
}

const ElementMenu: Component<ElementMenuProps> = (props) => {
  const [attributes, setAttributes] = createSignal({ type: "", props: {} as Record<string, any> });

  createEffect(() => {
    setAttributes((attributes) => {
      if (!props.state.node) {
        return { type: "", props: {} };
      }

      const newAttributes = props.state.node.attrs;

      if (
        newAttributes.type !== attributes.type ||
        JSON.stringify(newAttributes.props) !== JSON.stringify(attributes.props)
      ) {
        return { type: newAttributes.type, props: newAttributes.props };
      }

      return attributes;
    });
  });

  return (
    <Show when={props.state.editor.isEditable}>
      <div class="flex">
        <ElementMenuEditor
          state={{
            editor: props.state.editor,
            type: attributes()?.type || "",
            props: attributes()?.props || {},
            active: props.state.active,
            contentSize: props.state.node?.content.size || 0,

            removeElement() {
              props.state.editor.commands.command(({ tr, dispatch }) => {
                if (!dispatch) return false;

                const lastPos = props.state.pos;

                if (typeof lastPos === "number" && props.state.node) {
                  tr.delete(lastPos, lastPos + props.state.node.nodeSize);

                  return true;
                }

                return false;
              });
            },
            setElement(element) {
              props.state.editor.commands.command(({ tr, dispatch }) => {
                if (!dispatch) return false;

                const lastPos = props.state.pos;

                if (lastPos !== null) {
                  tr.setNodeAttribute(lastPos, "type", element.type);
                  tr.setNodeAttribute(lastPos, "props", element.props);

                  if (element.content && !props.state.node?.content.size) {
                    tr.replaceWith(
                      lastPos + 1,
                      lastPos + props.state.node!.content.size + 1,
                      props.state.editor.schema.node("paragraph")
                    );
                  } else if (!element.content && props.state.node?.content.size) {
                    tr.delete(lastPos + 1, lastPos + props.state.node!.content.size + 1);
                  }

                  return true;
                }

                return false;
              });
            }
          }}
        />
      </div>
    </Show>
  );
};

export { ElementMenu };
import {
  createEffect,
  createMemo,
  createRenderEffect,
  createSignal,
  lazy,
  on,
  onCleanup,
  onMount
} from "solid-js";
import { createRef } from "@vrite/components/src/ref";
import clsx from "clsx";
import { nanoid } from "nanoid";
import { SolidEditor } from "@vrite/tiptap-solid";
import { scrollIntoView } from "seamless-scroll-polyfill";
import { monaco } from "#lib/monaco";
import { useAppearance } from "#context";
import { formatCode } from "#lib/code-editor";

interface ElementMenuEditorProps {
  state: {
    type: string;
    active: boolean;
    props: Record<string, any>;
    editor: SolidEditor;
    contentSize: number;
    removeElement(): void;
    setElement(element: { type: string; props: Record<string, any>; content: boolean }): void;
  };
}

const codeEditorOptions: monaco.editor.IStandaloneEditorConstructionOptions = {
  automaticLayout: true,
  minimap: { enabled: false },
  contextmenu: false,
  fontSize: 17.5,
  fontFamily: "JetBrainsMonoVariable",
  scrollBeyondLastLine: false,
  model: null,
  wordWrap: "on",
  theme: "dark",
  suggestFontSize: 13,
  codeLensFontSize: 13,
  lineHeight: 26,
  suggestLineHeight: 21,
  overviewRulerBorder: false,
  overviewRulerLanes: 0,
  hideCursorInOverviewRuler: true,
  lineNumbers: "off",
  glyphMargin: false,
  folding: false,
  quickSuggestions: false,
  lightbulb: { enabled: false },
  hover: { enabled: false },
  lineDecorationsWidth: 0,
  lineNumbersMinChars: 0,
  renderLineHighlightOnlyWhenFocus: true,
  renderLineHighlight: "none",
  scrollbar: {
    vertical: "hidden",
    horizontal: "hidden",
    alwaysConsumeMouseWheel: false
  }
};
const ElementMenuEditor = lazy(async () => {
  const { monaco } = await import("#lib/monaco");

  return {
    default: (props: ElementMenuEditorProps) => {
      const { codeEditorTheme = () => "dark" } = useAppearance() || {};
      const [editorContainerRef, setEditorContainerRef] = createRef<HTMLElement | null>(null);
      const [coords, setCoords] = createSignal({ x: 0, y: 0 });
      const [visible, setVisible] = createSignal(true);
      const type = createMemo(() => props.state.type);
      const processCode = async (code: string): Promise<string> => {
        const codeTagClosed = code?.trim().replace(/>$/, "/>") || "";
        const formattedCode = await formatCode(codeTagClosed, "typescript", {
          printWidth: 60,
          trailingComma: "none",
          singleQuote: false
        });

        return formattedCode.replace(/ *?\/>;/gm, props.state.contentSize ? ">" : "/>").trim();
      };
      const propsValue = createMemo((previous) => {
        if (!previous || JSON.stringify(previous) !== JSON.stringify(props.state.props)) {
          return props.state.props;
        }

        return previous;
      });
      const editorCode = createMemo(() => {
        const keyValueProps = Object.entries(propsValue()).map(([key, value]) => {
          if (value === true) return key;

          const useBrackets =
            typeof value !== "string" || value.includes("\n") || value.includes(`"`);

          return `${key}=${useBrackets ? "{" : ""}${JSON.stringify(value)}${
            useBrackets ? "}" : ""
          }`;
        });

        return `<${type()}${keyValueProps.length ? " " : ""}${keyValueProps.join(" ")}>`;
      });
      const saveLastCoords = (event: MouseEvent): void => {
        setCoords({ x: event.clientX, y: event.clientY });
      };
      const onSave = async (code: string): Promise<void> => {
        const tagRegex = /^<(\w+?)(?:\s|\n|\/|>)/;
        const attributeRegex =
          /\s(\w+?)(?:=(?:(?:{((?:.|\n|\s)+?)})|(?:"((?:.|\n|\s)+?)")|(?:'((?:.|\n|\s)+?)')))?(?=(?:(?:\s|\n)+\w+=?)|(?:(?:\s|\n)*\/?>))/g;
        const [, tag] = tagRegex.exec(code.trim()) || [];
        const attributes: Record<string, any> = {};
        const processAttributes = async (): Promise<void> => {
          const match = attributeRegex.exec(code.trim());

          if (!match) return;

          const [, key] = match;
          const value = (match[2] || match[3] || match[4] || "true").trim();

          try {
            const processedValue = await formatCode(value, "json", {
              trailingComma: "none"
            });

            attributes[key] = JSON.parse(processedValue);
          } catch (e) {
            try {
              attributes[key] = JSON.parse(value);
            } catch (e) {
              if (!props.state.props[key] || typeof props.state.props[key] === "string") {
                attributes[key] = value;
              } else {
                attributes[key] = props.state.props[key];
              }
            }
          }

          await processAttributes();
        };

        await processAttributes();

        if (tag && tag !== "undefined") {
          props.state.setElement({
            type: tag,
            props: attributes,
            content: !code.endsWith("/>")
          });
        } else {
          props.state.removeElement();
        }
      };

      onMount(() => {
        const editorContainer = editorContainerRef()!;
        const codeEditor = monaco.editor.create(editorContainer, codeEditorOptions);
        const updateEditorHeight = (): void => {
          const container = codeEditor.getContainerDomNode();
          const contentHeight = Math.max(26, codeEditor.getContentHeight());

          if (editorContainer) {
            editorContainer.style.height = `${contentHeight}px`;
          }

          container.style.height = `${contentHeight}px`;
          codeEditor.layout({
            width: container.clientWidth,
            height: contentHeight
          });
        };

        codeEditor.onDidContentSizeChange(updateEditorHeight);
        codeEditor.onDidChangeModelContent(() => {
          const element = document.querySelector(".selected-element-tag") as HTMLElement;

          if (element) {
            element.textContent = codeEditor.getValue() || "";
            element.style.height = `${codeEditor.getContentHeight()}px`;
          }
        });
        codeEditor.onDidBlurEditorText(async () => {
          const element = document.querySelector(".selected-element-tag") as HTMLElement;

          if (element) {
            element.textContent = await processCode(editorCode());
          }

          await onSave(codeEditor.getValue());
        });
        codeEditor.onKeyDown((event) => {
          if (event.code === "Escape") {
            props.state.editor.commands.focus();
            event.preventDefault();
            event.stopPropagation();
          }
        });
        codeEditor.setModel(
          monaco.editor.createModel(
            editorCode(),
            "javascript",
            monaco.Uri.parse(`file:///${nanoid()}`)
          )
        );
        createEffect(() => {
          monaco.editor.setTheme(codeEditorTheme());
        });
        createEffect(
          on(
            () => props.state.active,
            (active, _, prevElement) => {
              const element: HTMLElement | null =
                (prevElement as HTMLElement) ||
                (document.querySelector(".selected-element-tag") as HTMLElement);

              if (element) {
                setTimeout(() => {
                  if (active) {
                    element.style.height = `${codeEditor.getContentHeight()}px`;

                    return element;
                  } else {
                    element.style.height = "unset";

                    return null;
                  }
                }, 0);
              }

              return element || null;
            }
          )
        );
        createEffect(
          on(editorCode, async (code) => {
            if (code === "<>") return codeEditor.setValue("");

            const selection = codeEditor.getSelection();
            const formattedCode = await processCode(code);

            codeEditor.setValue(formattedCode);
            if (selection) codeEditor.setSelection(selection);
          })
        );
        createEffect(
          on(type, (type, _previousType, handle) => {
            if (typeof handle === "number") clearTimeout(handle);

            if (type) {
              return window.setTimeout(() => {
                setVisible(true);

                const { position } =
                  codeEditor?.getTargetAtClientPoint(coords().x, coords().y) || {};

                if (position) {
                  codeEditor?.setSelection(monaco.Range.fromPositions(position, position));
                }

                scrollIntoView(editorContainer, { behavior: "smooth", block: "nearest" });
                codeEditor?.focus();
              }, 100);
            }
          })
        );
        onCleanup(() => {
          codeEditor.getModel()?.dispose();
          codeEditor.dispose();
        });
      });
      createRenderEffect(
        on(type, (type, previousType) => {
          if (type !== previousType) setVisible(false);
        })
      );
      window.addEventListener("pointerdown", saveLastCoords);
      onCleanup(() => {
        window.removeEventListener("pointerdown", saveLastCoords);
      });

      return (
        <div
          class={clsx(
            "w-full flex items-center justify-start",
            !visible() && "opacity-0 transition-opacity duration-200"
          )}
          contentEditable={false}
        >
          <div class="relative w-full">
            <div
              ref={setEditorContainerRef}
              class="w-full not-prose customized-editor customized-editor-contrast customized-editor-show-keyboard-hidden"
            ></div>
          </div>
        </div>
      );
    }
  };
});

export { ElementMenuEditor };
export * from "./plugin";
import { ElementMenu } from "./component";
import { Extension } from "@tiptap/core";
import { SolidEditor, SolidRenderer } from "@vrite/tiptap-solid";
import { CellSelection } from "@tiptap/pm/tables";
import { createNanoEvents } from "nanoevents";
import { NodeSelection } from "@tiptap/pm/state";
import { Node as PMNode } from "@tiptap/pm/model";

const emitter = createNanoEvents();
const generalMenuContainer = document.createElement("div");

let generalMenu: SolidRenderer<{
  editor: SolidEditor;
  pos: number;
  node: PMNode | null;
  container: HTMLElement | null;
  active: boolean;
}> | null = null;

const handleUpdate = (editor: SolidEditor): void => {
  const { selection } = editor.state;
  const selectedNode = selection.$from.nodeAfter;
  const isNodeSelection = selection instanceof NodeSelection;

  if (!isNodeSelection || !selectedNode || selectedNode.type.name !== "element") {
    generalMenuContainer.style.display = "none";
    generalMenu?.setState((state) => ({ ...state, active: false }));

    return;
  }

  const { view } = editor;
  const node = view.nodeDOM(selection.$from.pos);

  if (!node) return;

  const blockParent = node as HTMLElement;
  const parentPos = document.getElementById("pm-container")?.getBoundingClientRect();
  const childPos = blockParent?.getBoundingClientRect();

  if (!parentPos || !childPos) return;

  const relativePos = {
    top: childPos.top - parentPos.top,
    right: childPos.right - parentPos.right,
    bottom: childPos.bottom - parentPos.bottom,
    left: childPos.left - parentPos.left
  };

  Object.assign(generalMenuContainer.style, {
    width: `${Math.min(childPos?.width || parentPos.width, parentPos.width)}px`,
    top: `${relativePos.top}px`,
    left: `${relativePos.left}px`,
    position: "absolute",
    display: "block"
  });
  generalMenu?.setState(() => ({
    pos: selection.$from.pos,
    node: selectedNode,
    container: blockParent,
    editor,
    active: true
  }));
};
const ElementMenuPlugin = Extension.create({
  name: "elementMenu",
  onCreate() {
    generalMenu = new SolidRenderer(ElementMenu, {
      editor: this.editor as SolidEditor,
      state: {
        pos: 0,
        node: null as PMNode | null,
        container: null as HTMLElement | null,
        editor: this.editor as SolidEditor,
        active: false as boolean
      }
    });
    generalMenuContainer.appendChild(generalMenu.element);
    document.getElementById("pm-container")?.appendChild(generalMenuContainer);
  },
  onBlur() {
    const menuActive = document.activeElement?.contains(generalMenuContainer);

    if (!menuActive) {
      generalMenuContainer.style.display = "none";
      generalMenu?.setState((state) => ({ ...state, active: false }));
    }
  },
  onFocus() {
    const isCellSelection = this.editor.state.selection instanceof CellSelection;

    if (this.editor.isActive("element") && !isCellSelection) {
      generalMenuContainer.style.display = "block";
      generalMenu?.setState((state) => ({ ...state, active: true }));
    }
  },
  onUpdate() {
    handleUpdate(this.editor as SolidEditor);
  },
  onSelectionUpdate() {
    handleUpdate(this.editor as SolidEditor);
  }
});

export { ElementMenuPlugin, emitter };
import { Element as BaseElement, ElementAttributes } from "@vrite/editor";
import { SolidEditor } from "@vrite/tiptap-solid";
import { NodeView } from "@tiptap/core";
import { keymap } from "@tiptap/pm/keymap";
import { Node } from "@tiptap/pm/model";
import { EditorState } from "@tiptap/pm/state";
import { Node as PMNode } from "@tiptap/pm/model";
import { formatCode } from "#lib/code-editor";

const getOpeningTag = async (node: PMNode): Promise<string> => {
  const keyValueProps = Object.entries(node.attrs.props).map(([key, value]) => {
    if (value === true) return key;

    const useBrackets = typeof value !== "string" || value.includes("\n") || value.includes(`"`);

    return `${key}=${useBrackets ? "{" : ""}${JSON.stringify(value)}${useBrackets ? "}" : ""}`;
  });
  const c = `<${node.attrs.type}${keyValueProps.length ? " " : ""}${keyValueProps.join(" ")}>`;
  const codeTagClosed = c.trim().replace(/>$/, "/>") || "";
  const formattedCode = await formatCode(codeTagClosed, "typescript", {
    printWidth: 60,
    trailingComma: "none",
    singleQuote: false
  });

  return formattedCode.replace(/ *?\/>;/gm, node.content.size ? ">" : "/>").trim();
};
const getClosingTag = (node: PMNode): string => node.attrs.type;
const Element = BaseElement.extend({
  addProseMirrorPlugins() {
    const handleDeleteElement = (state: EditorState): boolean => {
      if (this.editor.isActive("element")) {
        const currentDepth = state.selection.$from.depth;

        let node: Node | null = null;
        let pos: number | null = null;

        for (let i = currentDepth; i >= 0; i--) {
          const currentNode = state.selection.$from.node(i);

          if (currentNode.type.name === "element") {
            node = currentNode;
            pos = i > 0 ? state.selection.$from.before(i) : 0;
            break;
          }
        }

        if (
          node &&
          !node.textContent &&
          node.content.childCount === 1 &&
          node.content.firstChild?.type.name === "paragraph" &&
          typeof pos === "number"
        ) {
          this.editor
            .chain()
            .deleteRange({
              from: pos,
              to: pos + node.nodeSize
            })
            .focus()
            .run();

          return true;
        }
      }

      return false;
    };

    return [
      keymap({
        Delete: handleDeleteElement,
        Backspace: handleDeleteElement
      })
    ];
  },
  addNodeView() {
    return (props) => {
      let node = props.node as Node;

      const editor = this.editor as SolidEditor;
      const referenceView = new NodeView(() => {}, props);
      const dom = document.createElement("div");
      const contentContainer = document.createElement("div");
      const content = document.createElement("div");
      const code = document.createElement("code");
      const bottomCode = document.createElement("code");
      const bottomCodeStart = document.createElement("span");
      const bottomCodeKey = document.createElement("span");
      const bottomCodeEnd = document.createElement("span");
      const handleCodeClick = (event: MouseEvent): void => {
        if (typeof props.getPos === "function") {
          editor.commands.setTextSelection(props.getPos());
          editor.commands.setNodeSelection(props.getPos());
        }

        event.preventDefault();
        event.stopPropagation();
      };

      getOpeningTag(props.node).then((openingTag) => (code.textContent = openingTag));
      bottomCodeKey.textContent = getClosingTag(node);
      contentContainer.setAttribute(
        "class",
        "px-3 w-full border-gray-300 dark:border-gray-700 border-l-2 ml-1 py-0 content"
      );
      dom.setAttribute("class", "flex flex-col justify-center items-center relative");
      dom.setAttribute("data-element", "true");
      content.setAttribute("class", "relative content");
      contentContainer.append(content);
      dom.append(code, contentContainer, bottomCode);
      code.setAttribute(
        "class",
        "!whitespace-pre-wrap leading-[26px] min-h-6.5 block w-full !p-0 !bg-transparent !rounded-0 !text-gray-400 !dark:text-gray-400 cursor-pointer"
      );
      bottomCode.setAttribute(
        "class",
        "block w-full !p-0 leading-[26px] min-h-6.5 !rounded-0 !bg-transparent !text-gray-400 !dark:text-gray-400 cursor-pointer"
      );
      code.contentEditable = "false";
      bottomCode.contentEditable = "false";
      bottomCode.append(bottomCodeStart, bottomCodeKey, bottomCodeEnd);
      bottomCodeStart.textContent = "</";
      bottomCodeEnd.textContent = ">";
      code.addEventListener("click", handleCodeClick);
      bottomCode.addEventListener("click", handleCodeClick);

      if (!node.content.size) {
        bottomCode.classList.add("!hidden");
      }

      return {
        dom,
        contentDOM: content,
        ignoreMutation(mutation: MutationRecord | { type: "selection"; target: Element }) {
          if (mutation.type === "selection") {
            return true;
          }

          return referenceView.ignoreMutation(mutation);
        },
        selectNode() {
          contentContainer.classList.add("!border-primary");
          code.classList.add("selected-element-tag");
          bottomCode.classList.remove("!text-gray-400", "!dark:text-gray-400");
          bottomCode.classList.add("!text-[#000000]", "!dark:text-[#DCDCDC]");
          bottomCodeKey.classList.add("!text-[#008080]", "!dark:text-[#3dc9b0]");
        },
        deselectNode() {
          contentContainer.classList.remove("!border-primary");
          code.classList.remove("selected-element-tag");
          bottomCode.classList.add("!text-gray-400", "!dark:text-gray-400");
          bottomCode.classList.remove("!text-[#000000]", "!dark:text-[#DCDCDC]");
          bottomCodeKey.classList.remove("!text-[#008080]", "!dark:text-[#3dc9b0]");
        },
        stopEvent(event) {
          return referenceView.stopEvent(event);
        },
        update(newNode) {
          if (newNode.type.name !== "element") return false;

          node = newNode as Node;
          getOpeningTag(node).then((openingTag) => (code.textContent = openingTag));
          bottomCodeKey.textContent = getClosingTag(node);

          if (node.content.size) {
            bottomCode.classList.remove("!hidden");
          } else {
            bottomCode.classList.add("!hidden");
          }

          return true;
        }
      };
    };
  }
});

export { Element };
export type { ElementAttributes };
import { Component, createEffect, createSignal, on } from "solid-js";
import { Card, Input } from "#components/primitives";
import { EmbedType, createRef, getEmbedId, getEmbedSrc } from "#lib/utils";
  const [menuRef, setMenuRef] = createRef<HTMLElement | null>(null);
  const [left, setLeft] = createSignal(0);
  createEffect(
    on(
      () => props.state.selected,
      () => {
        const element = menuRef();

        if (!element || !element.parentElement) return;

        const { left, width } = element.parentElement.getBoundingClientRect();
        const right = window.innerWidth - left - width;

        setLeft(-Math.abs((right - left) / 2));
      }
    )
  );

    <div
      class="pointer-events-auto flex bg-gray-50 dark:bg-gray-900 !md:bg-transparent border-gray-200 dark:border-gray-700 border-y-2 md:border-0 backdrop-blur-sm md:gap-2 w-screen md:w-auto !md:left-unset relative md:rounded-2xl"
      style={{ left: `${left()}px` }}
      ref={setMenuRef}
    >
      <Card class="flex m-0 border-0 md:border-2 p-1">
        <Input
          wrapperClass="max-w-full min-w-unset md:w-96 flex-1"
          class="w-full bg-transparent m-0 flex-1 text-lg"
          placeholder={getInputPlaceholder(attrs().embed as EmbedType)}
          value={attrs().input || ""}
          disabled={!props.state.editor.isEditable}
          setValue={(value) => {
            props.state.updateAttributes({ input: value, src: getSrc(value) });
          }}
        />
      </Card>
import { Icon } from "#components/primitives";
    <NodeViewWrapper>
                "pt-[35%] w-full rounded-2xl bg-gradient-to-tr flex justify-center items-center relative border-2 border-gray-300 dark:border-gray-700"
            class="object-contain w-full m-0 transition-opacity duration-300 border-2 border-gray-300 dark:border-gray-700 aspect-video min-h-96 rounded-2xl"
        <div
          class={clsx(
            "absolute w-full justify-center items-center -bottom-14 z-1 pointer-events-none",
            selected() ? "grid" : "hidden"
          )}
        >
        </div>
        <div data-type="draggable-item" />
import { Component, createEffect, createSignal, on, onMount } from "solid-js";
import clsx from "clsx";
import { createRef, uploadFile as uploadFileUtil } from "#lib/utils";
import { Card, IconButton, Input, Tooltip } from "#components/primitives";
  const [menuRef, setMenuRef] = createRef<HTMLElement | null>(null);
  const [left, setLeft] = createSignal(0);
  const placeholder = (): string => {
    if (inputMode() === "src") {
      return options().cover ? "Cover image URL" : "Image URL";
    }

    return options().cover ? "Cover alt description" : "Alt description";
  };
      if (uploadedUrl) props.state.updateAttributes({ src: uploadedUrl });
  const inputId = nanoid();
  createEffect(
    on(
      () => props.state.selected,
      () => {
        const element = menuRef();

        if (!element || !element.parentElement) return;

        const { left, width } = element.parentElement.getBoundingClientRect();
        const right = window.innerWidth - left - width;

        setLeft(-Math.abs((right - left) / 2));
      }
    )
  );

    <div
      class={clsx(
        "pointer-events-auto flex bg-gray-50 dark:bg-gray-900 border-gray-200 dark:border-gray-700 border-y-2 backdrop-blur-sm relative !md:left-unset",
        options().cover && "w-full border-t-0",
        !options().cover &&
          "md:gap-2 w-screen md:w-auto md:border-0 md:rounded-2xl !md:bg-transparent"
      )}
      style={{ left: `${left()}px` }}
      ref={setMenuRef}
    >
      <Card class={clsx("flex py-0 m-0 border-0  px-1 gap-1", !options().cover && "md:border-2")}>
        <Tooltip text="Alt">
          <IconButton
            path={mdiText}
            color={inputMode() === "alt" ? "primary" : "contrast"}
            text={inputMode() === "alt" ? "primary" : "soft"}
            variant={inputMode() === "alt" ? "solid" : "text"}
            class="m-0"
            onClick={() => {
              setInputMode("alt");
            }}
          ></IconButton>
        </Tooltip>
        <Tooltip text="Image URL">
          <IconButton
            path={mdiLinkVariant}
            color={inputMode() === "src" ? "primary" : "contrast"}
            text={inputMode() === "src" ? "primary" : "soft"}
            variant={inputMode() === "src" ? "solid" : "text"}
            class="m-0"
            onClick={() => {
              setInputMode("src");
            }}
          ></IconButton>
        </Tooltip>
      </Card>
      <Card class={clsx("p-1 m-0 border-0 flex-1", !options().cover && "md:border-2")}>
        <Input
          wrapperClass={clsx("max-w-full min-w-unset flex-1", !options().cover && "md:w-96 ")}
          class="w-full bg-transparent m-0 flex-1 text-lg"
          placeholder={placeholder()}
          value={attrs()[inputMode()] || ""}
          disabled={!props.state.editor.isEditable}
          setValue={(value) => {
            updateAttribute.clear();
            updateAttribute(inputMode(), value);
        />
      </Card>
      <Card class={clsx("p-1 m-0 border-0", !options().cover && "md:border-2")}>
          <Tooltip text={uploading() ? "Uploading" : "Upload image"} class="mt-1">
            <IconButton
              loading={uploading()}
              path={mdiUpload}
              color="contrast"
              class="m-0"
              text="soft"
              badge
              variant="text"
            ></IconButton>
      </Card>
import { Icon, Loader } from "#components/primitives";
  const [currentSrc, setCurrentSrc] = createSignal("");
    if (currentSrc()) {
    if (!src) {
      setError(false);
      setLoading(false);
      return;
    }
    if (!validateURL(src)) {

      return;

    setCurrentSrc(src);
    <NodeViewWrapper>
            options().cover ? "border-b-2" : "border-2 rounded-2xl"
          <div
            class={clsx(
              "w-full border-gray-200 dark:border-gray-700 flex justify-center items-center overflow-hidden bg-gray-100 dark:bg-gray-800 relative",
              !error() && !loading() && currentSrc() ? "" : "opacity-0 !absolute",
              !options().cover && "rounded-2xl"
            )}
                "overflow-hidden min-w-40 !h-full",
                state().editor.isEditable && "resize"
              )}
              ref={handleNewImageContainer}
              style={{ width: attrs().width }}
            >
              <img
                alt={attrs().alt}
                src={currentSrc()}
                class={clsx("object-contain w-full m-0 transition-opacity duration-300")}
                onLoad={(event) => {
                  setError(false);
                  setLoading(false);

                  const image = event.currentTarget;
                  const w = image.naturalWidth;
                  const h = image.naturalHeight;
                  const aspectRatio = w / h;

                  updateAspectRatio.clear();
                  updateAspectRatio(`${aspectRatio}`);
                }}
                onError={() => {
                  if (!currentSrc()) return;

                  setLoading(false);
                  removeImage();
                  setError(true);
                }}
              />
            </div>
          </div>
          <Show when={loading() || !currentSrc()}>
            <div
              class={clsx(
                "w-full bg-gradient-to-tr flex justify-center items-center relative",
                options().cover ? "min-h-48" : "rounded-2xl"
              style={{
                "padding-top": getPaddingTop()
              }}
              <div class="absolute flex flex-col items-center justify-center font-bold text-white transform -translate-y-1/2 top-1/2">
                <Show when={!loading()} fallback={<Loader class="w-8 h-8" />}>
                  <Show
                    when={!error()}
                    fallback={
                      <>
                        <Icon path={mdiAlertCircle} class="w-16 h-16" />
                        <span class="absolute top-full">Error</span>
                      </>
                    }
                  >
                    <Icon path={mdiImage} class="w-16 h-16" />
                  </Show>
                </Show>
        <div
            "w-full justify-center items-center z-1 pointer-events-none",
            selected() ? "grid" : "hidden",
            options().cover ? "!flex relative" : "absolute -bottom-14"
        </div>
        <div data-type="draggable-item" />
export * from "./element";
export * from "./element-menu";
  block?: App.WorkspaceSettings["blocks"][number];
monaco.editor.defineTheme("light", { ...lightTheme, base: "vs" });
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
  diagnosticCodesToIgnore: [17008, 1005]
});
  @apply !w-full !m-0;
  @apply !border-primary !w-full !z-1 !my-0 !top-0;
}
div:not([data-element="true"]) + .ProseMirror-gapcursor:has(+ div)::after,
div + .ProseMirror-gapcursor:has(+ div:not([data-element="true"]))::after {
  @apply !my-2.5;
  .ProseMirror {
    @apply pb-48;
      @apply border-2 border-gray-300 dark:border-gray-700;
      @apply text-left font-500 border-2 border-gray-300 dark:border-gray-700 relative p-2 vertical-top;
    // @apply my-5;
    //@apply m-0;
  --highlighted-thread: "";
  :where([aria-expanded="false"] > .ProseMirror, .content, blockquote, li) {
    &
      > :where(div, ul, ol, p, blockquote, hr):not(.ProseMirror-gapcursor)
      + :where(div, ul, ol, p, blockquote, hr, h1, h2, h3, h4, h5, h6):not([data-element="true"]),
    &
      > :where(div, ul, ol, p, blockquote, hr):not([data-element="true"], .ProseMirror-gapcursor)
      + :where(div, ul, ol, p, blockquote, hr, h1, h2, h3, h4, h5, h6),
    &
      > :where(div, ul, ol, p, blockquote, hr):not(.ProseMirror-gapcursor)
      + .ProseMirror-gapcursor
      + :where(div, ul, ol, p, blockquote, hr, h1, h2, h3, h4, h5, h6):not([data-element="true"]),
    &
      > :where(div, ul, ol, p, blockquote, hr):not([data-element="true"], .ProseMirror-gapcursor)
      + .ProseMirror-gapcursor
      + :where(div, ul, ol, p, blockquote, hr, h1, h2, h3, h4, h5, h6) {
      @apply mt-5;
    }
  }
  :where(div[data-element="true"]) {
    .content > .ProseMirror-gapcursor:first-child + *,
    .content > :first-child > div > [data-node-view-wrapper="true"],
    .content > .ProseMirror-gapcursor:first-child + * > div > [data-node-view-wrapper="true"] {
    .content > :last-child,
    .content > .ProseMirror-gapcursor:last-child + *,
    .content > :last-child > div > [data-node-view-wrapper="true"],
    .content > .ProseMirror-gapcursor:last-child + * > div > [data-node-view-wrapper="true"] {
    font-family: "JetBrainsMonoVariable", monospace !important;
.ProseMirror .monaco-editor,
.ProseMirror .monaco-editor > *:first-child {

.monaco-editor .editor-widget {
  @apply overflow-hidden;
  border-radius: 0.5rem !important;
}
.monaco-editor .monaco-hover {
  border-radius: 0.5rem !important;
}
.rounded-editor-2xl {
  .monaco-editor,
  .monaco-editor > *:first-child {
    @apply rounded-2xl;
  }
}
.rounded-editor-t-2xl {
  .monaco-editor,
  .monaco-editor > *:first-child {
    border-top-left-radius: calc(1rem - 2px);
    border-top-right-radius: calc(1rem - 2px);
  }
}

.rounded-editor-lg {
  .monaco-editor,
  .monaco-editor > *:first-child {
    @apply rounded-lg;
  }
}
.customized-editor-show-keyboard-hidden {
  [widgetid="editor.contrib.ShowKeyboardWidget"] {
    display: none !important;
  }
}
.customized-editor {
  --customized-editor-background: #f9fafb;
  --customized-editor-widget-background: #f3f4f6;
  .mtk2 {
    color: var(--customized-editor-background);
  }
  .monaco-editor {
    .inputarea.ime-input {
      background-color: var(--customized-editor-background);
    }
    .view-overlays .current-line {
      background-color: var(--customized-editor-widget-background) !important;
      @apply border-gray-300 border-0;
    }
    .view-overlays > *:last-child:first-child .current-line {
      background-color: transparent !important;
    }
    --vscode-editor-background: var(--customized-editor-background);
    --vscode-editorStickyScroll-background: var(--customized-editor-background);
    --vscode-breadcrumb-background: var(--customized-editor-background);
    --vscode-editorGutter-background: var(--customized-editor-background);
    --vscode-editorMarkerNavigation-background: var(--customized-editor-background);

    // Editor Widget
    .find-widget {
      background-color: var(--customized-editor-widget-background);
    }
    --vscode-editorWidget-background: var(--customized-editor-widget-background);
    --vscode-quickInput-background: var(--customized-editor-widget-background);
    --vscode-editorHoverWidget-background: var(--customized-editor-widget-background);
    --vscode-listFilterWidget-background: var(--customized-editor-widget-background);
    --vscode-checkbox-selectBackground: var(--customized-editor-widget-background);
    --vscode-breadcrumbPicker-background: var(--customized-editor-widget-background);
  }
}
.customized-editor-contrast {
  --customized-editor-background: #f3f4f6;
  --customized-editor-widget-background: #f9fafb;
}
.dark {
  .customized-editor {
    --customized-editor-background: #111827;
    --customized-editor-widget-background: #1f2937;
  }
  .customized-editor-contrast {
    --customized-editor-background: #1f2937;
    --customized-editor-widget-background: #111827;
  }
}
  magicLinkAlreadySent: "Wait 1 min before requesting a new magic link",
        <div class="h-full w-full absolute top-0 left-0 bg-gray-100 dark:bg-gray-800 flex justify-center items-center z-12">
            props.setSlug(
              value
                .split("/")
                .map((slugPart) => convertToSlug(slugPart))
                .join("/")
            );
import { AllSelection, NodeSelection } from "@tiptap/pm/state";
  ElementMenuPlugin,
      ElementMenuPlugin,
    const isNodeSelection = selection instanceof NodeSelection;
    if ((!view.hasFocus() && !isNodeSelection) || isAllSelection) {
      isNodeSelection &&
      ["horizontalRule", "image", "codeBlock", "embed", "element"].some((name) => {
      $anchor.depth === 1 ||
      ["element", "blockquote", "listItem", "taskItem"].includes(
        $anchor.node($anchor.depth - 1)?.type?.name
      );
              placement: "bottom",
              popperOptions: { modifiers: [{ name: "flip", enabled: false }] },
import { mdiPlus, mdiKeyboardCloseOutline } from "@mdi/js";
import clsx from "clsx";
import { Component } from "solid-js";
import { SolidEditor } from "@vrite/tiptap-solid";
import { Card, IconButton } from "#components/primitives";

const BlockMenu: Component<{
  class?: string;
  mode: string;
  opened: boolean;
  editor: SolidEditor;
  blur?(): void;
  setMode(mode: string): void;
  setBlockMenuOpened?(opened: boolean): void;
}> = (props) => {
  return (
    <Card
      class={clsx(
        "relative flex p-0 overflow-x-auto scrollbar-hidden md:overflow-initial not-prose",
        props.class
      )}
    >
      <IconButton
        path={mdiPlus}
        text="soft"
        variant="text"
        label="Insert block"
        onClick={(event) => {
          props.setBlockMenuOpened?.(true);
          event.preventDefault();
          event.stopPropagation();
        }}
      />
      <IconButton
        path={mdiKeyboardCloseOutline}
        text="soft"
        variant="text"
        onClick={(event) => {
          props.blur?.();
          event.preventDefault();
          event.stopPropagation();
        }}
      />
    </Card>
  );
};

export { BlockMenu };
import clsx from "clsx";
import { Component, For, createSignal } from "solid-js";
import { SolidEditor } from "@vrite/tiptap-solid";
import {
  mdiFormatBold,
  mdiFormatItalic,
  mdiFormatStrikethrough,
  mdiCodeTags,
  mdiLinkVariant,
  mdiFormatColorHighlight,
  mdiFormatSubscript,
  mdiFormatSuperscript,
  mdiKeyboardCloseOutline,
  mdiCommentOutline
} from "@mdi/js";
import { nanoid } from "nanoid";
import { Card, IconButton, Tooltip } from "#components/primitives";
import { App, useAuthenticatedUserData, useClient } from "#context";
import { breakpoints } from "#lib/utils";

const FormatMenu: Component<{
  class?: string;
  mode: string;
  opened: boolean;
  editor: SolidEditor;
  contentPieceId?: string;
  blur?(): void;
  setMode(mode: string): void;
}> = (props) => {
  const [activeMarks, setActiveMarks] = createSignal<string[]>([]);
  const { workspaceSettings = () => null } = useAuthenticatedUserData() || {};
  const client = useClient();
  const commentMenuItem = {
    icon: mdiCommentOutline,
    mark: "comment",
    label: "Comment",
    async onClick() {
      if (props.editor.isActive("comment")) {
        props.editor.commands.unsetComment();
      } else {
        const threadFragment = nanoid();

        props.editor.chain().setComment({ thread: threadFragment }).focus().run();

        try {
          await client.comments.createThread.mutate({
            contentPieceId: props.contentPieceId || "",
            fragment: threadFragment
          });
        } catch (error) {
          props.editor.commands.unsetComment();
        }
      }
    }
  };
  const closeKeyboardItem = {
    icon: mdiKeyboardCloseOutline,
    label: "Close keyboard",
    async onClick() {
      props.editor.commands.blur?.();
    }
  };
  const menus = (
    [
      {
        icon: mdiFormatBold,
        mark: "bold",
        label: "Bold"
      },
      {
        icon: mdiFormatItalic,
        mark: "italic",
        label: "Italic"
      },
      {
        icon: mdiFormatStrikethrough,
        mark: "strike",
        label: "Strike"
      },
      {
        icon: mdiCodeTags,
        mark: "code",
        label: "Code"
      },
      {
        icon: mdiLinkVariant,
        mark: "link",
        label: "Link",
        onClick() {
          props.setMode("link");
        }
      },
      { icon: mdiFormatColorHighlight, mark: "highlight", label: "Highlight" },
      { icon: mdiFormatSubscript, mark: "subscript", label: "Subscript" },
      { icon: mdiFormatSuperscript, mark: "superscript", label: "Superscript" },
      ...(props.contentPieceId && breakpoints.md() ? [commentMenuItem] : []),
      ...(breakpoints.md() ? [] : [closeKeyboardItem])
    ] as Array<{ icon: string; mark?: string; label: string; onClick?(): void }>
  ).filter(({ mark }) => {
    if (!mark || mark === "comment") return true;

    if (!workspaceSettings()) {
      return true;
    }

    return workspaceSettings()!.marks.includes(mark as App.WorkspaceSettings["marks"][number]);
  });
  const marks = menus.map((menu) => menu.mark);

  props.editor.on("update", () => {
    setActiveMarks(marks.filter((mark) => mark && props.editor.isActive(mark)) as string[]);
  });
  props.editor.on("selectionUpdate", () => {
    setActiveMarks(marks.filter((mark) => mark && props.editor.isActive(mark)) as string[]);
  });

  return (
    <Card
      class={clsx(
        "relative flex p-0 overflow-x-auto scrollbar-hidden md:overflow-initial not-prose",
        props.class
      )}
    >
      <For
        each={menus}
        fallback={<span class="px-1.5 py-0.5 text-base">No available options</span>}
      >
        {(menu) => {
          const active = (): boolean => {
            return Boolean(menu.mark && activeMarks().includes(menu.mark));
          };

          return (
            <Tooltip text={menu.label} side="bottom" wrapperClass="snap-start">
              <IconButton
                path={menu.icon}
                text={active() ? "primary" : "soft"}
                variant={active() ? "solid" : "text"}
                color={active() ? "primary" : "base"}
                onClick={(event) => {
                  const chain = props.editor.chain();

                  if (menu.onClick) {
                    menu.onClick();
                  } else if (menu.mark) {
                    if (menu.mark !== "code") {
                      chain.unsetCode();
                    }

                    chain.toggleMark(menu.mark).focus().run();
                  }

                  event.preventDefault();
                  event.stopPropagation();
                }}
              />
            </Tooltip>
          );
        }}
      </For>
    </Card>
  );
};

export { FormatMenu };
import { LinkMenu } from "./link";
import { FormatMenu } from "./format";
import { TableMenu } from "./table";
import { BlockMenu } from "./block";
import { SolidEditor } from "@vrite/tiptap-solid";
import { CellSelection } from "@tiptap/pm/tables";
import { Component, createEffect, createSignal, Match, on, Switch } from "solid-js";
import { Ref } from "#lib/utils";

type BubbleMenuMode = "format" | "link" | "table" | "block";
interface BubbleMenuProps {
  editor: SolidEditor;
  opened: boolean;
  contentPieceId?: string;
  class?: string;
  mode?: BubbleMenuMode;
  ref?: Ref<HTMLElement>[1];
  blur?(): void;
  setBlockMenuOpened?(opened: boolean): void;
}

const BubbleMenu: Component<BubbleMenuProps> = (props) => {
  const [mode, setMode] = createSignal<BubbleMenuMode>("format");

  props.editor.on("selectionUpdate", ({ editor }) => {
    const { selection } = editor.state;

    if (props.editor.state.selection instanceof CellSelection) {
      setMode("table");
    } else if (!props.editor.state.selection.empty) {
      setMode("format");
    }
  });
  createEffect(
    on(
      () => props.mode,
      (mode) => {
        setMode((currentMode) => mode || currentMode);
      }
    )
  );
  createEffect(
    on(
      () => props.opened,
      (opened) => {
        if (!opened) {
          setTimeout(() => {
            setMode("format");
          }, 300);
        }
      }
    )
  );

  return (
    <Switch>
      <Match when={mode() === "block"}>
        <BlockMenu
          editor={props.editor}
          mode={mode()}
          opened={props.opened}
          setMode={setMode}
          setBlockMenuOpened={props.setBlockMenuOpened}
          blur={props.blur}
          class={props.class}
        />
      </Match>
      <Match when={mode() === "table"}>
        <TableMenu
          editor={props.editor}
          mode={mode()}
          opened={props.opened}
          setMode={setMode}
          class={props.class}
        />
      </Match>
      <Match when={mode() === "format"}>
        <FormatMenu
          editor={props.editor}
          mode={mode()}
          opened={props.opened}
          setMode={setMode}
          class={props.class}
          contentPieceId={props.contentPieceId}
          blur={props.blur}
        />
      </Match>
      <Match when={mode() === "link"}>
        <LinkMenu
          editor={props.editor}
          mode={mode()}
          opened={props.opened}
          setMode={setMode}
          class={props.class}
        />
      </Match>
    </Switch>
  );
};

export { BubbleMenu };
import { mdiCheck, mdiDelete } from "@mdi/js";
import clsx from "clsx";
import { Component, createEffect, createSignal, on } from "solid-js";
import { SolidEditor } from "@vrite/tiptap-solid";
import { Card, Input, IconButton } from "#components/primitives";
import { createRef } from "#lib/utils";

const LinkMenu: Component<{
  class?: string;
  mode: string;
  opened: boolean;
  editor: SolidEditor;
  setMode(mode: string): void;
}> = (props) => {
  const [link, setLink] = createSignal("");
  const [linkInputRef, setLinkInputRef] = createRef<HTMLInputElement | null>(null);
  const saveLink = (): void => {
    props.editor.chain().unsetCode().setLink({ href: link() }).focus().run();
    props.setMode("format");
  };

  createEffect(
    on(
      () => props.opened,
      (opened) => {
        if (!opened) {
          setLink("");
        }
      }
    )
  );
  createEffect(
    on(
      () => props.mode,
      (mode) => {
        if (mode === "link") {
          setLink(props.editor.getAttributes("link").href || "");
          setTimeout(() => {
            const linkInput = linkInputRef();

            linkInput?.focus();
          }, 300);
        } else {
          setLink("");
        }
      }
    )
  );

  return (
    <Card
      class={clsx(
        "relative flex p-0 overflow-x-auto scrollbar-hidden md:overflow-initial not-prose",
        props.class
      )}
    >
      <Input
        ref={setLinkInputRef}
        value={link()}
        placeholder="Paste a link..."
        wrapperClass="w-full md:w-auto"
        setValue={(value) => {
          setLink(value);
        }}
        onEnter={saveLink}
        class="py-0 my-0 bg-transparent"
      />
      <IconButton path={mdiCheck} text="soft" variant="text" onClick={saveLink} />
      <IconButton
        path={mdiDelete}
        text="soft"
        variant="text"
        onClick={() => {
          props.editor.chain().unsetLink().focus().run();
          props.setMode("format");
        }}
      />
    </Card>
  );
};

export { LinkMenu };
import {
  mdiTableColumnRemove,
  mdiTableHeadersEyeOff,
  mdiTableMergeCells,
  mdiTableRemove,
  mdiTableRowRemove,
  mdiTableSplitCell
} from "@mdi/js";
import clsx from "clsx";
import { Component, For, Show, createEffect, on } from "solid-js";
import { SolidEditor } from "@vrite/tiptap-solid";
import { CellSelection } from "@tiptap/pm/tables";
import { Card, IconButton, Tooltip } from "#components/primitives";
import { createRef } from "#lib/utils";

const TableMenu: Component<{
  class?: string;
  mode: string;
  opened: boolean;
  editor: SolidEditor;
  setMode(mode: string): void;
}> = (props) => {
  const tableMenus = [
    {
      icon: mdiTableHeadersEyeOff,
      label: "Toggle header cell off",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);
          const rowNode = selection.$anchorCell.node(2);

          if (tableNode.child(0) === rowNode) {
            return false;
          }

          return selection.$anchorCell.nodeAfter?.type.name === "tableHeader";
        }

        return false;
      },
      onClick() {
        props.editor.chain().toggleHeaderCell().focus().run();
      }
    },
    {
      icon: mdiTableMergeCells,
      label: "Merge cells",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          return selection.$anchorCell.pos !== selection.$headCell.pos;
        }

        return false;
      },
      onClick() {
        props.editor.chain().mergeCells().run();
      }
    },
    {
      icon: mdiTableSplitCell,
      label: "Split cell",
      show() {
        const { selection } = props.editor.state;

        if (
          selection instanceof CellSelection &&
          selection.$anchorCell.pos === selection.$headCell.pos
        ) {
          return (
            selection.$anchorCell.nodeAfter?.attrs.colspan > 1 ||
            selection.$anchorCell.nodeAfter?.attrs.rowspan > 1
          );
        }

        return false;
      },
      onClick() {
        props.editor.chain().splitCell().run();
      }
    },
    {
      icon: mdiTableColumnRemove,
      label: "Delete column(s)",
      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          let isSingleColumn = false;

          tableNode.content.forEach((rowNode) => {
            isSingleColumn = rowNode.childCount === 1;
          });

          return !isSingleColumn;
        }

        return true;
      },
      onClick() {
        props.editor.chain().deleteColumn().focus().run();
      }
    },
    {
      icon: mdiTableRowRemove,
      label: "Delete row(s)",

      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          if (tableNode.content.childCount === 1) {
            return false;
          }
        }

        return true;
      },
      onClick() {
        props.editor.chain().deleteRow().focus().run();
      }
    },
    {
      icon: mdiTableRemove,
      label: "Delete table",

      show() {
        const { selection } = props.editor.state;

        if (selection instanceof CellSelection) {
          const tableNode = selection.$anchorCell.node(1);

          if (tableNode.childCount === 1) return true;

          let isSingleColumn = false;

          tableNode.content.forEach((rowNode) => {
            isSingleColumn = rowNode.childCount === 1;
          });

          return isSingleColumn;
        }

        return false;
      },
      onClick() {
        props.editor.chain().deleteTable().focus().run();
      }
    }
  ];

  return (
    <Card
      class={clsx(
        "relative flex p-0 overflow-x-auto scrollbar-hidden md:overflow-initial not-prose",
        props.class
      )}
    >
      <For
        each={tableMenus}
        fallback={<span class="px-1.5 py-0.5 text-base">No available options</span>}
      >
        {(menuItem) => {
          return (
            <Show when={!menuItem.show || menuItem.show()}>
              <Tooltip text={menuItem.label} side="bottom" wrapperClass="snap-start">
                <IconButton
                  path={menuItem.icon}
                  text="soft"
                  variant="text"
                  color="base"
                  onClick={(event) => {
                    menuItem.onClick();
                    event.preventDefault();
                    event.stopPropagation();
                  }}
                />
              </Tooltip>
            </Show>
          );
        }}
      </For>
    </Card>
  );
};

export { TableMenu };
export * from "./bubble";
export * from "./comment-threads";
export * from "./export";
export * from "./floating";
export * from "./link-preview";
export * from "./stats";
import { ExtensionDetails, hasPermission, useClient, useExtensions } from "#context";
  const { callFunction } = useExtensions();
                const onConfigureCallback = props.extension.spec.lifecycle?.["on:configure"];

                if (onConfigureCallback) {
                  await callFunction(props.extension.spec, onConfigureCallback, {
                    extensionId: id,
                    token,
                    context: () => ({
                      config: {},
                      spec: props.extension.spec
                    })
                  });
                }
  const { notify } = useNotifications();

            try {
              await client.git.github.initialSync.mutate();
              notify({ text: "Latest content pulled", type: "success" });
            } catch (error) {
              notify({ text: "Couldn't pull content", type: "error" });
            }

                  setMessage("");
import { Component, For, Show, createEffect, createMemo, createResource, on } from "solid-js";
      <TitledCard icon={mdiThemeLightDark} label="Theme">
  const [openedSubsection, setOpenedSubsection] = createSignal<"none">("none");
            color="contrast"
    { label: "Element", icon: mdiCubeOutline, value: "element" }
import { mdiFormatListBulleted, mdiPlusCircle, mdiPuzzle, mdiTrashCan, mdiTune } from "@mdi/js";
  transformer: App.Transformer & { inUse?: boolean; extension?: boolean };
  transformers(): Array<App.Transformer & { inUse?: boolean; extension?: boolean }>;
    transformers: Array<App.Transformer & { inUse?: boolean; extension?: boolean }>;
      <Show
        when={!props.transformer.extension}
        fallback={
          <Tooltip text="Extension" class="mt-1">
            <IconButton path={mdiPuzzle} text="soft" class="m-0" badge />
        }
      >
        <Show when={hasPermission("manageWorkspace")}>
          <div class="flex gap-2">
            <Tooltip text="Delete" class="mt-1" enabled={!props.transformer.inUse}>
              <IconButton
                path={mdiTrashCan}
                loading={loading()}
                disabled={props.transformer.inUse}
                class="m-0"
                text="soft"
                onClick={async () => {
                  setLoading(true);
                  await client.transformers.delete.mutate({ id: props.transformer.id });
                  setLoading(false);
                  props.onDelete?.();
                  notify({ text: "Transformer deleted", type: "success" });
                }}
              />
            </Tooltip>
          </div>
        </Show>
    event: "" as App.WebhookEventName,
            setWebhookData("event", value as App.WebhookEventName);
const webhookEvents: Array<{ label: string; value: App.WebhookEventName }> = [
    "types": ["vite/client", "@vrite/extensions"],
  const proxyTarget = env.PUBLIC_APP_URL;
          target: proxyTarget,
        "/session": { target: proxyTarget, ws: true },
        "/login": { target: proxyTarget, ws: true },
        "/github": { target: proxyTarget, ws: true },
        "/upload": { target: proxyTarget, ws: true }
  "version": "0.3.0",
import { Collection, Db, ObjectId } from "mongodb";
import { UnderscoreID, zodId } from "#lib/mongo";
  extensionId?: ID;
  email: z.string().email().max(320),
const webhookEventName = z.enum([...contentPieceEvents, ...contentGroupEvents, ...memberEvents]);
  event: webhookEventName
type WebhookEventName = z.infer<typeof webhookEventName>;
  webhookEventName,
export type { WebhookEventName, Webhook, FullWebhook };
  email: z.string().email().max(320).optional(),
  "element"
  embeds: z.array(z.enum(embeds))
  extends Omit<z.infer<typeof workspaceSettings>, "id"> {
export type { MetadataField, MetadataSettings, WorkspaceSettings, FullWorkspaceSettings };
import { z } from "zod";
import { Observable } from "@trpc/server/observable";
import { Comment, CommentThread, CommentMember } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type CommentEvent =
  | { action: "createThread"; data: CommentThread }
  | { action: "resolveThread"; data: Pick<CommentThread, "id" | "fragment" | "resolved"> }
  | { action: "deleteThread"; data: Pick<CommentThread, "id" | "fragment"> }
  | {
      action: "createComment";
      data: Omit<Comment, "memberId"> & { member: CommentMember | null };
    }
  | {
      action: "updateComment";
      data: Pick<Comment, "id" | "content">;
    }
  | {
      action: "deleteComment";
      data: Pick<Comment, "id">;
    };

const publishCommentEvent = createEventPublisher<CommentEvent>((contentPieceId) => {
  return `comments:${contentPieceId}`;
});
const subscribeToCommentEvents = (
  ctx: Context,
  contentPieceId: string
): Observable<CommentEvent, unknown> => {
  return createEventSubscription<CommentEvent>(ctx, `comments:${contentPieceId}`);
};

export { publishCommentEvent, subscribeToCommentEvents };
export type { CommentEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { ContentGroup } from "#database";

type ContentGroupEvent =
  | {
      action: "create";
      data: ContentGroup;
    }
  | {
      action: "update";
      data: Partial<ContentGroup> & { id: string };
    }
  | { action: "delete"; data: { id: string } }
  | { action: "move"; data: ContentGroup }
  | { action: "reorder"; data: { id: string; index: number } };

const publishContentGroupEvent = createEventPublisher<ContentGroupEvent>(
  (workspaceId) => `contentGroups:${workspaceId}`
);
const subscribeToContentGroupEvents = (
  ctx: Context,
  workspaceId: string
): Observable<ContentGroupEvent, unknown> => {
  return createEventSubscription<ContentGroupEvent>(ctx, `contentGroups:${workspaceId}`);
};

export { publishContentGroupEvent, subscribeToContentGroupEvents };
export type { ContentGroupEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { FullContentPieceWithAdditionalData } from "#database";

type ContentPieceEvent =
  | { action: "delete"; userId: string; data: { id: string } }
  | { action: "create"; userId: string; data: FullContentPieceWithAdditionalData }
  | {
      action: "update";
      userId: string;
      variantId?: string;
      data: Partial<FullContentPieceWithAdditionalData> & { id: string };
    }
  | {
      action: "move";
      userId: string;
      data: {
        contentPiece: FullContentPieceWithAdditionalData;
        nextReferenceId?: string;
        previousReferenceId?: string;
      };
    };

const publishContentPieceEvent = createEventPublisher<ContentPieceEvent>((contentGroupId) => {
  return `contentPieces:${contentGroupId}`;
});
const subscribeToContentPieceEvents = (
  ctx: Context,
  contentGroupId: string
): Observable<ContentPieceEvent, unknown> => {
  return createEventSubscription<ContentPieceEvent>(ctx, `contentPieces:${contentGroupId}`);
};

export { publishContentPieceEvent, subscribeToContentPieceEvents };
export type { ContentPieceEvent };
import { Observable } from "@trpc/server/observable";
import { ContextObject, Extension } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type ExtensionEvent =
  | { action: "delete"; data: { id: string } }
  | { action: "create"; data: Extension & { id: string } }
  | { action: "update"; data: { id: string; config: ContextObject } };

const publishExtensionEvent = createEventPublisher<ExtensionEvent>((workspaceId) => {
  return `extensions:${workspaceId}`;
});
const subscribeToExtensionEvents = (
  ctx: Context,
  workspaceId: string
): Observable<ExtensionEvent, unknown> => {
  return createEventSubscription<ExtensionEvent>(ctx, `extensions:${workspaceId}`);
};

export { publishExtensionEvent, subscribeToExtensionEvents };
export type { ExtensionEvent };
import { Observable } from "@trpc/server/observable";
import { GitData } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type GitDataEvent =
  | {
      action: "configure";
      data: GitData;
    }
  | {
      action: "update";
      data: Partial<GitData>;
    }
  | {
      action: "reset";
      data: {};
    };

const publishGitDataEvent = createEventPublisher<GitDataEvent>((workspaceId) => {
  return `gitData:${workspaceId}`;
});
const subscribeToGitDataEvents = (
  ctx: Context,
  workspaceId: string
): Observable<GitDataEvent, unknown> => {
  return createEventSubscription<GitDataEvent>(ctx, `gitData:${workspaceId}`);
};

export { publishGitDataEvent, subscribeToGitDataEvents };
export type { GitDataEvent };
export * from "./comment";
export * from "./content-group";
export * from "./content-piece";
export * from "./extension";
export * from "./tag";
export * from "./token";
export * from "./transformer";
export * from "./user-settings";
export * from "./user";
export * from "./variant";
export * from "./workspace-membership";
export * from "./webhook";
export * from "./workspace-settings";
export * from "./workspace";
export * from "./git-data";
export * from "./role";
import { Observable } from "@trpc/server/observable";
import { Role } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type RoleEvent =
  | {
      action: "create";
      data: Role;
    }
  | { action: "update"; data: Partial<Role> & { id: string } }
  | { action: "delete"; data: { id: string; newRole: Role } };

const publishRoleEvent = createEventPublisher((workspaceId) => `roles:${workspaceId}`);
const subscribeToRoleEvents = (
  ctx: Context,
  workspaceId: string
): Observable<RoleEvent, unknown> => {
  return createEventSubscription<RoleEvent>(ctx, `roles:${workspaceId}`);
};

export { publishRoleEvent, subscribeToRoleEvents };
export type { RoleEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { Tag } from "#database";

type TagEvent =
  | { action: "create"; data: Tag }
  | { action: "update"; data: Partial<Tag> & { id: string } }
  | {
      action: "delete";
      data: { id: string };
    };

const publishTagEvent = createEventPublisher<TagEvent>((workspaceId) => `tags:${workspaceId}`);
const subscribeToTagEvents = (ctx: Context, workspaceId: string): Observable<TagEvent, unknown> => {
  return createEventSubscription<TagEvent>(ctx, `tags:${workspaceId}`);
};

export { publishTagEvent, subscribeToTagEvents };
export type { TagEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { Token } from "#database";

type TokenEvent =
  | {
      action: "create";
      data: Token;
    }
  | { action: "update"; data: Partial<Token> & { id: string } }
  | { action: "delete"; data: { id: string } };

const publishTokenEvent = createEventPublisher<TokenEvent>(
  (workspaceId) => `tokens:${workspaceId}`
);
const subscribeToTokenEvents = (
  ctx: Context,
  workspaceId: string
): Observable<TokenEvent, unknown> => {
  return createEventSubscription<TokenEvent>(ctx, `tokens:${workspaceId}`);
};

export { publishTokenEvent, subscribeToTokenEvents };
export type { TokenEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { Transformer } from "#database";

type TransformerEvent =
  | {
      action: "create";
      data: Transformer & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishTransformerEvent = createEventPublisher<TransformerEvent>(
  (workspaceId) => `transformers:${workspaceId}`
);
const subscribeToTransformerEvents = (
  ctx: Context,
  workspaceId: string
): Observable<TransformerEvent, unknown> => {
  return createEventSubscription<TransformerEvent>(ctx, `transformers:${workspaceId}`);
};

export { publishTransformerEvent, subscribeToTransformerEvents };
export type { TransformerEvent };
import { Observable } from "@trpc/server/observable";
import { AppearanceSettings } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type UserSettingsEvent = { action: "update"; data: Partial<AppearanceSettings> };

const publishUserSettingsEvent = createEventPublisher<UserSettingsEvent>(
  (userId) => `userSettings:${userId}`
);
const subscribeToUserSettingsEvents = (
  ctx: Context,
  userId: string
): Observable<UserSettingsEvent, unknown> => {
  return createEventSubscription<UserSettingsEvent>(ctx, `userSettings:${userId}`);
};

export { publishUserSettingsEvent, subscribeToUserSettingsEvents };
export type { UserSettingsEvent };
import { Observable } from "@trpc/server/observable";
import { VerificationDetails, Profile } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type UserEvent = {
  action: "update";
  data: Partial<Profile> & { id: string } & Partial<VerificationDetails>;
};

const publishUserEvent = createEventPublisher<UserEvent>((userId: string) => `user:${userId}`);
const subscribeToUserEvents = (ctx: Context, userId: string): Observable<UserEvent, unknown> => {
  return createEventSubscription<UserEvent>(ctx, `user:${userId}`);
};

export { publishUserEvent, subscribeToUserEvents };
export type { UserEvent };
import { Observable } from "@trpc/server/observable";
import { Variant } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type VariantEvent =
  | {
      action: "create";
      data: Variant & { id: string };
    }
  | {
      action: "update";
      data: Partial<Variant> & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishVariantEvent = createEventPublisher<VariantEvent>(
  (workspaceId) => `variants:${workspaceId}`
);
const subscribeToVariantEvents = (
  ctx: Context,
  workspaceId: string
): Observable<VariantEvent, unknown> => {
  return createEventSubscription<VariantEvent>(ctx, `variants:${workspaceId}`);
};

export { publishVariantEvent, subscribeToVariantEvents };
export type { VariantEvent };
import { Observable } from "@trpc/server/observable";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";
import { Webhook } from "#database";

type WebhookEvent =
  | {
      action: "create";
      data: Webhook & { id: string };
    }
  | {
      action: "update";
      data: Partial<Webhook> & { id: string };
    }
  | {
      action: "delete";
      data: { id: string };
    };

const publishWebhookEvent = createEventPublisher<WebhookEvent>((workspaceId) => {
  return `webhooks:${workspaceId}`;
});
const subscribeToWebhookEvents = (
  ctx: Context,
  workspaceId: string
): Observable<WebhookEvent, unknown> => {
  return createEventSubscription<WebhookEvent>(ctx, `webhooks:${workspaceId}`);
};

export { publishWebhookEvent, subscribeToWebhookEvents };
export type { WebhookEvent };
import { Observable } from "@trpc/server/observable";
import { Role, WorkspaceMembership } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type WorkspaceMembershipEvent =
  | { action: "create"; data: { id: string; pendingInvite: boolean } & WorkspaceMembership }
  | {
      action: "update";
      data: {
        id: string;
        userId: string;
        role?: Role;
        pendingInvite?: boolean;
        profile?: {
          fullName?: string;
          username?: string;
          avatar?: string;
        };
      } & Partial<WorkspaceMembership>;
    }
  | {
      action: "delete";
      data: { id: string; userId: string };
    };

const publishWorkspaceMembershipEvent = createEventPublisher<WorkspaceMembershipEvent>(
  (workspaceId: string) => `workspaceMemberships:${workspaceId}`
);
const subscribeToWorkspaceMembershipEvents = (
  ctx: Context,
  workspaceId: string
): Observable<WorkspaceMembershipEvent, unknown> => {
  return createEventSubscription<WorkspaceMembershipEvent>(
    ctx,
    `workspaceMemberships:${workspaceId}`
  );
};

export { publishWorkspaceMembershipEvent, subscribeToWorkspaceMembershipEvents };
export type { WorkspaceMembershipEvent };
import { Observable } from "@trpc/server/observable";
import { WorkspaceSettings } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type WorkspaceSettingsEvent = {
  action: "update";
  data: Partial<Omit<WorkspaceSettings, "id">>;
};

const publishWorkspaceSettingsEvent = createEventPublisher<WorkspaceSettingsEvent>(
  (workspaceId) => {
    return `workspaceSettings:${workspaceId}`;
  }
);
const subscribeToWorkspaceSettingsEvents = (
  ctx: Context,
  workspaceId: string
): Observable<WorkspaceSettingsEvent, unknown> => {
  return createEventSubscription<WorkspaceSettingsEvent>(ctx, `workspaceSettings:${workspaceId}`);
};

export { publishWorkspaceSettingsEvent, subscribeToWorkspaceSettingsEvents };
export type { WorkspaceSettingsEvent };
import { Observable } from "@trpc/server/observable";
import { Workspace } from "#database";
import { Context } from "#lib/context";
import { createEventPublisher, createEventSubscription } from "#lib/pub-sub";

type WorkspaceEvent =
  | { action: "update"; data: Partial<Workspace> & { id: string } }
  | { action: "delete"; data: { id: string } };

const publishWorkspaceEvent = createEventPublisher<WorkspaceEvent>((workspaceId) => {
  return `workspace:${workspaceId}`;
});
const subscribeToWorkspaceEvents = (
  ctx: Context,
  workspaceId: string
): Observable<WorkspaceEvent, unknown> => {
  return createEventSubscription<WorkspaceEvent>(ctx, `workspace:${workspaceId}`);
};

export { publishWorkspaceEvent, subscribeToWorkspaceEvents };
export type { WorkspaceEvent };
export * from "./events";
export * from "./routes";
export * from "./server";
import { TokenPermission, getTokensCollection } from "#database";
interface FastifyContext {
}
interface Context extends FastifyContext {
const createFastifyContext = (
  { req, res }: CreateFastifyContextOptions,
  fastify: FastifyInstance
): FastifyContext => {
  return { req, res, fastify };
};
  return {
    ...createFastifyContext({ req, res }, fastify),
    db
  };
export { createContext, createFastifyContext };
export type { FastifyContext, Context };
export {
  createInputContentProcessor as createInputContentProcessorGitHub,
  createOutputContentProcessor as createOutputContentProcessorGitHub
} from "./process-content";
import { AuthenticatedContext } from "../../middleware";
import { UnderscoreID } from "../../mongo";
import { jsonToBuffer, htmlToJSON, bufferToJSON } from "../../processing";
import { InputContentProcessor, OutputContentProcessor } from "../types";
import { ObjectId } from "mongodb";
export { createInputContentProcessor, createOutputContentProcessor };
import { createGenericOutputContentProcessor } from "./process-content";
import { OutputContentProcessor } from "./types";
import { AuthenticatedContext } from "../middleware";
import { UnderscoreID } from "../mongo";
import { jsonToBuffer } from "../processing";
import { ObjectId } from "mongodb";
import { publishGitDataEvent } from "#events";
export * from "./hooks";
export * from "./process-content";
export * from "./github";
export * from "./types";
import { createOutputContentProcessorGitHub, createInputContentProcessorGitHub } from "./github";
import { InputContentProcessor, OutputContentProcessor } from "./types";
import { InputTransformer } from "@vrite/sdk/transformers";
import { ObjectId } from "mongodb";
import { FullContentPiece } from "#database";
import { UnderscoreID } from "#lib/mongo";

interface ProcessInputResult {
  buffer: Buffer;
  contentHash: string;
  metadata: Partial<
    Pick<FullContentPiece, keyof NonNullable<ReturnType<InputTransformer>["contentPiece"]>>
  >;
}
interface OutputContentProcessorInput {
  buffer: Buffer;
  contentPiece: UnderscoreID<FullContentPiece<ObjectId>>;
}

interface InputContentProcessor {
  process(inputContent: string): Promise<ProcessInputResult>;
  processBatch(inputContent: string[]): Promise<ProcessInputResult[]>;
}

interface OutputContentProcessor {
  process(input: OutputContentProcessorInput): Promise<string>;
  processBatch(input: OutputContentProcessorInput[]): Promise<string[]>;
}

export type { InputContentProcessor, OutputContentProcessor, OutputContentProcessorInput };
import { z } from "zod";

const hostConfig = z.object({
  githubOAuth: z.boolean(),
  githubApp: z.boolean(),
  sendgrid: z.boolean(),
  smtp: z.boolean(),
  search: z.boolean(),
  aiSearch: z.boolean(),
  extensions: z.boolean()
});

interface HostConfig extends z.infer<typeof hostConfig> {}

export { hostConfig };
export type { HostConfig };
export * from "./auth";
export * from "./context";
export * as errors from "./errors";
export * from "./git-sync";
export * from "./hash";
export * from "./middleware";
export * from "./pub-sub";
export * from "./session";
export * from "./utils";
export * from "./webhooks";
export * from "./workspace";
export * from "./host-config";
import * as errors from "./errors";
import { HostConfig } from "./host-config";
import { Meta, middleware } from "./trpc";
  if (requiredConfig.some((property) => !ctx.fastify.hostConfig[property as keyof HostConfig])) {
export { zodId };
export type { UnderscoreID };
  Element
    Element,
    Element,
import * as errors from "./errors";
import {
  BaseRoleType,
  FullRole,
  Permission,
  getRolesCollection,
  getUserSettingsCollection,
  getWorkspaceMembershipsCollection
} from "#database";
import { HostConfig } from "./host-config";
import { zodId } from "./mongo";
import { ObjectId } from "mongodb";
import {
  WebhookEvent,
  getWebhooksCollection,
  contentGroup,
  contentPiece,
  getContentGroupsCollection,
  workspaceMembership
} from "#database";
      ctx.fastify.log.error("Failed to run webhook", error);
import { publicPlugin } from "#lib";
  getUserSettingsCollection,
  getWebhooksCollection,
  getWorkspaceSettingsCollection,
  getContentsCollection,
  getUsersCollection,
  getCommentThreadsCollection,
  getCommentsCollection,
  getContentPiecesCollection,
  getRolesCollection,
  getTagsCollection,
  getTokensCollection,
import { getWorkspacesCollection, getUsersCollection } from "#database";
import { errors, publicPlugin } from "#lib";
        fastify.log.error(error);
        fastify.log.error(error);
    fastify.log.error("No email service configured");
import { publicPlugin } from "#lib";
import { HostConfig, publicPlugin } from "#lib";
export { hostConfigPlugin };
import { publicPlugin, generateSalt, createSession, createWorkspace } from "#lib";
import { getUserSettingsCollection, getUsersCollection } from "#database";
          codeEditorTheme: "auto",
      fastify.log.error(error);
import { publicPlugin } from "#lib";
import { S3Client, CreateBucketCommand, HeadBucketCommand } from "@aws-sdk/client-s3";
import { publicPlugin } from "#lib";
import { Db, ObjectId } from "mongodb";
import { UnderscoreID, bufferToJSON, publicPlugin } from "#lib";
import { appRouter } from "#routes";
import { publicPlugin, errors } from "#lib";
      const error = e as errors.CustomError;
      const error = e as errors.CustomError;
import { appRouter } from "#routes";
import { publicPlugin, createContext } from "#lib";
import { FullUser, getUsersCollection, getUserSettingsCollection } from "#database";
  UnderscoreID,
  generateSalt,
  processAuth,
  errors,
  isAuthenticated,
  isAuthenticatedUser,
  hashValue,
  verifyValue,
  updateSession,
  procedure,
  router
} from "#lib";
        email: z.string().email().max(320),
        password: z
          .string()
          .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/)
          .min(8)
          .max(128),
        email: z.string().email().max(320),
      const magicLinkSent = await ctx.fastify.redis.get(`user:${user._id}:magicLinkSent`);

      if (magicLinkSent === "true") {
        throw errors.unauthorized("magicLinkAlreadySent");
      }

      await ctx.fastify.redis.set(`user:${user._id}:magicLinkSent`, "true", "EX", 60);
        email: z.string().email().max(320),
        password: z.string().min(8).max(128),
import { UnderscoreID, zodId, isAuthenticated, procedure, router, errors } from "#lib";
  getUsersCollection
import { publishCommentEvent, subscribeToCommentEvents } from "#events";
      publishCommentEvent(ctx, `${input.contentPieceId}`, {
      publishCommentEvent(ctx, `${existingThread.contentPieceId}`, {
      publishCommentEvent(ctx, `${existingThread.contentPieceId}`, {
      publishCommentEvent(ctx, `${existingThread.contentPieceId}`, {
      publishCommentEvent(ctx, `${existingThread.contentPieceId}`, {
      publishCommentEvent(ctx, `${existingThread.contentPieceId}`, {
      return subscribeToCommentEvents(ctx, input.contentPieceId);
import {
  runGitSyncHook,
  runWebhooks,
  errors,
  UnderscoreID,
  zodId,
  isAuthenticated,
  procedure,
  router
} from "#lib";
import { subscribeToContentGroupEvents, publishContentGroupEvent } from "#events";

      publishContentGroupEvent(ctx, `${ctx.auth.workspaceId}`, {
        action: "update",
        data: { id, ...update }
      });
      publishContentGroupEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishContentGroupEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishContentGroupEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishContentGroupEvent(ctx, `${ctx.auth.workspaceId}`, {
    return subscribeToContentGroupEvents(ctx, `${ctx.auth.workspaceId}`);
export { contentGroupsRouter };
  getContentPiecesCollection,
  Tag,
  getTagsCollection,
  tag,
  getContentsCollection
} from "#database";
import {
  runWebhooks,
  errors,
  runGitSyncHook,
  procedure,
  router,
  isAuthenticated,
  bufferToJSON,
  DocJSON,
  htmlToJSON,
  jsonToBuffer,
  UnderscoreID,
  zodId,
  stringToRegex
} from "#lib";
import { publishContentPieceEvent, subscribeToContentPieceEvents } from "#events";
  variantIdOrKey?: string
): Promise<{ variantId: ObjectId | null; variantKey: string | null }> => {
  if (!variantIdOrKey) return { variantId: null, variantKey: null };
  const isId = ObjectId.isValid(variantIdOrKey);
    ...(isId && { _id: new ObjectId(variantIdOrKey) }),
    ...(!isId && { key: variantIdOrKey })
  return { variantId: variant._id || null, variantKey: variant.key || null };
      const { variantId, variantKey } = await getVariantDetails(ctx.db, input.variant);
              { slug: contentPiece.slug, variant: variantKey }
      const { variantId, variantKey } = await getVariantDetails(ctx.db, input.variant);
                  { slug: contentPiece.slug, variant: variantKey }
      publishContentPieceEvent(ctx, `${contentPiece.contentGroupId}`, {
      const { variantId, variantKey } = await getVariantDetails(ctx.db, variant);
        if (update.slug) {
          contentPieceUpdates.slug = update.slug
            .split("/")
            .map((slugPart) => convertToSlug(slugPart))
            .join("/");
        } else {
          contentPieceUpdates.slug = convertToSlug(update.title || contentPiece.title);
        }
      publishContentPieceEvent(ctx, `${newContentPiece.contentGroupId}`, {
                { slug: newContentPiece.slug, variant: variantKey }
      publishContentPieceEvent(ctx, `${contentPiece.contentGroupId}`, {
      publishContentPieceEvent(
      return subscribeToContentPieceEvents(ctx, input.contentGroupId);
  getContentPiecesCollection
import { zodId, errors, procedure, router, isAuthenticated, isEnabled } from "#lib";
import { publishExtensionEvent, subscribeToExtensionEvents } from "#events/extension";
import { publishContentPieceEvent } from "#events";
    return subscribeToExtensionEvents(ctx, `${ctx.auth.workspaceId}`);
      publishExtensionEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishExtensionEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishExtensionEvent(ctx, `${ctx.auth.workspaceId}`, {
import { createSyncedPieces } from "./synced-pieces";
import { Binary, ObjectId } from "mongodb";
import {
  createInputContentProcessorGitHub,
  createOutputContentProcessorGitHub,
  OutputContentProcessorInput,
  AuthenticatedContext,
  isAuthenticated,
  isEnabled,
  procedure,
  router,
  errors
} from "#lib";
import { UnderscoreID, zodId } from "#lib";
import {
  publishContentGroupEvent,
  publishGitDataEvent,
  publishWorkspaceSettingsEvent
} from "#events";
      const inputContentProcessor = await createInputContentProcessorGitHub(ctx, gitData);
        const outputContentProcessor = await createOutputContentProcessorGitHub(ctx, gitData);
      const outputContentProcessor = await createOutputContentProcessorGitHub(ctx, gitData);
      const outputContentProcessor = await createOutputContentProcessorGitHub(ctx, gitData);
      const inputContentProcessor = await createInputContentProcessorGitHub(ctx, gitData);
export { githubRouter };
import { createSyncedPieces } from "./synced-pieces";
import { createInputContentProcessorGitHub } from "#lib";
  const inputContentProcessor = await createInputContentProcessorGitHub(ctx, gitData);
import { ObjectId, Binary } from "mongodb";
import { convert as convertToSlug } from "url-slug";
import { FullContentPiece, FullContents } from "#database";
import { InputContentProcessor, UnderscoreID } from "#lib";

const createSyncedPieces = async (
  inputs: Array<{
    path: string;
    content: string;
    workspaceId: ObjectId;
    contentGroupId: ObjectId;
    order: string;
  }>,
  inputContentProcessor: InputContentProcessor
): Promise<
  Array<{
    contentPiece: UnderscoreID<FullContentPiece<ObjectId>>;
    content: UnderscoreID<FullContents<ObjectId>>;
    contentHash: string;
  }>
> => {
  const inputContentProcessorOutput = await inputContentProcessor.processBatch(
    inputs.map((input) => input.content)
  );

  return inputs.map((input, index) => {
    const filename = input.path.split("/").pop() || "";
    const { buffer, contentHash, metadata } = inputContentProcessorOutput[index];
    const { members, tags, date, ...inputMetadata } = metadata;
    const contentPiece: UnderscoreID<FullContentPiece<ObjectId>> = {
      _id: new ObjectId(),
      workspaceId: input.workspaceId,
      contentGroupId: input.contentGroupId,
      order: input.order,
      members: [],
      slug: convertToSlug(filename),
      tags: [],
      title: filename,
      filename,
      ...inputMetadata,
      ...(date && { date: new Date(date) }),
      ...(members && { members: members.map((memberId) => new ObjectId(memberId)) }),
      ...(tags && { tags: tags.map((tagId) => new ObjectId(tagId)) })
    };
    const content = {
      _id: new ObjectId(),
      contentPieceId: contentPiece._id,
      content: new Binary(buffer)
    };

    return {
      contentPiece,
      contentHash,
      content
    };
  });
};

export { createSyncedPieces };
import { publishGitDataEvent, subscribeToGitDataEvents } from "#events";
import { procedure, router, errors, isAuthenticated } from "#lib";
    return subscribeToGitDataEvents(ctx, `${ctx.auth.workspaceId}`);
export { gitRouter };
import { ObjectId } from "mongodb";
import { UnderscoreID } from "#lib";
import { gitRouter } from "./git";
import { Context, createContext } from "#lib";
import { router } from "#lib";
export { appRouter, createContext };
import { zodId, isAuthenticated, procedure, router, updateSessionRole, errors } from "#lib";
import { publishRoleEvent, subscribeToRoleEvents } from "#events";

    return subscribeToRoleEvents(ctx, `${ctx.auth.workspaceId}`);
      publishRoleEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishRoleEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishRoleEvent(ctx, `${ctx.auth.workspaceId}`, {
import { ObjectId } from "mongodb";
import { errors, zodId, procedure, router, isAuthenticated, isEnabled } from "#lib";
import { contentPiece, getContentPiecesCollection } from "#database";
          contentPiece,
      const contentPiecesCollection = getContentPiecesCollection(ctx.db);
      const processedResults = results.data.Get.Content.map(({ _additional, ...result }) => result);
      const contentPieces = await contentPiecesCollection
        .find({
          _id: { $in: processedResults.map(({ contentPieceId }) => new ObjectId(contentPieceId)) }
        })
        .toArray();

      return processedResults.map(({ contentPieceId, content, breadcrumb }) => {
        const { _id, date, contentGroupId, tags, members, ...contentPiece } = contentPieces.find(
          ({ _id }) => _id.toString() === contentPieceId
        )!;
        return {
          contentPieceId,
          breadcrumb,
          content,
          contentPiece: {
            id: `${_id}`,
            contentGroupId: `${contentGroupId}`,
            ...contentPiece,
            ...(date && { date: date.toISOString() }),
            ...(tags && { tags: tags.map((tagId) => `${tagId}`) }),
            ...(members && { members: members.map((members) => `${members}`) })
          }
        };
      });
import { stringToRegex, isAuthenticated, procedure, router, errors, zodId } from "#lib";
import { ExtendedTag, getTagsCollection, tag, getContentPiecesCollection } from "#database";
import { publishTagEvent, subscribeToTagEvents } from "#events";
      publishTagEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishTagEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishTagEvent(ctx, `${ctx.auth.workspaceId}`, {
    return subscribeToTagEvents(ctx, `${ctx.auth.workspaceId}`);
import {
  AuthenticatedContext,
  isAuthenticated,
  procedure,
  router,
  UnderscoreID,
  zodId,
  errors,
  generateSalt,
  hashValue
} from "#lib";
import { Token, FullToken, getTokensCollection, token } from "#database";
import { publishTokenEvent, subscribeToTokenEvents } from "#events";

      publishTokenEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishTokenEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishTokenEvent(ctx, `${ctx.auth.workspaceId}`, {
    return subscribeToTokenEvents(ctx, `${ctx.auth.workspaceId}`);
import { ObjectId } from "mongodb";
import { getGitDataCollection, transformer, getTransformersCollection } from "#database";
import { zodId, errors, procedure, router, isAuthenticated } from "#lib";
import { publishTransformerEvent, subscribeToTransformerEvents } from "#events";
      const extensionId = ctx.req.headers["x-vrite-extension-id"] as string | undefined;
        ...(extensionId && { extensionId: new ObjectId(extensionId) }),
      publishTransformerEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishTransformerEvent(ctx, `${ctx.auth.workspaceId}`, { action: "delete", data: input });
    .output(
      z.array(
        transformer.extend({
          inUse: z.boolean().optional(),
          extension: z.boolean().optional()
        })
      )
    )
      return transformers.map(({ _id, workspaceId, extensionId, ...transformerData }) => {
          ...(extensionId && { extension: true }),
    return subscribeToTransformerEvents(ctx, `${ctx.auth.workspaceId}`);
import { zodId, errors, procedure, router, isAuthenticated, isAuthenticatedUser } from "#lib";
import { publishUserSettingsEvent, subscribeToUserSettingsEvents } from "#events";
    .input(appearanceSettings.omit({ codeEditorTheme: true }).partial())
      publishUserSettingsEvent(ctx, `${ctx.auth.userId}`, {
        action: "update",
        data: { ...input, ...(input.uiTheme ? { codeEditorTheme: input.uiTheme } : {}) }
      });
        codeEditorTheme: userSettings.uiTheme,
    return subscribeToUserSettingsEvents(ctx, `${ctx.auth.userId}`);
import { procedure, router, errors, UnderscoreID, isAuthenticated, hashValue } from "#lib";
import { FullUser, getUsersCollection, profile, verificationDetails } from "#database/users";
import { publishUserEvent, subscribeToUserEvents } from "#events";
    return subscribeToUserEvents(ctx, `${ctx.auth.userId}`);
      publishUserEvent(ctx, `${ctx.auth.userId}`, {
import {
  procedure,
  router,
  errors,
  extractPreviewDataFromOpenGraph,
  hostConfig,
  HostConfig
} from "#lib";
import { ObjectId } from "mongodb";
import { zodId, errors, procedure, router, isAuthenticated } from "#lib";
import { publishVariantEvent, subscribeToVariantEvents } from "#events";
      publishVariantEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishVariantEvent(ctx, `${ctx.auth.workspaceId}`, { action: "update", data: input });
      publishVariantEvent(ctx, `${ctx.auth.workspaceId}`, { action: "delete", data: input });
    return subscribeToVariantEvents(ctx, `${ctx.auth.workspaceId}`);
  getUsersCollection,
  getUserSettingsCollection,
} from "#database";
import {
  runWebhooks,
  verifyValue,
  isAuthenticatedUser,
  createSession,
  errors,
  createWorkspace,
  procedure,
  router
} from "#lib";
import { publishUserEvent, publishWorkspaceMembershipEvent } from "#events";
          codeEditorTheme: "auto",
        ctx.fastify.log.error(error);
import { FullWebhook, Webhook, getWebhooksCollection, webhook } from "#database";
import { errors, isAuthenticated, UnderscoreID, zodId, procedure, router } from "#lib";
import { publishWebhookEvent, subscribeToWebhookEvents } from "#events";

      publishWebhookEvent(ctx, `${ctx.auth.workspaceId}`, {
    return subscribeToWebhookEvents(ctx, `${ctx.auth.workspaceId}`);
      publishWebhookEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishWebhookEvent(ctx, `${ctx.auth.workspaceId}`, {
  contentPieceMember,
  workspaceMembership,
  getWorkspacesCollection,
  workspace
import {
  AuthenticatedContext,
  isAuthenticated,
  procedure,
  router,
  isAuthenticatedUser,
  updateSessionUser,
  runWebhooks,
  errors,
  UnderscoreID,
  generateSalt,
  hashValue,
  stringToRegex,
  zodId
} from "#lib";
import { publishWorkspaceMembershipEvent, subscribeToWorkspaceMembershipEvents } from "#events";

  publishWorkspaceMembershipEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishWorkspaceMembershipEvent(ctx, `${ctx.auth.workspaceId}`, {
        email: z.string().email().max(320),
      publishWorkspaceMembershipEvent(ctx, `${ctx.auth.workspaceId}`, {
    return subscribeToWorkspaceMembershipEvents(ctx, `${ctx.auth.workspaceId}`);
  workspaceSettings
import { errors, isAuthenticated, procedure, router } from "#lib";
import { subscribeToWorkspaceSettingsEvents, publishWorkspaceSettingsEvent } from "#events";
        embeds: workspaceSettings.embeds
    return subscribeToWorkspaceSettingsEvents(ctx, `${ctx.auth.workspaceId}`);
        .omit({ id: true, prettierConfig: true })
      publishWorkspaceSettingsEvent(ctx, `${ctx.auth.workspaceId}`, {
export { workspaceSettingsRouter };
import {
  errors,
  createWorkspace,
  deleteWorkspace,
  isAuthenticated,
  isAuthenticatedUser,
  procedure,
  router
} from "#lib";
import { getWorkspacesCollection, workspace, getUsersCollection } from "#database";
import { subscribeToWorkspaceEvents, publishWorkspaceEvent } from "#events";
    return subscribeToWorkspaceEvents(ctx, `${ctx.auth.workspaceId}`);
      publishWorkspaceEvent(ctx, `${ctx.auth.workspaceId}`, {
      publishWorkspaceEvent(ctx, `${ctx.auth.workspaceId}`, {
import {
  gitSyncPlugin,
  hostConfigPlugin,
  searchPlugin,
  databasePlugin,
  pubSubPlugin,
  sessionPlugin,
  mailPlugin,
  s3Plugin,
  OAuthPlugin
} from "#plugins";
const createServer = async (
  pluginOptions: Partial<{
    database: boolean;
    pubSub: boolean;
    storage: boolean;
    auth: boolean;
    email: boolean;
    gitSync: boolean;
    search: boolean;
  }>
): Promise<FastifyInstance> => {
      schema: zodToJsonSchema(envSchema)

  if (pluginOptions.database) {
    await server.register(mongoPlugin, {
    });
    await server.register(databasePlugin);
  }

  if (pluginOptions.pubSub) {
    await server
      .register(redisPlugin, { url: server.config.REDIS_URL })
      .register(redisPlugin, { url: server.config.REDIS_URL, namespace: "sub" });
    await server.register(pubSubPlugin);
  }

  if (pluginOptions.storage) {
    await server.register(s3Plugin);
  }

  if (pluginOptions.auth) {
    await server
      .register(cookiePlugin, { secret: server.config.SECRET })
      .register(jwtPlugin, {
        secret: server.config.SECRET,
        cookie: { cookieName: "accessToken", signed: true }
      })
      .register(sessionPlugin)
      .register(OAuthPlugin);
  }

  if (pluginOptions.email) {
    await server.register(mailPlugin);
  }

  if (pluginOptions.gitSync) {
    await server.register(gitSyncPlugin);
  }

  if (pluginOptions.search) {
    await server.register(searchPlugin);
  }
  suggestionsBoxClass?: string;
            `:base-2: absolute z-50 flex flex-col p-1 overflow-hidden transition-all duration-300 transform shadow-2xl w-full`,
            props.suggestionsBoxClass
  if (typeof document !== "undefined") {
    document.body.addEventListener("pointermove", onPointerMove);
  }


    if (typeof document !== "undefined") {
      document.body.removeEventListener("pointermove", onPointerMove);
    }
  title?: string;
  meta?: string;
      },
      title: {
        default: null,
        parseHTML: (element) => {
          return element.getAttribute("data-title");
        }
      },
      meta: {
        default: null,
        parseHTML: (element) => {
          return element.getAttribute("data-meta");
        }
          "class": node.attrs.lang ? `language-${node.attrs.lang}` : null,
          "data-title": node.attrs.title,
          "data-meta": node.attrs.meta
import { ExtendedRegExpMatchArray, Node, mergeAttributes, wrappingInputRule } from "@tiptap/core";
import { nodeInputRule } from "#node-input-rule";

interface ElementAttributes {
  type?: string;
  props: Record<string, unknown>;
}

declare module "@tiptap/core" {
  interface Commands<ReturnType> {
    Element: {
      setElement: (attrs?: ElementAttributes) => ReturnType;
      toggleElement: (attrs?: ElementAttributes) => ReturnType;
      unsetElement: () => ReturnType;
    };
  }
}

const Element = Node.create({
  name: "element",
  content: "block*",
  group: "block",
  isolating: true,
  defining: true,
  selectable: true,
  addAttributes() {
    return {
      props: {
        default: {},
        parseHTML: (element) => {
          return JSON.parse(element.getAttribute("data-props") || "{}");
        }
      },
      type: {
        default: "Element",
        parseHTML: (element) => {
          return element.getAttribute("data-type");
        }
      }
    };
  },
  parseHTML() {
    return [
      {
        tag: "div[data-element=true]"
      }
    ];
  },
  renderHTML({ node, HTMLAttributes }) {
    return [
      "div",
      mergeAttributes(HTMLAttributes, {
        "data-element": "true",
        "data-type": node.attrs.type,
        "data-props": JSON.stringify(node.attrs.props)
      }),
      0
    ];
  },
  addCommands() {
    return {
      setElement: (attrs) => {
        return ({ commands }) => {
          return commands.insertContent({
            type: this.name,
            attrs: {
              type: "Element",
              props: {},
              ...attrs
            }
            // content: [{ type: "paragraph" }]
          });
        };
      },
      toggleElement: (attrs) => {
        return ({ commands }) => {
          return commands.toggleWrap(this.name, attrs);
        };
      },
      unsetElement: () => {
        return ({ commands }) => {
          return commands.lift(this.name);
        };
      }
    };
  },
  addInputRules() {
    const getAttributes = (input: ExtendedRegExpMatchArray): Record<string, any> => {
      const [code] = input;
      const tagRegex = /^<(\w+?)(?:\s|\n|\/|>)/;
      const [, tag] = tagRegex.exec(code.trim()) || [];

      if (tag && tag !== "undefined") {
        return { type: tag, props: {} };
      }

      return {};
    };

    return [
      nodeInputRule({
        find: /^<.*?.+?\/>$/,
        type: this.type,
        getAttributes
      }),
      wrappingInputRule({
        find: /^<.*?.+?>$/,
        type: this.type,
        joinPredicate: () => false,
        getAttributes
      })
    ];
  }
});

export { Element };
export type { ElementAttributes };
  draggable: true,
  draggable: true,
export * from "./element";
const renderEmail = <T extends keyof typeof templateMap>(
};

type RenderEmail = typeof renderEmail;
import { ExtensionBaseContext } from "@vrite/extensions";

const configure = async (context: ExtensionBaseContext): Promise<void> => {
  const transformers = await context.client.transformers.list();
  const mdxTransformer = transformers.find((transformer) => {
    return (
      transformer.label === "MDX" &&
      transformer.input === "https://extensions.vrite.io/mdx/input" &&
      transformer.output === "https://extensions.vrite.io/mdx/output"
    );
  });

  if (!mdxTransformer) {
    await context.client.transformers.create({
      input: "https://extensions.vrite.io/mdx/input",
      output: "https://extensions.vrite.io/mdx/output",
      maxBatchSize: 100,
      label: "MDX"
    });
  }
};

export default configure;
import { ExtensionGeneralContext } from "@vrite/extensions";

const uninstall = async (context: ExtensionGeneralContext): Promise<void> => {
  const transformers = await context.client.transformers.list();

  if (transformers.length > 0) {
    const mdxTransformer = transformers.find((transformer) => {
      return (
        transformer.label === "MDX" &&
        transformer.input === "https://extensions.vrite.io/mdx/input" &&
        transformer.output === "https://extensions.vrite.io/mdx/output"
      );
    });

    if (mdxTransformer) {
      await context.client.transformers.delete({
        id: mdxTransformer?.id
      });
    }
  }
};

export default uninstall;
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
    <path
        d="M20.3,16.5l-3.9,3.9-4-3.9,1.1-1.1,2.1,2.1V11.8h1.5v5.8l2.1-2.1ZM3.5,15.7l2.7,2.7L9,15.7v4.4h1.5V12L6.2,16.3,2,12v8.1H3.5Z"
        style="fill:#d2d2d2" />
    <path d="M28.8,20l-3.1-3.1L22.6,20l-1-1.1,3.1-3.1-3.2-3.2,1.1-1,3.1,3.2,3.2-3.2,1.1,1-3.2,3.2,3.1,3.1Z"
        style="fill:#f9ac00" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
    <path
        d="M20.3,16.5l-3.9,3.9-4-3.9,1.1-1.1,2.1,2.1V11.8h1.5v5.8l2.1-2.1ZM3.5,15.7l2.7,2.7L9,15.7v4.4h1.5V12L6.2,16.3,2,12v8.1H3.5Z"
        style="fill:#00000" />
    <path d="M28.8,20l-3.1-3.1L22.6,20l-1-1.1,3.1-3.1-3.2-3.2,1.1-1,3.1,3.2,3.2-3.2,1.1,1-3.2,3.2,3.1,3.1Z"
        style="fill:#f9ac00" />
</svg>
{
  "name": "mdx",
  "displayName": "MDX",
  "description": "Adds MDX transformers to Git sync",
  "permissions": ["workspace:write", "workspace:read"],
  "lifecycle": {
    "on:uninstall": "uninstall",
    "on:configure": "configure"
  }
}
  "version": "0.3.0",
import {
  ContentPiece,
  ContentPiecesEndpoints,
  createContentPiecesEndpoints
} from "./content-pieces";
interface SearchResult {
  contentPieceId: string;
  contentPiece: Omit<ContentPiece, "locked" | "content" | "coverWidth">;
  breadcrumb: string[];
  content: string;
}
    contentPieceId?: string;
  }): Promise<SearchResult[]>;
  useSignal(signal: AbortSignal | null): Client;
  reconfigure(config: ClientConfig): Client;
  const { sendRequest, reconfigure, getConfig, getSignal, useSignal } = createAPIFetcher(config);
  const client: Client = {
      getSignal()?.addEventListener("abort", () => {
        source.close();
      });
      useSignal(null);
    useSignal(signal) {
      useSignal(signal);

      return client;
    },
    reconfigure(config) {
      reconfigure(config);

      return client;
    }

  return client;
export type { Client, SearchResult };
export type { Client, SearchResult } from "./client";
  useSignal: (signal: AbortSignal | null) => void;
  getSignal: () => AbortSignal | null;
  let signal: AbortSignal | null = null;
          signal,
      signal = null;

  const useSignal = (newSignal: AbortSignal | null): void => {
    signal = newSignal;
  };
  const getSignal = (): AbortSignal | null => {
    return signal;
  };
  return { sendRequest, reconfigure, useSignal, getConfig, getSignal };
    | ElementNode
type ElementNode = {
  type: "element";
  attrs: {
    type: string;
    props: Record<string, any>;
    | ElementNode
    lang?: string;
    meta?: string;
    title?: string;
    | ElementNode
  element: ElementNode;
      JSONContentNode["listItem" | "taskItem" | "blockquote" | "doc" | "element"]
          case "element":
              child as JSONContentNodeWalker<JSONContentNode["element"]>
      case "element":
          "data-type": nodeWalker.node.attrs?.type
        })}>${(nodeWalker as JSONContentNodeWalker<JSONContentNode["element"]>).children
        version: 6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.45.0)(typescript@5.2.2)
        version: 6.2.0(eslint@8.45.0)(typescript@5.2.2)
        version: 3.0.1(eslint@8.45.0)(prettier@3.0.2)(typescript@5.2.2)
        version: 0.12.1(eslint@8.45.0)(typescript@5.2.2)
        version: 5.2.2
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.4)
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.4)
      '@prettier/sync':
        specifier: ^0.3.0
        version: 0.3.0(prettier@3.0.2)
      '@types/hast':
        specifier: ^3.0.1
        version: 3.0.1
      '@types/html-to-text':
        specifier: ^9.0.1
        version: 9.0.1
      '@types/js-yaml':
        specifier: ^4.0.6
        version: 4.0.6
      '@types/mdast':
        specifier: ^4.0.1
        version: 4.0.1
      dayjs:
        specifier: ^1.11.9
        version: 1.11.9
      hast-util-to-html:
        specifier: ^9.0.0
        version: 9.0.0
      html-to-text:
        specifier: ^9.0.5
        version: 9.0.5
      js-yaml:
        specifier: ^4.1.0
        version: 4.1.0
      mdast-util-from-markdown:
        specifier: ^2.0.0
        version: 2.0.0
      mdast-util-frontmatter:
        specifier: ^2.0.1
        version: 2.0.1
      mdast-util-gfm:
        specifier: ^3.0.0
        version: 3.0.0
      mdast-util-mdx:
        specifier: ^3.0.0
        version: 3.0.0
      mdast-util-to-hast:
        specifier: ^13.0.2
        version: 13.0.2
      micromark-extension-frontmatter:
        specifier: ^2.0.0
        version: 2.0.0
      micromark-extension-gfm:
        specifier: ^3.0.0
        version: 3.0.0
      micromark-extension-mdxjs:
        specifier: ^2.0.0
        version: 2.0.0
      prettier:
        specifier: ^3.0.2
        version: 3.0.2
      remark:
        specifier: ^15.0.1
        version: 15.0.1
      remark-mdx:
        specifier: ^2.3.0
        version: 2.3.0
      remark-parse:
        specifier: ^11.0.0
        version: 11.0.0
        version: 1.2.0(@trpc/server@10.35.0)(zod@3.22.4)
      unist-util-visit:
        specifier: ^5.0.0
        version: 5.0.0
      '@astrojs/mdx':
        specifier: ^1.1.1
        version: 1.1.1(astro@3.1.0)
      '@solid-primitives/scheduled':
        specifier: ^1.4.0
        version: 1.4.0(solid-js@1.7.11)
      '@vrite/sdk':
        specifier: workspace:*
        version: link:../../packages/sdk/javascript
      astro-auto-import:
        specifier: ^0.3.1
        version: 0.3.1(astro@3.1.0)
      astro-icon:
        specifier: ^0.8.1
        version: 0.8.1
      seamless-scroll-polyfill:
        specifier: ^2.3.4
        version: 2.3.4
      tinykeys:
        specifier: ^2.1.0
        version: 2.1.0
        version: 0.55.7(postcss@8.4.31)(vite@4.4.9)
      url-slug:
        specifier: ^4.0.1
        version: 4.0.1
        version: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
        version: 2.2.1(@babel/core@7.23.0)(solid-js@1.7.11)(vite@4.4.9)
        version: 0.55.7(postcss@8.4.31)(vite@4.4.9)
        version: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
        version: 10.16.2(solid-js@1.7.11)
        version: 2.0.15(solid-js@1.7.11)
        version: 0.3.15(solid-js@1.7.11)
        version: 2.2.3(solid-js@1.7.11)
        version: 1.3.2(solid-js@1.7.11)
        version: 1.4.0(solid-js@1.7.11)
        version: 0.8.2(solid-js@1.7.11)
        version: 1.0.0(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)(solid-js@1.7.11)
        specifier: ^0.43.0
        version: 0.43.0
        version: 1.7.11
        version: 1.2.1(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
        version: 5.2.2
        version: 0.55.7(postcss@8.4.31)(vite@4.4.9)
        version: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
        version: 2.7.0(solid-js@1.7.11)(vite@4.4.9)
        version: 4.2.0(typescript@5.2.2)(vite@4.4.9)
        version: 1.4.0(typescript@5.2.2)
        version: 5.2.2
        version: 1.4.0(graphql@16.8.1)
        version: 2.0.15(solid-js@1.7.11)
        version: 2.2.3(solid-js@1.7.11)
        version: 1.7.11
        version: 2.1.8(@tiptap/core@2.1.8)(@tiptap/extension-code-block@2.1.11)(@tiptap/pm@2.1.8)
        version: 1.7.11
        version: 2.10.15
        version: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      '@jridgewell/trace-mapping': 0.3.19
  /@astrojs/compiler@2.2.0:
    resolution: {integrity: sha512-JvmckEJgg8uXUw8Rs6VZDvN7LcweCHOdcxsCXpC+4KMDC9FaB5t9EH/NooSE+hu/rnACEhsXA3FKmf9wnhb7hA==}
      '@jridgewell/trace-mapping': 0.3.19
      '@vscode/emmet-helper': 2.9.2
      vscode-css-languageservice: 6.2.9
      vscode-html-languageservice: 5.1.0
      vscode-languageserver-protocol: 3.17.5
      vscode-languageserver-textdocument: 1.0.11
      vscode-languageserver-types: 3.17.5
      vscode-uri: 3.0.8
  /@astrojs/markdown-remark@3.2.0(astro@3.1.0):
    resolution: {integrity: sha512-jigyLfefUZPKgVmmraCkVpdUuFH1R3SrpgQO13axsgwLDBgkggaQpNR5Ag4O9PDualeBtbdt30aYSfvnBKx9Hg==}
      astro: ^3.1.0
      '@astrojs/prism': 3.0.0
      astro: 3.1.0(sass@1.64.1)
      github-slugger: 2.0.0
      import-meta-resolve: 3.0.0
      mdast-util-definitions: 6.0.0
  /@astrojs/markdown-remark@3.2.1(astro@3.1.0):
    resolution: {integrity: sha512-Z4YNMRtgFZeHhB29uCZl0B9MbMZddW9ZKCNucapoysbvygbDFF1gGtqpVnf+Lyv3rUBHwM/J5qWB2MSZuTuz1g==}
      astro: ^3.2.3
    dev: false

  /@astrojs/mdx@1.1.1(astro@3.1.0):
    resolution: {integrity: sha512-3dfL12ZqI6NCjx0iVOYVSyljlVgsxds5mOhe78xoCVjyqSpZZsxzz4Dt5WfGxDon2nc2bD6XGiZ2PIy8fmX6NQ==}
    engines: {node: '>=18.14.1'}
    peerDependencies:
      astro: ^3.2.3
    dependencies:
      '@astrojs/markdown-remark': 3.2.1(astro@3.1.0)
      '@mdx-js/mdx': 2.3.0
      acorn: 8.10.0
      astro: 3.1.0(sass@1.64.1)
      es-module-lexer: 1.3.1
      estree-util-visit: 1.2.1
      github-slugger: 2.0.0
      gray-matter: 4.0.3
      hast-util-to-html: 8.0.4
      kleur: 4.1.5
      rehype-raw: 6.1.1
      remark-gfm: 3.0.1
      remark-smartypants: 2.0.0
      source-map: 0.7.4
      unist-util-visit: 4.1.2
      vfile: 5.3.7
    transitivePeerDependencies:
      - supports-color
    dev: false
      zod: 3.21.4
  /@astrojs/solid-js@2.2.1(@babel/core@7.23.0)(solid-js@1.7.11)(vite@4.4.9):
      babel-preset-solid: 1.7.12(@babel/core@7.23.0)
      ci-info: 3.9.0
      undici: 5.25.4
      ci-info: 3.9.0
      is-wsl: 3.1.0
      undici: 5.25.4
      undici: 5.25.4
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      '@babel/highlight': 7.22.20
  /@babel/compat-data@7.22.20:
    resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==}
  /@babel/core@7.23.0:
    resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==}
      '@babel/generator': 7.23.0
      '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0)
      '@babel/helpers': 7.23.1
      '@babel/parser': 7.23.0
      '@babel/traverse': 7.23.0
      '@babel/types': 7.23.0
      convert-source-map: 2.0.0
  /@babel/eslint-parser@7.22.15(@babel/core@7.23.0)(eslint@8.45.0):
    resolution: {integrity: sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==}
      '@babel/core': ^7.11.0
      '@babel/core': 7.23.0
  /@babel/generator@7.23.0:
    resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
      '@babel/types': 7.23.0
      '@jridgewell/trace-mapping': 0.3.19
      '@babel/types': 7.23.0
      '@babel/compat-data': 7.22.20
      browserslist: 4.22.1
  /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0):
    resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==}
      '@babel/core': 7.23.0
      '@babel/helper-environment-visitor': 7.22.20
      '@babel/helper-function-name': 7.23.0
      '@babel/helper-member-expression-to-functions': 7.23.0
      '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0)
      '@babel/helper-split-export-declaration': 7.22.6
  /@babel/helper-environment-visitor@7.22.20:
    resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
  /@babel/helper-function-name@7.23.0:
    resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
      '@babel/template': 7.22.15
      '@babel/types': 7.23.0
      '@babel/types': 7.23.0
  /@babel/helper-member-expression-to-functions@7.23.0:
    resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
      '@babel/types': 7.23.0
      '@babel/types': 7.23.0
      '@babel/types': 7.23.0
  /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0):
    resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
      '@babel/core': 7.23.0
      '@babel/helper-environment-visitor': 7.22.20
      '@babel/helper-validator-identifier': 7.22.20
      '@babel/types': 7.23.0
  /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0):
    resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
    peerDependencies:
      '@babel/core': ^7.0.0
      '@babel/core': 7.23.0
      '@babel/helper-environment-visitor': 7.22.20
      '@babel/helper-member-expression-to-functions': 7.23.0
      '@babel/types': 7.23.0
      '@babel/types': 7.23.0
      '@babel/types': 7.23.0
  /@babel/helper-validator-identifier@7.22.20:
    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
  /@babel/helpers@7.23.1:
    resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==}
      '@babel/traverse': 7.23.0
      '@babel/types': 7.23.0
  /@babel/highlight@7.22.20:
    resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
      '@babel/helper-validator-identifier': 7.22.20
  /@babel/parser@7.23.0:
    resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
      '@babel/types': 7.23.0
  /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0):
      '@babel/core': 7.23.0
  /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0):
      '@babel/core': 7.23.0
  /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0):
    resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==}
      '@babel/core': 7.23.0
      '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0)
  /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0):
    resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==}
      '@babel/core': 7.23.0
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0)
      '@babel/types': 7.23.0
  /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0):
    resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==}
      '@babel/core': 7.23.0
      '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0)
      '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0)
  /@babel/preset-typescript@7.23.0(@babel/core@7.23.0):
    resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==}
      '@babel/core': 7.23.0
      '@babel/helper-validator-option': 7.22.15
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0)
      '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0)
      '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0)
  /@babel/runtime@7.23.1:
    resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==}
      regenerator-runtime: 0.14.0
  /@babel/standalone@7.23.1:
    resolution: {integrity: sha512-a4muOYz1qUaSoybuUKwK90mRG4sf5rBeUbuzpuGLzG32ZDE/Y2YEebHDODFJN+BtyOKi19hrLfq2qbNyKMx0TA==}
      '@babel/parser': 7.23.0
      '@babel/types': 7.23.0
  /@babel/traverse@7.23.0:
    resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==}
      '@babel/generator': 7.23.0
      '@babel/helper-environment-visitor': 7.22.20
      '@babel/helper-function-name': 7.23.0
      '@babel/parser': 7.23.0
      '@babel/types': 7.23.0
  /@babel/types@7.23.0:
    resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
      '@babel/helper-validator-identifier': 7.22.20
  /@bufbuild/connect-node@0.9.1(@bufbuild/protobuf@1.3.3):
    deprecated: Connect has moved to its own org @connectrpc and has a stable v1. Run `npx @connectrpc/connect-migrate@latest` to update. See https://github.com/connectrpc/connect-es/releases/tag/v0.13.1 for details.
      '@bufbuild/connect': 0.9.1(@bufbuild/protobuf@1.3.3)
      '@bufbuild/protobuf': 1.3.3
      headers-polyfill: 3.3.0
  /@bufbuild/connect@0.9.1(@bufbuild/protobuf@1.3.3):
    deprecated: Connect has moved to its own org @connectrpc and has a stable v1. Run `npx @connectrpc/connect-migrate@latest` to update. See https://github.com/connectrpc/connect-es/releases/tag/v0.13.1 for details.
      '@bufbuild/protobuf': 1.3.3
  /@bufbuild/protobuf@1.3.3:
    resolution: {integrity: sha512-AoHSiIpTFF97SQgmQni4c+Tyr0CDhkaRaR2qGEJTEbauqQwLRpLrd9yVv//wVHOSxr/b4FJcL54VchhY6710xA==}
  /@esbuild/android-arm64@0.19.4:
    resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==}
  /@esbuild/android-arm@0.19.4:
    resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==}
  /@esbuild/android-x64@0.19.4:
    resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==}
  /@esbuild/darwin-arm64@0.19.4:
    resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==}
  /@esbuild/darwin-x64@0.19.4:
    resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==}
  /@esbuild/freebsd-arm64@0.19.4:
    resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==}
  /@esbuild/freebsd-x64@0.19.4:
    resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==}
  /@esbuild/linux-arm64@0.19.4:
    resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==}
  /@esbuild/linux-arm@0.19.4:
    resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==}
  /@esbuild/linux-ia32@0.19.4:
    resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==}
  /@esbuild/linux-loong64@0.19.4:
    resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==}
  /@esbuild/linux-mips64el@0.19.4:
    resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==}
  /@esbuild/linux-ppc64@0.19.4:
    resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==}
  /@esbuild/linux-riscv64@0.19.4:
    resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==}
  /@esbuild/linux-s390x@0.19.4:
    resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==}
  /@esbuild/linux-x64@0.19.4:
    resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==}
  /@esbuild/netbsd-x64@0.19.4:
    resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==}
  /@esbuild/openbsd-x64@0.19.4:
    resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==}
  /@esbuild/sunos-x64@0.19.4:
    resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==}
  /@esbuild/win32-arm64@0.19.4:
    resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==}
  /@esbuild/win32-ia32@0.19.4:
    resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==}
  /@esbuild/win32-x64@0.19.4:
    resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==}
      eslint-visitor-keys: 3.4.3
  /@eslint-community/regexpp@4.9.1:
    resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
  /@eslint/eslintrc@2.1.2:
    resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
      globals: 13.23.0
  /@fastify/busboy@2.0.0:
    resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==}
    engines: {node: '>=14'}

      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
  /@fastify/error@3.4.0:
    resolution: {integrity: sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==}
      fast-json-stringify: 5.8.0
      '@fastify/error': 3.4.0
      fast-jwt: 3.3.1
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      '@fastify/error': 3.4.0
      '@fastify/swagger': 8.11.0
      '@fastify/swagger-ui': 1.10.0
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      tiny-lru: 11.2.2
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      readable-stream: 4.4.2
  /@fastify/swagger-ui@1.10.0:
    resolution: {integrity: sha512-vps8KRDQ8JWQGG9Dh6fCOzAc81Y5a6RnCU/Sumyw3n7+HXJSYExnLLgv4aS9eRFSODtQ8kzZJ//IxAbf0nZ+sQ==}
      fastify-plugin: 4.5.1
  /@fastify/swagger@8.11.0:
    resolution: {integrity: sha512-K8hAWr3wTBUojjJfNUy0TAl766ga2O/L5mWVbBZ6MImOOB3GYUgqNXC4MKrOejt8Y4Ps4cdKjkgzWLcUtg8SFg==}
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      fastify-plugin: 4.5.1
      ws: 8.14.2
  /@floating-ui/core@1.5.0:
    resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
    dependencies:
      '@floating-ui/utils': 0.1.6
      '@floating-ui/core': 1.5.0
    dev: false

  /@floating-ui/utils@0.1.6:
    resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
  /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1):
      graphql: 16.8.1
  /@hocuspocus/common@2.6.1:
    resolution: {integrity: sha512-s6//HV4D8Oav3uFHZKWcKtKaKPd6j2hidmplFKufgh1dSKeZ6psiNv9SzB3GUYPva7Vw81dWbJ2U8fkOYNqHzg==}
      lib0: 0.2.86
      uuid: 9.0.1
      '@hocuspocus/common': 2.6.1
      lib0: 0.2.86
      '@hocuspocus/common': 2.6.1
      lib0: 0.2.86
      uuid: 9.0.1
      ws: 8.14.2
      '@tiptap/starter-kit': 2.1.11(@tiptap/pm@2.1.8)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
  /@humanwhocodes/config-array@0.11.11:
    resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==}
  /@iconify/utils@2.1.11:
    resolution: {integrity: sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==}
      '@jridgewell/trace-mapping': 0.3.19
  /@jridgewell/resolve-uri@3.1.1:
    resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
  /@jridgewell/source-map@0.3.5:
    resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
      '@jridgewell/trace-mapping': 0.3.19
  /@jridgewell/trace-mapping@0.3.19:
    resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==}
      '@jridgewell/resolve-uri': 3.1.1
      '@jridgewell/sourcemap-codec': 1.4.15
  /@lukeed/ms@2.0.1:
    resolution: {integrity: sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==}
    engines: {node: '>=8'}
  /@manypkg/find-root@2.1.0:
    resolution: {integrity: sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==}
    engines: {node: '>=14.18.0'}
  /@mdx-js/mdx@2.3.0:
    resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/mdx': 2.0.8
      estree-util-build-jsx: 2.2.2
      estree-util-is-identifier-name: 2.1.0
      estree-util-to-js: 1.2.0
      estree-walker: 3.0.3
      hast-util-to-estree: 2.3.3
      markdown-extensions: 1.1.1
      periscopic: 3.1.0
      remark-mdx: 2.3.0
      remark-parse: 10.0.2
      remark-rehype: 10.1.0
      unified: 10.1.2
      unist-util-position-from-estree: 1.1.2
      unist-util-stringify-position: 3.0.3
      unist-util-visit: 4.1.2
      vfile: 5.3.7
    transitivePeerDependencies:
      - supports-color
    dev: false

  /@motionone/animation@10.16.3:
    resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==}
      '@motionone/easing': 10.16.3
      '@motionone/types': 10.16.3
      '@motionone/utils': 10.16.3
      tslib: 2.6.2
  /@motionone/dom@10.16.4:
    resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==}
      '@motionone/animation': 10.16.3
      '@motionone/generators': 10.16.4
      '@motionone/types': 10.16.3
      '@motionone/utils': 10.16.3
      tslib: 2.6.2
  /@motionone/easing@10.16.3:
    resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==}
      '@motionone/utils': 10.16.3
      tslib: 2.6.2
  /@motionone/generators@10.16.4:
    resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==}
      '@motionone/types': 10.16.3
      '@motionone/utils': 10.16.3
      tslib: 2.6.2
  /@motionone/solid@10.16.2(solid-js@1.7.11):
      '@motionone/dom': 10.16.4
      '@motionone/utils': 10.16.3
      '@solid-primitives/props': 3.1.8(solid-js@1.7.11)
      '@solid-primitives/refs': 1.0.5(solid-js@1.7.11)
      '@solid-primitives/transition-group': 1.0.3(solid-js@1.7.11)
      solid-js: 1.7.11
  /@motionone/types@10.16.3:
    resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==}
  /@motionone/utils@10.16.3:
    resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==}
      '@motionone/types': 10.16.3
      tslib: 2.6.2
  /@octokit/app@14.0.1:
    resolution: {integrity: sha512-4opdXcWBVhzd6FOxlaxDKXXqi9Vz2hsDSWQGNo49HbYFAX11UqMpksMjEdfvHy0x19Pse8Nvn+R6inNb/V398w==}
      '@octokit/auth-app': 6.0.1
      '@octokit/auth-unauthenticated': 5.0.1
      '@octokit/core': 5.0.1
      '@octokit/plugin-paginate-rest': 9.0.0(@octokit/core@5.0.1)
      '@octokit/types': 12.0.0
  /@octokit/auth-app@6.0.1:
    resolution: {integrity: sha512-tjCD4nzQNZgmLH62+PSnTF6eGerisFgV4v6euhqJik6yWV96e1ZiiGj+NXIqbgnpjLmtnBqVUrNyGKu3DoGEGA==}
      '@octokit/auth-oauth-app': 7.0.1
      '@octokit/auth-oauth-user': 4.0.1
      '@octokit/request': 8.1.3
      '@octokit/request-error': 5.0.1
      '@octokit/types': 12.0.0
      lru-cache: 10.0.1
  /@octokit/auth-oauth-app@7.0.1:
    resolution: {integrity: sha512-RE0KK0DCjCHXHlQBoubwlLijXEKfhMhKm9gO56xYvFmP1QTMb+vvwRPmQLLx0V+5AvV9N9I3lr1WyTzwL3rMDg==}
      '@octokit/auth-oauth-device': 6.0.1
      '@octokit/auth-oauth-user': 4.0.1
      '@octokit/request': 8.1.3
      '@octokit/types': 12.0.0
  /@octokit/auth-oauth-device@6.0.1:
    resolution: {integrity: sha512-yxU0rkL65QkjbqQedgVx3gmW7YM5fF+r5uaSj9tM/cQGVqloXcqP2xK90eTyYvl29arFVCW8Vz4H/t47mL0ELw==}
      '@octokit/request': 8.1.3
      '@octokit/types': 12.0.0
  /@octokit/auth-oauth-user@4.0.1:
    resolution: {integrity: sha512-N94wWW09d0hleCnrO5wt5MxekatqEJ4zf+1vSe8MKMrhZ7gAXKFOKrDEZW2INltvBWJCyDUELgGRv8gfErH1Iw==}
      '@octokit/auth-oauth-device': 6.0.1
      '@octokit/request': 8.1.3
      '@octokit/types': 12.0.0
  /@octokit/auth-unauthenticated@5.0.1:
    resolution: {integrity: sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==}
      '@octokit/request-error': 5.0.1
      '@octokit/types': 12.0.0
  /@octokit/core@5.0.1:
    resolution: {integrity: sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==}
      '@octokit/graphql': 7.0.2
      '@octokit/request': 8.1.3
      '@octokit/request-error': 5.0.1
      '@octokit/types': 12.0.0
  /@octokit/endpoint@9.0.1:
    resolution: {integrity: sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA==}
      '@octokit/types': 12.0.0
  /@octokit/graphql@7.0.2:
    resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==}
      '@octokit/request': 8.1.3
      '@octokit/types': 12.0.0
      '@octokit/auth-oauth-app': 7.0.1
      '@octokit/auth-oauth-user': 4.0.1
      '@octokit/auth-unauthenticated': 5.0.1
      '@octokit/core': 5.0.1
      '@types/aws-lambda': 8.10.124
      '@octokit/request': 8.1.3
      '@octokit/request-error': 5.0.1
  /@octokit/openapi-types@18.1.1:
    resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==}
    dev: false

  /@octokit/openapi-types@19.0.0:
    resolution: {integrity: sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==}
  /@octokit/plugin-paginate-rest@8.0.0(@octokit/core@5.0.1):
      '@octokit/core': 5.0.1
  /@octokit/plugin-paginate-rest@9.0.0(@octokit/core@5.0.1):
    resolution: {integrity: sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw==}
    engines: {node: '>= 18'}
    peerDependencies:
      '@octokit/core': '>=5'
    dependencies:
      '@octokit/core': 5.0.1
      '@octokit/types': 12.0.0
    dev: false

  /@octokit/plugin-request-log@4.0.0(@octokit/core@5.0.1):
      '@octokit/core': 5.0.1
  /@octokit/plugin-rest-endpoint-methods@9.0.0(@octokit/core@5.0.1):
      '@octokit/core': 5.0.1
  /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.1):
    resolution: {integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==}
      '@octokit/core': 5.0.1
      '@octokit/request-error': 5.0.1
      '@octokit/types': 12.0.0
  /@octokit/plugin-throttling@7.0.0(@octokit/core@5.0.1):
      '@octokit/core': 5.0.1
  /@octokit/request-error@5.0.1:
    resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==}
      '@octokit/types': 12.0.0
      node-fetch: 2.7.0
  /@octokit/request@8.1.3:
    resolution: {integrity: sha512-iUvXP4QmysS8kyE/a4AGwR0A+tHDVxgW6TmPd2ci8/Xc8KjlBtTKSDpZlUT5Y4S4Nu+eM8LvbOYjVAp/sz3Gpg==}
      '@octokit/endpoint': 9.0.1
      '@octokit/request-error': 5.0.1
      '@octokit/types': 12.0.0
      '@octokit/core': 5.0.1
      '@octokit/plugin-paginate-rest': 8.0.0(@octokit/core@5.0.1)
      '@octokit/plugin-request-log': 4.0.0(@octokit/core@5.0.1)
      '@octokit/plugin-rest-endpoint-methods': 9.0.0(@octokit/core@5.0.1)
      '@octokit/openapi-types': 18.1.1
      '@octokit/openapi-types': 18.1.1
    dev: false

  /@octokit/types@12.0.0:
    resolution: {integrity: sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==}
    dependencies:
      '@octokit/openapi-types': 19.0.0
      '@octokit/openapi-types': 18.1.1
      '@octokit/request-error': 5.0.1
  /@pkgr/utils@2.4.2:
    resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==}
      tslib: 2.6.2
  /@polka/url@1.0.0-next.23:
    resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==}
  /@prettier/sync@0.3.0(prettier@3.0.2):
    resolution: {integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==}
    peerDependencies:
      prettier: ^3.0.0
    dependencies:
      prettier: 3.0.2
    dev: false

  /@qdrant/js-client-grpc@1.4.0(typescript@5.2.2):
      '@bufbuild/connect': 0.9.1(@bufbuild/protobuf@1.3.3)
      '@bufbuild/connect-node': 0.9.1(@bufbuild/protobuf@1.3.3)
      '@bufbuild/protobuf': 1.3.3
      typescript: 5.2.2
  /@qdrant/js-client-rest@1.4.0(typescript@5.2.2):
      typescript: 5.2.2
      undici: 5.25.4
  /@qdrant/qdrant-js@1.4.0(typescript@5.2.2):
      '@qdrant/js-client-grpc': 1.4.0(typescript@5.2.2)
      '@qdrant/js-client-rest': 1.4.0(typescript@5.2.2)
      typescript: 5.2.2
      '@babel/runtime': 7.23.1
      '@babel/runtime': 7.23.1
  /@remirror/core-constants@2.0.2:
    resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==}
  /@remirror/core-helpers@3.0.0:
    resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==}
      '@remirror/core-constants': 2.0.2
      '@types/object.omit': 3.0.1
  /@rollup/plugin-alias@5.0.1(rollup@3.29.4):
    resolution: {integrity: sha512-JObvbWdOHoMy9W7SU0lvGhDtWq9PllP5mjpAy+TUslZG/WzOId9u80Hsqq1vCUn9pFJ0cxpdcnAv+QzU2zFH3Q==}
      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
      rollup: 3.29.4
  /@rollup/plugin-commonjs@24.1.0(rollup@3.29.4):
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      rollup: 3.29.4
  /@rollup/plugin-json@6.0.1(rollup@3.29.4):
    resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==}
      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      rollup: 3.29.4
  /@rollup/plugin-node-resolve@15.2.2(rollup@3.29.4):
    resolution: {integrity: sha512-f64bU4OKqV0yihtxFemmuf0oj37pToCFMISCA+sJbbIAl5wcpbRO9XgWNWb1tDiWQJUcPxo6V0l59hcuZOQ3kw==}
      rollup: ^2.78.0||^3.0.0||^4.0.0
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      resolve: 1.22.6
      rollup: 3.29.4
  /@rollup/plugin-replace@5.0.3(rollup@3.29.4):
    resolution: {integrity: sha512-je7fu05B800IrMlWjb2wzJcdXzHYW46iTipfChnBDbIbDXhASZs27W1B58T2Yf45jZtJUONegpbce+9Ut2Ti/Q==}
      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      rollup: 3.29.4
  /@rollup/pluginutils@5.0.5(rollup@3.29.4):
    resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==}
      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
      '@types/estree': 1.0.2
      rollup: 3.29.4
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
      tslib: 2.6.2
  /@solid-primitives/active-element@2.0.15(solid-js@1.7.11):
      '@solid-primitives/event-listener': 2.3.0(solid-js@1.7.11)
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/connectivity@0.3.15(solid-js@1.7.11):
      '@solid-primitives/event-listener': 2.3.0(solid-js@1.7.11)
      '@solid-primitives/rootless': 1.4.2(solid-js@1.7.11)
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/event-listener@2.3.0(solid-js@1.7.11):
    resolution: {integrity: sha512-0DS7DQZvCExWSpurVZC9/wjI8RmkhuOtWOy6Pp1Woq9ElMT9/bfjNpkwXsOwisLpcTqh9eUs17kp7jtpWcC20w==}
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/media@2.2.3(solid-js@1.7.11):
      '@solid-primitives/event-listener': 2.3.0(solid-js@1.7.11)
      '@solid-primitives/rootless': 1.4.2(solid-js@1.7.11)
      '@solid-primitives/static-store': 0.0.4(solid-js@1.7.11)
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/memo@1.3.2(solid-js@1.7.11):
      '@solid-primitives/scheduled': 1.4.0(solid-js@1.7.11)
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/props@3.1.8(solid-js@1.7.11):
    resolution: {integrity: sha512-38ERNFhl87emUDPRlYvCmlbvEcK2mOJB38SU22YS2QXFDK7TQf/7P46XZacs7oODc/fckhfZTitht71FMEDe2g==}
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/refs@1.0.5(solid-js@1.7.11):
    resolution: {integrity: sha512-5hmYmYbm6rs43nMHHozyyUngGA7P7q2WtlaCLJEfmlUJf67GWI1PZmqAiol6m9F37XSMZRuvZLoQ7HA/0q3GYg==}
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/rootless@1.4.2(solid-js@1.7.11):
    resolution: {integrity: sha512-ynI/2aEOPyc14IKCX6yDBqnsAYCoLbaP9V/jejEWMVKOT2ZdV2ZxdftaLimOpWPpvjyti5DUJIGTOfLaNb7jlg==}
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/scheduled@1.4.0(solid-js@1.7.11):
      solid-js: 1.7.11
  /@solid-primitives/static-store@0.0.4(solid-js@1.7.11):
      '@solid-primitives/utils': 6.2.1(solid-js@1.7.11)
      solid-js: 1.7.11
  /@solid-primitives/transition-group@1.0.3(solid-js@1.7.11):
    resolution: {integrity: sha512-TnFADZhx9sibdoW5gxkU1QmLabzV2H2OBKYGS2aR5IC61Q/+7v8wlxOJEevxXNbPiRo6qlE3STLU3L9XS8hDbA==}
      solid-js: 1.7.11
  /@solid-primitives/utils@6.2.1(solid-js@1.7.11):
    resolution: {integrity: sha512-TsecNzxiO5bLfzqb4OOuzfUmdOROcssuGqgh5rXMMaasoFZ3GoveUgdY1wcf17frMJM7kCNGNuK34EjErneZkg==}
      solid-js: 1.7.11
  /@solidjs/router@0.8.2(solid-js@1.7.11):
      solid-js: 1.7.11
    dev: false

  /@tiptap/core@2.1.11(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-1W2DdjpPwfphHgQ3Qm4s5wzCnEjiXm1TeZ+6/zBl89yKURXgv8Mw1JGdj/NcImQjtDcsNn97MscACK3GKbEJBA==}
    peerDependencies:
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/pm': 2.1.8
  /@tiptap/extension-blockquote@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-IEVe3goA0rgp1G8Wm733BSRJiy71Vh2fmTCyZKWmc2A6GREVSy1X3fCvAo6pMENRObhjIoaBQUCE3p4iJYOxqg==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-bold@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-vhdkBtvd029ufOYt2ug49Gz+RLKSczO/CCqKYBqBmpIpsifyK7M6jkgamvAQg3c/vYk0LNcKiL2dp0Jp7L+5Gw==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-bullet-list@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-SOOVH2aSmdMtjWL7TTLbN72xbAFz2G5jifT4UCXb7Qx6LsyhNCyDCu0ukOW8rSosGoSdmBXxAsD9sBJ1jEOmZw==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-code-block-lowlight@2.1.8(@tiptap/core@2.1.8)(@tiptap/extension-code-block@2.1.11)(@tiptap/pm@2.1.8):
      '@tiptap/extension-code-block': 2.1.11(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)
      '@tiptap/pm': 2.1.8
    dev: false

  /@tiptap/extension-code-block@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-QhmhCCWqg/5qLXpZ3sl2A0rqJqV8zMOegcxUFaqcJMOqNbsuHcRgc9C+1hWSVLbCmstB7M6sgF02QpTBOkYHxg==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
  /@tiptap/extension-code-block@2.1.11(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-QhmhCCWqg/5qLXpZ3sl2A0rqJqV8zMOegcxUFaqcJMOqNbsuHcRgc9C+1hWSVLbCmstB7M6sgF02QpTBOkYHxg==}
  /@tiptap/extension-code@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-G0UEbMFunujy/F86yHN0/dumPLbwTis9C+6IQv1XRPNsV28U0MgxBhlPcJUgyO5lwuleePDxiBVcRv2XrysgKw==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

      y-prosemirror: 1.0.20(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.0.20(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
      y-prosemirror: 1.2.1(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7)
    dev: false

  /@tiptap/extension-document@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-L/iLuqxvJep33ycCFNrnUhdR0VtcZyeNnqB+ZvVHzEwLoRud+LBy44lpEdBrAFsvRm3DG14m/FGYL+TfaD0vxA==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
  /@tiptap/extension-dropcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-MiJepRpHlu93aInOMW8NeRCvm9VE5rL0MA9TONY/IspJFGFIqonc/01J6t33JQa3Xh/x3xAfis4nKa/UazeVJw==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
      '@tiptap/pm': 2.1.8
    dev: false

  /@tiptap/extension-gapcursor@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-P/xjyhSOVyop5XXbNtRPgrooQrSlpYblwR67ClI9FAC7uQliuOwi5VcndmEItjWWSe85kJa2IHjOS7mLYvJe8A==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
      '@tiptap/pm': 2.1.8
    dev: false

  /@tiptap/extension-hard-break@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-qhiPe6FA0b6PPb/ITlgSnY0l9tEVmXZ9e7eSjvks12ORfqL/dofSCLtChHWvhZxugzo92xejG2hXLi6lyOLbkg==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-heading@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-QBtl0S1aDFB+F1wvTrS5iGdNUEeXp+WuTddj+L2f5EP4KqG2x7sj7e7ENMy20g/l8tbKwzd3AZZydvClH4Ybbw==}
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
  /@tiptap/extension-history@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-88dovV2O9icmBn0IvaArFFeS6X5ts6BxZPu5VbGML8KBL8iAu+Og7RXEPdOy5e13K0K4V21fDpO3n7KdvNOAYQ==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
      '@tiptap/pm': 2.1.8
    dev: false

  /@tiptap/extension-horizontal-rule@2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-uvHPa2YCKnDhtSBSZB3lk5U4H3wRKP0DNvVx4Y2F7MdQianVzcyOd1pZYO9BQs+lUB1aZots6doE69Zqz3mU2Q==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
      '@tiptap/pm': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
      '@tiptap/pm': 2.1.8
    dev: false

  /@tiptap/extension-italic@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-QmDsHtnBBit/1KtQpBPxjSPjDC1mVKtoNTgsEwMWK6YAkCKOKPj7oPEqqjaNZIRMKPPzE5XCsfBoS3jtVmo+6A==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-list-item@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-YhwHaPGhffsFsg/zjCu1G24//j/BTRDRZbZXmMwp77m1yEqPULcWyoWrI+gUzetQxJRD/ruAucqjLtoLLfICmQ==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-ordered-list@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-/tghfEJ5U7WFbF8xyOqRJks8KxP/lRjnroMXMglaushSMx8PYPo1dZDB/dJZw7ksy47MAaKJfKlx3gyN2CPXBQ==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-paragraph@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-gXMgJ2CU3X4yh1wKnb8RdbDmhITB76pH6DX0uWprmEgvzNMN3Qw+h5uBD9lgxg1WVghbCmkG9mY9J4PPbPTLxw==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-strike@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-UnjeSVgu3bDuyjjUdWsUErRCoQKAHCzH/pAiqTEPEEdFYgZFQPBpcJICRVdlYjRmI2ZKh6d0TMUS55m7ckmwmQ==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

  /@tiptap/extension-text@2.1.11(@tiptap/core@2.1.11):
    resolution: {integrity: sha512-Iey0EXYv9079+lbHMvZtLc6XcYfKrq++msEXuFFNHxvL0i/XzndhGf+qlDhLROLgEtDiiTqzOBBwFCGlFjbDow==}
    peerDependencies:
      '@tiptap/core': ^2.0.0
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
    dev: false

      prosemirror-markdown: 1.11.2
      prosemirror-menu: 1.2.4
      prosemirror-model: 1.19.3
      prosemirror-tables: 1.3.4
      prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)
      prosemirror-transform: 1.8.0
      prosemirror-view: 1.32.0
    dev: false

  /@tiptap/starter-kit@2.1.11(@tiptap/pm@2.1.8):
    resolution: {integrity: sha512-kZXwuo9yxrs1ASxluRKjXThjdcy90d7owJxnJWD7SyEwXaXYc4h+Ar1M9rP3jieCDBuRTtCgvAOKbVbhnRJ2jg==}
    dependencies:
      '@tiptap/core': 2.1.11(@tiptap/pm@2.1.8)
      '@tiptap/extension-blockquote': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-bold': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-bullet-list': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-code': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-code-block': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8)
      '@tiptap/extension-document': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-dropcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8)
      '@tiptap/extension-gapcursor': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8)
      '@tiptap/extension-hard-break': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-heading': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-history': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8)
      '@tiptap/extension-horizontal-rule': 2.1.11(@tiptap/core@2.1.11)(@tiptap/pm@2.1.8)
      '@tiptap/extension-italic': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-list-item': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-ordered-list': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-paragraph': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-strike': 2.1.11(@tiptap/core@2.1.11)
      '@tiptap/extension-text': 2.1.11(@tiptap/core@2.1.11)
  /@trysound/sax@0.2.0:
    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
    engines: {node: '>=10.13.0'}
    dev: false

  /@types/acorn@4.0.6:
    resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
    dependencies:
      '@types/estree': 1.0.2
    dev: false

  /@types/aws-lambda@8.10.124:
    resolution: {integrity: sha512-PHqK0SuAkFS3tZjceqRXecxxrWIN3VqTicuialtK2wZmvBy7H9WGc3u3+wOgaZB7N8SpSXDpWk9qa7eorpTStg==}
  /@types/babel__core@7.20.2:
    resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==}
      '@babel/parser': 7.23.0
      '@babel/types': 7.23.0
      '@types/babel__generator': 7.6.5
      '@types/babel__template': 7.4.2
      '@types/babel__traverse': 7.20.2
  /@types/babel__generator@7.6.5:
    resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==}
      '@babel/types': 7.23.0
  /@types/babel__template@7.4.2:
    resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==}
      '@babel/parser': 7.23.0
      '@babel/types': 7.23.0
  /@types/babel__traverse@7.20.2:
    resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==}
      '@babel/types': 7.23.0
  /@types/debug@4.1.9:
    resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==}
      '@types/ms': 0.7.32
  /@types/dom-view-transitions@1.0.2:
    resolution: {integrity: sha512-+ctRyzGMOZB5AbvhpTv37OWkP9N3Xxfac7bhS7AcuRMmO03SHxm5/5kWCPtcatx2gW+NhFMdl7l1DqJvvPVtwg==}
      '@types/trusted-types': 2.0.4
  /@types/estree-jsx@1.0.1:
    resolution: {integrity: sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ==}
    dependencies:
      '@types/estree': 1.0.2
    dev: false

  /@types/estree@1.0.2:
    resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==}
  /@types/hast@2.3.6:
    resolution: {integrity: sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==}
    dependencies:
      '@types/unist': 2.0.8

  /@types/hast@3.0.1:
    resolution: {integrity: sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==}
      '@types/unist': 3.0.0
    dev: false
  /@types/js-yaml@4.0.6:
    resolution: {integrity: sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw==}
    dev: false

  /@types/json-schema@7.0.13:
    resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==}
  /@types/jsonwebtoken@9.0.3:
    resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==}
  /@types/mdast@3.0.13:
    resolution: {integrity: sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==}
      '@types/unist': 2.0.8
  /@types/mdast@4.0.1:
    resolution: {integrity: sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==}
  /@types/mdx@2.0.8:
    resolution: {integrity: sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA==}
    dev: false

  /@types/ms@0.7.32:
    resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==}
  /@types/nlcst@1.0.2:
    resolution: {integrity: sha512-ykxL/GDDUhqikjU0LIywZvEwb1NTYXTEWf+XgMSS2o6IXIakafPccxZmxgZcvJPZ3yFl2kdL1gJZz3U3iZF3QA==}
      '@types/unist': 2.0.8
  /@types/node-fetch@2.6.6:
    resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==}
      form-data: 4.0.0
  /@types/node@18.18.4:
    resolution: {integrity: sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ==}
  /@types/normalize-package-data@2.4.2:
    resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==}
  /@types/object.omit@3.0.1:
    resolution: {integrity: sha512-24XD34UeRWw505TsMNBrQ4bES2s8IxiFC59mmNUFhTz9IX2hAtA7gQ8wVww1i17QmhBYILg5iqYP2y7aqA3pwQ==}
  /@types/prop-types@15.7.8:
    resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==}
      '@types/prop-types': 15.7.8
      '@types/scheduler': 0.16.4
    dev: true
  /@types/resolve@1.20.3:
    resolution: {integrity: sha512-NH5oErHOtHZYcjCtg69t26aXEk4BN2zLWqf7wnDZ+dpe0iR7Rds1SPGEItl3fca21oOe0n3OCnZ4W7jBxu7FOw==}

  /@types/sax@1.2.5:
    resolution: {integrity: sha512-9jWta97bBVC027/MShr3gLab8gPhKy4l6qpb+UJLF5pDm3501NvA7uvqVCW+REFtx00oTi6Cq9JzLwgq6evVgw==}
  /@types/scheduler@0.16.4:
    resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==}
  /@types/semver@7.5.3:
    resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==}
  /@types/trusted-types@2.0.4:
    resolution: {integrity: sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==}
  /@types/unist@2.0.8:
    resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==}
  /@types/webidl-conversions@7.0.1:
    resolution: {integrity: sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg==}
      '@types/webidl-conversions': 7.0.1
  /@types/yargs-parser@21.0.1:
    resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==}
  /@typescript-eslint/eslint-plugin@3.10.1(@typescript-eslint/parser@3.10.1)(eslint@8.45.0)(typescript@5.2.2):
      '@typescript-eslint/experimental-utils': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      tsutils: 3.21.0(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/eslint-plugin@6.2.0(@typescript-eslint/parser@6.2.0)(eslint@8.45.0)(typescript@5.2.2):
      '@eslint-community/regexpp': 4.9.1
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      '@typescript-eslint/type-utils': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      '@typescript-eslint/utils': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      ts-api-utils: 1.0.3(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/experimental-utils@3.10.1(eslint@8.45.0)(typescript@5.2.2):
      '@types/json-schema': 7.0.13
      '@typescript-eslint/typescript-estree': 3.10.1(typescript@5.2.2)
  /@typescript-eslint/parser@3.10.1(eslint@8.45.0)(typescript@5.2.2):
      '@typescript-eslint/experimental-utils': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      '@typescript-eslint/typescript-estree': 3.10.1(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/parser@6.2.0(eslint@8.45.0)(typescript@5.2.2):
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/scope-manager@5.62.0:
    resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
      '@typescript-eslint/types': 5.62.0
      '@typescript-eslint/visitor-keys': 5.62.0
  /@typescript-eslint/type-utils@6.2.0(eslint@8.45.0)(typescript@5.2.2):
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.2.2)
      '@typescript-eslint/utils': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      ts-api-utils: 1.0.3(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/types@5.62.0:
    resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
  /@typescript-eslint/typescript-estree@3.10.1(typescript@5.2.2):
      tsutils: 3.21.0(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2):
    resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
      '@typescript-eslint/types': 5.62.0
      '@typescript-eslint/visitor-keys': 5.62.0
      tsutils: 3.21.0(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/typescript-estree@6.2.0(typescript@5.2.2):
      ts-api-utils: 1.0.3(typescript@5.2.2)
      typescript: 5.2.2
  /@typescript-eslint/utils@5.62.0(eslint@8.45.0)(typescript@5.2.2):
    resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
      '@types/json-schema': 7.0.13
      '@types/semver': 7.5.3
      '@typescript-eslint/scope-manager': 5.62.0
      '@typescript-eslint/types': 5.62.0
      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
  /@typescript-eslint/utils@6.2.0(eslint@8.45.0)(typescript@5.2.2):
      '@types/json-schema': 7.0.13
      '@types/semver': 7.5.3
      '@typescript-eslint/typescript-estree': 6.2.0(typescript@5.2.2)
  /@typescript-eslint/visitor-keys@5.62.0:
    resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
      '@typescript-eslint/types': 5.62.0
      eslint-visitor-keys: 3.4.3
      eslint-visitor-keys: 3.4.3
  /@ungap/structured-clone@1.2.0:
    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
    dev: false
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      magic-string: 0.30.4
      unconfig: 0.3.11
  /@unocss/postcss@0.55.7(postcss@8.4.31):
      magic-string: 0.30.4
      postcss: 8.4.31
      '@iconify/utils': 2.1.11
  /@unocss/vite@0.55.7(vite@4.4.9):
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      magic-string: 0.30.4
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /@vrite/tiptap-solid@1.0.0(@tiptap/core@2.1.8)(@tiptap/pm@2.1.8)(solid-js@1.7.11):
    resolution: {integrity: sha512-eSv3kr8VAjyZ8aVEfhzIGe/LLDAcdBS0GEcWr+Eaab3tM6N11PIhI/1vlufU02uAF0JFY4yx/NA1jvGLU8jEWw==}
      '@tiptap/core': 2.1.8
      '@tiptap/pm': 2.1.8
      solid-js: ^1.7.11
      solid-js: 1.7.11
  /@vscode/emmet-helper@2.9.2:
    resolution: {integrity: sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==}
      emmet: 2.4.6
      vscode-languageserver-textdocument: 1.0.11
      vscode-languageserver-types: 3.17.5
  /@vscode/l10n@0.0.16:
    resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==}
  /ansi-sequence-parser@1.1.1:
    resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==}
  /array-includes@3.1.7:
    resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /array.prototype.flat@1.3.2:
    resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /array.prototype.flatmap@1.3.2:
    resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /arraybuffer.prototype.slice@1.0.2:
    resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
    engines: {node: '>= 0.4'}
    dependencies:
      array-buffer-byte-length: 1.0.0
      call-bind: 1.0.2
      define-properties: 1.2.1
      es-abstract: 1.22.2
      get-intrinsic: 1.2.1
      is-array-buffer: 3.0.2
      is-shared-array-buffer: 1.0.2
    dev: true

  /astring@1.8.6:
    resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
    hasBin: true
    dev: false

  /astro-auto-import@0.3.1(astro@3.1.0):
    resolution: {integrity: sha512-4kXZMlZFiq3dqT6fcfPbCjHTABQ279eKbIqZAb6qktBhGlmHwpHr1spOUFj/RQFilaWVgfjzOBmuZnoydZb5Vg==}
    engines: {node: '>=16.0.0'}
    peerDependencies:
      astro: ^2.0.0 || ^3.0.0-beta
    dependencies:
      '@types/node': 18.18.4
      acorn: 8.10.0
      astro: 3.1.0(sass@1.64.1)
    dev: false

  /astro-icon@0.8.1:
    resolution: {integrity: sha512-APk+fbFnoyGdIVSPFrdrOW9YBK96/1fYuVe7ULTGW92+z00RKB8GfLJiUvzNVXUAX2rZJCFmruGVF4rrhcTYsg==}
    dependencies:
      node-fetch: 3.3.2
      resolve-pkg: 2.0.0
      svgo: 2.8.0
    dev: false

      zod: 3.22.4
      '@babel/core': 7.23.0
      '@babel/generator': 7.23.0
      '@babel/parser': 7.23.0
      '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0)
      '@babel/traverse': 7.23.0
      '@babel/types': 7.23.0
      '@types/babel__core': 7.20.2
      '@types/dom-view-transitions': 1.0.2
      '@types/yargs-parser': 21.0.1
      ci-info: 3.9.0
      es-module-lexer: 1.3.1
      magic-string: 0.30.4
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      '@astrojs/compiler': 2.2.0
      '@babel/core': 7.23.0
      '@babel/generator': 7.23.0
      '@babel/parser': 7.23.0
      '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.0)
      '@babel/traverse': 7.23.0
      '@babel/types': 7.23.0
      '@types/babel__core': 7.20.2
      ci-info: 3.9.0
      es-module-lexer: 1.3.1
      esbuild: 0.19.4
      magic-string: 0.30.4
      resolve: 1.22.6
      undici: 5.25.4
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
      follow-redirects: 1.15.3
      follow-redirects: 1.15.3
  /babel-plugin-jsx-dom-expressions@0.36.18(@babel/core@7.23.0):
    resolution: {integrity: sha512-8K0CHgzNMB0+1OC+GQf1O49Nc6DfHAoWDjY4YTW3W/3il5KrDKAj65723oPmya68kKKOkqDKuz+Zh1u7VFHthw==}
      '@babel/core': 7.23.0
      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0)
      '@babel/types': 7.23.0
  /babel-preset-solid@1.7.12(@babel/core@7.23.0):
    resolution: {integrity: sha512-vNZn34Dv6IsWK/F59HhZlN8gP0ihZfkhPp8Lx/nxlY+rKtSZEAmmYlXWtds6EDKSiXoj2TEHuCcuqp6cO7oLSg==}
      '@babel/core': 7.23.0
      babel-plugin-jsx-dom-expressions: 0.36.18(@babel/core@7.23.0)
  /browserslist@4.22.1:
    resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
      caniuse-lite: 1.0.30001546
      electron-to-chromium: 1.4.544
      update-browserslist-db: 1.0.13(browserslist@4.22.1)
  /bson@5.5.0:
    resolution: {integrity: sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==}
  /caniuse-lite@1.0.30001546:
    resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==}
  /character-reference-invalid@2.0.1:
    resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
    dev: false

      fsevents: 2.3.3
  /ci-info@3.9.0:
    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
  /citty@0.1.4:
    resolution: {integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==}
    dependencies:
      consola: 3.2.3
    dev: true

  /cli-spinners@2.9.1:
    resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==}
  /commander@7.2.0:
    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
    engines: {node: '>= 10'}
    dev: false

  /convert-source-map@2.0.0:
    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
      node-fetch: 2.7.0
  /css-select@4.3.0:
    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
    dependencies:
      boolbase: 1.0.0
      css-what: 6.1.0
      domhandler: 4.3.1
      domutils: 2.8.0
      nth-check: 2.1.1
    dev: false

  /css-tree@1.1.3:
    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
    engines: {node: '>=8.0.0'}
    dependencies:
      mdn-data: 2.0.14
      source-map: 0.6.1
    dev: false

  /csso@4.2.0:
    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
    engines: {node: '>=8.0.0'}
    dependencies:
      css-tree: 1.1.3
    dev: false

  /data-uri-to-buffer@4.0.1:
    resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
    engines: {node: '>= 12'}
    dev: false

      '@babel/runtime': 7.23.1
      execa: 7.2.0
  /define-data-property@1.1.0:
    resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==}
    engines: {node: '>= 0.4'}
    dependencies:
      get-intrinsic: 1.2.1
      gopd: 1.0.1
      has-property-descriptors: 1.0.0
    dev: true

  /define-properties@1.2.1:
    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
      define-data-property: 1.1.0
  /devlop@1.1.0:
    resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
    dependencies:
      dequal: 2.0.3
    dev: false

  /dom-serializer@1.4.1:
    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
    dependencies:
      domelementtype: 2.3.0
      domhandler: 4.3.1
      entities: 2.2.0
    dev: false

  /domhandler@4.3.1:
    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
    engines: {node: '>= 4'}
    dependencies:
      domelementtype: 2.3.0
    dev: false

  /domutils@2.8.0:
    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
    dependencies:
      dom-serializer: 1.4.1
      domelementtype: 2.3.0
      domhandler: 4.3.1
    dev: false

      dotenv: 16.3.1
  /dotenv@16.3.1:
    resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
  /electron-to-chromium@1.4.544:
    resolution: {integrity: sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==}
  /emmet@2.4.6:
    resolution: {integrity: sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==}
  /entities@2.2.0:
    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
    dev: false

      dotenv: 16.3.1
  /es-abstract@1.22.2:
    resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==}
      arraybuffer.prototype.slice: 1.0.2
      function.prototype.name: 1.1.6
      has: 1.0.4
      is-typed-array: 1.1.12
      regexp.prototype.flags: 1.5.1
      safe-array-concat: 1.0.1
      string.prototype.trim: 1.2.8
      string.prototype.trimend: 1.0.7
      string.prototype.trimstart: 1.0.7
      typed-array-buffer: 1.0.0
      typed-array-byte-length: 1.0.0
      typed-array-byte-offset: 1.0.0
      which-typed-array: 1.1.11
  /es-module-lexer@1.3.1:
    resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==}
      has: 1.0.4
      has: 1.0.4
  /esbuild@0.19.4:
    resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==}
      '@esbuild/android-arm': 0.19.4
      '@esbuild/android-arm64': 0.19.4
      '@esbuild/android-x64': 0.19.4
      '@esbuild/darwin-arm64': 0.19.4
      '@esbuild/darwin-x64': 0.19.4
      '@esbuild/freebsd-arm64': 0.19.4
      '@esbuild/freebsd-x64': 0.19.4
      '@esbuild/linux-arm': 0.19.4
      '@esbuild/linux-arm64': 0.19.4
      '@esbuild/linux-ia32': 0.19.4
      '@esbuild/linux-loong64': 0.19.4
      '@esbuild/linux-mips64el': 0.19.4
      '@esbuild/linux-ppc64': 0.19.4
      '@esbuild/linux-riscv64': 0.19.4
      '@esbuild/linux-s390x': 0.19.4
      '@esbuild/linux-x64': 0.19.4
      '@esbuild/netbsd-x64': 0.19.4
      '@esbuild/openbsd-x64': 0.19.4
      '@esbuild/sunos-x64': 0.19.4
      '@esbuild/win32-arm64': 0.19.4
      '@esbuild/win32-ia32': 0.19.4
      '@esbuild/win32-x64': 0.19.4
  /eslint-config-xtrict@3.0.1(eslint@8.45.0)(prettier@3.0.2)(typescript@5.2.2):
      '@typescript-eslint/eslint-plugin': 3.10.1(@typescript-eslint/parser@3.10.1)(eslint@8.45.0)(typescript@5.2.2)
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      typescript: 5.2.2
  /eslint-import-resolver-node@0.3.9:
    resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
      is-core-module: 2.13.0
      resolve: 1.22.6
  /eslint-module-utils@2.8.0(@typescript-eslint/parser@3.10.1)(eslint-import-resolver-node@0.3.9)(eslint@8.45.0):
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      eslint-import-resolver-node: 0.3.9
  /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.45.0):
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      eslint-import-resolver-node: 0.3.9
      '@typescript-eslint/parser': 3.10.1(eslint@8.45.0)(typescript@5.2.2)
      array-includes: 3.1.7
      array.prototype.flat: 1.3.2
      array.prototype.flatmap: 1.3.2
      eslint-import-resolver-node: 0.3.9
      eslint-module-utils: 2.8.0(@typescript-eslint/parser@3.10.1)(eslint-import-resolver-node@0.3.9)(eslint@8.45.0)
      has: 1.0.4
      is-core-module: 2.13.0
      object.values: 1.1.7
      resolve: 1.22.6
      semver: 6.3.1
      '@typescript-eslint/parser': 6.2.0(eslint@8.45.0)(typescript@5.2.2)
      array-includes: 3.1.7
      array.prototype.flat: 1.3.2
      array.prototype.flatmap: 1.3.2
      eslint-import-resolver-node: 0.3.9
      eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.45.0)
      has: 1.0.4
      is-core-module: 2.13.0
      object.values: 1.1.7
      resolve: 1.22.6
      semver: 6.3.1
  /eslint-plugin-solid@0.12.1(eslint@8.45.0)(typescript@5.2.2):
      '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@5.2.2)
      jsx-ast-utils: 3.3.5
  /eslint-scope@7.2.2:
    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
      '@babel/core': 7.23.0
      '@babel/eslint-parser': 7.22.15(@babel/core@7.23.0)(eslint@8.45.0)
  /eslint-visitor-keys@3.4.3:
    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
      '@eslint-community/regexpp': 4.9.1
      '@eslint/eslintrc': 2.1.2
      '@humanwhocodes/config-array': 0.11.11
      eslint-scope: 7.2.2
      eslint-visitor-keys: 3.4.3
      globals: 13.23.0
      eslint-visitor-keys: 3.4.3
  /estree-util-attach-comments@2.1.1:
    resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==}
    dependencies:
      '@types/estree': 1.0.2
    dev: false

  /estree-util-build-jsx@2.2.2:
    resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      estree-util-is-identifier-name: 2.1.0
      estree-walker: 3.0.3
    dev: false

  /estree-util-is-identifier-name@2.1.0:
    resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==}
    dev: false

  /estree-util-to-js@1.2.0:
    resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      astring: 1.8.6
      source-map: 0.7.4
    dev: false

  /estree-util-visit@1.2.1:
    resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/unist': 2.0.8
    dev: false

      '@types/estree': 1.0.2
  /execa@7.2.0:
    resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
  /fast-content-type-parse@1.1.0:
    resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==}
  /fast-json-stringify@5.8.0:
    resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==}
  /fast-jwt@3.3.1:
    resolution: {integrity: sha512-1YuuIJeh1hEvfcYDe89P2oGACWI5hd2GadRDKHalSxkc1Z0z8I6yzuVK6SF15sW09QZngTV6d7g4+TFL9bvs5A==}
    engines: {node: '>=16 <22'}
      '@lukeed/ms': 2.0.1
  /fast-redact@3.3.0:
    resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==}
  /fastify-plugin@4.5.1:
    resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==}
      '@fastify/error': 3.4.0
      fast-content-type-parse: 1.1.0
      fast-json-stringify: 5.8.0
      light-my-request: 5.11.0
      pino: 8.15.6
      tiny-lru: 11.2.2
  /fault@2.0.1:
    resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
    dependencies:
      format: 0.2.2
    dev: false

  /fetch-blob@3.2.0:
    resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
    engines: {node: ^12.20 || >= 14.13}
    dependencies:
      node-domexception: 1.0.0
      web-streams-polyfill: 3.2.1
    dev: false

      flat-cache: 3.1.1
  /flat-cache@3.1.1:
    resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==}
    engines: {node: '>=12.0.0'}
      flatted: 3.2.9
      keyv: 4.5.4
  /flatted@3.2.9:
    resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
  /follow-redirects@1.15.3:
    resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
      signal-exit: 4.1.0
  /format@0.2.2:
    resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
    engines: {node: '>=0.4.x'}
    dev: false

  /formdata-polyfill@4.0.10:
    resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
    engines: {node: '>=12.20.0'}
    dependencies:
      fetch-blob: 3.2.0
    dev: false

  /fsevents@2.3.3:
    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
  /function.prototype.name@1.1.6:
    resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
      has: 1.0.4
      jackspeak: 2.3.6
      minipass: 7.0.4
  /globals@13.23.0:
    resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
      define-properties: 1.2.1
  /globby@13.2.2:
    resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
  /graphql-request@5.2.0(graphql@16.8.1):
      '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1)
      graphql: 16.8.1
  /graphql@16.8.1:
    resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==}
  /h3@1.8.2:
    resolution: {integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==}
      destr: 2.0.1
      iron-webcrypto: 0.10.1
      radix3: 1.1.0
      ufo: 1.3.1
      unenv: 1.7.4
  /has@1.0.4:
    resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
      '@types/hast': 2.3.6
      '@types/unist': 2.0.8
      property-information: 6.3.0
  /hast-util-from-parse5@8.0.1:
    resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
    dependencies:
      '@types/hast': 3.0.1
      '@types/unist': 3.0.0
      devlop: 1.1.0
      hastscript: 8.0.0
      property-information: 6.3.0
      vfile: 6.0.1
      vfile-location: 5.0.2
      web-namespaces: 2.0.1
    dev: false

      '@types/hast': 2.3.6

  /hast-util-parse-selector@4.0.0:
    resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
    dependencies:
      '@types/hast': 3.0.1
    dev: false
      '@types/hast': 2.3.6
  /hast-util-raw@9.0.1:
    resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==}
    dependencies:
      '@types/hast': 3.0.1
      '@types/unist': 3.0.0
      '@ungap/structured-clone': 1.2.0
      hast-util-from-parse5: 8.0.1
      hast-util-to-parse5: 8.0.0
      html-void-elements: 3.0.0
      mdast-util-to-hast: 13.0.2
      parse5: 7.1.2
      unist-util-position: 5.0.0
      unist-util-visit: 5.0.0
      vfile: 6.0.1
      web-namespaces: 2.0.1
      zwitch: 2.0.4
    dev: false

  /hast-util-to-estree@2.3.3:
    resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==}
    dependencies:
      '@types/estree': 1.0.2
      '@types/estree-jsx': 1.0.1
      '@types/hast': 2.3.6
      '@types/unist': 2.0.8
      comma-separated-tokens: 2.0.3
      estree-util-attach-comments: 2.1.1
      estree-util-is-identifier-name: 2.1.0
      hast-util-whitespace: 2.0.1
      mdast-util-mdx-expression: 1.3.2
      mdast-util-mdxjs-esm: 1.3.1
      property-information: 6.3.0
      space-separated-tokens: 2.0.2
      style-to-object: 0.4.1
      unist-util-position: 4.0.4
      zwitch: 2.0.4
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/hast': 2.3.6
      '@types/unist': 2.0.8
      property-information: 6.3.0
  /hast-util-to-html@9.0.0:
    resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==}
      '@types/hast': 3.0.1
      '@types/unist': 3.0.0
      ccount: 2.0.1
      hast-util-raw: 9.0.1
      hast-util-whitespace: 3.0.0
      html-void-elements: 3.0.0
      mdast-util-to-hast: 13.0.2
      property-information: 6.3.0
      stringify-entities: 4.0.3
    dev: false

  /hast-util-to-parse5@7.1.0:
    resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
    dependencies:
      '@types/hast': 2.3.6
      comma-separated-tokens: 2.0.3
      property-information: 6.3.0
      space-separated-tokens: 2.0.2
      web-namespaces: 2.0.1
      zwitch: 2.0.4

  /hast-util-to-parse5@8.0.0:
    resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
    dependencies:
      '@types/hast': 3.0.1
      comma-separated-tokens: 2.0.3
      devlop: 1.1.0
      property-information: 6.3.0
      space-separated-tokens: 2.0.2
      web-namespaces: 2.0.1
      zwitch: 2.0.4
    dev: false
  /hast-util-whitespace@3.0.0:
    resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
    dependencies:
      '@types/hast': 3.0.1
    dev: false

      '@types/hast': 2.3.6
      property-information: 6.3.0
  /hastscript@8.0.0:
    resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
    dependencies:
      '@types/hast': 3.0.1
      comma-separated-tokens: 2.0.3
      hast-util-parse-selector: 4.0.0
      property-information: 6.3.0
      space-separated-tokens: 2.0.2
    dev: false

  /headers-polyfill@3.3.0:
    resolution: {integrity: sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ==}
  /html-void-elements@3.0.0:
    resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
    dev: false

  /immutable@4.3.4:
    resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==}
      has: 1.0.4
  /iron-webcrypto@0.10.1:
    resolution: {integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==}
    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
      is-typed-array: 1.1.12
      has: 1.0.4
  /is-decimal@2.0.1:
    resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
    dev: false

  /is-hexadecimal@2.0.1:
    resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
    dev: false

      '@types/estree': 1.0.2
  /is-reference@3.0.2:
    resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
    dependencies:
      '@types/estree': 1.0.2
    dev: false

  /is-typed-array@1.1.12:
    resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
      which-typed-array: 1.1.11
  /is-wsl@3.1.0:
    resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
      is-inside-container: 1.0.0
  /isarray@2.0.5:
    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
    dev: true

      node-fetch: 2.7.0
      whatwg-fetch: 3.6.19
      node-fetch: 2.7.0
  /jackspeak@2.3.6:
    resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
  /jiti@1.20.0:
    resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==}
  /joi@17.11.0:
    resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==}
  /json-buffer@3.0.1:
    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
    dev: true

  /jsonwebtoken@9.0.2:
    resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
      lodash.includes: 4.3.0
      lodash.isboolean: 3.0.3
      lodash.isinteger: 4.0.4
      lodash.isnumber: 3.0.3
      lodash.isplainobject: 4.0.6
      lodash.isstring: 4.0.1
      lodash.once: 4.1.1
  /jssha@3.3.1:
    resolution: {integrity: sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==}
  /jsx-ast-utils@3.3.5:
    resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
      array-includes: 3.1.7
      array.prototype.flat: 1.3.2
      object.values: 1.1.7
  /keyv@4.5.4:
    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
    dependencies:
      json-buffer: 3.0.1
    dev: true

  /lib0@0.2.86:
    resolution: {integrity: sha512-kxigQTM4Q7NwJkEgdqQvU21qiR37twcqqLmh+/SbiGbRLfPlLVbHyY9sWp7PwXh0Xus9ELDSjsUOwcrdt5yZ4w==}
  /light-my-request@5.11.0:
    resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==}
  /lodash.includes@4.3.0:
    resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
    dev: false

  /lodash.isboolean@3.0.3:
    resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
    dev: false

  /lodash.isinteger@4.0.4:
    resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
    dev: false

  /lodash.isnumber@3.0.3:
    resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
    dev: false

  /lodash.isplainobject@4.0.6:
    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
    dev: false

  /lodash.isstring@4.0.1:
    resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
    dev: false

  /lodash.once@4.1.1:
    resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
    dev: false

    dev: true
  /lru-cache@10.0.1:
    resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==}
  /magic-string@0.30.4:
    resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==}
  /markdown-extensions@1.1.1:
    resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
    engines: {node: '>=0.10.0'}
    dev: false

  /markdown-it@13.0.2:
    resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==}
      '@types/mdast': 3.0.13
      '@types/unist': 2.0.8
      '@types/mdast': 4.0.1
      '@types/mdast': 3.0.13
  /mdast-util-find-and-replace@3.0.1:
    resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
    dependencies:
      '@types/mdast': 4.0.1
      escape-string-regexp: 5.0.0
      unist-util-is: 6.0.0
      unist-util-visit-parents: 6.0.1
    dev: false

      '@types/mdast': 3.0.13
      '@types/unist': 2.0.8
  /mdast-util-from-markdown@2.0.0:
    resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==}
    dependencies:
      '@types/mdast': 4.0.1
      '@types/unist': 3.0.0
      decode-named-character-reference: 1.0.2
      devlop: 1.1.0
      mdast-util-to-string: 4.0.0
      micromark: 4.0.0
      micromark-util-decode-numeric-character-reference: 2.0.0
      micromark-util-decode-string: 2.0.0
      micromark-util-normalize-identifier: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
      unist-util-stringify-position: 4.0.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /mdast-util-frontmatter@2.0.1:
    resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==}
    dependencies:
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      escape-string-regexp: 5.0.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
      micromark-extension-frontmatter: 2.0.0
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-gfm-autolink-literal@2.0.0:
    resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==}
    dependencies:
      '@types/mdast': 4.0.1
      ccount: 2.0.1
      devlop: 1.1.0
      mdast-util-find-and-replace: 3.0.1
      micromark-util-character: 2.0.1
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-gfm-footnote@2.0.0:
    resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
    dependencies:
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
      micromark-util-normalize-identifier: 2.0.0
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-gfm-strikethrough@2.0.0:
    resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
    dependencies:
      '@types/mdast': 4.0.1
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-gfm-table@2.0.0:
    resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
    dependencies:
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      markdown-table: 3.0.3
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-gfm-task-list-item@2.0.0:
    resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
    dependencies:
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /mdast-util-gfm@3.0.0:
    resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
    dependencies:
      mdast-util-from-markdown: 2.0.0
      mdast-util-gfm-autolink-literal: 2.0.0
      mdast-util-gfm-footnote: 2.0.0
      mdast-util-gfm-strikethrough: 2.0.0
      mdast-util-gfm-table: 2.0.0
      mdast-util-gfm-task-list-item: 2.0.0
      mdast-util-to-markdown: 2.1.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /mdast-util-mdx-expression@1.3.2:
    resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/hast': 2.3.6
      '@types/mdast': 3.0.13
      mdast-util-from-markdown: 1.3.1
      mdast-util-to-markdown: 1.5.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /mdast-util-mdx-expression@2.0.0:
    resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/hast': 3.0.1
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.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.1
      '@types/hast': 2.3.6
      '@types/mdast': 3.0.13
      '@types/unist': 2.0.8
      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-jsx@3.0.0:
    resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/hast': 3.0.1
      '@types/mdast': 4.0.1
      '@types/unist': 3.0.0
      ccount: 2.0.1
      devlop: 1.1.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
      parse-entities: 4.0.1
      stringify-entities: 4.0.3
      unist-util-remove-position: 5.0.0
      unist-util-stringify-position: 4.0.0
      vfile-message: 4.0.2
    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-mdx@3.0.0:
    resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
    dependencies:
      mdast-util-from-markdown: 2.0.0
      mdast-util-mdx-expression: 2.0.0
      mdast-util-mdx-jsx: 3.0.0
      mdast-util-mdxjs-esm: 2.0.1
      mdast-util-to-markdown: 2.1.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.1
      '@types/hast': 2.3.6
      '@types/mdast': 3.0.13
      mdast-util-from-markdown: 1.3.1
      mdast-util-to-markdown: 1.5.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /mdast-util-mdxjs-esm@2.0.1:
    resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
    dependencies:
      '@types/estree-jsx': 1.0.1
      '@types/hast': 3.0.1
      '@types/mdast': 4.0.1
      devlop: 1.1.0
      mdast-util-from-markdown: 2.0.0
      mdast-util-to-markdown: 2.1.0
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/mdast': 3.0.13
  /mdast-util-phrasing@4.0.0:
    resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==}
    dependencies:
      '@types/mdast': 4.0.1
      unist-util-is: 6.0.0
    dev: false

      '@types/hast': 2.3.6
      '@types/mdast': 3.0.13
  /mdast-util-to-hast@13.0.2:
    resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==}
    dependencies:
      '@types/hast': 3.0.1
      '@types/mdast': 4.0.1
      '@ungap/structured-clone': 1.2.0
      devlop: 1.1.0
      micromark-util-sanitize-uri: 2.0.0
      trim-lines: 3.0.1
      unist-util-position: 5.0.0
      unist-util-visit: 5.0.0
    dev: false

      '@types/mdast': 3.0.13
      '@types/unist': 2.0.8
  /mdast-util-to-markdown@2.1.0:
    resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
    dependencies:
      '@types/mdast': 4.0.1
      '@types/unist': 3.0.0
      longest-streak: 3.1.0
      mdast-util-phrasing: 4.0.0
      mdast-util-to-string: 4.0.0
      micromark-util-decode-string: 2.0.0
      unist-util-visit: 5.0.0
      zwitch: 2.0.4
    dev: false

      '@types/mdast': 3.0.13

  /mdast-util-to-string@4.0.0:
    resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
    dependencies:
      '@types/mdast': 4.0.1
    dev: false

  /mdn-data@2.0.14:
    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
    dev: false
  /micromark-core-commonmark@2.0.0:
    resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==}
    dependencies:
      decode-named-character-reference: 1.0.2
      devlop: 1.1.0
      micromark-factory-destination: 2.0.0
      micromark-factory-label: 2.0.0
      micromark-factory-space: 2.0.0
      micromark-factory-title: 2.0.0
      micromark-factory-whitespace: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-chunked: 2.0.0
      micromark-util-classify-character: 2.0.0
      micromark-util-html-tag-name: 2.0.0
      micromark-util-normalize-identifier: 2.0.0
      micromark-util-resolve-all: 2.0.0
      micromark-util-subtokenize: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-frontmatter@2.0.0:
    resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
    dependencies:
      fault: 2.0.1
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-autolink-literal@2.0.0:
    resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==}
    dependencies:
      micromark-util-character: 2.0.1
      micromark-util-sanitize-uri: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-footnote@2.0.0:
    resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==}
    dependencies:
      devlop: 1.1.0
      micromark-core-commonmark: 2.0.0
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-normalize-identifier: 2.0.0
      micromark-util-sanitize-uri: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-strikethrough@2.0.0:
    resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==}
    dependencies:
      devlop: 1.1.0
      micromark-util-chunked: 2.0.0
      micromark-util-classify-character: 2.0.0
      micromark-util-resolve-all: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-table@2.0.0:
    resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==}
    dependencies:
      devlop: 1.1.0
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-tagfilter@2.0.0:
    resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
    dependencies:
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm-task-list-item@2.0.1:
    resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==}
    dependencies:
      devlop: 1.1.0
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-gfm@3.0.0:
    resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
    dependencies:
      micromark-extension-gfm-autolink-literal: 2.0.0
      micromark-extension-gfm-footnote: 2.0.0
      micromark-extension-gfm-strikethrough: 2.0.0
      micromark-extension-gfm-table: 2.0.0
      micromark-extension-gfm-tagfilter: 2.0.0
      micromark-extension-gfm-task-list-item: 2.0.1
      micromark-util-combine-extensions: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-mdx-expression@1.0.8:
    resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==}
    dependencies:
      '@types/estree': 1.0.2
      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-expression@2.0.0:
    resolution: {integrity: sha512-hUI6PJCCVaymBF5paL29sOpcbtVXtumDdJgBDxN+tbHlXAqQwNl4EhhJfx4fe7bUpEZzcFRIBAeOiGq7hsZBXw==}
    dependencies:
      '@types/estree': 1.0.2
      devlop: 1.1.0
      micromark-factory-mdx-expression: 2.0.1
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-events-to-acorn: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    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.2
      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-jsx@2.0.0:
    resolution: {integrity: sha512-hp6ff4eympWcq3Jh9XIJmJPNpM2RNmBjz5vvU1YkND7h4UwjSZas7lXSrAJjtTG7Z56JMMTyowwcbPkAjZmwMg==}
    dependencies:
      '@types/acorn': 4.0.6
      '@types/estree': 1.0.2
      devlop: 1.1.0
      estree-util-is-identifier-name: 2.1.0
      micromark-factory-mdx-expression: 2.0.1
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
      vfile-message: 4.0.2
    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-mdx-md@2.0.0:
    resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
    dependencies:
      micromark-util-types: 2.0.0
    dev: false

  /micromark-extension-mdxjs-esm@1.0.5:
    resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==}
    dependencies:
      '@types/estree': 1.0.2
      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-esm@2.0.1:
    resolution: {integrity: sha512-HLPrY5XLYzFtG5KxEcZXfUV/SOy9Eu3R+dnpP1P6ko/ZO9xceGxmgJOAMq4r/rPLrHaEosfhNIOXDcvFSkVfKQ==}
    dependencies:
      '@types/estree': 1.0.2
      devlop: 1.1.0
      micromark-core-commonmark: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-events-to-acorn: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
      unist-util-position-from-estree: 2.0.0
      vfile-message: 4.0.2
    dev: false

  /micromark-extension-mdxjs@1.0.1:
    resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==}
    dependencies:
      acorn: 8.10.0
      acorn-jsx: 5.3.2(acorn@8.10.0)
      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-extension-mdxjs@2.0.0:
    resolution: {integrity: sha512-cICbQUdcgFvfg3JH9XTqZoa1ONCZI0GsiOvl9672Ka3SilIo9kMmaKLdSd/QrDgNGxrirWtZfFh19DSKJUivWQ==}
    dependencies:
      acorn: 8.10.0
      acorn-jsx: 5.3.2(acorn@8.10.0)
      micromark-extension-mdx-expression: 2.0.0
      micromark-extension-mdx-jsx: 2.0.0
      micromark-extension-mdx-md: 2.0.0
      micromark-extension-mdxjs-esm: 2.0.1
      micromark-util-combine-extensions: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-factory-destination@2.0.0:
    resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
    dependencies:
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-factory-label@2.0.0:
    resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
    dependencies:
      devlop: 1.1.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-factory-mdx-expression@1.0.9:
    resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==}
    dependencies:
      '@types/estree': 1.0.2
      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-mdx-expression@2.0.1:
    resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==}
    dependencies:
      '@types/estree': 1.0.2
      devlop: 1.1.0
      micromark-util-character: 2.0.1
      micromark-util-events-to-acorn: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
      unist-util-position-from-estree: 2.0.0
      vfile-message: 4.0.2
    dev: false

  /micromark-factory-space@2.0.0:
    resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
    dependencies:
      micromark-util-character: 2.0.1
      micromark-util-types: 2.0.0
    dev: false

  /micromark-factory-title@2.0.0:
    resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
    dependencies:
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-factory-whitespace@2.0.0:
    resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
    dependencies:
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-character@2.0.1:
    resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==}
    dependencies:
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-chunked@2.0.0:
    resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
    dependencies:
      micromark-util-symbol: 2.0.0
    dev: false

  /micromark-util-classify-character@2.0.0:
    resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
    dependencies:
      micromark-util-character: 2.0.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-combine-extensions@2.0.0:
    resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
    dependencies:
      micromark-util-chunked: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-decode-numeric-character-reference@2.0.0:
    resolution: {integrity: sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==}
    dependencies:
      micromark-util-symbol: 2.0.0
    dev: false

  /micromark-util-decode-string@2.0.0:
    resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
    dependencies:
      decode-named-character-reference: 1.0.2
      micromark-util-character: 2.0.1
      micromark-util-decode-numeric-character-reference: 2.0.0
      micromark-util-symbol: 2.0.0
    dev: false

  /micromark-util-encode@2.0.0:
    resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
    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.2
      '@types/unist': 2.0.8
      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-events-to-acorn@2.0.1:
    resolution: {integrity: sha512-3pf0pxvFaTxzTwisMHmEk5lnW7oSU/oRZxpZcrdx/voJgCpPaspexc89mJodW4ekATo1UILtZvjESclKONSB6w==}
    dependencies:
      '@types/acorn': 4.0.6
      '@types/estree': 1.0.2
      '@types/unist': 3.0.0
      devlop: 1.1.0
      estree-util-visit: 1.2.1
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
      vfile-message: 4.0.2
    dev: false

  /micromark-util-html-tag-name@2.0.0:
    resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
    dev: false

  /micromark-util-normalize-identifier@2.0.0:
    resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
    dependencies:
      micromark-util-symbol: 2.0.0
    dev: false

  /micromark-util-resolve-all@2.0.0:
    resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
    dependencies:
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-sanitize-uri@2.0.0:
    resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
    dependencies:
      micromark-util-character: 2.0.1
      micromark-util-encode: 2.0.0
      micromark-util-symbol: 2.0.0
    dev: false

  /micromark-util-subtokenize@2.0.0:
    resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==}
    dependencies:
      devlop: 1.1.0
      micromark-util-chunked: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    dev: false

  /micromark-util-symbol@2.0.0:
    resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
    dev: false

  /micromark-util-types@2.0.0:
    resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
    dev: false

      '@types/debug': 4.1.9
  /micromark@4.0.0:
    resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
    dependencies:
      '@types/debug': 4.1.9
      debug: 4.3.4
      decode-named-character-reference: 1.0.2
      devlop: 1.1.0
      micromark-core-commonmark: 2.0.0
      micromark-factory-space: 2.0.0
      micromark-util-character: 2.0.1
      micromark-util-chunked: 2.0.0
      micromark-util-combine-extensions: 2.0.0
      micromark-util-decode-numeric-character-reference: 2.0.0
      micromark-util-encode: 2.0.0
      micromark-util-normalize-identifier: 2.0.0
      micromark-util-resolve-all: 2.0.0
      micromark-util-sanitize-uri: 2.0.0
      micromark-util-subtokenize: 2.0.0
      micromark-util-symbol: 2.0.0
      micromark-util-types: 2.0.0
    transitivePeerDependencies:
      - supports-color
    dev: false

  /minipass@7.0.4:
    resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
  /mkdist@1.3.0(typescript@5.2.2):
    resolution: {integrity: sha512-ZQrUvcL7LkRdzMREpDyg9AT18N9Tl5jc2qeKAUeEw0KGsgykbHbuRvysGAzTuGtwuSg0WQyNit5jh/k+Er3JEg==}
      sass: ^1.63.6
      typescript: '>=5.1.6'
      citty: 0.1.4
      esbuild: 0.18.16
      globby: 13.2.2
      jiti: 1.20.0
      ufo: 1.3.1
  /monaco-editor@0.43.0:
    resolution: {integrity: sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==}
      bson: 5.5.0
      sax: 1.3.0
      '@types/nlcst': 1.0.2
  /node-fetch@2.7.0:
    resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
  /node-fetch@3.3.2:
    resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
    dependencies:
      data-uri-to-buffer: 4.0.1
      fetch-blob: 3.2.0
      formdata-polyfill: 4.0.10
    dev: false

  /node-mocks-http@1.13.0:
    resolution: {integrity: sha512-lArD6sJMPJ53WF50GX0nJ89B1nkV1TdMvNwq8WXXFrUXF80ujSyye1T30mgiHh4h2It0/svpF3C4kZ2OAONVlg==}
    engines: {node: '>=14'}
      resolve: 1.22.6
      semver: 5.7.2
      define-properties: 1.2.1
  /object.values@1.1.7:
    resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
      '@octokit/app': 14.0.1
      '@octokit/core': 5.0.1
      '@octokit/plugin-paginate-rest': 8.0.0(@octokit/core@5.0.1)
      '@octokit/plugin-rest-endpoint-methods': 9.0.0(@octokit/core@5.0.1)
      '@octokit/plugin-retry': 6.0.1(@octokit/core@5.0.1)
      '@octokit/plugin-throttling': 7.0.0(@octokit/core@5.0.1)
      '@octokit/request-error': 5.0.1
      ufo: 1.3.1
  /on-exit-leak-free@2.1.2:
    resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
    engines: {node: '>=14.0.0'}
      undici: 5.25.4
      validator: 13.11.0
      '@types/node': 18.18.4
      '@types/node-fetch': 2.6.6
      node-fetch: 2.7.0
      cli-spinners: 2.9.1
      cli-spinners: 2.9.1
      cli-spinners: 2.9.1
      jssha: 3.3.1
  /parse-entities@4.0.1:
    resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
    dependencies:
      '@types/unist': 2.0.8
      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

      lru-cache: 10.0.1
      minipass: 7.0.4
  /periscopic@3.1.0:
    resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
    dependencies:
      '@types/estree': 1.0.2
      estree-walker: 3.0.3
      is-reference: 3.0.2
    dev: false

  /pino-abstract-transport@1.1.0:
    resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==}
      readable-stream: 4.4.2
  /pino-std-serializers@6.2.2:
    resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==}
  /pino@8.15.6:
    resolution: {integrity: sha512-GuxHr61R0ZFD1npu58tB3a3FSVjuy21OwN/haw4OuKiZBL63Pg11Y51WWeD52RENS2mjwPZOwt+2OQOSkck6kQ==}
      fast-redact: 3.3.0
      on-exit-leak-free: 2.1.2
      pino-abstract-transport: 1.1.0
      pino-std-serializers: 6.2.2
      sonic-boom: 3.6.1
      thread-stream: 2.4.1
      resolve: 1.22.6
  /postcss@8.4.31:
    resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
      '@astrojs/compiler': 1.8.2
      sass-formatter: 0.7.8
      sass-formatter: 0.7.8
  /pretty-bytes@6.1.1:
    resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
  /property-information@6.3.0:
    resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==}
      prosemirror-transform: 1.8.0
      prosemirror-model: 1.19.3
      prosemirror-transform: 1.8.0
      prosemirror-transform: 1.8.0
      prosemirror-view: 1.32.0
      prosemirror-model: 1.19.3
      prosemirror-view: 1.32.0
      prosemirror-transform: 1.8.0
      prosemirror-view: 1.32.0
      prosemirror-transform: 1.8.0
  /prosemirror-markdown@1.11.2:
    resolution: {integrity: sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==}
      markdown-it: 13.0.2
      prosemirror-model: 1.19.3
  /prosemirror-menu@1.2.4:
    resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==}
  /prosemirror-model@1.19.3:
    resolution: {integrity: sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==}
      prosemirror-model: 1.19.3
      prosemirror-model: 1.19.3
      prosemirror-transform: 1.8.0
      prosemirror-model: 1.19.3
      prosemirror-transform: 1.8.0
      prosemirror-view: 1.32.0
  /prosemirror-tables@1.3.4:
    resolution: {integrity: sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw==}
      prosemirror-model: 1.19.3
      prosemirror-transform: 1.8.0
      prosemirror-view: 1.32.0
  /prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0):
    resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==}
      prosemirror-view: ^1.31.2
      '@remirror/core-constants': 2.0.2
      '@remirror/core-helpers': 3.0.0
      prosemirror-model: 1.19.3
      prosemirror-view: 1.32.0
  /prosemirror-transform@1.8.0:
    resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==}
      prosemirror-model: 1.19.3
  /prosemirror-view@1.32.0:
    resolution: {integrity: sha512-HwW7IWgca6ehiW2PA48H/8yl0TakA0Ms5LgN5Krc97oar7GfjIKE/NocUsLe74Jq4mwyWKUNoBljE8WkXKZwng==}
      prosemirror-model: 1.19.3
      prosemirror-transform: 1.8.0
  /radix3@1.1.0:
    resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==}
      '@types/normalize-package-data': 2.4.2
  /readable-stream@4.4.2:
    resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==}
      string_decoder: 1.3.0
      resolve: 1.22.6
  /regenerator-runtime@0.14.0:
    resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
  /regexp.prototype.flags@1.5.1:
    resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
      define-properties: 1.2.1
      set-function-name: 2.0.1
  /rehype-parse@8.0.5:
    resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==}
      '@types/hast': 2.3.6
      '@types/hast': 2.3.6
      '@types/hast': 2.3.6
      '@types/hast': 2.3.6
      rehype-parse: 8.0.5
      '@types/mdast': 3.0.13
  /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

      '@types/mdast': 3.0.13
  /remark-parse@11.0.0:
    resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
    dependencies:
      '@types/mdast': 4.0.1
      mdast-util-from-markdown: 2.0.0
      micromark-util-types: 2.0.0
      unified: 11.0.3
    transitivePeerDependencies:
      - supports-color
    dev: false

      '@types/hast': 2.3.6
      '@types/mdast': 3.0.13
  /remark-stringify@11.0.0:
    resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
    dependencies:
      '@types/mdast': 4.0.1
      mdast-util-to-markdown: 2.1.0
      unified: 11.0.3
    dev: false

  /remark@15.0.1:
    resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==}
    dependencies:
      '@types/mdast': 4.0.1
      remark-parse: 11.0.0
      remark-stringify: 11.0.0
      unified: 11.0.3
    transitivePeerDependencies:
      - supports-color
    dev: false

  /resolve-from@5.0.0:
    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
    engines: {node: '>=8'}
    dev: false

  /resolve-pkg@2.0.0:
    resolution: {integrity: sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==}
    engines: {node: '>=8'}
      resolve-from: 5.0.0
    dev: false
  /resolve@1.22.6:
    resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==}
      '@types/nlcst': 1.0.2
      '@types/nlcst': 1.0.2
      '@types/nlcst': 1.0.2
      '@types/nlcst': 1.0.2
  /rollup-plugin-dts@5.3.1(rollup@3.29.4)(typescript@5.2.2):
    resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==}
    engines: {node: '>=v14.21.3'}
      rollup: ^3.0
      magic-string: 0.30.4
      rollup: 3.29.4
  /rollup@3.29.4:
    resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
      fsevents: 2.3.3
  /safe-array-concat@1.0.1:
    resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
    engines: {node: '>=0.4'}
    dependencies:
      call-bind: 1.0.2
      get-intrinsic: 1.2.1
      has-symbols: 1.0.3
      isarray: 2.0.5
    dev: true

  /sass-formatter@0.7.8:
    resolution: {integrity: sha512-7fI2a8THglflhhYis7k06eUf92VQuJoXzEs2KRP0r1bluFxKFvLx0Ns7c478oYGM0fPfrr846ZRWVi2MAgHt9Q==}
      immutable: 4.3.4
  /sax@1.3.0:
    resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==}
  /semver@5.7.2:
    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
  /set-function-name@2.0.1:
    resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
    engines: {node: '>= 0.4'}
    dependencies:
      define-data-property: 1.1.0
      functions-have-names: 1.2.3
      has-property-descriptors: 1.0.0
    dev: true

      ansi-sequence-parser: 1.1.1
      joi: 17.11.0
      '@polka/url': 1.0.0-next.23
      '@types/sax': 1.2.5
      sax: 1.3.0
      '@babel/generator': 7.23.0
      '@babel/helper-module-imports': 7.22.15
      '@babel/types': 7.23.0
  /sonic-boom@3.6.1:
    resolution: {integrity: sha512-QV+p5nXPiUiSMxn/k5bOL+hzCpafdj1voL+hywPZhheRSYyYp7CF15rNdz1evOXCUn/tFb7R62PDX1yJmtoTgg==}
  /source-map@0.7.4:
    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
    engines: {node: '>= 8'}
    dev: false

      spdx-license-ids: 3.0.16
      spdx-license-ids: 3.0.16
  /spdx-license-ids@3.0.16:
    resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==}
  /stable@0.1.8:
    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
    dev: false

  /string.prototype.trim@1.2.8:
    resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /string.prototype.trimend@1.0.7:
    resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /string.prototype.trimstart@1.0.7:
    resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
      define-properties: 1.2.1
      es-abstract: 1.22.2
  /svgo@2.8.0:
    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
    engines: {node: '>=10.13.0'}
    hasBin: true
    dependencies:
      '@trysound/sax': 0.2.0
      commander: 7.2.0
      css-select: 4.3.0
      css-tree: 1.1.3
      csso: 4.2.0
      picocolors: 1.0.0
      stable: 0.1.8
    dev: false

      '@pkgr/utils': 2.4.2
      tslib: 2.6.2
      resolve: 1.22.6
      '@jridgewell/source-map': 0.3.5
  /thread-stream@2.4.1:
    resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==}
  /tiny-lru@11.2.2:
    resolution: {integrity: sha512-1An82KBJOUKCfRhsk4tHe4rNblnhAUzisesWBGf/0pztaVoNYM7eJxouN+mq6WkV/qNG21AFbrsgQfvBk0X9ng==}
      h3: 1.8.2
      node-mocks-http: 1.13.0
  /trpc-openapi@1.2.0(@trpc/server@10.35.0)(zod@3.22.4):
      h3: 1.8.2
      node-mocks-http: 1.13.0
      zod: 3.22.4
      zod-to-json-schema: 3.21.4(zod@3.22.4)
  /ts-api-utils@1.0.3(typescript@5.2.2):
    resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
      typescript: 5.2.2
  /tsconfck@2.1.2(typescript@5.2.2):
      typescript: 5.2.2
      '@types/resolve': 1.20.3
      resolve: 1.22.6
  /tslib@2.6.2:
    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
  /tsutils@3.21.0(typescript@5.2.2):
      typescript: 5.2.2
  /typed-array-buffer@1.0.0:
    resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
    engines: {node: '>= 0.4'}
    dependencies:
      call-bind: 1.0.2
      get-intrinsic: 1.2.1
      is-typed-array: 1.1.12
    dev: true

  /typed-array-byte-length@1.0.0:
    resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
    engines: {node: '>= 0.4'}
    dependencies:
      call-bind: 1.0.2
      for-each: 0.3.3
      has-proto: 1.0.1
      is-typed-array: 1.1.12
    dev: true

  /typed-array-byte-offset@1.0.0:
    resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
    engines: {node: '>= 0.4'}
    dependencies:
      available-typed-arrays: 1.0.5
      call-bind: 1.0.2
      for-each: 0.3.3
      has-proto: 1.0.1
      is-typed-array: 1.1.12
    dev: true

      is-typed-array: 1.1.12
  /ufo@1.3.1:
    resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==}
      '@rollup/plugin-alias': 5.0.1(rollup@3.29.4)
      '@rollup/plugin-commonjs': 24.1.0(rollup@3.29.4)
      '@rollup/plugin-json': 6.0.1(rollup@3.29.4)
      '@rollup/plugin-node-resolve': 15.2.2(rollup@3.29.4)
      '@rollup/plugin-replace': 5.0.3(rollup@3.29.4)
      '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
      globby: 13.2.2
      jiti: 1.20.0
      magic-string: 0.30.4
      mkdist: 1.3.0(typescript@5.2.2)
      mlly: 1.4.2
      pretty-bytes: 6.1.1
      rollup: 3.29.4
      rollup-plugin-dts: 5.3.1(rollup@3.29.4)(typescript@5.2.2)
      untyped: 1.4.0
  /unconfig@0.3.11:
    resolution: {integrity: sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==}
      jiti: 1.20.0
  /undici@5.25.4:
    resolution: {integrity: sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==}
      '@fastify/busboy': 2.0.0
  /unenv@1.7.4:
    resolution: {integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==}
      consola: 3.2.3
      defu: 6.1.2
      mime: 3.0.0
      node-fetch-native: 1.4.0
      pathe: 1.1.1
    dev: false
      '@types/unist': 2.0.8
  /unified@11.0.3:
    resolution: {integrity: sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg==}
    dependencies:
      '@types/unist': 3.0.0
      bail: 2.0.2
      devlop: 1.1.0
      extend: 3.0.2
      is-plain-obj: 4.1.0
      trough: 2.1.0
      vfile: 6.0.1
    dev: false

      '@types/unist': 2.0.8
      '@types/unist': 2.0.8
  /unist-util-position-from-estree@1.1.2:
    resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==}
    dependencies:
      '@types/unist': 2.0.8
    dev: false

  /unist-util-position-from-estree@2.0.0:
    resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
    dependencies:
      '@types/unist': 3.0.0
    dev: false

      '@types/unist': 2.0.8

  /unist-util-position@5.0.0:
    resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
    dependencies:
      '@types/unist': 3.0.0
    dev: false

  /unist-util-remove-position@4.0.2:
    resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==}
    dependencies:
      '@types/unist': 2.0.8
      unist-util-visit: 4.1.2
    dev: false

  /unist-util-remove-position@5.0.0:
    resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
    dependencies:
      '@types/unist': 3.0.0
      unist-util-visit: 5.0.0
    dev: false
      '@types/unist': 2.0.8

  /unist-util-stringify-position@4.0.0:
    resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
    dependencies:
      '@types/unist': 3.0.0
    dev: false
      '@types/unist': 2.0.8
      '@types/unist': 2.0.8
      '@types/unist': 2.0.8
      '@types/jsonwebtoken': 9.0.3
      jsonwebtoken: 9.0.2
  /unocss@0.55.7(postcss@8.4.31)(vite@4.4.9):
      '@unocss/postcss': 0.55.7(postcss@8.4.31)
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /untyped@1.4.0:
    resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==}
      '@babel/core': 7.23.0
      '@babel/standalone': 7.23.1
      '@babel/types': 7.23.0
      jiti: 1.20.0
  /update-browserslist-db@1.0.13(browserslist@4.22.1):
    resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
      browserslist: 4.22.1
  /uuid@9.0.1:
    resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
  /validator@13.11.0:
    resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
      '@types/unist': 2.0.8
  /vfile-location@5.0.2:
    resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
    dependencies:
      '@types/unist': 3.0.0
      vfile: 6.0.1
    dev: false

      '@types/unist': 2.0.8
  /vfile-message@4.0.2:
    resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
    dependencies:
      '@types/unist': 3.0.0
      unist-util-stringify-position: 4.0.0
    dev: false

      '@types/unist': 2.0.8
  /vfile@6.0.1:
    resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==}
    dependencies:
      '@types/unist': 3.0.0
      unist-util-stringify-position: 4.0.0
      vfile-message: 4.0.2
    dev: false

      '@babel/core': 7.23.0
      '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0)
      '@types/babel__core': 7.20.2
      babel-preset-solid: 1.7.12(@babel/core@7.23.0)
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /vite-tsconfig-paths@4.2.0(typescript@5.2.2)(vite@4.4.9):
      tsconfck: 2.1.2(typescript@5.2.2)
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /vite@4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2):
    resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
      postcss: 8.4.31
      rollup: 3.29.4
      fsevents: 2.3.3
      vite: 4.4.9(@types/node@20.4.4)(sass@1.64.1)(terser@5.19.2)
  /vscode-css-languageservice@6.2.9:
    resolution: {integrity: sha512-9MsOvAi+VycKomQ7KEq4o/hLtjHHrtRLLl8lM9nMcH8cxfNI7/6jVXmsV/7pdbDWu9L3DZhsspN1eMXZwiOymw==}
      '@vscode/l10n': 0.0.16
      vscode-languageserver-textdocument: 1.0.11
      vscode-uri: 3.0.8
  /vscode-html-languageservice@5.1.0:
    resolution: {integrity: sha512-cGOu5+lrz+2dDXSGS15y24lDtPaML1T8K/SfqgFbLmCZ1btYOxceFieR+ybTS2es/A67kRc62m2cKFLUQPWG5g==}
      '@vscode/l10n': 0.0.16
      vscode-languageserver-textdocument: 1.0.11
      vscode-languageserver-types: 3.17.5
      vscode-uri: 3.0.8
  /vscode-jsonrpc@8.2.0:
    resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
    engines: {node: '>=14.0.0'}

  /vscode-languageserver-protocol@3.17.5:
    resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
    dependencies:
      vscode-jsonrpc: 8.2.0
      vscode-languageserver-types: 3.17.5

  /vscode-languageserver-textdocument@1.0.11:
    resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==}
  /vscode-languageserver-types@3.17.5:
    resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}

  /vscode-uri@3.0.8:
    resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
  /weaviate-ts-client@1.4.0(graphql@16.8.1):
      graphql-request: 5.2.0(graphql@16.8.1)
      uuid: 9.0.1
  /web-streams-polyfill@3.2.1:
    resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
    engines: {node: '>= 8'}
    dev: false

  /whatwg-fetch@3.6.19:
    resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==}
  /which-typed-array@1.1.11:
    resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
  /ws@8.14.2:
    resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
  /y-prosemirror@1.0.20(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7):
      lib0: 0.2.86
      prosemirror-model: 1.19.3
      prosemirror-view: 1.32.0
  /y-prosemirror@1.2.1(prosemirror-model@1.19.3)(prosemirror-state@1.4.3)(prosemirror-view@1.32.0)(y-protocols@1.0.5)(yjs@13.6.7):
      lib0: 0.2.86
      prosemirror-model: 1.19.3
      prosemirror-view: 1.32.0
      lib0: 0.2.86
      lib0: 0.2.86
  /zod-to-json-schema@3.21.4(zod@3.22.4):
      zod: 3.22.4
  /zod@3.22.4:
    resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}