diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ffd4b7ace..8b42e6ca6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: "🐛 Bug Report" description: "Submit a bug report to help us improve,\nif you have a problem installing the app please join our https://discord.postiz.com instead for help." -title: "🐛 Bug Report: " +title: "Give your bug report a good title " labels: ["type: bug"] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 5cd789a5c..b40dcfb68 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,7 +1,7 @@ name: 🚀 Feature description: "Submit a proposal for a new feature" -title: "🚀 Feature: " -labels: [feature] +title: "Give your feature request a title" +labels: ["type: feature-request"] body: - type: markdown attributes: diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index a3dfadc18..a0d83a754 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -8,8 +8,27 @@ on: - '*' jobs: - build-containers: + build-containers-common: runs-on: ubuntu-latest + outputs: + containerver: ${{ steps.getcontainerver.outputs.containerver }} + steps: + - name: Get Container Version + id: getcontainerver + run: | + echo "containerver=$(date +'%s')" >> "$GITHUB_OUTPUT" + + build-containers: + needs: build-containers-common + strategy: + matrix: + include: + - runnertags: ubuntu-latest + arch: amd64 + - runnertags: [self-hosted, ARM64] + arch: arm64 + + runs-on: ${{ matrix.runnertags }} steps: - name: Checkout uses: actions/checkout@v4 @@ -26,24 +45,41 @@ jobs: - name: docker build run: ./var/docker/docker-build.sh - - name: Get date - run: | - echo "DATE=$(date +'%s')" >> "$GITHUB_ENV" - - name: Print post-build debug info run: | docker images - name: docker tag + env: + CONTAINERVER: ${{ needs.build-containers-common.outputs.containerver }} run: | - docker tag localhost/postiz ghcr.io/gitroomhq/postiz-app:${{ env.DATE }} - docker push ghcr.io/gitroomhq/postiz-app:${{ env.DATE }} - - docker tag ghcr.io/gitroomhq/postiz-app:${{ env.DATE }} ghcr.io/gitroomhq/postiz-app:latest - docker push ghcr.io/gitroomhq/postiz-app:latest + docker tag localhost/postiz ghcr.io/gitroomhq/postiz-app:${{ matrix.arch }}-${{ env.CONTAINERVER }} + docker push ghcr.io/gitroomhq/postiz-app:${{ matrix.arch }}-${{ env.CONTAINERVER }} - docker tag localhost/postiz-devcontainer ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }} - docker push ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }} + docker tag localhost/postiz-devcontainer ghcr.io/gitroomhq/postiz-devcontainer:${{ env.CONTAINERVER }} + docker push ghcr.io/gitroomhq/postiz-devcontainer:${{ env.CONTAINERVER }} - docker tag ghcr.io/gitroomhq/postiz-devcontainer:${{ env.DATE }} ghcr.io/gitroomhq/postiz-devcontainer:latest + docker tag ghcr.io/gitroomhq/postiz-devcontainer:${{ env.CONTAINERVER }} ghcr.io/gitroomhq/postiz-devcontainer:latest docker push ghcr.io/gitroomhq/postiz-devcontainer:latest + + build-container-manifest: + needs: [build-containers, build-containers-common] + runs-on: ubuntu-latest + steps: + - name: Login to ghcr + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ github.token }} + + - name: Create Docker Manifest + env: + CONTAINERVER: ${{ needs.build-containers-common.outputs.containerver }} + run: | + docker manifest create \ + ghcr.io/gitroomhq/postiz-app:latest \ + ghcr.io/gitroomhq/postiz-app:amd64-${{ env.CONTAINERVER }} \ + ghcr.io/gitroomhq/postiz-app:arm64-${{ env.CONTAINERVER }} + + docker manifest push ghcr.io/gitroomhq/postiz-app:latest diff --git a/Dockerfile.dev b/Dockerfile.dev index d43b45afa..0162b4efb 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -14,17 +14,20 @@ ENV NPM_CONFIG_UPDATE_NOTIFIER=false ENV NEXT_TELEMETRY_DISABLED=1 RUN apk add --no-cache \ + caddy \ bash=5.2.21-r0 \ supervisor=4.2.5-r4 WORKDIR /app -EXPOSE 4200 EXPOSE 3000 +EXPOSE 4200 +EXPOSE 5000 COPY var/docker/entrypoint.sh /app/entrypoint.sh COPY var/docker/supervisord.conf /etc/supervisord.conf COPY var/docker/supervisord /app/supervisord_available_configs/ +COPY var/docker/Caddyfile /app/Caddyfile COPY .env.example /config/postiz.env VOLUME /config @@ -61,6 +64,9 @@ FROM base AS dist COPY --from=devcontainer /app/node_modules/ /app/node_modules/ COPY --from=devcontainer /app/dist/ /app/dist/ +# Required for prisma +COPY --from=devcontainer /app/libraries/ /app/libraries/ + COPY package.json nx.json /app/ VOLUME /config diff --git a/README.md b/README.md index 52d15c8e2..886783843 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ Facebook Pinterest Threads + X

diff --git a/apps/backend/src/api/api.module.ts b/apps/backend/src/api/api.module.ts index 011562708..d60fabc3a 100644 --- a/apps/backend/src/api/api.module.ts +++ b/apps/backend/src/api/api.module.ts @@ -11,7 +11,6 @@ import { PermissionsService } from '@gitroom/backend/services/auth/permissions/p import { IntegrationsController } from '@gitroom/backend/api/routes/integrations.controller'; import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; import { SettingsController } from '@gitroom/backend/api/routes/settings.controller'; -import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; import { PostsController } from '@gitroom/backend/api/routes/posts.controller'; import { MediaController } from '@gitroom/backend/api/routes/media.controller'; import { UploadModule } from '@gitroom/nestjs-libraries/upload/upload.module'; @@ -27,6 +26,7 @@ import { CodesService } from '@gitroom/nestjs-libraries/services/codes.service'; import { CopilotController } from '@gitroom/backend/api/routes/copilot.controller'; import { AgenciesController } from '@gitroom/backend/api/routes/agencies.controller'; import { PublicController } from '@gitroom/backend/api/routes/public.controller'; +import { RootController } from '@gitroom/backend/api/routes/root.controller'; const authenticatedController = [ UsersController, @@ -60,6 +60,7 @@ const authenticatedController = [ : []), ], controllers: [ + RootController, StripeController, AuthController, PublicController, diff --git a/apps/backend/src/api/routes/analytics.controller.ts b/apps/backend/src/api/routes/analytics.controller.ts index 257df0a82..dbe350366 100644 --- a/apps/backend/src/api/routes/analytics.controller.ts +++ b/apps/backend/src/api/routes/analytics.controller.ts @@ -17,6 +17,7 @@ import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/in import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { timer } from '@gitroom/helpers/utils/timer'; @ApiTags('Analytics') @Controller('/analytics') @@ -61,78 +62,6 @@ export class AnalyticsController { @Param('integration') integration: string, @Query('date') date: string ) { - const getIntegration = await this._integrationService.getIntegrationById( - org.id, - integration - ); - - if (!getIntegration) { - throw new Error('Invalid integration'); - } - - if (getIntegration.type !== 'social') { - return {}; - } - - const integrationProvider = this._integrationManager.getSocialIntegration( - getIntegration.providerIdentifier - ); - - if (dayjs(getIntegration?.tokenExpiration).isBefore(dayjs())) { - const { accessToken, expiresIn, refreshToken } = - await integrationProvider.refreshToken(getIntegration.refreshToken!); - - if (accessToken) { - await this._integrationService.createOrUpdateIntegration( - getIntegration.organizationId, - getIntegration.name, - getIntegration.picture!, - 'social', - getIntegration.internalId, - getIntegration.providerIdentifier, - accessToken, - refreshToken, - expiresIn - ); - - getIntegration.token = accessToken; - } - } - - const getIntegrationData = await ioRedis.get( - `integration:${org.id}:${integration}:${date}` - ); - if (getIntegrationData) { - return JSON.parse(getIntegrationData); - } - - if (integrationProvider.analytics) { - try { - const loadAnalytics = await integrationProvider.analytics( - getIntegration.internalId, - getIntegration.token, - +date - ); - await ioRedis.set( - `integration:${org.id}:${integration}:${date}`, - JSON.stringify(loadAnalytics), - 'EX', - !process.env.NODE_ENV || process.env.NODE_ENV === 'development' - ? 1 - : 3600 - ); - return loadAnalytics; - } catch (e) { - if (e instanceof RefreshToken) { - await this._integrationService.disconnectChannel( - org.id, - getIntegration - ); - return []; - } - } - } - - return []; + return this._integrationService.checkAnalytics(org, integration, date); } } diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index bd14422ec..1a0a8af27 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -30,7 +30,9 @@ export class AuthController { getOrgFromCookie ); - if (body.provider === 'LOCAL') { + const activationRequired = body.provider === 'LOCAL' && !!process.env.RESEND_API_KEY; + + if (activationRequired) { response.header('activate', 'true'); response.status(200).json({ activate: true }); return; diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index a633bb4d9..a9a92b2dd 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -26,6 +26,7 @@ import { ApiTags } from '@nestjs/swagger'; import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request'; import { NotEnoughScopesFilter } from '@gitroom/nestjs-libraries/integrations/integration.missing.scopes'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; +import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; @ApiTags('Integrations') @Controller('/integrations') @@ -55,6 +56,7 @@ export class IntegrationsController { inBetweenSteps: p.inBetweenSteps, refreshNeeded: p.refreshNeeded, type: p.type, + time: JSON.parse(p.postingTimes) })), }; } @@ -97,6 +99,14 @@ export class IntegrationsController { return { url }; } + @Post('/:id/time') + async setTime( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string, + @Body() body: IntegrationTimeDto + ) { + return this._integrationService.setTimes(org.id, id, body); + } @Post('/function') async functionIntegration( @GetOrgFromRequest() org: Organization, @@ -238,7 +248,8 @@ export class IntegrationsController { expiresIn, username, integrationProvider.isBetweenSteps, - body.refresh + body.refresh, + +body.timezone ); } diff --git a/apps/backend/src/api/routes/posts.controller.ts b/apps/backend/src/api/routes/posts.controller.ts index dccdd28ce..1590411a3 100644 --- a/apps/backend/src/api/routes/posts.controller.ts +++ b/apps/backend/src/api/routes/posts.controller.ts @@ -13,7 +13,6 @@ import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.reque import { Organization, User } from '@prisma/client'; import { CreatePostDto } from '@gitroom/nestjs-libraries/dtos/posts/create.post.dto'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; -import { CommentsService } from '@gitroom/nestjs-libraries/database/prisma/comments/comments.service'; import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; import { @@ -30,7 +29,6 @@ import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generato export class PostsController { constructor( private _postsService: PostsService, - private _commentsService: CommentsService, private _starsService: StarsService, private _messagesService: MessagesService ) {} diff --git a/apps/backend/src/api/routes/root.controller.ts b/apps/backend/src/api/routes/root.controller.ts new file mode 100644 index 000000000..c79d90807 --- /dev/null +++ b/apps/backend/src/api/routes/root.controller.ts @@ -0,0 +1,8 @@ +import { Controller, Get } from '@nestjs/common'; +@Controller('/') +export class RootController { + @Get('/') + getRoot(): string { + return 'App is running!'; + } +} diff --git a/apps/backend/src/api/routes/users.controller.ts b/apps/backend/src/api/routes/users.controller.ts index 81bc575de..85311535f 100644 --- a/apps/backend/src/api/routes/users.controller.ts +++ b/apps/backend/src/api/routes/users.controller.ts @@ -21,7 +21,7 @@ import { AuthorizationActions, Sections, } from '@gitroom/backend/services/auth/permissions/permissions.service'; -import { removeSubdomain } from '@gitroom/helpers/subdomain/subdomain.management'; +import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management'; import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing'; import { ApiTags } from '@nestjs/swagger'; import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service'; @@ -54,7 +54,7 @@ export class UsersController { // @ts-ignore totalChannels: organization?.subscription?.totalChannels || pricing.FREE.channel, // @ts-ignore - tier: organization?.subscription?.subscriptionTier || 'FREE', + tier: organization?.subscription?.subscriptionTier || (!process.env.STRIPE_PUBLISHABLE_KEY ? 'ULTIMATE' : 'FREE'), // @ts-ignore role: organization?.users[0]?.role, // @ts-ignore @@ -92,8 +92,7 @@ export class UsersController { } response.cookie('impersonate', id, { - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), secure: true, httpOnly: true, sameSite: 'none', @@ -163,8 +162,7 @@ export class UsersController { @Res({ passthrough: true }) response: Response ) { response.cookie('showorg', id, { - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), secure: true, httpOnly: true, sameSite: 'none', @@ -177,8 +175,7 @@ export class UsersController { @Post('/logout') logout(@Res({ passthrough: true }) response: Response) { response.cookie('auth', '', { - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), secure: true, httpOnly: true, maxAge: -1, @@ -187,8 +184,7 @@ export class UsersController { }); response.cookie('showorg', '', { - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), secure: true, httpOnly: true, maxAge: -1, @@ -197,8 +193,7 @@ export class UsersController { }); response.cookie('impersonate', '', { - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), secure: true, httpOnly: true, maxAge: -1, diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index d7b8d4648..30f1be83a 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -36,11 +36,16 @@ async function bootstrap() { loadSwagger(app); const port = process.env.PORT || 3000; - await app.listen(port); - checkConfiguration() // Do this last, so that users will see obvious issues at the end of the startup log without having to scroll up. + try { + await app.listen(port); + + checkConfiguration() // Do this last, so that users will see obvious issues at the end of the startup log without having to scroll up. - Logger.log(`🚀 Application is running on: http://localhost:${port}`); + Logger.log(`🚀 Backend is running on: http://localhost:${port}`); + } catch (e) { + Logger.error(`Backend failed to start on port ${port}`, e); + } } function checkConfiguration() { @@ -53,7 +58,7 @@ function checkConfiguration() { Logger.warn(issue, 'Configuration issue') } - Logger.warn("Configuration issues found: " + checker.getIssuesCount() + ". You can run `npm run command config:check` to quickly check again.") + Logger.warn("Configuration issues found: " + checker.getIssuesCount()) } else { Logger.log("Configuration check completed without any issues.") } diff --git a/apps/cron/src/cron.module.ts b/apps/cron/src/cron.module.ts index a44744b9b..4db31e812 100644 --- a/apps/cron/src/cron.module.ts +++ b/apps/cron/src/cron.module.ts @@ -8,6 +8,6 @@ import { BullMqModule } from '@gitroom/nestjs-libraries/bull-mq-transport-new/bu @Module({ imports: [DatabaseModule, ScheduleModule.forRoot(), BullMqModule], controllers: [], - providers: [CheckStars, SyncTrending], + providers: [...(!process.env.IS_GENERAL ? [CheckStars, SyncTrending] : [])], }) export class CronModule {} diff --git a/apps/docs/README.md b/apps/docs/README.md deleted file mode 100644 index c89c478d1..000000000 --- a/apps/docs/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Mintlify Starter Kit - -Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including - -- Guide pages -- Navigation -- Customizations -- API Reference pages -- Use of popular components - -### Development - -Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command - -``` -npm i -g mintlify -``` - -Run the following command at the root of your documentation (where mint.json is) - -``` -mintlify dev -``` - -### Publishing Changes - -Install our Github App to autopropagate changes from youre repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard. - -#### Troubleshooting - -- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. -- Page loads as a 404 - Make sure you are running in a folder with `mint.json` diff --git a/apps/docs/api-reference/custom/analytics/get-analytics.mdx b/apps/docs/api-reference/custom/analytics/get-analytics.mdx deleted file mode 100644 index d66ca0a84..000000000 --- a/apps/docs/api-reference/custom/analytics/get-analytics.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /analytics ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/analytics/get-analyticstrending.mdx b/apps/docs/api-reference/custom/analytics/get-analyticstrending.mdx deleted file mode 100644 index 1401ebfe7..000000000 --- a/apps/docs/api-reference/custom/analytics/get-analyticstrending.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /analytics/trending ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/analytics/post-analyticsstars.mdx b/apps/docs/api-reference/custom/analytics/post-analyticsstars.mdx deleted file mode 100644 index a785314cc..000000000 --- a/apps/docs/api-reference/custom/analytics/post-analyticsstars.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /analytics/stars ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/auth/post-authforgot-return.mdx b/apps/docs/api-reference/custom/auth/post-authforgot-return.mdx deleted file mode 100644 index 98b152f6a..000000000 --- a/apps/docs/api-reference/custom/auth/post-authforgot-return.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /auth/forgot-return ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/auth/post-authforgot.mdx b/apps/docs/api-reference/custom/auth/post-authforgot.mdx deleted file mode 100644 index ecfdaec7f..000000000 --- a/apps/docs/api-reference/custom/auth/post-authforgot.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /auth/forgot ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/auth/post-authlogin.mdx b/apps/docs/api-reference/custom/auth/post-authlogin.mdx deleted file mode 100644 index c20b13e4e..000000000 --- a/apps/docs/api-reference/custom/auth/post-authlogin.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /auth/login ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/auth/post-authregister.mdx b/apps/docs/api-reference/custom/auth/post-authregister.mdx deleted file mode 100644 index 6e6245559..000000000 --- a/apps/docs/api-reference/custom/auth/post-authregister.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /auth/register ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/get-billing.mdx b/apps/docs/api-reference/custom/billing/get-billing.mdx deleted file mode 100644 index 3fc1da215..000000000 --- a/apps/docs/api-reference/custom/billing/get-billing.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /billing ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/get-billingcheck.mdx b/apps/docs/api-reference/custom/billing/get-billingcheck.mdx deleted file mode 100644 index 4bd8e5339..000000000 --- a/apps/docs/api-reference/custom/billing/get-billingcheck.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /billing/check/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/get-billingportal.mdx b/apps/docs/api-reference/custom/billing/get-billingportal.mdx deleted file mode 100644 index 7d6a0bea2..000000000 --- a/apps/docs/api-reference/custom/billing/get-billingportal.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /billing/portal ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/post-billingcancel.mdx b/apps/docs/api-reference/custom/billing/post-billingcancel.mdx deleted file mode 100644 index aaf94dbdb..000000000 --- a/apps/docs/api-reference/custom/billing/post-billingcancel.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /billing/cancel ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/post-billingprorate.mdx b/apps/docs/api-reference/custom/billing/post-billingprorate.mdx deleted file mode 100644 index faf145e62..000000000 --- a/apps/docs/api-reference/custom/billing/post-billingprorate.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /billing/prorate ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/billing/post-billingsubscribe.mdx b/apps/docs/api-reference/custom/billing/post-billingsubscribe.mdx deleted file mode 100644 index b922bdbd1..000000000 --- a/apps/docs/api-reference/custom/billing/post-billingsubscribe.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /billing/subscribe ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/comments/delete-comments.mdx b/apps/docs/api-reference/custom/comments/delete-comments.mdx deleted file mode 100644 index 05f2e159f..000000000 --- a/apps/docs/api-reference/custom/comments/delete-comments.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: delete /comments/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/comments/get-comments.mdx b/apps/docs/api-reference/custom/comments/get-comments.mdx deleted file mode 100644 index a89d40d7b..000000000 --- a/apps/docs/api-reference/custom/comments/get-comments.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /comments/{date} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/comments/post-comments-1.mdx b/apps/docs/api-reference/custom/comments/post-comments-1.mdx deleted file mode 100644 index b808bdeb2..000000000 --- a/apps/docs/api-reference/custom/comments/post-comments-1.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /comments/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/comments/post-comments.mdx b/apps/docs/api-reference/custom/comments/post-comments.mdx deleted file mode 100644 index 20750b6c8..000000000 --- a/apps/docs/api-reference/custom/comments/post-comments.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /comments ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/comments/put-comments.mdx b/apps/docs/api-reference/custom/comments/put-comments.mdx deleted file mode 100644 index 80e76a6f2..000000000 --- a/apps/docs/api-reference/custom/comments/put-comments.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: put /comments/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/delete-integrations.mdx b/apps/docs/api-reference/custom/integrations/delete-integrations.mdx deleted file mode 100644 index 01eb5339f..000000000 --- a/apps/docs/api-reference/custom/integrations/delete-integrations.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: delete /integrations ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/get-integrations.mdx b/apps/docs/api-reference/custom/integrations/get-integrations.mdx deleted file mode 100644 index ea16dc896..000000000 --- a/apps/docs/api-reference/custom/integrations/get-integrations.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /integrations ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/get-integrationslist.mdx b/apps/docs/api-reference/custom/integrations/get-integrationslist.mdx deleted file mode 100644 index 4492a8eb1..000000000 --- a/apps/docs/api-reference/custom/integrations/get-integrationslist.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /integrations/list ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/get-integrationssocial.mdx b/apps/docs/api-reference/custom/integrations/get-integrationssocial.mdx deleted file mode 100644 index 012ff9357..000000000 --- a/apps/docs/api-reference/custom/integrations/get-integrationssocial.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /integrations/social/{integration} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/post-integrationsarticle-connect.mdx b/apps/docs/api-reference/custom/integrations/post-integrationsarticle-connect.mdx deleted file mode 100644 index 992192eee..000000000 --- a/apps/docs/api-reference/custom/integrations/post-integrationsarticle-connect.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /integrations/article/{integration}/connect ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/post-integrationsdisable.mdx b/apps/docs/api-reference/custom/integrations/post-integrationsdisable.mdx deleted file mode 100644 index 2af123c5f..000000000 --- a/apps/docs/api-reference/custom/integrations/post-integrationsdisable.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /integrations/disable ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/post-integrationsenable.mdx b/apps/docs/api-reference/custom/integrations/post-integrationsenable.mdx deleted file mode 100644 index 1866d943b..000000000 --- a/apps/docs/api-reference/custom/integrations/post-integrationsenable.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /integrations/enable ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/post-integrationsfunction.mdx b/apps/docs/api-reference/custom/integrations/post-integrationsfunction.mdx deleted file mode 100644 index 7bd2564bd..000000000 --- a/apps/docs/api-reference/custom/integrations/post-integrationsfunction.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /integrations/function ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/integrations/post-integrationssocial-connect.mdx b/apps/docs/api-reference/custom/integrations/post-integrationssocial-connect.mdx deleted file mode 100644 index 7b7e99b47..000000000 --- a/apps/docs/api-reference/custom/integrations/post-integrationssocial-connect.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /integrations/social/{integration}/connect ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/media/get-media.mdx b/apps/docs/api-reference/custom/media/get-media.mdx deleted file mode 100644 index 84018f438..000000000 --- a/apps/docs/api-reference/custom/media/get-media.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /media ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/media/post-media.mdx b/apps/docs/api-reference/custom/media/post-media.mdx deleted file mode 100644 index 5ef2236a5..000000000 --- a/apps/docs/api-reference/custom/media/post-media.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /media ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/notifications/get-notifications.mdx b/apps/docs/api-reference/custom/notifications/get-notifications.mdx deleted file mode 100644 index 0a659ffc6..000000000 --- a/apps/docs/api-reference/custom/notifications/get-notifications.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /notifications ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/notifications/get-notificationslist.mdx b/apps/docs/api-reference/custom/notifications/get-notificationslist.mdx deleted file mode 100644 index 44bb0ab78..000000000 --- a/apps/docs/api-reference/custom/notifications/get-notificationslist.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /notifications/list ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/delete-posts.mdx b/apps/docs/api-reference/custom/posts/delete-posts.mdx deleted file mode 100644 index 69d46e4ff..000000000 --- a/apps/docs/api-reference/custom/posts/delete-posts.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: delete /posts/{group} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/get-posts-1.mdx b/apps/docs/api-reference/custom/posts/get-posts-1.mdx deleted file mode 100644 index b4b6045da..000000000 --- a/apps/docs/api-reference/custom/posts/get-posts-1.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /posts/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/get-posts.mdx b/apps/docs/api-reference/custom/posts/get-posts.mdx deleted file mode 100644 index 2b8135958..000000000 --- a/apps/docs/api-reference/custom/posts/get-posts.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /posts ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/get-postsold.mdx b/apps/docs/api-reference/custom/posts/get-postsold.mdx deleted file mode 100644 index 5f2cca667..000000000 --- a/apps/docs/api-reference/custom/posts/get-postsold.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /posts/old ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/get-postspredict-trending.mdx b/apps/docs/api-reference/custom/posts/get-postspredict-trending.mdx deleted file mode 100644 index 0f0ad9837..000000000 --- a/apps/docs/api-reference/custom/posts/get-postspredict-trending.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /posts/predict-trending ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/post-posts.mdx b/apps/docs/api-reference/custom/posts/post-posts.mdx deleted file mode 100644 index 1a6a78bf7..000000000 --- a/apps/docs/api-reference/custom/posts/post-posts.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /posts ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/posts/put-posts-date.mdx b/apps/docs/api-reference/custom/posts/put-posts-date.mdx deleted file mode 100644 index b9655c264..000000000 --- a/apps/docs/api-reference/custom/posts/put-posts-date.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: put /posts/{id}/date ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/delete-settingsrepository.mdx b/apps/docs/api-reference/custom/settings/delete-settingsrepository.mdx deleted file mode 100644 index 3b646c0fe..000000000 --- a/apps/docs/api-reference/custom/settings/delete-settingsrepository.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: delete /settings/repository/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/delete-settingsteam.mdx b/apps/docs/api-reference/custom/settings/delete-settingsteam.mdx deleted file mode 100644 index aaf40de29..000000000 --- a/apps/docs/api-reference/custom/settings/delete-settingsteam.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: delete /settings/team/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/get-settingsgithub.mdx b/apps/docs/api-reference/custom/settings/get-settingsgithub.mdx deleted file mode 100644 index ac3cbd5c4..000000000 --- a/apps/docs/api-reference/custom/settings/get-settingsgithub.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /settings/github ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/get-settingsgithuburl.mdx b/apps/docs/api-reference/custom/settings/get-settingsgithuburl.mdx deleted file mode 100644 index b952fe505..000000000 --- a/apps/docs/api-reference/custom/settings/get-settingsgithuburl.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /settings/github/url ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/get-settingsorganizations-.mdx b/apps/docs/api-reference/custom/settings/get-settingsorganizations-.mdx deleted file mode 100644 index 57bb5902e..000000000 --- a/apps/docs/api-reference/custom/settings/get-settingsorganizations-.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /settings/organizations/{id}/{github} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/get-settingsorganizations.mdx b/apps/docs/api-reference/custom/settings/get-settingsorganizations.mdx deleted file mode 100644 index 8b64a9b1f..000000000 --- a/apps/docs/api-reference/custom/settings/get-settingsorganizations.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /settings/organizations/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/get-settingsteam.mdx b/apps/docs/api-reference/custom/settings/get-settingsteam.mdx deleted file mode 100644 index 5a05bd017..000000000 --- a/apps/docs/api-reference/custom/settings/get-settingsteam.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /settings/team ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/post-settingsgithub.mdx b/apps/docs/api-reference/custom/settings/post-settingsgithub.mdx deleted file mode 100644 index bf19af99a..000000000 --- a/apps/docs/api-reference/custom/settings/post-settingsgithub.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /settings/github ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/post-settingsorganizations.mdx b/apps/docs/api-reference/custom/settings/post-settingsorganizations.mdx deleted file mode 100644 index fd26194f8..000000000 --- a/apps/docs/api-reference/custom/settings/post-settingsorganizations.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /settings/organizations/{id} ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/settings/post-settingsteam.mdx b/apps/docs/api-reference/custom/settings/post-settingsteam.mdx deleted file mode 100644 index bde58c248..000000000 --- a/apps/docs/api-reference/custom/settings/post-settingsteam.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /settings/team ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/stripe/post-stripe.mdx b/apps/docs/api-reference/custom/stripe/post-stripe.mdx deleted file mode 100644 index 3a80d176d..000000000 --- a/apps/docs/api-reference/custom/stripe/post-stripe.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /stripe ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/get-userorganizations.mdx b/apps/docs/api-reference/custom/user/get-userorganizations.mdx deleted file mode 100644 index 66f23d584..000000000 --- a/apps/docs/api-reference/custom/user/get-userorganizations.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /user/organizations ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/get-userself.mdx b/apps/docs/api-reference/custom/user/get-userself.mdx deleted file mode 100644 index 0d91b7c42..000000000 --- a/apps/docs/api-reference/custom/user/get-userself.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /user/self ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/get-usersubscription.mdx b/apps/docs/api-reference/custom/user/get-usersubscription.mdx deleted file mode 100644 index 3254da9e6..000000000 --- a/apps/docs/api-reference/custom/user/get-usersubscription.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /user/subscription ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/get-usersubscriptiontiers.mdx b/apps/docs/api-reference/custom/user/get-usersubscriptiontiers.mdx deleted file mode 100644 index b277613e7..000000000 --- a/apps/docs/api-reference/custom/user/get-usersubscriptiontiers.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: get /user/subscription/tiers ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/post-userchange-org.mdx b/apps/docs/api-reference/custom/user/post-userchange-org.mdx deleted file mode 100644 index 73d9742eb..000000000 --- a/apps/docs/api-reference/custom/user/post-userchange-org.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /user/change-org ---- \ No newline at end of file diff --git a/apps/docs/api-reference/custom/user/post-userjoin-org.mdx b/apps/docs/api-reference/custom/user/post-userjoin-org.mdx deleted file mode 100644 index 27014d520..000000000 --- a/apps/docs/api-reference/custom/user/post-userjoin-org.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi: post /user/join-org ---- \ No newline at end of file diff --git a/apps/docs/api-reference/introduction.mdx b/apps/docs/api-reference/introduction.mdx deleted file mode 100644 index f1f59cb8a..000000000 --- a/apps/docs/api-reference/introduction.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 'Introduction' ---- - - - If you're not looking to build API reference documentation, you can delete - this section by removing the api-reference folder. - - -## Welcome - -## How to use the API -There are two main options to use the API: -1. You can send an header called `auth` with the token you received when you logged in. -2. You can send a cookie called `auth` with the token you received when you logged in. - -The dashboard mainly uses the cookie method to authenticate requests.
-But if you want to test the API with Swagger or Postman, you can use the `auth` header. diff --git a/apps/docs/developer-guide/how-to-add-provider.mdx b/apps/docs/developer-guide/how-to-add-provider.mdx deleted file mode 100644 index a813633e2..000000000 --- a/apps/docs/developer-guide/how-to-add-provider.mdx +++ /dev/null @@ -1,172 +0,0 @@ ---- -title: How to add a new provider -description: How to add a new provider to Gitroom ---- - -The system is designed to be easily extensible. -Each provider need to implement multiple things. -There are two main options: -- Implement a social media provider (oAuth2) -- Implement a publishing provider (Token) - -

    -
  1. - ### The backend logic: - -
  2. -
  3. - ### The frontend logic: - -
  4. -
- -## Social Media - -### Backend -For our example, we will use the X provider.
-1. First, we need to create a DTO for the settings of the provider.
-head over to `nestjs-libraries/src/dtos/posts/providers-settings` -And create a new file `x-provider-settings.dto.ts`
-(you don't have to create a DTO if there are no settings)

-Once created head over to `nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts` -And add the new DTO.

-Head to `libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts`
-look for the discriminator and add another line in the format of
- -```typescript create.post.dto.ts -{ value: DTOClassName, name: 'providerName' }, -``` - -2. head over to `libraries/nestjs-libraries/src/integrations/social`
-And create a new provider file `providerName.provider.ts`
-The content of the file should look like this: - - -```typescript For oAuth2 providers -import { - AuthTokenDetails, - PostDetails, - PostResponse, - SocialProvider, -} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; - -export class XProvider implements SocialProvider { - identifier = 'providerName'; - name = 'Provider Name'; - async refreshToken(refreshToken: string): Promise { - ...refresh the token - } - - async generateAuthUrl() { - ...generate the auth url - } - - async authenticate(params: { code: string; codeVerifier: string }) { - ...authenticate the user - } - - async post( - id: string, - accessToken: string, - postDetails: PostDetails[] - ): Promise { - ...post the content - } -} -``` - -```typescript For Token providers -import { ArticleProvider } from '@gitroom/nestjs-libraries/integrations/article/article.integrations.interface'; - -export class DevToProvider implements ArticleProvider { - identifier = 'providerName'; - name = 'ProviderName'; - async authenticate(token: string) { - - } - - async post(token: string, content: string, settings: DTOClassName) { - - } -} -``` - - -Take a look at the exising providers to see how to implement the methods. - -### Custom functions -You might want to create custom functions for the providers for example: get available orgs, get available pages, etc.
-You can create a public function in the provider for example `organizations` and later call it from a special hook from the frontend. - -### Integration Manager -Open `libraries/nestjs-libraries/src/integrations/integration.manager.ts` -And add the new provider to either `socialIntegrationList` (oAuth2) or `articleIntegrationList` (Token) - ---- - -### Frontend - -1. Head over to `apps/frontend/src/components/launches/providers` -Create a new folder with the providerName
-Add a new file `providerName.provider.tsx`
-The content of the file should look like this: - -```typescript providerName.provider.tsx -import { FC } from 'react'; -import { withProvider } from '@gitroom/frontend/components/launches/providers/high.order.provider'; -import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; -import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; - -const ProviderPreview: FC = () => { - const { value } = useIntegration(); - const settings = useSettings(); - - return ( - ...Preview - ); -}; - -const ProviderSettings: FC = () => { - const form = useSettings(); - const { date } = useIntegration(); - return ( - ...Settings - ); -}; - -export default withProvider(DevtoSettings, DevtoPreview, DTOClassName); -``` - -If you want to use a custom function for the provider you can use the `useCustomProviderFunction` hook. - -```typescript -import { useCustomProviderFunction } from '@gitroom/frontend/components/launches/helpers/use.custom.provider.function'; -import { useCallback } from 'react'; -const customFunc = useCustomProviderFunction(); - -// and use it like that: -const getOrgs = useCallback(() => { - customFunc.get('organizations', { - anyKey: 'anyValue' - }) -}, []); -``` - -It will automatically interact with the right provider saved for the user. - -You can look at the other integration to understand what data to put inside. - -2. Open `apps/frontend/src/components/launches/providers/show.all.providers.tsx` -And add the new provider to the list. -```typescript show.all.providers.tsx - {identifier: 'providerName', component: DefaultImportFromHighOrderProvider}, -``` diff --git a/apps/docs/emails.mdx b/apps/docs/emails.mdx deleted file mode 100644 index e7c7ea455..000000000 --- a/apps/docs/emails.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Email Notifications -description: How to send notifications to users ---- - -Postiz uses Resend to send email notifications to users. Emails are currently -required as part of the new-user creation process, which sends an activation -email. - -* Register to [Resend](https://resend.com), and connect your domain. -* Copy your API Key from the Resend control panel. -* Open the .env file and edit the following line. - -```env -RESEND_API_KEY="" -``` - -Feel free to contribute other providers to send email notifications. diff --git a/apps/docs/essentials/code.mdx b/apps/docs/essentials/code.mdx deleted file mode 100644 index d2a462a7a..000000000 --- a/apps/docs/essentials/code.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: 'Code Blocks' -description: 'Display inline code and code blocks' -icon: 'code' ---- - -## Basic - -### Inline Code - -To denote a `word` or `phrase` as code, enclose it in backticks (`). - -``` -To denote a `word` or `phrase` as code, enclose it in backticks (`). -``` - -### Code Block - -Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language. - -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` - -````md -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` -```` diff --git a/apps/docs/essentials/images.mdx b/apps/docs/essentials/images.mdx deleted file mode 100644 index 4c1517777..000000000 --- a/apps/docs/essentials/images.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: 'Images and Embeds' -description: 'Add image, video, and other HTML elements' -icon: 'image' ---- - - - -## Image - -### Using Markdown - -The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code - -```md -![title](/path/image.jpg) -``` - -Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed. - -### Using Embeds - -To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images - -```html - -``` - -## Embeds and HTML elements - - - -
- - - -Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility. - - - -### iFrames - -Loads another HTML page within the document. Most commonly used for embedding videos. - -```html - -``` diff --git a/apps/docs/essentials/markdown.mdx b/apps/docs/essentials/markdown.mdx deleted file mode 100644 index c8ad9c1f3..000000000 --- a/apps/docs/essentials/markdown.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: 'Markdown Syntax' -description: 'Text, title, and styling in standard markdown' -icon: 'text-size' ---- - -## Titles - -Best used for section headers. - -```md -## Titles -``` - -### Subtitles - -Best use to subsection headers. - -```md -### Subtitles -``` - - - -Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right. - - - -## Text Formatting - -We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it. - -| Style | How to write it | Result | -| ------------- | ----------------- | --------------- | -| Bold | `**bold**` | **bold** | -| Italic | `_italic_` | _italic_ | -| Strikethrough | `~strikethrough~` | ~strikethrough~ | - -You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text. - -You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text. - -| Text Size | How to write it | Result | -| ----------- | ------------------------ | ---------------------- | -| Superscript | `superscript` | superscript | -| Subscript | `subscript` | subscript | - -## Linking to Pages - -You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com). - -Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section. - -Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily. - -## Blockquotes - -### Singleline - -To create a blockquote, add a `>` in front of a paragraph. - -> Dorothy followed her through many of the beautiful rooms in her castle. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -``` - -### Multiline - -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. -``` - -### LaTeX - -Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component. - -8 x (vk x H1 - H2) = (0,1) - -```md -8 x (vk x H1 - H2) = (0,1) -``` diff --git a/apps/docs/essentials/navigation.mdx b/apps/docs/essentials/navigation.mdx deleted file mode 100644 index ca44bb645..000000000 --- a/apps/docs/essentials/navigation.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: 'Navigation' -description: 'The navigation field in mint.json defines the pages that go in the navigation menu' -icon: 'map' ---- - -The navigation menu is the list of links on every website. - -You will likely update `mint.json` every time you add a new page. Pages do not show up automatically. - -## Navigation syntax - -Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names. - - - -```json Regular Navigation -"navigation": [ - { - "group": "Getting Started", - "pages": ["quickstart"] - } -] -``` - -```json Nested Navigation -"navigation": [ - { - "group": "Getting Started", - "pages": [ - "quickstart", - { - "group": "Nested Reference Pages", - "pages": ["nested-reference-page"] - } - ] - } -] -``` - - - -## Folders - -Simply put your MDX files in folders and update the paths in `mint.json`. - -For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`. - - - -You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted. - - - -```json Navigation With Folder -"navigation": [ - { - "group": "Group Name", - "pages": ["your-folder/your-page"] - } -] -``` - -## Hidden Pages - -MDX files not included in `mint.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them. diff --git a/apps/docs/essentials/settings.mdx b/apps/docs/essentials/settings.mdx deleted file mode 100644 index ae6e7d6ab..000000000 --- a/apps/docs/essentials/settings.mdx +++ /dev/null @@ -1,318 +0,0 @@ ---- -title: 'Global Settings' -description: 'Mintlify gives you complete control over the look and feel of your documentation using the mint.json file' -icon: 'gear' ---- - -Every Mintlify site needs a `mint.json` file with the core configuration settings. Learn more about the [properties](#properties) below. - -## Properties - - -Name of your project. Used for the global title. - -Example: `mintlify` - - - - - An array of groups with all the pages within that group - - - The name of the group. - - Example: `Settings` - - - - The relative paths to the markdown files that will serve as pages. - - Example: `["customization", "page"]` - - - - - - - - Path to logo image or object with path to "light" and "dark" mode logo images - - - Path to the logo in light mode - - - Path to the logo in dark mode - - - Where clicking on the logo links you to - - - - - - Path to the favicon image - - - - Hex color codes for your global theme - - - The primary color. Used for most often for highlighted content, section - headers, accents, in light mode - - - The primary color for dark mode. Used for most often for highlighted - content, section headers, accents, in dark mode - - - The primary color for important buttons - - - The color of the background in both light and dark mode - - - The hex color code of the background in light mode - - - The hex color code of the background in dark mode - - - - - - - - Array of `name`s and `url`s of links you want to include in the topbar - - - The name of the button. - - Example: `Contact us` - - - The url once you click on the button. Example: `https://mintlify.com/contact` - - - - - - - - - Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars. - - - If `link`: What the button links to. - - If `github`: Link to the repository to load GitHub information from. - - - Text inside the button. Only required if `type` is a `link`. - - - - - - - Array of version names. Only use this if you want to show different versions - of docs with a dropdown in the navigation bar. - - - - An array of the anchors, includes the `icon`, `color`, and `url`. - - - The [Font Awesome](https://fontawesome.com/search?s=brands%2Cduotone) icon used to feature the anchor. - - Example: `comments` - - - The name of the anchor label. - - Example: `Community` - - - The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in. - - - The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color. - - - Used if you want to hide an anchor until the correct docs version is selected. - - - Pass `true` if you want to hide the anchor until you directly link someone to docs inside it. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - - Override the default configurations for the top-most anchor. - - - The name of the top-most anchor - - - Font Awesome icon. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - An array of navigational tabs. - - - The name of the tab label. - - - The start of the URL that marks what pages go in the tab. Generally, this - is the name of the folder you put your pages in. - - - - - - Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo). - - - The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url - options that the user can toggle. - - - - - - The authentication strategy used for all API endpoints. - - - The name of the authentication parameter used in the API playground. - - If method is `basic`, the format should be `[usernameName]:[passwordName]` - - - The default value that's designed to be a prefix for the authentication input field. - - E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`. - - - - - - Configurations for the API playground - - - - Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple` - - Learn more at the [playground guides](/api-playground/demo) - - - - - - Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file. - - This behavior will soon be enabled by default, at which point this field will be deprecated. - - - - - - - A string or an array of strings of URL(s) or relative path(s) pointing to your - OpenAPI file. - - Examples: - - ```json Absolute - "openapi": "https://example.com/openapi.json" - ``` - ```json Relative - "openapi": "/openapi.json" - ``` - ```json Multiple - "openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"] - ``` - - - - - - An object of social media accounts where the key:property pair represents the social media platform and the account url. - - Example: - ```json - { - "twitter": "https://twitter.com/mintlify", - "website": "https://mintlify.com" - } - ``` - - - One of the following values `website`, `facebook`, `twitter`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news` - - Example: `twitter` - - - The URL to the social platform. - - Example: `https://twitter.com/mintlify` - - - - - - Configurations to enable feedback buttons - - - - Enables a button to allow users to suggest edits via pull requests - - - Enables a button to allow users to raise an issue about the documentation - - - - - - Customize the dark mode toggle. - - - Set if you always want to show light or dark mode for new users. When not - set, we default to the same mode as the user's operating system. - - - Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example: - - - ```json Only Dark Mode - "modeToggle": { - "default": "dark", - "isHidden": true - } - ``` - - ```json Only Light Mode - "modeToggle": { - "default": "light", - "isHidden": true - } - ``` - - - - - - - - - A background image to be displayed behind every page. See example with - [Infisical](https://infisical.com/docs) and [FRPC](https://frpc.io). - diff --git a/apps/docs/favicon.ico b/apps/docs/favicon.ico deleted file mode 100644 index 317ebcb23..000000000 Binary files a/apps/docs/favicon.ico and /dev/null differ diff --git a/apps/docs/favicon.png b/apps/docs/favicon.png deleted file mode 100755 index 57d731fda..000000000 Binary files a/apps/docs/favicon.png and /dev/null differ diff --git a/apps/docs/github.mdx b/apps/docs/github.mdx deleted file mode 100644 index f45b05f71..000000000 --- a/apps/docs/github.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: GitHub ---- - -Gitroom uses GitHub for oAuth2 authentication during login and for the initial stars sync. -To use GitHub open settings of either your profile or and organization and click on "Developers Settings". -And it left menu, click on "oAuth Apps" and then "New oAuth App". - -In the `Authorization callback URL` add `http://localhost:4200/settings`
-Then copy the GitHub `Client ID` and `Client Secret` and paste them in the `.env` file. - -```env -GITHUB_CLIENT_ID="" -GITHUB_CLIENT_SECRET="" -``` \ No newline at end of file diff --git a/apps/docs/howitworks.mdx b/apps/docs/howitworks.mdx deleted file mode 100644 index aa1fa7dc4..000000000 --- a/apps/docs/howitworks.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: How it works -description: 'Learn the architecture of the project' ---- - -The entire project is built under [NX](https://nx.dev/) to have a monorepo with multiple projects.

-Unlike other NX project, this project has one `.env` file that is shared between all the apps.
-It makes it easier to develop and deploy the project.

-When deploying to websites like [Railway](https://railway.app) or [Heroku](https://heroku.com), you can use a shared environment variables for all the apps.

- -**At the moment it has 6 projects:** - -- [Frontend](#frontend) - Provides the Web user interface, talks to the Backend. -- [Backend](#backend) - Does all the real work, provides an API for the frontend, and posts work to the redis queue. -- [Workers](#worker) - Consumes work from the Redis Queue. -- [Cron](#cron) - Run jobs at scheduled times. -- [Docs](#docs) - This documentation site! - -Architecture of Gitroom - -## Architecture -### Frontend -The frontend is built with [NextJS](https://nextjs.org/) and [TailwindCSS](https://tailwindcss.com/).
-It works directly with the Backend to: -- Show analytics -- Schedule posts -- Manage users - -### Backend -The backend is built with [NestJS](https://nestjs.com/) with a basic architecture of controllers, services, repositories and dtos.

-It uses [Prisma](https://www.prisma.io/) as an ORM to interact with the database.
-By default Prisma uses [Postgres](https://www.postgresql.org/) as a database, but it can be easily changed to any other database since there are no native queries.

-It uses Redis to schedule posts and run background jobs. - -### Cron -The backend is built with [NestJS](https://nestjs.com/) and share components with the backend.
-At the moment the use of the cron is: -- Refresh tokens from different social media platforms. -- Check for trending change every hour and inform users about it. -- Sync the amount of stars for every repository at the end of the day. - -### Worker -The backend is built with [NestJS](https://nestjs.com/) and share components with the backend.
-At the moment the use of the worker is: -- Post scheduled posts to social media platforms. -- Perform multiple jobs coming from the cron. - -### Docs -The documentation website is built with [Mintlify](https://www.mintlify.com/).
-The reference in the documentation is being auto-generated by the backend.
-NestJS has a built-in Swagger module that generates a JSON file with all the routes and their documentation.
-It makes it very easy to track API changes and deploy them. diff --git a/apps/docs/images/arch.png b/apps/docs/images/arch.png deleted file mode 100644 index 2a45a0e52..000000000 Binary files a/apps/docs/images/arch.png and /dev/null differ diff --git a/apps/docs/images/checks-passed.png b/apps/docs/images/checks-passed.png deleted file mode 100644 index 3303c7736..000000000 Binary files a/apps/docs/images/checks-passed.png and /dev/null differ diff --git a/apps/docs/images/hero-dark.svg b/apps/docs/images/hero-dark.svg deleted file mode 100644 index c6a30e88b..000000000 --- a/apps/docs/images/hero-dark.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/docs/images/hero-light.svg b/apps/docs/images/hero-light.svg deleted file mode 100644 index 297d68fb9..000000000 --- a/apps/docs/images/hero-light.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/docs/images/providers/linkedin/linkedin-001.png b/apps/docs/images/providers/linkedin/linkedin-001.png deleted file mode 100644 index 3226cc136..000000000 Binary files a/apps/docs/images/providers/linkedin/linkedin-001.png and /dev/null differ diff --git a/apps/docs/images/providers/linkedin/linkedin-002.png b/apps/docs/images/providers/linkedin/linkedin-002.png deleted file mode 100644 index 18138aa75..000000000 Binary files a/apps/docs/images/providers/linkedin/linkedin-002.png and /dev/null differ diff --git a/apps/docs/images/providers/reddit/reddit-001.png b/apps/docs/images/providers/reddit/reddit-001.png deleted file mode 100644 index 7507a0e38..000000000 Binary files a/apps/docs/images/providers/reddit/reddit-001.png and /dev/null differ diff --git a/apps/docs/images/providers/x/x-001.png b/apps/docs/images/providers/x/x-001.png deleted file mode 100644 index bd8253a62..000000000 Binary files a/apps/docs/images/providers/x/x-001.png and /dev/null differ diff --git a/apps/docs/images/providers/x/x-002.png b/apps/docs/images/providers/x/x-002.png deleted file mode 100644 index 59f0d47c7..000000000 Binary files a/apps/docs/images/providers/x/x-002.png and /dev/null differ diff --git a/apps/docs/images/providers/x/x-003.png b/apps/docs/images/providers/x/x-003.png deleted file mode 100644 index d54a5f196..000000000 Binary files a/apps/docs/images/providers/x/x-003.png and /dev/null differ diff --git a/apps/docs/images/providers/x/x-004.png b/apps/docs/images/providers/x/x-004.png deleted file mode 100644 index 8e62bf5e6..000000000 Binary files a/apps/docs/images/providers/x/x-004.png and /dev/null differ diff --git a/apps/docs/images/screens/analytics.png b/apps/docs/images/screens/analytics.png deleted file mode 100644 index dbd67e75c..000000000 Binary files a/apps/docs/images/screens/analytics.png and /dev/null differ diff --git a/apps/docs/images/screens/billing.png b/apps/docs/images/screens/billing.png deleted file mode 100644 index 6df00c535..000000000 Binary files a/apps/docs/images/screens/billing.png and /dev/null differ diff --git a/apps/docs/images/screens/settings.png b/apps/docs/images/screens/settings.png deleted file mode 100644 index 6d256c835..000000000 Binary files a/apps/docs/images/screens/settings.png and /dev/null differ diff --git a/apps/docs/installation/development.mdx b/apps/docs/installation/development.mdx deleted file mode 100644 index 015b9bf18..000000000 --- a/apps/docs/installation/development.mdx +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Development Environment ---- - -This is currently the recommended option to install Postiz in a supportable configuration. The docker images are in active and heavy development for now. - -## Tested configurations - -- MacOS -- Linux (Fedora 40) - -Naturally you can use these instructions to setup a development environment on any platform, but there may not be much experience in the community to help you with any issues you may encounter. - -## Prerequisites - -This guide will ask you to install & configure several services exaplained below. - -### Prerequisite Cloud Services - -- **[Cloudflare R2](https://cloudflare.com)** - for uploads (optional, can use local machine). -- **Social Media API details** - various API keys and secrets (more details later) for services you want to use; reddit, X, Instagram, etc.. - -### Optional Cloud Services - -- **[Resend account](https://resend.com)** - for user activation and email notifications. - -### Prerequisite Local Services - -- **Node.js** - for running the code! (version 18+) -- **PostgreSQL** - or any other SQL database (instructions beleow suggest Docker) -- **Redis** - for handling worker queues (instructions below suggest Docker) - -We have some messages from users who are using Windows, which should work, but they are not tested well yet. - -## Installation Instructions - -### NodeJS (version 18+) - -A complete guide of how to install NodeJS can be found [here](https://nodejs.org/en/download/). - -### PostgreSQL (or any other SQL database) & Redis - -You can choose **Option A** to **Option B** to install the database. - -#### Option A) Postgres and Redis as Single containers - -You can install [Docker](https://www.docker.com/products/docker-desktop) and run: - -```bash Terminal -docker run -e POSTGRES_USER=root -e POSTGRES_PASSWORD=your_password --name postgres -p 5432:5432 -d postgres -docker run --name redis -p 6379:6379 -d redis -``` - -#### Option B) Postgres and Redis as docker-compose - -Download the [docker-compose.yaml file here](https://raw.githubusercontent.com/gitroomhq/postiz-app/main/docker-compose.dev.yaml), -or grab it from the repository in the next step. - -```bash Terminal -docker compose -f "docker-compose.dev.yaml" up -``` - -## Build Postiz - - - -```bash Terminal -git clone https://github.com/gitroomhq/gitroom -``` - - - -Copy the `.env.example` file to `.env` and fill in the values - -An example file of the most used configuration settings can be found here; [example postiz.env file](https://raw.githubusercontent.com/gitroomhq/postiz-app/main/.env.example) - -There is also a [configuration reference](/configuration/reference) page that goes into more detail. - -```bash .env -# Required Settings -DATABASE_URL="postgresql://postiz-user:postiz-password@localhost:5432/postiz-db-local" -REDIS_URL="redis://localhost:6379" -JWT_SECRET="random string for your JWT secret, make it long" -FRONTEND_URL="http://localhost:4200" -NEXT_PUBLIC_BACKEND_URL="http://localhost:3000" -BACKEND_INTERNAL_URL="http://localhost:3000" - -# Optional. Your upload directory path if you host your files locally. -UPLOAD_DIRECTORY="/opt/postiz/uploads/" - -# Optional: your upload directory slug if you host your files locally. -NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="" - -## This is a dummy key, you must create your own from Resend. -## If this variable exists, user activation is required. -## If it is commented out, users are activated automatically. -#RESEND_API_KEY="RzeTwHijvxvPUerScFcenUZUALuQJzSaGSMJ" - -## These are dummy values, you must create your own from Cloudflare. -## Remember to set your public internet IP address in the allow-list for the API token. -CLOUDFLARE_ACCOUNT_ID="QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu" -CLOUDFLARE_ACCESS_KEY="dcfCMSuFEeCNfvByUureMZEfxWJmDqZe" -CLOUDFLARE_SECRET_ACCESS_KEY="zTTMXBmtyLPwHEdpACGHgDgzRTNpTJewiNriLnUS" -CLOUDFLARE_BUCKETNAME="postiz" -CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflarestorage.com/" -CLOUDFLARE_REGION="auto" - -# Social Media API Settings -X_API_KEY="Twitter API key for normal oAuth not oAuth2" -X_API_SECRET="Twitter API secret for normal oAuth not oAuth2" -LINKEDIN_CLIENT_ID="Linkedin Client ID" -LINKEDIN_CLIENT_SECRET="Linkedin Client Secret" -REDDIT_CLIENT_ID="Reddit Client ID" -REDDIT_CLIENT_SECRET="Linkedin Client Secret" -GITHUB_CLIENT_ID="GitHub Client ID" -GITHUB_CLIENT_SECRET="GitHub Client Secret" - - -# Developer Settings -NX_ADD_PLUGINS=false -IS_GENERAL="true" # required for now -``` - - - - -```bash Terminal -npm install -``` - - - -```bash Terminal -npm run prisma-db-push -``` - - - -```bash Terminal -npm run dev -``` - - - -If everything is running successfully, open http://localhost:4200 in your browser! - -If everything is not running - you had errors in the steps above, please head over to our [support](/support) page. - -## Next Steps - - - - Learn the architecture of the project - - - Set up email for notifications - - - Set up github for authentication and sync - - - Set up providers such as Linkedin, X and Reddit - - diff --git a/apps/docs/installation/docker-compose.mdx b/apps/docs/installation/docker-compose.mdx deleted file mode 100644 index 8c422f018..000000000 --- a/apps/docs/installation/docker-compose.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Docker Compose ---- - -import EarlyDoc from '/snippets/earlydoc.mdx'; -import DockerEnvvarApps from '/snippets/docker-envvar-apps.mdx'; -import DockerEnvvarGeneral from '/snippets/docker-envvar-general.mdx'; - - - - - -The container images will copy a file called `/config/postiz.env` to `/apps/.env` on startup. - -# Example `docker-compose.yml` file - -```yaml -services: - postiz: - image: ghcr.io/gitroomhq/postiz-app:latest - container_name: postiz - restart: always - environment: # If you want to specify the variables in your compose file. - - DATABASE_URL="postgresql://postiz-user:postiz-password@localhost:5432/postiz-db-local" - - REDIS_URL="redis://localhost:6379" - - JWT_SECRET="random string for your JWT secret, make it long" - - FRONTEND_URL="http://localhost:4200" - - NEXT_PUBLIC_BACKEND_URL="http://localhost:3000" - - BACKEND_INTERNAL_URL="http://localhost:3000" - volumes: - - ./config:/config/ # If you want to specify the variables in your `postiz.env` file. - ports: - - 4200:4200 - - 3000:3000 - networks: - - postiz-network - - postiz-postgres: - image: postgres:14.5 - container_name: postiz-postgres - restart: always - environment: - POSTGRES_PASSWORD: postiz-local-pwd - POSTGRES_USER: postiz-local - POSTGRES_DB: postiz-db-local - volumes: - - postgres-volume:/var/lib/postgresql/data - ports: - - 5432:5432 - networks: - - postiz-network - postiz-pg-admin: - image: dpage/pgadmin4 - container_name: postiz-pg-admin - restart: always - ports: - - 8081:80 - environment: - PGADMIN_DEFAULT_EMAIL: admin@admin.com - PGADMIN_DEFAULT_PASSWORD: admin - networks: - - postiz-network - postiz-redis: - image: redis:7.2 - container_name: postiz-redis - restart: always - ports: - - 6379:6379 - -volumes: - postgres-volume: - external: false - -networks: - postiz-network: - external: false -``` - - diff --git a/apps/docs/installation/docker.mdx b/apps/docs/installation/docker.mdx deleted file mode 100644 index 3ba5228b7..000000000 --- a/apps/docs/installation/docker.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Docker ---- - -import EarlyDoc from '/snippets/earlydoc.mdx'; -import DockerEnvvarApps from '/snippets/docker-envvar-apps.mdx'; -import DockerEnvvarGeneral from '/snippets/docker-envvar-general.mdx'; - - - - - -The container images will copy a file called `/config/postiz.env` to `/apps/.env` on startup. - -# Create the container on command line - -It is recommended to have a local directory where you save your `postiz.env` file, such as `/myContainers/postiz/config`, which is mounted as a volume. - -```bash Using a configuration volume -docker create --name postiz -v /myContainers/postiz/config:/config -p 4200:4200 -p 3000:3000 ghcr.io/gitroomhq/postiz-app:latest -``` - -Alternatively, you can specify the variables one by one at creation time. This approach is not recommended -simply because it's a pain to manage, and sensitive keys get stored with the container definition, which is bad practice. - -```bash At creation-time (not recommended) -docker create --name postiz \ - -e DATABASE_URL=postgres://... \ - -e REDIS_URL=redis:// \ - -e JWT_SECRET \ - ... \ - -p 4200:4200 \ - -p 3000:3000 \ - ghcr.io/gitroomhq/postiz-app:latest -``` - - - - diff --git a/apps/docs/installation/kubernetes-helm.mdx b/apps/docs/installation/kubernetes-helm.mdx deleted file mode 100644 index 819a64981..000000000 --- a/apps/docs/installation/kubernetes-helm.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Helm ---- - -import EarlyDoc from '/snippets/earlydoc.mdx'; -import DockerDatabase from '/snippets/docker-database.mdx'; - - - - -Postiz has a helm chart that is in very active development. You can find it here; - -https://github.com/gitroomhq/postiz-helmchart diff --git a/apps/docs/introduction.mdx b/apps/docs/introduction.mdx deleted file mode 100644 index 67c5e21b4..000000000 --- a/apps/docs/introduction.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Introduction -description: 'Welcome to Gitroom documentation' ---- - -
- Hero Light - Hero Dark -
- -## What is Gitroom? - -Gitroom can help you launch your open-source tool every week
-
    -
  • Schedule social media and articles.
  • -
  • Exchange or buy posts from other members.
  • -
  • Monitor your GitHub trending, and so much more.
  • -
- -## Architecture -Gitroom is an [NX monorepo](https://nx.dev) that contains a backend, a frontend, workers, cron jobs and the docs.

-Unlike other NX project, this project has one `.env` file that is shared between all the apps.
-It makes it easier to develop and deploy the project.

-When deploying to websites like [Railway](https://railway.app) or [Heroku](https://heroku.com), you can use a shared environment variables for all the apps.
- -**It has four main components:** -- `frontend` - NextJS control panel serving as the admin dashboard for the project. -- `backend` - NestJS backend that serves as the API for the frontend. -- `cron` - NestJS cron jobs that run every X to update the database with new trending, refresh tokens and more. -- `workers` - NestJS workers that run every X to process scheduled posts, sync GitHub stars and more. - - - - Learn how to install the project and start using it - - - Learn the architecture of the project - - diff --git a/apps/docs/logo/dark.png b/apps/docs/logo/dark.png deleted file mode 100644 index 1d787f8c6..000000000 Binary files a/apps/docs/logo/dark.png and /dev/null differ diff --git a/apps/docs/logo/light.png b/apps/docs/logo/light.png deleted file mode 100644 index 14611589d..000000000 Binary files a/apps/docs/logo/light.png and /dev/null differ diff --git a/apps/docs/mint.json b/apps/docs/mint.json deleted file mode 100644 index 4b375a4d9..000000000 --- a/apps/docs/mint.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "$schema": "https://mintlify.com/schema.json", - "name": "Starter Kit", - "logo": { - "dark": "/logo/dark.png", - "light": "/logo/light.png" - }, - "favicon": "/favicon.png", - "colors": { - "primary": "#000", - "light": "#612ad5", - "dark": "#000", - "anchors": { - "from": "#612ad5", - "to": "#612ad5" - } - }, - "openapi": "https://api.postiz.com/docs-json", - "api": { - "baseUrl": "https://api.postiz.com" - }, - "topbarLinks": [ - { - "name": "Support", - "url": "mailto:nevo@postiz.com" - }, - { - "name": "Cloud", - "url": "https://platform.postiz.com" - } - ], - "modeToggle": { - "default": "light" - }, - "topbarCtaButton": { - "type": "github", - "url": "https://github.com/gitroomhq/postiz-app" - }, - "anchors": [ - { - "name": "Community", - "icon": "discord", - "url": "https://postiz.gitroom.com" - } - ], - "navigation": [ - { - "group": "How to use Postiz", - "pages": [ - "use/analytics", - { - "group": "Launches", - "pages": ["use/calendar", "use/scheduling"] - }, - "use/settings", - "use/billing" - ] - }, - { - "group": "Self Hosting", - "pages": [ - "introduction", - "quickstart", - { - "group": "Install", - "pages": [ - "installation/development", - "installation/docker", - "installation/docker-compose", - "installation/kubernetes-helm" - ] - }, - { - "group": "Configuration", - "pages": [ - "configuration/reference" - ] - }, - "howitworks", - "emails", - "github", - { - "group": "Providers", - "pages": [ - "providers/x/x", - "providers/linkedin/linkedin", - "providers/reddit/reddit", - "providers/articles" - ] - }, - "support" - ] - }, - { - "group": "Developer Guide", - "pages": [ - "developer-guide/how-to-add-provider" - ] - } - ], - "footerSocials": { - "twitter": "https://twitter.com/nevodavid", - "github": "https://github.com/gitroomhq/postiz-app", - "linkedin": "https://www.linkedin.com/nevodavid" - } -} diff --git a/apps/docs/openapi.json b/apps/docs/openapi.json deleted file mode 100644 index 81ddedfb7..000000000 --- a/apps/docs/openapi.json +++ /dev/null @@ -1 +0,0 @@ -{"openapi":"3.0.0","paths":{"/stripe":{"post":{"operationId":"StripeController_stripe","parameters":[],"responses":{"201":{"description":""}},"tags":["Stripe"]}},"/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgUserDto"}}}},"responses":{"201":{"description":""}},"tags":["Auth"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginUserDto"}}}},"responses":{"201":{"description":""}},"tags":["Auth"]}},"/auth/forgot":{"post":{"operationId":"AuthController_forgot","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"201":{"description":""}},"tags":["Auth"]}},"/auth/forgot-return":{"post":{"operationId":"AuthController_forgotReturn","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotReturnPasswordDto"}}}},"responses":{"201":{"description":""}},"tags":["Auth"]}},"/user/self":{"get":{"operationId":"UsersController_getSelf","parameters":[],"responses":{"200":{"description":""}},"tags":["User"]}},"/user/subscription":{"get":{"operationId":"UsersController_getSubscription","parameters":[],"responses":{"200":{"description":""}},"tags":["User"]}},"/user/subscription/tiers":{"get":{"operationId":"UsersController_tiers","parameters":[],"responses":{"200":{"description":""}},"tags":["User"]}},"/user/join-org":{"post":{"operationId":"UsersController_joinOrg","parameters":[],"responses":{"201":{"description":""}},"tags":["User"]}},"/user/organizations":{"get":{"operationId":"UsersController_getOrgs","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["User"]}},"/user/change-org":{"post":{"operationId":"UsersController_changeOrg","parameters":[],"responses":{"201":{"description":""}},"tags":["User"]}},"/analytics":{"get":{"operationId":"AnalyticsController_getStars","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["Analytics"]}},"/analytics/trending":{"get":{"operationId":"AnalyticsController_getTrending","parameters":[],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/analytics/stars":{"post":{"operationId":"AnalyticsController_getStarsFilter","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarsListDto"}}}},"responses":{"201":{"description":""}},"tags":["Analytics"]}},"/integrations":{"get":{"operationId":"IntegrationsController_getIntegration","parameters":[],"responses":{"200":{"description":""}},"tags":["Integrations"]},"delete":{"operationId":"IntegrationsController_deleteChannel","parameters":[],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/integrations/list":{"get":{"operationId":"IntegrationsController_getIntegrationList","parameters":[],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/integrations/social/{integration}":{"get":{"operationId":"IntegrationsController_getIntegrationUrl","parameters":[{"name":"integration","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/integrations/function":{"post":{"operationId":"IntegrationsController_functionIntegration","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationFunctionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Integrations"]}},"/integrations/article/{integration}/connect":{"post":{"operationId":"IntegrationsController_connectArticle","parameters":[{"name":"integration","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/integrations/social/{integration}/connect":{"post":{"operationId":"IntegrationsController_connectSocialMedia","parameters":[{"name":"integration","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectIntegrationDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/integrations/disable":{"post":{"operationId":"IntegrationsController_disableChannel","parameters":[],"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/integrations/enable":{"post":{"operationId":"IntegrationsController_enableChannel","parameters":[],"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/settings/github":{"get":{"operationId":"SettingsController_getConnectedGithubAccounts","parameters":[],"responses":{"200":{"description":""}},"tags":["Settings"]},"post":{"operationId":"SettingsController_addGitHub","parameters":[],"responses":{"201":{"description":""}},"tags":["Settings"]}},"/settings/github/url":{"get":{"operationId":"SettingsController_authUrl","parameters":[],"responses":{"200":{"description":""}},"tags":["Settings"]}},"/settings/organizations/{id}":{"get":{"operationId":"SettingsController_getOrganizations","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Settings"]},"post":{"operationId":"SettingsController_updateGitHubLogin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Settings"]}},"/settings/organizations/{id}/{github}":{"get":{"operationId":"SettingsController_getRepositories","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"github","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Settings"]}},"/settings/repository/{id}":{"delete":{"operationId":"SettingsController_deleteRepository","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Settings"]}},"/settings/team":{"get":{"operationId":"SettingsController_getTeam","parameters":[],"responses":{"200":{"description":""}},"tags":["Settings"]},"post":{"operationId":"SettingsController_inviteTeamMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTeamMemberDto"}}}},"responses":{"201":{"description":""}},"tags":["Settings"]}},"/settings/team/{id}":{"delete":{"operationId":"SettingsController_deleteTeamMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Settings"]}},"/posts":{"get":{"operationId":"PostsController_getPosts","parameters":[{"name":"week","required":true,"in":"query","schema":{"minimum":1,"maximum":52,"type":"number"}},{"name":"year","required":true,"in":"query","schema":{"minimum":2022,"maximum":2034,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Posts"]},"post":{"operationId":"PostsController_createPost","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostDto"}}}},"responses":{"201":{"description":""}},"tags":["Posts"]}},"/posts/predict-trending":{"get":{"operationId":"PostsController_predictTrending","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"tags":["Posts"]}},"/posts/old":{"get":{"operationId":"PostsController_oldPosts","parameters":[{"name":"date","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Posts"]}},"/posts/{id}":{"get":{"operationId":"PostsController_getPost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Posts"]}},"/posts/{group}":{"delete":{"operationId":"PostsController_deletePost","parameters":[{"name":"group","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Posts"]}},"/posts/{id}/date":{"put":{"operationId":"PostsController_changeDate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Posts"]}},"/media":{"post":{"operationId":"MediaController_uploadFile","parameters":[],"responses":{"201":{"description":""}},"tags":["Media"]},"get":{"operationId":"MediaController_getMedia","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Media"]}},"/comments":{"post":{"operationId":"CommentsController_addComment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentDto"}}}},"responses":{"201":{"description":""}},"tags":["Comments"]}},"/comments/{id}":{"post":{"operationId":"CommentsController_addCommentTocComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentDto"}}}},"responses":{"201":{"description":""}},"tags":["Comments"]},"put":{"operationId":"CommentsController_editComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentDto"}}}},"responses":{"200":{"description":""}},"tags":["Comments"]},"delete":{"operationId":"CommentsController_deleteComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Comments"]}},"/comments/{date}":{"get":{"operationId":"CommentsController_loadAllCommentsAndSubCommentsForADate","parameters":[{"name":"date","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Comments"]}},"/billing/check/{id}":{"get":{"operationId":"BillingController_checkId","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Billing"]}},"/billing/subscribe":{"post":{"operationId":"BillingController_subscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSubscribeDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["Billing"]}},"/billing/portal":{"get":{"operationId":"BillingController_modifyPayment","parameters":[],"responses":{"200":{"description":""}},"tags":["Billing"]}},"/billing":{"get":{"operationId":"BillingController_getCurrentBilling","parameters":[],"responses":{"200":{"description":""}},"tags":["Billing"]}},"/billing/cancel":{"post":{"operationId":"BillingController_cancel","parameters":[],"responses":{"201":{"description":""}},"tags":["Billing"]}},"/billing/prorate":{"post":{"operationId":"BillingController_prorate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSubscribeDto"}}}},"responses":{"201":{"description":""}},"tags":["Billing"]}},"/notifications":{"get":{"operationId":"NotificationsController_mainPageList","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/notifications/list":{"get":{"operationId":"NotificationsController_notifications","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}}},"info":{"title":"Gitroom Swagger file","description":"API description","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"schemas":{"CreateOrgUserDto":{"type":"object","properties":{"password":{"type":"string","minLength":3},"provider":{"type":"object"},"providerToken":{"type":"string"},"email":{"type":"string"},"company":{"type":"string","minLength":3}},"required":["password","provider","providerToken","email","company"]},"LoginUserDto":{"type":"object","properties":{"password":{"type":"string","minLength":3},"provider":{"type":"object"},"providerToken":{"type":"string"},"email":{"type":"string"}},"required":["password","provider","providerToken","email"]},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},"ForgotReturnPasswordDto":{"type":"object","properties":{"password":{"type":"string","minLength":3},"repeatPassword":{"type":"string","enum":["zxKvwYYHO7"]},"token":{"type":"string","minLength":5}},"required":["password","repeatPassword","token"]},"StarsListDto":{"type":"object","properties":{"page":{"type":"number"},"key":{"type":"string","enum":["login","totalStars","stars","date","forks","totalForks"]},"state":{"type":"string","enum":["desc","asc"]}},"required":["page","key","state"]},"IntegrationFunctionDto":{"type":"object","properties":{"name":{"type":"string"},"id":{"type":"string"},"data":{"type":"object"}},"required":["name","id","data"]},"ApiKeyDto":{"type":"object","properties":{"api":{"type":"string","minLength":4}},"required":["api"]},"ConnectIntegrationDto":{"type":"object","properties":{"state":{"type":"string"},"code":{"type":"string"}},"required":["state","code"]},"AddTeamMemberDto":{"type":"object","properties":{"email":{"type":"string"},"role":{"type":"string","enum":["USER","ADMIN"]},"sendEmail":{"type":"boolean"}},"required":["email","role","sendEmail"]},"Integration":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"MediaDto":{"type":"object","properties":{"id":{"type":"string"},"path":{"type":"string"}},"required":["id","path"]},"PostContent":{"type":"object","properties":{"content":{"type":"string","minLength":6},"id":{"type":"string"},"image":{"type":"array","items":{"$ref":"#/components/schemas/MediaDto"}}},"required":["content","id","image"]},"Post":{"type":"object","properties":{"integration":{"$ref":"#/components/schemas/Integration"},"value":{"type":"array","items":{"$ref":"#/components/schemas/PostContent"}},"group":{"type":"string"},"settings":{"type":"object"}},"required":["integration","value","group","settings"]},"CreatePostDto":{"type":"object","properties":{"type":{"type":"string","enum":["draft","schedule","now"]},"date":{"type":"string"},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}},"required":["type","date","posts"]},"AddCommentDto":{"type":"object","properties":{"content":{"type":"string"},"date":{"type":"string"}},"required":["content","date"]},"BillingSubscribeDto":{"type":"object","properties":{"total":{"type":"number","minimum":1,"maximum":60},"period":{"type":"string","enum":["MONTHLY","YEARLY"]},"billing":{"type":"string","enum":["STANDARD","PRO"]}},"required":["total","period","billing"]}}}} \ No newline at end of file diff --git a/apps/docs/project.json b/apps/docs/project.json deleted file mode 100644 index ff5e925ee..000000000 --- a/apps/docs/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "docs", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/docs", - "projectType": "application", - "targets": { - "build": { - "command": "node apps/docs/generate-refrences.js", - "options": { - "type": "module" - } - }, - "serve": { - "command": "cd apps/docs && npx mintlify dev", - "options": { - "type": "module" - } - } - }, - "tags": [] -} diff --git a/apps/docs/providers/articles.mdx b/apps/docs/providers/articles.mdx deleted file mode 100644 index 3642734c2..000000000 --- a/apps/docs/providers/articles.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Publishing platforms -description: How to add a new publishing platform Gitroom ---- - -Publishing platforms such as DEV, Hashnode, and Medium don't require any special setup. \ No newline at end of file diff --git a/apps/docs/providers/linkedin/linkedin.mdx b/apps/docs/providers/linkedin/linkedin.mdx deleted file mode 100644 index 0bba5cb98..000000000 --- a/apps/docs/providers/linkedin/linkedin.mdx +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Linkedin -description: How to add Linkedin to your system ---- - -Head over to [Linkedin developers](https://www.linkedin.com/developers/apps) and create a new app. -![Linkedin](/images/providers/linkedin/linkedin-001.png) - -Fill in all the details, once created head over to Products and make sure you add all the required products. -![Linkedin](/images/providers/linkedin/linkedin-002.png) - -It is important to have the special permissions or you will not have the ability to refresh your tokens. - -Make sure your redirect URL is set to `http://localhost:4200/integrations/social/linkedin` for local development. -Copy the created `Client ID` and `Client Secret` and add them to your `.env` file. - -```env -LINKEDIN_CLIENT_ID="" -LINKEDIN_CLIENT_SECRET="" -``` diff --git a/apps/docs/providers/reddit/reddit.mdx b/apps/docs/providers/reddit/reddit.mdx deleted file mode 100644 index 950818499..000000000 --- a/apps/docs/providers/reddit/reddit.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Reddit -description: How to add Reddit to your system ---- - -Head over to [Reddit developers](https://www.reddit.com/prefs/apps) and create a new app. -In the type of app, select `web app` and in the redirect uri, add `http://localhost:4200/integrations/social/reddit`. - -Copy the Reddit client id and client secret and add them to your `.env` file. - -![Reddit](/images/providers/reddit/reddit-001.png) - -```env -REDDIT_CLIENT_ID="" -REDDIT_CLIENT_SECRET="" -``` \ No newline at end of file diff --git a/apps/docs/providers/x/x.mdx b/apps/docs/providers/x/x.mdx deleted file mode 100644 index f9f75d46e..000000000 --- a/apps/docs/providers/x/x.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: X -description: How to add X to your system ---- - -X is a bit different.
-They created an oAuth2 flow, but it works only with Twitter v2 API.
-But in order to upload pictures to X, you need to use the old Twitter v1 API.
-So we are going to use the normal oAuth1 flow for that (that supports Twitter v2 also 🤷🏻‍).

- -Head over the [Twitter developers page](https://developer.twitter.com/en/portal/dashboard) and create a new app.
-Click to sign-up for a new free account - -![X](/images/providers/x/x-001.png) - -Click to edit the application settings -![X](/images/providers/x/x-002.png) - -The click to set up an authentication flow -![X](/images/providers/x/x-003.png) - -In the App Permission set it to `Read and Write` -In the Type of App set it to `Web App, Automated App or Bot` -In the App Info set the `Callback URI / Redirect URL` to `http://localhost:4200/integrations/social/x` -Save it and go to "Keys and Tokens" tab - -Click on "Regenerate" inside "Consumer Keys" and copy the `API Key` and `API Key Secret`. -Open .env file and add the following: - -```env -X_API_KEY="" -X_API_SECRET="" -``` \ No newline at end of file diff --git a/apps/docs/quickstart.mdx b/apps/docs/quickstart.mdx deleted file mode 100644 index c2d7f3e16..000000000 --- a/apps/docs/quickstart.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 'Quickstart' ---- - -At the moment it is necessary to build the project locally - some dependencies -like redis and postgres can run as docker containers, but there is no docker -container for Postiz just yet. - -## Self Hosted installation options - -You can choose between the following installation options; - -* [Development](/installation/development) - The only installation option that is offically supported at the moment. -* [Docker (standalone)](/installation/docker) - Run from the command line with Docker. -* [Docker Compose](/installation/docker-compose) - Run with Docker Compose. -* [Helm](/installation/kubernetes-helm) - Run with Kubernetes + Helm. - - diff --git a/apps/docs/snippets/docker-envvar-apps.mdx b/apps/docs/snippets/docker-envvar-apps.mdx deleted file mode 100644 index 314aeaa50..000000000 --- a/apps/docs/snippets/docker-envvar-apps.mdx +++ /dev/null @@ -1,10 +0,0 @@ -## Controlling container services -When the environment variable `POSTIZ_APPS` is not set, or is set to an empty string, all -services will be started in a single container. This is normally fine for small, personal deployments. - -However, you can only start specific services within the docker container by changing this environement variable. - -If you need to scale, you can experiement with having multiple containers defined like; -- Frontend only: `POSTIZ_APPS="frontend"` -- Backend only: `POSTIZ_APPS="backend"` -- Worker and Cron only: `POSTIZ_APPS="worker cron"` diff --git a/apps/docs/snippets/docker-envvar-general.mdx b/apps/docs/snippets/docker-envvar-general.mdx deleted file mode 100644 index cf1a09714..000000000 --- a/apps/docs/snippets/docker-envvar-general.mdx +++ /dev/null @@ -1,15 +0,0 @@ -# Set environment variables - -Postiz configuration is entirely via environment variables. - -When using Postiz container images, you can specify the environment variables when you create the container (`docker create -e DATABASE_URL=...`), but this might be -a bit tedious, as Postiz requires quite a few variables set to startup. - -It is recommended to use a `postiz.env` file, which the Postiz containers look for in /config. Docker will automatically create this file for you on a -docker volume the first time you start up Postiz. The default container images will copy the `/config/postiz.env` to `/apps/.env` on startup. Like with -any environment variables, if you change them, you must restart the application for the changes to take effect. - -An example file of the most used configuration settings can be found here; [example postiz.env file](https://raw.githubusercontent.com/gitroomhq/postiz-app/main/.env.example) - -There is also a [configuration reference](/configuration/reference) page that goes into more detail. - diff --git a/apps/docs/snippets/earlydoc.mdx b/apps/docs/snippets/earlydoc.mdx deleted file mode 100644 index c6ef810ff..000000000 --- a/apps/docs/snippets/earlydoc.mdx +++ /dev/null @@ -1,6 +0,0 @@ - - **NOTE:** This page is marked "earlydoc", or "early documentation", which means it might - be brief, or contain information about parts of the app that are under heavy development. - If you encounter issues with instructions found here, please check out the [support](/support) - page for options. - diff --git a/apps/docs/snippets/snippet-example.mdx b/apps/docs/snippets/snippet-example.mdx deleted file mode 100644 index 089334c54..000000000 --- a/apps/docs/snippets/snippet-example.mdx +++ /dev/null @@ -1,3 +0,0 @@ -## My Snippet - -This is an example of a reusable snippet diff --git a/apps/docs/support.mdx b/apps/docs/support.mdx deleted file mode 100644 index 837f6c860..000000000 --- a/apps/docs/support.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Support ---- - -Sometimes, things can go wrong, or you need some help! - -Note that the Self Hosted version of Postiz is supported by the community in their -free time, on a best-efforts basis. Please post your question and be patient. - -- [Discord](https://discord.com/invite/sf7QjTcX37) - Flexible chat, with screenshots and screen sharing, probably the best option for support. -- [GitHub issue](https://github.com/gitroomhq/postiz-app/issues/new/choose) - backup option if you are unable to use Discord. - -## How to effectively ask for support - -Try to follow this guide when asking for support, in this order; **Goal, Environment, Changes, Results**. - -- **Goal:** Start off by explaining what you were trying to do - - _I want to schedule a post on Reddit at 6pm_ - - _I want to run in a Linux container on a Raspberry Pi_ - - _I want to use a custom domain name_ - -- **Environment:** - Share the relevant parts about your environment. Web App issues; Are you using Firefox, Chrome, etc? Installation/Other issues; a Mac, Linux, Windows, how did you install? - - _I'm using Firefox on Windows 10_ - - _I'm using a Raspberry Pi 4 with Ubuntu 20.04, and Node version 18_ - - _This is a new installation on a Mac_ - -- **Changed:** - Most likely something has changed, what is it? - - _I updated my browser to the latest version and now ..._ - - _I found a change in the latest version and now ..._ - - _I think this used to work, but now..._ - -- **Results:** - What happened? What did you expect to happen? - - _I see a blank screen_ - - _I see an error message_ - - _I see a 404 page_ diff --git a/apps/docs/use/analytics.mdx b/apps/docs/use/analytics.mdx deleted file mode 100644 index af6cbcaad..000000000 --- a/apps/docs/use/analytics.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Analytics ---- - -![Analytics](/images/screens/analytics.png) - -**The analytics page allows you to:** -- Monitor the amount of stars you get every day -- Let you know when was the last GitHub trending feed refresh and when the next one will be -- Cross-reference between the number of stars you got and the launch that caused it \ No newline at end of file diff --git a/apps/docs/use/billing.mdx b/apps/docs/use/billing.mdx deleted file mode 100644 index 78da82cbe..000000000 --- a/apps/docs/use/billing.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Billing ---- - -![Billing](/images/screens/billing.png) - -**The settings page allows you to:** -- Add GitHub repositories you would like to track in the analytics page. -- [PRO Tier / Self-hosted] Invite team members to your organization to collaborate with you. \ No newline at end of file diff --git a/apps/docs/use/calendar.mdx b/apps/docs/use/calendar.mdx deleted file mode 100644 index b8f95864c..000000000 --- a/apps/docs/use/calendar.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Calendar ---- - - diff --git a/apps/docs/use/scheduling.mdx b/apps/docs/use/scheduling.mdx deleted file mode 100644 index 8ebe675ea..000000000 --- a/apps/docs/use/scheduling.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Scheduling ---- - - diff --git a/apps/docs/use/settings.mdx b/apps/docs/use/settings.mdx deleted file mode 100644 index ca6b74a0a..000000000 --- a/apps/docs/use/settings.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Settings ---- - -![Settings](/images/screens/settings.png) - -**The settings page allows you to:** -- Add GitHub repositories you would like to track in the analytics page -- [PRO Tier / Self-hosted] Invite team members to your organization to collaborate with you \ No newline at end of file diff --git a/apps/frontend/next.config.js b/apps/frontend/next.config.js index 3df2713a9..34d130dae 100644 --- a/apps/frontend/next.config.js +++ b/apps/frontend/next.config.js @@ -20,12 +20,7 @@ const nextConfig = { hostname: '**', }, ], - }, - env: { - isBillingEnabled: String(!!process.env.STRIPE_PUBLISHABLE_KEY), - isGeneral: String(!!process.env.IS_GENERAL), - frontendUrl: String(process.env.FRONTEND_URL), - }, + } }; const plugins = [ diff --git a/apps/frontend/src/app/(site)/analytics/page.tsx b/apps/frontend/src/app/(site)/analytics/page.tsx index ac1170786..951f8bdb5 100644 --- a/apps/frontend/src/app/(site)/analytics/page.tsx +++ b/apps/frontend/src/app/(site)/analytics/page.tsx @@ -1,20 +1,19 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; - export const dynamic = 'force-dynamic'; import { AnalyticsComponent } from '@gitroom/frontend/components/analytics/analytics.component'; import { Metadata } from 'next'; import { PlatformAnalytics } from '@gitroom/frontend/components/platform-analytics/platform.analytics'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Analytics`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Analytics`, description: '', }; export default async function Index() { return ( <> - {isGeneral() ? : } + {isGeneralServerSide() ? : } ); } diff --git a/apps/frontend/src/app/(site)/billing/lifetime/page.tsx b/apps/frontend/src/app/(site)/billing/lifetime/page.tsx index 8df7e8298..916731df3 100644 --- a/apps/frontend/src/app/(site)/billing/lifetime/page.tsx +++ b/apps/frontend/src/app/(site)/billing/lifetime/page.tsx @@ -3,10 +3,10 @@ import { LifetimeDeal } from '@gitroom/frontend/components/billing/lifetime.deal export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Lifetime deal`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Lifetime deal`, description: '', }; diff --git a/apps/frontend/src/app/(site)/billing/page.tsx b/apps/frontend/src/app/(site)/billing/page.tsx index d7a9722c7..77bfcf7ef 100644 --- a/apps/frontend/src/app/(site)/billing/page.tsx +++ b/apps/frontend/src/app/(site)/billing/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import { BillingComponent } from '@gitroom/frontend/components/billing/billing.component'; import { Metadata } from 'next'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Billing`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Billing`, description: '', }; diff --git a/apps/frontend/src/app/(site)/integrations/social/[provider]/continue/page.tsx b/apps/frontend/src/app/(site)/integrations/social/[provider]/continue/page.tsx new file mode 100644 index 000000000..bead77f84 --- /dev/null +++ b/apps/frontend/src/app/(site)/integrations/social/[provider]/continue/page.tsx @@ -0,0 +1,40 @@ +import { HttpStatusCode } from 'axios'; + +export const dynamic = 'force-dynamic'; + +import { internalFetch } from '@gitroom/helpers/utils/internal.fetch'; +import { redirect } from 'next/navigation'; + +export default async function Page({ + params: { provider }, + searchParams, +}: { + params: { provider: string }; + searchParams: any; +}) { + if (provider === 'x') { + searchParams = { + ...searchParams, + state: searchParams.oauth_token || '', + code: searchParams.oauth_verifier || '', + refresh: searchParams.refresh || '', + }; + } + + const data = await internalFetch(`/integrations/social/${provider}/connect`, { + method: 'POST', + body: JSON.stringify(searchParams), + }); + + if (data.status === HttpStatusCode.NotAcceptable) { + return redirect(`/launches?scope=missing`); + } + + const { inBetweenSteps, id } = await data.json(); + + if (inBetweenSteps && !searchParams.refresh) { + return redirect(`/launches?added=${provider}&continue=${id}`); + } + + return redirect(`/launches?added=${provider}`); +} diff --git a/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx b/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx index bead77f84..f8f178733 100644 --- a/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx +++ b/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx @@ -1,10 +1,7 @@ -import { HttpStatusCode } from 'axios'; +import { IntegrationRedirectComponent } from '@gitroom/frontend/components/launches/integration.redirect.component'; export const dynamic = 'force-dynamic'; -import { internalFetch } from '@gitroom/helpers/utils/internal.fetch'; -import { redirect } from 'next/navigation'; - export default async function Page({ params: { provider }, searchParams, @@ -12,29 +9,5 @@ export default async function Page({ params: { provider: string }; searchParams: any; }) { - if (provider === 'x') { - searchParams = { - ...searchParams, - state: searchParams.oauth_token || '', - code: searchParams.oauth_verifier || '', - refresh: searchParams.refresh || '', - }; - } - - const data = await internalFetch(`/integrations/social/${provider}/connect`, { - method: 'POST', - body: JSON.stringify(searchParams), - }); - - if (data.status === HttpStatusCode.NotAcceptable) { - return redirect(`/launches?scope=missing`); - } - - const { inBetweenSteps, id } = await data.json(); - - if (inBetweenSteps && !searchParams.refresh) { - return redirect(`/launches?added=${provider}&continue=${id}`); - } - - return redirect(`/launches?added=${provider}`); + return ; } diff --git a/apps/frontend/src/app/(site)/integrations/social/layout.tsx b/apps/frontend/src/app/(site)/integrations/social/layout.tsx new file mode 100644 index 000000000..39b812649 --- /dev/null +++ b/apps/frontend/src/app/(site)/integrations/social/layout.tsx @@ -0,0 +1,13 @@ +import { ReactNode } from 'react'; + +export default async function IntegrationLayout({ + children, +}: { + children: ReactNode; +}) { + return ( +
+ Adding channel, Redirecting You{children} +
+ ); +} diff --git a/apps/frontend/src/app/(site)/launches/page.tsx b/apps/frontend/src/app/(site)/launches/page.tsx index 82e367642..544fbab00 100644 --- a/apps/frontend/src/app/(site)/launches/page.tsx +++ b/apps/frontend/src/app/(site)/launches/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import {LaunchesComponent} from "@gitroom/frontend/components/launches/launches.component"; import {Metadata} from "next"; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz Calendar' : 'Gitroom Launches'}`, + title: `${isGeneralServerSide() ? 'Postiz Calendar' : 'Gitroom Launches'}`, description: '', } diff --git a/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx b/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx index a67c2404b..b02c4dd6d 100644 --- a/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx @@ -2,10 +2,10 @@ import { Buyer } from '@gitroom/frontend/components/marketplace/buyer'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/marketplace/page.tsx b/apps/frontend/src/app/(site)/marketplace/page.tsx index f6d3302a6..6f10ab0a1 100644 --- a/apps/frontend/src/app/(site)/marketplace/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/marketplace/seller/page.tsx b/apps/frontend/src/app/(site)/marketplace/seller/page.tsx index dee662a47..a57763602 100644 --- a/apps/frontend/src/app/(site)/marketplace/seller/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/seller/page.tsx @@ -2,10 +2,10 @@ import { Seller } from '@gitroom/frontend/components/marketplace/seller'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/messages/[id]/page.tsx b/apps/frontend/src/app/(site)/messages/[id]/page.tsx index a416877df..9c78f7378 100644 --- a/apps/frontend/src/app/(site)/messages/[id]/page.tsx +++ b/apps/frontend/src/app/(site)/messages/[id]/page.tsx @@ -3,10 +3,10 @@ import { Messages } from '@gitroom/frontend/components/messages/messages'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Messages`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Messages`, description: '', }; diff --git a/apps/frontend/src/app/(site)/messages/page.tsx b/apps/frontend/src/app/(site)/messages/page.tsx index 626b781e9..70da5af70 100644 --- a/apps/frontend/src/app/(site)/messages/page.tsx +++ b/apps/frontend/src/app/(site)/messages/page.tsx @@ -1,11 +1,11 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import {Metadata} from "next"; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Messages`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Messages`, description: '', } diff --git a/apps/frontend/src/app/(site)/settings/page.tsx b/apps/frontend/src/app/(site)/settings/page.tsx index 6979dfd2a..ba9acb8e0 100644 --- a/apps/frontend/src/app/(site)/settings/page.tsx +++ b/apps/frontend/src/app/(site)/settings/page.tsx @@ -1,5 +1,3 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; - export const dynamic = 'force-dynamic'; import { SettingsComponent } from '@gitroom/frontend/components/settings/settings.component'; @@ -7,9 +5,10 @@ import { internalFetch } from '@gitroom/helpers/utils/internal.fetch'; import { redirect } from 'next/navigation'; import { RedirectType } from 'next/dist/client/components/redirect'; import { Metadata } from 'next'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Settings`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Settings`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/auth/activate/[code]/page.tsx b/apps/frontend/src/app/auth/activate/[code]/page.tsx index fb02d53ac..ee6613c52 100644 --- a/apps/frontend/src/app/auth/activate/[code]/page.tsx +++ b/apps/frontend/src/app/auth/activate/[code]/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; import { AfterActivate } from '@gitroom/frontend/components/auth/after.activate'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} - Activate your account`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} - Activate your account`, description: '', }; diff --git a/apps/frontend/src/app/auth/activate/page.tsx b/apps/frontend/src/app/auth/activate/page.tsx index 607b709df..6cfe66090 100644 --- a/apps/frontend/src/app/auth/activate/page.tsx +++ b/apps/frontend/src/app/auth/activate/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import {Metadata} from "next"; import { Activate } from '@gitroom/frontend/components/auth/activate'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} - Activate your account`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} - Activate your account`, description: '', }; diff --git a/apps/frontend/src/app/auth/forgot/[token]/page.tsx b/apps/frontend/src/app/auth/forgot/[token]/page.tsx index 44f4ddd5e..fc6e3e3f0 100644 --- a/apps/frontend/src/app/auth/forgot/[token]/page.tsx +++ b/apps/frontend/src/app/auth/forgot/[token]/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import { ForgotReturn } from '@gitroom/frontend/components/auth/forgot-return'; import { Metadata } from 'next'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Forgot Password`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Forgot Password`, description: '', }; export default async function Auth(params: { params: { token: string } }) { diff --git a/apps/frontend/src/app/auth/forgot/page.tsx b/apps/frontend/src/app/auth/forgot/page.tsx index 8518e18e9..79a533624 100644 --- a/apps/frontend/src/app/auth/forgot/page.tsx +++ b/apps/frontend/src/app/auth/forgot/page.tsx @@ -1,12 +1,12 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; import {Forgot} from "@gitroom/frontend/components/auth/forgot"; import {Metadata} from "next"; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Forgot Password`, + title: `${isGeneralServerSide() ? 'Postiz' : 'Gitroom'} Forgot Password`, description: '', }; diff --git a/apps/frontend/src/app/auth/layout.tsx b/apps/frontend/src/app/auth/layout.tsx index dc005197a..140822865 100644 --- a/apps/frontend/src/app/auth/layout.tsx +++ b/apps/frontend/src/app/auth/layout.tsx @@ -1,11 +1,10 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; - export const dynamic = 'force-dynamic'; import { ReactNode } from 'react'; import Image from 'next/image'; import clsx from 'clsx'; import loadDynamic from 'next/dynamic'; +import { isGeneralServerSide } from '@gitroom/helpers/utils/is.general.server.side'; const ReturnUrlComponent = loadDynamic(() => import('./return.url.component')); export default async function AuthLayout({ @@ -22,15 +21,15 @@ export default async function AuthLayout({
Logo
- {isGeneral() ? ( + {isGeneralServerSide() ? ( - - {children} - + + + {children} + + ); diff --git a/apps/frontend/src/components/auth/login.tsx b/apps/frontend/src/components/auth/login.tsx index 741027f54..9810e5d6a 100644 --- a/apps/frontend/src/components/auth/login.tsx +++ b/apps/frontend/src/components/auth/login.tsx @@ -10,8 +10,8 @@ import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto'; import { GithubProvider } from '@gitroom/frontend/components/auth/providers/github.provider'; import interClass from '@gitroom/react/helpers/inter.font'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; import { GoogleProvider } from '@gitroom/frontend/components/auth/providers/google.provider'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; type Inputs = { email: string; @@ -22,6 +22,7 @@ type Inputs = { export function Login() { const [loading, setLoading] = useState(false); + const {isGeneral} = useVariables(); const resolver = useMemo(() => { return classValidatorResolver(LoginUserDto); }, []); @@ -61,7 +62,7 @@ export function Login() {
- {!isGeneral() ? : } + {!isGeneral ? : }
= async (data) => { setLoading(true); - const register = await fetchData('/auth/register', { + + await fetchData('/auth/register', { method: 'POST', body: JSON.stringify({ ...data }), - }); - if (register.status === 400) { - form.setError('email', { - message: 'Email already exists', - }); - + }).then((response) => { setLoading(false); - } - - fireEvents('register'); - if (register.headers.get('activate')) { - router.push('/auth/activate'); - } + if (response.status === 200) { + fireEvents('register') + + if (response.headers.get('activate') === "true") { + router.push('/auth/activate'); + } else { + router.push('/auth/login'); + } + } else { + form.setError('email', { + message: getHelpfulReasonForRegistrationFailure(response.status), + }); + } + }).catch(e => { + form.setError("email", { + message: 'General error: ' + e.toString() + '. Please check your browser console.', + }); + }) }; - const rootDomain = useMemo(() => { - const url = new URL(process.env.frontendUrl!); - const hostname = url.hostname; - const parts = hostname.split('.'); - if (parts.length > 2) { - return url.protocol + '//' + url.hostname?.replace(/^[^.]+\./, ''); - } - - return process.env.frontendUrl; - }, []); - return (
@@ -135,7 +143,7 @@ export function RegisterAfter({ Sign Up
- {!isAfterProvider && (!isGeneral() ? : )} + {!isAfterProvider && (!isGeneral ? : )} {!isAfterProvider && (
@@ -175,14 +183,14 @@ export function RegisterAfter({
By registering you agree to our{' '} Terms of Service {' '} and{' '} Privacy Policy diff --git a/apps/frontend/src/components/billing/faq.component.tsx b/apps/frontend/src/components/billing/faq.component.tsx index ea15fad58..972315477 100644 --- a/apps/frontend/src/components/billing/faq.component.tsx +++ b/apps/frontend/src/components/billing/faq.component.tsx @@ -1,30 +1,35 @@ +'use client'; + import { FC, useCallback, useState } from 'react'; import clsx from 'clsx'; import interClass from '@gitroom/react/helpers/inter.font'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; -const list = [ - { - title: `Can I trust ${isGeneral() ? 'Postiz' : 'Gitroom'}?`, - description: `${isGeneral() ? 'Postiz' : 'Gitroom'} is proudly open-source! We believe in an ethical and transparent culture, meaning Postiz will live forever. You can check the entire code / or use it for your personal use. You can check the open-source repository click here.`, - }, - { - title: 'What are channels?', - description: `${ - isGeneral() ? 'Postiz' : 'Gitroom' - } allows you to schedule your posts between different channels. +const useFaqList = () => { + const {isGeneral} = useVariables(); + return [ + { + title: `Can I trust ${isGeneral ? 'Postiz' : 'Gitroom'}?`, + description: `${isGeneral ? 'Postiz' : 'Gitroom'} is proudly open-source! We believe in an ethical and transparent culture, meaning Postiz will live forever. You can check the entire code / or use it for your personal use. You can check the open-source repository click here.`, + }, + { + title: 'What are channels?', + description: `${ + isGeneral ? 'Postiz' : 'Gitroom' + } allows you to schedule your posts between different channels. A channel is a publishing platform where you can schedule your posts. For example, you can schedule your posts on Twitter, Linkedin, DEV and Hashnode`, - }, - { - title: 'What are team members?', - description: `If you have a team with multiple members, you can invite them to your workspace to collaborate on your posts and add their personal channels`, - }, - { - title: 'What is AI auto-complete?', - description: `We automate ChatGPT to help you write your social posts and articles`, - }, -]; + }, + { + title: 'What are team members?', + description: `If you have a team with multiple members, you can invite them to your workspace to collaborate on your posts and add their personal channels`, + }, + { + title: 'What is AI auto-complete?', + description: `We automate ChatGPT to help you write your social posts and articles`, + }, + ]; +} export const FAQSection: FC<{ title: string; description: string }> = ( props @@ -98,6 +103,7 @@ export const FAQSection: FC<{ title: string; description: string }> = ( }; export const FAQComponent: FC = () => { + const list = useFaqList(); return (

diff --git a/apps/frontend/src/components/billing/main.billing.component.tsx b/apps/frontend/src/components/billing/main.billing.component.tsx index 9c7b466ad..dc55b7fd8 100644 --- a/apps/frontend/src/components/billing/main.billing.component.tsx +++ b/apps/frontend/src/components/billing/main.billing.component.tsx @@ -19,7 +19,7 @@ import { useSWRConfig } from 'swr'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import interClass from '@gitroom/react/helpers/inter.font'; import { useRouter } from 'next/navigation'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export interface Tiers { month: Array<{ @@ -153,6 +153,7 @@ export const MainBillingComponent: FC<{ sub?: Subscription; }> = (props) => { const { sub } = props; + const {isGeneral} = useVariables(); const { mutate } = useSWRConfig(); const fetch = useFetch(); const toast = useToaster(); @@ -329,7 +330,7 @@ export const MainBillingComponent: FC<{

{Object.entries(pricing) - .filter((f) => !isGeneral() || f[0] !== 'FREE') + .filter((f) => !isGeneral || f[0] !== 'FREE') .map(([name, values]) => (
- {isGeneral() && !subscription?.cancelAt && ( + {isGeneral && !subscription?.cancelAt && ( + +
+
Add Time Slot
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+ {times.map((timeSlot, index) => ( + +
{timeSlot.formatted}
+
+ X +
+
+ ))} +
+
+ +
+
+ ); +}; diff --git a/apps/frontend/src/components/layout/continue.provider.tsx b/apps/frontend/src/components/layout/continue.provider.tsx index 5e5b042cf..bc1e814e3 100644 --- a/apps/frontend/src/components/layout/continue.provider.tsx +++ b/apps/frontend/src/components/layout/continue.provider.tsx @@ -82,6 +82,7 @@ export const ContinueProvider: FC = () => { date: dayjs(), value: [], integration: { + time: [{time: 0}], id: continueId, type: '', name: '', diff --git a/apps/frontend/src/components/layout/layout.context.tsx b/apps/frontend/src/components/layout/layout.context.tsx index 451bd4085..9e75b9f28 100644 --- a/apps/frontend/src/components/layout/layout.context.tsx +++ b/apps/frontend/src/components/layout/layout.context.tsx @@ -5,6 +5,7 @@ import { FetchWrapperComponent } from '@gitroom/helpers/utils/custom.fetch'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import { isGeneral } from '@gitroom/react/helpers/is.general'; import { useReturnUrl } from '@gitroom/frontend/app/auth/return.url.component'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export default function LayoutContext(params: { children: ReactNode }) { if (params?.children) { @@ -16,6 +17,7 @@ export default function LayoutContext(params: { children: ReactNode }) { } function LayoutContextInner(params: { children: ReactNode }) { const returnUrl = useReturnUrl(); + const {backendUrl, isGeneral} = useVariables(); const afterRequest = useCallback( async (url: string, options: RequestInit, response: Response) => { @@ -32,7 +34,7 @@ function LayoutContextInner(params: { children: ReactNode }) { } if (response?.headers?.get('onboarding')) { - window.location.href = isGeneral() + window.location.href = isGeneral ? '/launches?onboarding=true' : '/analytics?onboarding=true'; @@ -70,7 +72,7 @@ function LayoutContextInner(params: { children: ReactNode }) { return ( {params?.children || <>} diff --git a/apps/frontend/src/components/layout/layout.settings.tsx b/apps/frontend/src/components/layout/layout.settings.tsx index 831b42b82..500befb79 100644 --- a/apps/frontend/src/components/layout/layout.settings.tsx +++ b/apps/frontend/src/components/layout/layout.settings.tsx @@ -25,12 +25,13 @@ import { SettingsComponent } from '@gitroom/frontend/components/layout/settings. import { Onboarding } from '@gitroom/frontend/components/onboarding/onboarding'; import { Support } from '@gitroom/frontend/components/layout/support'; import { ContinueProvider } from '@gitroom/frontend/components/layout/continue.provider'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; import { CopilotKit } from '@copilotkit/react-core'; import { Impersonate } from '@gitroom/frontend/components/layout/impersonate'; import clsx from 'clsx'; import { BillingComponent } from '@gitroom/frontend/components/billing/billing.component'; import dynamic from 'next/dynamic'; +import { NewSubscription } from '@gitroom/frontend/components/layout/new.subscription'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; const ModeComponent = dynamic( () => import('@gitroom/frontend/components/layout/mode.component'), { ssr: false } @@ -43,6 +44,8 @@ dayjs.extend(isBetween); export const LayoutSettings = ({ children }: { children: ReactNode }) => { const fetch = useFetch(); + const {isGeneral} = useVariables(); + const {backendUrl, billingEnabled} = useVariables(); const load = useCallback(async (path: string) => { return await (await fetch(path)).json(); }, []); @@ -61,7 +64,7 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => { @@ -70,7 +73,8 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => { - {(user.tier !== 'FREE' || !isGeneral() || process.env.isBillingEnabled === "false") && } + + {user.tier !== 'FREE' && }
@@ -82,7 +86,7 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => { >
Logo {
- {isGeneral() ? ( + {isGeneral ? ( { )}
- {user?.orgId && (user.tier !== 'FREE' || !isGeneral() || process.env.isBillingEnabled === "false") ? ( + {user?.orgId && (user.tier !== 'FREE' || !isGeneral || !billingEnabled) ? ( ) : (
@@ -137,7 +141,7 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => {
- {(user.tier === 'FREE' && isGeneral()) && process.env.isBillingEnabled === "true" ? ( + {(user.tier === 'FREE' && isGeneral) && billingEnabled ? ( <>

diff --git a/apps/frontend/src/components/layout/logout.component.tsx b/apps/frontend/src/components/layout/logout.component.tsx index 5ff59b787..03d49227c 100644 --- a/apps/frontend/src/components/layout/logout.component.tsx +++ b/apps/frontend/src/components/layout/logout.component.tsx @@ -1,10 +1,13 @@ -import { isGeneral } from '@gitroom/react/helpers/is.general'; +'use client'; + import { useCallback } from 'react'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export const LogoutComponent = () => { const fetch = useFetch(); + const {isGeneral} = useVariables(); const logout = useCallback(async () => { if (await deleteDialog('Are you sure you want to logout?', 'Yes logout')) { await fetch('/user/logout', { @@ -15,5 +18,5 @@ export const LogoutComponent = () => { } }, []); - return
Logout from {isGeneral() ? 'Postiz' : 'Gitroom'}
; + return
Logout from {isGeneral ? 'Postiz' : 'Gitroom'}
; }; diff --git a/apps/frontend/src/components/layout/new.subscription.tsx b/apps/frontend/src/components/layout/new.subscription.tsx new file mode 100644 index 000000000..52a812e8a --- /dev/null +++ b/apps/frontend/src/components/layout/new.subscription.tsx @@ -0,0 +1,17 @@ +import { useSearchParams } from 'next/navigation'; +import { useEffect } from 'react'; +import { useFireEvents } from '@gitroom/helpers/utils/use.fire.events'; + +export const NewSubscription = () =>{ + const query = useSearchParams(); + const fireEvents = useFireEvents(); + + useEffect(() => { + const check = query.get('check'); + if (check) { + fireEvents('purchase'); + } + }, [query]); + + return null; +} \ No newline at end of file diff --git a/apps/frontend/src/components/layout/settings.component.tsx b/apps/frontend/src/components/layout/settings.component.tsx index f14fdfd17..a0d8e817c 100644 --- a/apps/frontend/src/components/layout/settings.component.tsx +++ b/apps/frontend/src/components/layout/settings.component.tsx @@ -1,3 +1,5 @@ +'use client'; + import { useModals } from '@mantine/modals'; import React, { FC, Ref, useCallback, useEffect, useMemo } from 'react'; import { Input } from '@gitroom/react/form/input'; @@ -12,12 +14,13 @@ import { useToaster } from '@gitroom/react/toaster/toaster'; import { useSWRConfig } from 'swr'; import clsx from 'clsx'; import { TeamsComponent } from '@gitroom/frontend/components/settings/teams.component'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; import { useSearchParams } from 'next/navigation'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => { + const {isGeneral} = useVariables(); const { getRef } = props; const fetch = useFetch(); const toast = useToaster(); @@ -191,7 +194,7 @@ export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => {

)} - {!!user?.tier?.team_members && isGeneral() && } + {!!user?.tier?.team_members && isGeneral && } {showLogout && }
diff --git a/apps/frontend/src/components/layout/support.tsx b/apps/frontend/src/components/layout/support.tsx index ba8781aff..954443776 100644 --- a/apps/frontend/src/components/layout/support.tsx +++ b/apps/frontend/src/components/layout/support.tsx @@ -2,11 +2,13 @@ import { EventEmitter } from 'events'; import { useEffect, useState } from 'react'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export const supportEmitter = new EventEmitter(); export const Support = () => { const [show, setShow] = useState(true); + const {discordUrl} = useVariables(); useEffect(() => { supportEmitter.on('change', setShow); @@ -15,11 +17,11 @@ export const Support = () => { } }, []); - if (!process.env.NEXT_PUBLIC_DISCORD_SUPPORT || !show) return null + if (!discordUrl || !show) return null return (
window.open(process.env.NEXT_PUBLIC_DISCORD_SUPPORT)} + onClick={() => window.open(discordUrl)} >
{ const path = usePathname(); + const menuItems = useMenuItems(); const currentTitle = useMemo(() => { return menuItems.find(item => path.indexOf(item.path) > -1)?.name; }, [path]); diff --git a/apps/frontend/src/components/layout/top.menu.tsx b/apps/frontend/src/components/layout/top.menu.tsx index 216bc481a..52b3711b9 100644 --- a/apps/frontend/src/components/layout/top.menu.tsx +++ b/apps/frontend/src/components/layout/top.menu.tsx @@ -5,36 +5,36 @@ import Link from 'next/link'; import clsx from 'clsx'; import { usePathname } from 'next/navigation'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; -const general = isGeneral(); - -export const menuItems = [ - ...(!general - ? [ +export const useMenuItems = () => { + const {isGeneral} = useVariables(); + return [ + ...(!isGeneral + ? [ { name: 'Analytics', icon: 'analytics', path: '/analytics', }, ] - : []), - { - name: isGeneral() ? 'Calendar' : 'Launches', - icon: 'launches', - path: '/launches', - }, - ...(general - ? [ + : []), + { + name: isGeneral ? 'Calendar' : 'Launches', + icon: 'launches', + path: '/launches', + }, + ...(isGeneral + ? [ { name: 'Analytics', icon: 'analytics', path: '/analytics', }, ] - : []), - ...(!general - ? [ + : []), + ...(!isGeneral + ? [ { name: 'Settings', icon: 'settings', @@ -42,36 +42,39 @@ export const menuItems = [ role: ['ADMIN', 'SUPERADMIN'], }, ] - : []), - { - name: 'Marketplace', - icon: 'marketplace', - path: '/marketplace', - }, - { - name: 'Messages', - icon: 'messages', - path: '/messages', - }, - { - name: 'Billing', - icon: 'billing', - path: '/billing', - role: ['ADMIN', 'SUPERADMIN'], - requireBilling: true, - }, -]; + : []), + { + name: 'Marketplace', + icon: 'marketplace', + path: '/marketplace', + }, + { + name: 'Messages', + icon: 'messages', + path: '/messages', + }, + { + name: 'Billing', + icon: 'billing', + path: '/billing', + role: ['ADMIN', 'SUPERADMIN'], + requireBilling: true, + }, + ]; +} export const TopMenu: FC = () => { const path = usePathname(); const user = useUser(); + const {billingEnabled} = useVariables(); + const menuItems = useMenuItems(); return (
    {menuItems .filter((f) => { - if (f.requireBilling && process.env.isBillingEnabled === 'false') { + if (f.requireBilling && !billingEnabled) { return false; } if (f.role) { diff --git a/apps/frontend/src/components/onboarding/connect.channels.tsx b/apps/frontend/src/components/onboarding/connect.channels.tsx index de9a912c3..02987db89 100644 --- a/apps/frontend/src/components/onboarding/connect.channels.tsx +++ b/apps/frontend/src/components/onboarding/connect.channels.tsx @@ -1,3 +1,5 @@ +'use client'; + import React, { FC, useCallback, @@ -15,10 +17,11 @@ import Image from 'next/image'; import { Menu } from '@gitroom/frontend/components/launches/menu/menu'; import { ApiModal } from '@gitroom/frontend/components/launches/add.provider.component'; import { useRouter } from 'next/navigation'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { useVariables } from '@gitroom/react/helpers/variable.context'; export const ConnectChannels: FC = () => { const fetch = useFetch(); + const { isGeneral } = useVariables(); const router = useRouter(); const [identifier, setIdentifier] = useState(undefined); const [popup, setPopups] = useState(undefined); @@ -158,7 +161,7 @@ export const ConnectChannels: FC = () => { ))}
- {!isGeneral() && ( + {!isGeneral && (
Publishing Platforms
@@ -239,6 +242,7 @@ export const ConnectChannels: FC = () => { {integration.name}
{ }; const Welcome: FC = () => { const [seller, setSeller] = useState(false); - const [lastStep, setLastStep] = useState(isGeneral() ? 3 : 4); + const {isGeneral} = useVariables(); + const [lastStep, setLastStep] = useState(isGeneral ? 3 : 4); const [step, setStep] = useState(1); const ref = useRef(); const router = useRouter(); @@ -148,7 +148,7 @@ const Welcome: FC = () => { const sellPosts = useCallback(() => { nextStep()(); - setLastStep(isGeneral() ? 4 : 5); + setLastStep(isGeneral ? 4 : 5); setSeller(true); }, [step]); @@ -162,7 +162,7 @@ const Welcome: FC = () => {
- {!isGeneral() && ( + {!isGeneral && ( <> { )} - + {seller && ( <> @@ -204,7 +204,7 @@ const Welcome: FC = () => {
)} - {step === 2 && !isGeneral() && ( + {step === 2 && !isGeneral && (
@@ -213,7 +213,7 @@ const Welcome: FC = () => {
)} - {step === 3 - (isGeneral() ? 1 : 0) && ( + {step === 3 - (isGeneral ? 1 : 0) && (
@@ -222,7 +222,7 @@ const Welcome: FC = () => {
)} - {step === 4 - (isGeneral() ? 1 : 0) && ( + {step === 4 - (isGeneral ? 1 : 0) && (
success @@ -231,8 +231,8 @@ const Welcome: FC = () => { You are done, from here you can:
-
- {!isGeneral() && ( +
+ {!isGeneral && ( )} @@ -245,7 +245,7 @@ const Welcome: FC = () => {
)} - {step === 5 - (isGeneral() ? 1 : 0) && ( + {step === 5 - (isGeneral ? 1 : 0) && (
To sell posts you would have to:
    @@ -254,7 +254,7 @@ const Welcome: FC = () => {
- +
diff --git a/apps/frontend/src/components/settings/settings.component.tsx b/apps/frontend/src/components/settings/settings.component.tsx index 2ce482274..051604f12 100644 --- a/apps/frontend/src/components/settings/settings.component.tsx +++ b/apps/frontend/src/components/settings/settings.component.tsx @@ -8,11 +8,10 @@ import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import useSWR from 'swr'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; import { useRouter } from 'next/navigation'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; - -const general = isGeneral(); +import { useVariables } from '@gitroom/react/helpers/variable.context'; export const SettingsComponent = () => { + const {isGeneral} = useVariables(); const user = useUser(); const router = useRouter(); @@ -53,7 +52,7 @@ export const SettingsComponent = () => { return (
- {!general && ( + {!isGeneral && (

Your Git Repository

diff --git a/apps/frontend/src/middleware.ts b/apps/frontend/src/middleware.ts index 9a3a3cee6..3f7fe8ac6 100644 --- a/apps/frontend/src/middleware.ts +++ b/apps/frontend/src/middleware.ts @@ -1,8 +1,7 @@ import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; import { fetchBackend } from '@gitroom/helpers/utils/custom.fetch.func'; -import { removeSubdomain } from '@gitroom/helpers/subdomain/subdomain.management'; -import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { getCookieUrlFromDomain } from '@gitroom/helpers/subdomain/subdomain.management'; // This function can be marked `async` if using `await` inside export async function middleware(request: NextRequest) { @@ -20,8 +19,7 @@ export async function middleware(request: NextRequest) { httpOnly: true, secure: true, maxAge: -1, - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), }); return response; } @@ -31,9 +29,17 @@ export async function middleware(request: NextRequest) { if (nextUrl.href.indexOf('/auth') === -1 && !authCookie) { const providers = ['google', 'settings']; - const findIndex = providers.find(p => nextUrl.href.indexOf(p) > -1); - const additional = !findIndex ? '' : (url.indexOf('?') > -1 ? '&' : '?') + `provider=${(findIndex === 'settings' ? 'github' : findIndex).toUpperCase()}`; - return NextResponse.redirect(new URL(`/auth${url}${additional}`, nextUrl.href)); + const findIndex = providers.find((p) => nextUrl.href.indexOf(p) > -1); + const additional = !findIndex + ? '' + : (url.indexOf('?') > -1 ? '&' : '?') + + `provider=${(findIndex === 'settings' + ? 'github' + : findIndex + ).toUpperCase()}`; + return NextResponse.redirect( + new URL(`/auth${url}${additional}`, nextUrl.href) + ); } // If the url is /auth and the cookie exists, redirect to / @@ -50,8 +56,7 @@ export async function middleware(request: NextRequest) { httpOnly: true, secure: true, expires: new Date(Date.now() + 15 * 60 * 1000), - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), }); return redirect; } @@ -82,8 +87,7 @@ export async function middleware(request: NextRequest) { httpOnly: true, secure: true, expires: new Date(Date.now() + 15 * 60 * 1000), - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), }); } @@ -92,7 +96,10 @@ export async function middleware(request: NextRequest) { if (nextUrl.pathname === '/') { return NextResponse.redirect( - new URL(isGeneral() ? '/launches' : `/analytics`, nextUrl.href) + new URL( + !!process.env.IS_GENERAL ? '/launches' : `/analytics`, + nextUrl.href + ) ); } @@ -110,8 +117,7 @@ export async function middleware(request: NextRequest) { httpOnly: true, secure: true, expires: new Date(Date.now() + 15 * 60 * 1000), - domain: - '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + domain: getCookieUrlFromDomain(process.env.FRONTEND_URL!), }); } diff --git a/apps/workers/src/app/app.module.ts b/apps/workers/src/app/app.module.ts index efaf1029f..20d2e3817 100644 --- a/apps/workers/src/app/app.module.ts +++ b/apps/workers/src/app/app.module.ts @@ -8,7 +8,7 @@ import { BullMqModule } from '@gitroom/nestjs-libraries/bull-mq-transport-new/bu @Module({ imports: [DatabaseModule, BullMqModule], - controllers: [StarsController, PostsController], + controllers: [...!process.env.IS_GENERAL ? [StarsController] : [], PostsController], providers: [TrendingService], }) export class AppModule {} diff --git a/libraries/helpers/src/subdomain/subdomain.management.ts b/libraries/helpers/src/subdomain/subdomain.management.ts index 7a8aa9316..ec54bd381 100644 --- a/libraries/helpers/src/subdomain/subdomain.management.ts +++ b/libraries/helpers/src/subdomain/subdomain.management.ts @@ -1,37 +1,6 @@ -import {allTwoLevelSubdomain} from "./all.two.level.subdomain"; -const ipRegex = /^(https?:\/\/)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:\d+)?$/; - -export function removeSubdomain(domain: string) { - // Check if the domain is an IP address with optional port - if (ipRegex.test(domain)) { - return domain; // Return the original domain if it's an IP address - } - // Split the domain into its parts - const parts = domain.split('.'); - - // Check if there are at least two parts (e.g., 'example.com') - if (parts.length < 2) { - return domain; // Return the original domain if it's too short to have a subdomain - } - - if (parts.length > 2) { - const lastTwo = parts.slice(-2).join('.'); - if (allTwoLevelSubdomain.includes(lastTwo)) { - return 'https://' + parts.slice(-3).join('.'); // Return the last three parts for known second-level domains - } - } - - // Return the last two parts for standard domains - return 'https://' + parts.slice(-2).join('.'); -} - +import { parse } from 'tldts'; export function getCookieUrlFromDomain(domain: string) { - const url = removeSubdomain(domain); - const urlObj = new URL(url); - if (!ipRegex.test(domain)) { - return '.' + urlObj.hostname - } - - return urlObj.hostname; + const url = parse(domain); + return url.domain! ? "." + url.domain! : url.hostname!; } \ No newline at end of file diff --git a/libraries/helpers/src/utils/custom.fetch.func.ts b/libraries/helpers/src/utils/custom.fetch.func.ts index b1372bee2..f7f38c072 100644 --- a/libraries/helpers/src/utils/custom.fetch.func.ts +++ b/libraries/helpers/src/utils/custom.fetch.func.ts @@ -1,3 +1,5 @@ +import { loadVars } from '@gitroom/react/helpers/variable.context'; + export interface Params { baseUrl: string; beforeRequest?: (url: string, options: RequestInit) => Promise; @@ -45,5 +47,7 @@ export const customFetch = ( }; export const fetchBackend = customFetch({ - baseUrl: process.env.NEXT_PUBLIC_BACKEND_URL!, + get baseUrl() { + return loadVars().backendUrl; + }, }); diff --git a/libraries/helpers/src/utils/is.general.server.side.ts b/libraries/helpers/src/utils/is.general.server.side.ts new file mode 100644 index 000000000..c24b8dc96 --- /dev/null +++ b/libraries/helpers/src/utils/is.general.server.side.ts @@ -0,0 +1,3 @@ +export const isGeneralServerSide = () => { + return !!process.env.IS_GENERAL; +} \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index b986538ca..7778c05af 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -1,11 +1,11 @@ import { PrismaRepository } from '@gitroom/nestjs-libraries/database/prisma/prisma.service'; import { Injectable } from '@nestjs/common'; import dayjs from 'dayjs'; -import * as console from 'node:console'; import { Integration } from '@prisma/client'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { simpleUpload } from '@gitroom/nestjs-libraries/upload/r2.uploader'; import axios from 'axios'; +import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; @Injectable() export class IntegrationRepository { @@ -14,10 +14,34 @@ export class IntegrationRepository { private _posts: PrismaRepository<'post'> ) {} + async setTimes(org: string, id: string, times: IntegrationTimeDto) { + return this._integration.model.integration.update({ + select: { + id: true, + }, + where: { + id, + organizationId: org, + }, + data: { + postingTimes: JSON.stringify(times.time), + }, + }); + } + async updateIntegration(id: string, params: Partial) { - if (params.picture && params.picture.indexOf(process.env.CLOUDFLARE_BUCKET_URL!) === -1) { - const picture = await axios.get(params.picture, { responseType: 'arraybuffer' }); - params.picture = await simpleUpload(picture.data, `${makeId(10)}.png`, 'image/png'); + if ( + params.picture && + params.picture.indexOf(process.env.CLOUDFLARE_BUCKET_URL!) === -1 + ) { + const picture = await axios.get(params.picture, { + responseType: 'arraybuffer', + }); + params.picture = await simpleUpload( + picture.data, + `${makeId(10)}.png`, + 'image/png' + ); } return this._integration.model.integration.update({ @@ -54,8 +78,18 @@ export class IntegrationRepository { expiresIn = 999999999, username?: string, isBetweenSteps = false, - refresh?: string + refresh?: string, + timezone?: number ) { + const postTimes = timezone + ? { + postingTimes: JSON.stringify([ + { time: 560 - timezone }, + { time: 850 - timezone }, + { time: 1140 - timezone }, + ]), + } + : {}; return this._integration.model.integration.upsert({ where: { organizationId_internalId: { @@ -76,6 +110,7 @@ export class IntegrationRepository { ? { tokenExpiration: new Date(Date.now() + expiresIn * 1000) } : {}), internalId, + ...postTimes, organizationId: org, refreshNeeded: false, }, @@ -212,7 +247,7 @@ export class IntegrationRepository { where: { organizationId: org, integrationId: id, - deletedAt: null + deletedAt: null, }, }); } diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts index 111d20d92..c67d7c9e6 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -1,15 +1,26 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { + HttpException, + HttpStatus, + Injectable, + Param, + Query, +} from '@nestjs/common'; import { IntegrationRepository } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.repository'; import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/facebook.provider'; -import { SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; -import { Integration } from '@prisma/client'; +import { AnalyticsData, SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { Integration, Organization } from '@prisma/client'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; import { LinkedinPageProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.page.provider'; import { simpleUpload } from '@gitroom/nestjs-libraries/upload/r2.uploader'; import axios from 'axios'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import dayjs from 'dayjs'; +import { timer } from '@gitroom/helpers/utils/timer'; +import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; +import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; @Injectable() export class IntegrationService { @@ -18,6 +29,11 @@ export class IntegrationService { private _integrationManager: IntegrationManager, private _notificationService: NotificationService ) {} + + async setTimes(orgId: string, integrationId: string, times: IntegrationTimeDto) { + return this._integrationRepository.setTimes(orgId, integrationId, times); + } + async createOrUpdateIntegration( org: string, name: string, @@ -30,10 +46,15 @@ export class IntegrationService { expiresIn?: number, username?: string, isBetweenSteps = false, - refresh?: string + refresh?: string, + timezone?: number ) { const loadImage = await axios.get(picture, { responseType: 'arraybuffer' }); - const uploadedPicture = await simpleUpload(loadImage.data, `${makeId(10)}.png`, 'image/png'); + const uploadedPicture = await simpleUpload( + loadImage.data, + `${makeId(10)}.png`, + 'image/png' + ); return this._integrationRepository.createOrUpdateIntegration( org, @@ -47,7 +68,8 @@ export class IntegrationService { expiresIn, username, isBetweenSteps, - refresh + refresh, + timezone ); } @@ -267,4 +289,80 @@ export class IntegrationService { return { success: true }; } + + async checkAnalytics(org: Organization, integration: string, date: string, forceRefresh = false): Promise { + const getIntegration = await this.getIntegrationById(org.id, integration); + + if (!getIntegration) { + throw new Error('Invalid integration'); + } + + if (getIntegration.type !== 'social') { + return []; + } + + const integrationProvider = this._integrationManager.getSocialIntegration( + getIntegration.providerIdentifier + ); + + if (dayjs(getIntegration?.tokenExpiration).isBefore(dayjs()) || forceRefresh) { + const { accessToken, expiresIn, refreshToken } = + await integrationProvider.refreshToken(getIntegration.refreshToken!); + + if (accessToken) { + await this.createOrUpdateIntegration( + getIntegration.organizationId, + getIntegration.name, + getIntegration.picture!, + 'social', + getIntegration.internalId, + getIntegration.providerIdentifier, + accessToken, + refreshToken, + expiresIn + ); + + getIntegration.token = accessToken; + + if (integrationProvider.refreshWait) { + await timer(10000); + } + } else { + await this.disconnectChannel(org.id, getIntegration); + return []; + } + } + + const getIntegrationData = await ioRedis.get( + `integration:${org.id}:${integration}:${date}` + ); + if (getIntegrationData) { + return JSON.parse(getIntegrationData); + } + + if (integrationProvider.analytics) { + try { + const loadAnalytics = await integrationProvider.analytics( + getIntegration.internalId, + getIntegration.token, + +date + ); + await ioRedis.set( + `integration:${org.id}:${integration}:${date}`, + JSON.stringify(loadAnalytics), + 'EX', + !process.env.NODE_ENV || process.env.NODE_ENV === 'development' + ? 1 + : 3600 + ); + return loadAnalytics; + } catch (e) { + if (e instanceof RefreshToken) { + return this.checkAnalytics(org, integration, date); + } + } + } + + return []; + } } diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index b4704b29c..d213a6f47 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -64,10 +64,31 @@ export class PostsRepository { getPosts(orgId: string, query: GetPostsDto) { const dateYear = dayjs().year(query.year); - const date = query.week ? dateYear.isoWeek(query.week) : dateYear.month(query.month-1); + const date = + query.display === 'day' + ? dateYear.isoWeek(query.week).day(query.day) + : query.display === 'week' + ? dateYear.isoWeek(query.week) + : dateYear.month(query.month - 1); - const startDate = (query.week ? date.startOf('isoWeek') : date.startOf('month')).subtract(2, 'days').toDate(); - const endDate = (query.week ? date.endOf('isoWeek') : date.endOf('month')).add(2, 'days').toDate(); + const startDate = ( + query.display === 'day' + ? date.startOf('day') + : query.display === 'week' + ? date.startOf('isoWeek') + : date.startOf('month') + ) + .subtract(2, 'hours') + .toDate(); + const endDate = ( + query.display === 'day' + ? date.endOf('day') + : query.display === 'week' + ? date.endOf('isoWeek') + : date.endOf('month') + ) + .add(2, 'hours') + .toDate(); return this._post.model.post.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 680045568..fbd051f22 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -15,8 +15,12 @@ import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generator/create.generated.posts.dto'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; -import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { + BadBody, + RefreshToken, +} from '@gitroom/nestjs-libraries/integrations/social.abstract'; import { BullMqClient } from '@gitroom/nestjs-libraries/bull-mq-transport-new/client'; +import { timer } from '@gitroom/helpers/utils/timer'; type PostWithConditionals = Post & { integration?: Integration; @@ -131,6 +135,7 @@ export class PostsService { `An error occurred while posting on ${firstPost.integration?.providerIdentifier}`, true ); + return; } @@ -156,6 +161,8 @@ export class PostsService { }`, true ); + + console.error('[Error] posting on', firstPost.integration?.providerIdentifier, err); } } @@ -224,6 +231,10 @@ export class PostsService { ); integration.token = accessToken; + + if (getIntegration.refreshWait) { + await timer(10000); + } } const newPosts = await this.updateTags(integration.organizationId, posts); diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index 079e0e743..3944ec4d7 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -262,6 +262,7 @@ model Integration { orderItems OrderItems[] inBetweenSteps Boolean @default(false) refreshNeeded Boolean @default(false) + postingTimes String @default("[{\"time\":120}, {\"time\":400}, {\"time\":700}]") @@index([updatedAt]) @@index([deletedAt]) diff --git a/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts b/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts index 28bf4cb9c..a74bfb5e3 100644 --- a/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts @@ -1,15 +1,19 @@ import { IsDefined, IsOptional, IsString } from 'class-validator'; export class ConnectIntegrationDto { - @IsString() - @IsDefined() - state: string; - - @IsString() - @IsDefined() - code: string; - - @IsString() - @IsOptional() - refresh?: string; -} \ No newline at end of file + @IsString() + @IsDefined() + state: string; + + @IsString() + @IsDefined() + code: string; + + @IsString() + @IsDefined() + timezone: string; + + @IsString() + @IsOptional() + refresh?: string; +} diff --git a/libraries/nestjs-libraries/src/dtos/integrations/integration.time.dto.ts b/libraries/nestjs-libraries/src/dtos/integrations/integration.time.dto.ts new file mode 100644 index 000000000..cde4d0b6b --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/integrations/integration.time.dto.ts @@ -0,0 +1,15 @@ +import { IsArray, IsDefined, IsNumber, ValidateNested } from 'class-validator'; +import { Type } from 'class-transformer'; + +export class IntegrationValidateTimeDto { + @IsDefined() + @IsNumber() + time: number; +} +export class IntegrationTimeDto { + @Type(() => IntegrationValidateTimeDto) + @IsArray() + @IsDefined() + @ValidateNested({each: true}) + time: IntegrationValidateTimeDto[]; +} \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts index 1a89560fa..258fa6946 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/get.posts.dto.ts @@ -1,16 +1,30 @@ import { Type } from 'class-transformer'; -import { IsIn, IsNumber, IsString, Max, Min, ValidateIf } from 'class-validator'; +import { + IsDefined, + IsIn, + IsNumber, + Max, + Min, +} from 'class-validator'; import dayjs from 'dayjs'; export class GetPostsDto { - @ValidateIf((o) => !o.month) @Type(() => Number) @IsNumber() @Max(52) @Min(1) week: number; - @ValidateIf((o) => !o.week) + @Type(() => Number) + @IsNumber() + @Max(6) + @Min(0) + day: number; + + @IsDefined() + @IsIn(['day', 'week', 'month']) + display: 'day' | 'week' | 'month'; + @Type(() => Number) @IsNumber() @Max(52) diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index dba5c1013..beea4116b 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -17,7 +17,7 @@ import { LinkedinPageProvider } from '@gitroom/nestjs-libraries/integrations/soc import { ThreadsProvider } from '@gitroom/nestjs-libraries/integrations/social/threads.provider'; const socialIntegrationList = [ - ...(process.env.IS_GENERAL !== 'true' ? [new XProvider()] : []), + new XProvider(), new LinkedinProvider(), new LinkedinPageProvider(), new RedditProvider(), diff --git a/libraries/nestjs-libraries/src/integrations/social.abstract.ts b/libraries/nestjs-libraries/src/integrations/social.abstract.ts index e24bf6a3b..eee510db9 100644 --- a/libraries/nestjs-libraries/src/integrations/social.abstract.ts +++ b/libraries/nestjs-libraries/src/integrations/social.abstract.ts @@ -1,28 +1,39 @@ -export class RefreshToken {} +export class RefreshToken { + constructor(public json: string, public body: BodyInit) {} +} +export class BadBody { + constructor(public json: string, public body: BodyInit) {} +} export class NotEnoughScopes {} export abstract class SocialAbstract { async fetch(url: string, options: RequestInit = {}) { const request = await fetch(url, options); - console.log(request.status); - if (request.status !== 200 && request.status !== 201) { - try { - console.log(await request.json()); - } - catch (err) { - console.log('skip'); - } + + if (request.status === 200 || request.status === 201) { + return request; } - if (request.status === 401 || request.status === 400) { - throw new RefreshToken(); + + let json = '{}'; + try { + json = await request.json(); + } catch (err) { + json = '{}'; + } + + if (request.status === 401) { + throw new RefreshToken(json, options.body!); + } + + if (request.status === 400) { + throw new BadBody(json, options.body!); } return request; } checkScopes(required: string[], got: string | string[]) { - console.log(required, got); if (Array.isArray(got)) { if (!required.every((scope) => got.includes(scope))) { throw new NotEnoughScopes(); diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts index 6b77a387d..452b91230 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -16,6 +16,7 @@ export class LinkedinPageProvider override identifier = 'linkedin-page'; override name = 'LinkedIn Page'; override isBetweenSteps = true; + override refreshWait = true; override scopes = [ 'openid', 'profile', diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index 539d11393..6bacf92c7 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -16,6 +16,7 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider { name = 'LinkedIn'; isBetweenSteps = false; scopes = ['openid', 'profile', 'w_member_social', 'r_basicprofile']; + refreshWait = true; async refreshToken(refresh_token: string): Promise { const { access_token: accessToken, refresh_token: refreshToken, expires_in } = await ( diff --git a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts index 80c06876e..35a9c2993 100644 --- a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts +++ b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts @@ -69,6 +69,7 @@ export interface SocialProvider extends IAuthenticator, ISocialMediaIntegration { identifier: string; + refreshWait?: boolean; name: string; isBetweenSteps: boolean; scopes: string[]; diff --git a/libraries/nestjs-libraries/src/services/trending.service.ts b/libraries/nestjs-libraries/src/services/trending.service.ts index ba7ada044..09ccb5844 100644 --- a/libraries/nestjs-libraries/src/services/trending.service.ts +++ b/libraries/nestjs-libraries/src/services/trending.service.ts @@ -23,8 +23,8 @@ export class TrendingService { }); const hashedNames = md5(arr.map(p => p.name).join('')); - console.log(language, hashedNames); + console.log('Updating GitHub trending topic', language, hashedNames); await this._starsService.updateTrending(language.name, hashedNames, arr); } } -} \ No newline at end of file +} diff --git a/libraries/react-shared-libraries/src/helpers/is.general.tsx b/libraries/react-shared-libraries/src/helpers/is.general.tsx index 1b18fa706..90fa96fe4 100644 --- a/libraries/react-shared-libraries/src/helpers/is.general.tsx +++ b/libraries/react-shared-libraries/src/helpers/is.general.tsx @@ -1,3 +1,5 @@ +import { loadVars } from './variable.context'; + export const isGeneral = () => { - return process.env.isGeneral === 'true'; + return typeof process.env.IS_GENERAL === 'undefined' ? !!process.env.IS_GENERAL : loadVars?.()?.isGeneral; } \ No newline at end of file diff --git a/libraries/react-shared-libraries/src/helpers/use.media.directory.ts b/libraries/react-shared-libraries/src/helpers/use.media.directory.ts index 39157d56b..7a989f265 100644 --- a/libraries/react-shared-libraries/src/helpers/use.media.directory.ts +++ b/libraries/react-shared-libraries/src/helpers/use.media.directory.ts @@ -1,11 +1,13 @@ import {useCallback} from "react"; +import { useVariables } from './variable.context'; export const useMediaDirectory = () => { + const {backendUrl, uploadDirectory} = useVariables(); const set = useCallback((path: string) => { if (path.indexOf('https') === 0) { return path; } - return `${process.env.NEXT_PUBLIC_BACKEND_URL}/${process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY}${path}`; + return `${backendUrl}/${uploadDirectory}${path}`; }, []); return { diff --git a/libraries/react-shared-libraries/src/helpers/variable.context.tsx b/libraries/react-shared-libraries/src/helpers/variable.context.tsx new file mode 100644 index 000000000..6fb98bb08 --- /dev/null +++ b/libraries/react-shared-libraries/src/helpers/variable.context.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { createContext, FC, ReactNode, useContext, useEffect } from 'react'; + +interface VariableContextInterface { + billingEnabled: boolean; + isGeneral: boolean; + frontEndUrl: string; + plontoKey: string; + backendUrl: string; + discordUrl: string; + uploadDirectory: string; +} +const VariableContext = createContext({ + billingEnabled: false, + isGeneral: true, + frontEndUrl: '', + plontoKey: '', + backendUrl: '', + discordUrl: '', + uploadDirectory: '', +} as VariableContextInterface); + +export const VariableContextComponent: FC< + VariableContextInterface & { children: ReactNode } +> = (props) => { + const { children, ...otherProps } = props; + useEffect(() => { + if (typeof window !== 'undefined') { + // @ts-ignore + window.vars = otherProps; + } + }, []); + return ( + + {children} + + ); +}; + +export const useVariables = () => { + return useContext(VariableContext); +} + +export const loadVars = () => { + // @ts-ignore + return window.vars as VariableContextInterface; +} diff --git a/package-lock.json b/package-lock.json index 8bf65143d..b410290dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,6 +116,7 @@ "swr": "^2.2.5", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "3.4.3", + "tldts": "^6.1.47", "tslib": "^2.3.0", "twitter-api-v2": "^1.16.0", "use-debounce": "^10.0.0", @@ -125,7 +126,6 @@ "yup": "^1.4.0" }, "devDependencies": { - "@mintlify/scraping": "^3.0.90", "@nestjs/schematics": "^10.0.1", "@nestjs/testing": "^10.0.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", @@ -461,50 +461,6 @@ "web-streams-polyfill": "^3.2.1" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", - "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "dev": true - }, - "node_modules/@apidevtools/swagger-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz", - "integrity": "sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.6", - "@apidevtools/openapi-schemas": "^2.1.0", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "ajv": "^8.6.3", - "ajv-draft-04": "^1.0.0", - "call-me-maybe": "^1.0.1" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -6862,12 +6818,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", @@ -7302,95 +7252,6 @@ "node": ">=10" } }, - "node_modules/@mdx-js/mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", - "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/mdx": "^2.0.0", - "estree-util-build-jsx": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-util-to-js": "^1.1.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^2.0.0", - "markdown-extensions": "^1.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^2.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "unified": "^10.0.0", - "unist-util-position-from-estree": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/@mdx-js/mdx/node_modules/estree-util-to-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", - "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@mdx-js/mdx/node_modules/unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", - "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", - "dev": true, - "dependencies": { - "@types/mdx": "^2.0.0", - "@types/react": ">=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": ">=16" - } - }, "node_modules/@meronex/icons": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@meronex/icons/-/icons-4.0.0.tgz", @@ -7416,119 +7277,6 @@ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==" }, - "node_modules/@mintlify/common": { - "version": "1.0.141", - "resolved": "https://registry.npmjs.org/@mintlify/common/-/common-1.0.141.tgz", - "integrity": "sha512-W55hktZ8jrf5z7bI1r6O84GtXMhwBicHOQWUrozXDXoQz4eDu1HPCjOp0/IktasEDpAlmde1lYErq88IZXDhHA==", - "dev": true, - "dependencies": { - "@apidevtools/swagger-parser": "^10.1.0", - "@mintlify/mdx": "0.0.46", - "@mintlify/models": "0.0.120", - "@mintlify/validation": "0.1.186", - "@sindresorhus/slugify": "^2.1.1", - "acorn": "^8.11.2", - "acorn-jsx": "^5.3.2", - "esast-util-from-js": "^2.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.3", - "gray-matter": "^4.0.3", - "hast-util-from-html": "^1.0.0", - "hast-util-from-html-isomorphic": "^2.0.0", - "hast-util-to-html": "^8.0.3", - "hast-util-to-text": "^4.0.0", - "is-absolute-url": "^4.0.1", - "lodash": "^4.17.21", - "mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.2.0", - "mdast-util-gfm": "^2.0.1", - "mdast-util-mdx": "^2.0.0", - "mdast-util-mdx-jsx": "^2.1.2", - "mdast-util-mdxjs-esm": "^1.3.0", - "micromark-extension-mdx-jsx": "^1.0.3", - "micromark-extension-mdxjs": "^1.0.0", - "micromark-extension-mdxjs-esm": "^1.0.0", - "openapi-types": "^12.0.0", - "remark": "^14.0.2", - "remark-frontmatter": "^4.0.1", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1", - "remark-mdx": "^2.0.0", - "unist-builder": "^3.0.1", - "unist-util-map": "^3.1.2", - "unist-util-remove": "^3.1.0", - "unist-util-remove-position": "^4.0.0", - "unist-util-visit": "^4.1.1", - "unist-util-visit-parents": "^5.0.0", - "vfile": "^5.3.6" - } - }, - "node_modules/@mintlify/mdx": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@mintlify/mdx/-/mdx-0.0.46.tgz", - "integrity": "sha512-8BZsTvFhek4Z6//+kWKvlgnKy+dOjbtHqPnhiYaNlvZvGFU5BkLjOtFFP2jG+7vluvfI2yWOS8g3mtPwntWrVg==", - "dev": true, - "dependencies": { - "hast-util-to-string": "^2.0.0", - "next-mdx-remote": "^4.4.1", - "refractor": "^4.8.0", - "rehype-katex": "^6.0.3", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1", - "remark-smartypants": "^2.0.0", - "unist-util-visit": "^4.1.1" - } - }, - "node_modules/@mintlify/models": { - "version": "0.0.120", - "resolved": "https://registry.npmjs.org/@mintlify/models/-/models-0.0.120.tgz", - "integrity": "sha512-H6bb2StjBiLAySPoPJbx2k3o6W/WOoGPkJudyzHSUzGPt8HN5hXUR6gnyRjVt0Ba7LKy8HxiG24G4s6wVwDgsA==", - "dev": true, - "dependencies": { - "axios": "^1.4.0", - "openapi-types": "12.x" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@mintlify/scraping": { - "version": "3.0.164", - "resolved": "https://registry.npmjs.org/@mintlify/scraping/-/scraping-3.0.164.tgz", - "integrity": "sha512-MjtXFr8kRjbJiPB9n2KCds3EdJ5XlrmsZq7TeeT5JCp0xpe4LnY12csWyNuNNVb017hqOpcxYPCAvsxqTWMB2g==", - "dev": true, - "dependencies": { - "@apidevtools/swagger-parser": "^10.1.0", - "@mintlify/common": "1.0.141", - "axios": "^1.2.2", - "cheerio": "^1.0.0-rc.12", - "fs-extra": "^11.1.1", - "node-html-markdown": "^1.3.0", - "ora": "^6.1.2", - "puppeteer": "^22.14.0", - "yargs": "^17.6.0" - }, - "bin": { - "mintlify-scrape": "bin/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@mintlify/validation": { - "version": "0.1.186", - "resolved": "https://registry.npmjs.org/@mintlify/validation/-/validation-0.1.186.tgz", - "integrity": "sha512-gOrp9N2N5rg+P7gD6OSpr4hjYe26LKli/4Dk1SetLAd9oDSHbB/z0vQ6IkiXxMew+kHlRk3fwlnesLLf/A/3yg==", - "dev": true, - "dependencies": { - "@mintlify/models": "0.0.120", - "lcm": "^0.0.3", - "lodash": "^4.17.21", - "openapi-types": "12.x", - "zod": "^3.20.6", - "zod-to-json-schema": "^3.20.3" - } - }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.6.3.tgz", @@ -10473,40 +10221,6 @@ "@prisma/debug": "5.19.1" } }, - "node_modules/@puppeteer/browsers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", - "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", - "dev": true, - "dependencies": { - "debug": "^4.3.5", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.3", - "tar-fs": "^3.0.6", - "unbzip2-stream": "^1.4.3", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@radix-ui/number": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", @@ -11425,61 +11139,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sindresorhus/slugify": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", - "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", - "dev": true, - "dependencies": { - "@sindresorhus/transliterate": "^1.0.0", - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", - "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -12886,12 +12545,6 @@ "node": ">= 10" } }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, "node_modules/@transloadit/prettier-bytes": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.4.tgz", @@ -12933,15 +12586,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -13205,12 +12849,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true - }, "node_modules/@types/jsdom": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", @@ -13253,12 +12891,6 @@ "@types/node": "*" } }, - "node_modules/@types/katex": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", - "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==", - "dev": true - }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -13296,12 +12928,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "dev": true - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -13325,21 +12951,6 @@ "@types/express": "*" } }, - "node_modules/@types/nlcst": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.4.tgz", - "integrity": "sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==", - "dev": true, - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/nlcst/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/@types/node": { "version": "18.16.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", @@ -13367,12 +12978,6 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, "node_modules/@types/prismjs": { "version": "1.26.4", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", @@ -13570,8 +13175,8 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -15689,20 +15294,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/ajv-formats": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", @@ -15939,16 +15530,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/array-move": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz", @@ -16106,33 +15687,12 @@ "node": "*" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "dev": true, - "bin": { - "astring": "bin/astring" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -16238,12 +15798,6 @@ "node": ">= 0.4" } }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -16520,53 +16074,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "dev": true, - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.4.tgz", - "integrity": "sha512-7YyxitZEq0ey5loOF5gdo1fZQFF7290GziT+VbAJ+JbYTJYaPZwuEz2r/Nq23sm4fjyTgUf2uJI2gkT3xAuSYA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.2.tgz", - "integrity": "sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==", - "dev": true, - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", - "dev": true, - "optional": true, - "dependencies": { - "b4a": "^1.6.6", - "streamx": "^2.20.0" - } - }, "node_modules/base-64": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", @@ -16607,15 +16114,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -16780,17 +16278,6 @@ "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -16954,7 +16441,8 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -17154,12 +16642,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -17426,7 +16908,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -17451,7 +16934,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -17468,7 +16952,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "entities": "^4.4.0" }, @@ -17526,20 +17011,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-bidi": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", - "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", - "dev": true, - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -18937,15 +18408,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/data-urls": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", @@ -19247,20 +18709,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -19361,12 +18809,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1312386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", - "dev": true - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -19706,7 +19148,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" @@ -19719,7 +19162,8 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -19769,15 +19213,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -19968,38 +19403,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -21082,82 +20485,6 @@ "node": ">=4.0" } }, - "node_modules/estree-util-attach-comments": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", - "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", - "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", - "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -21492,23 +20819,12 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -21528,7 +20844,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -21559,12 +20876,6 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -21703,7 +21014,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "pend": "~1.2.0" } @@ -22532,12 +21844,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/gcd": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/gcd/-/gcd-0.0.1.tgz", - "integrity": "sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw==", - "dev": true - }, "node_modules/gcp-metadata": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", @@ -22654,21 +21960,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -23027,21 +22318,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dev": true, - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/groq-sdk": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz", @@ -23177,293 +22453,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-from-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", - "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "hastscript": "^8.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-dom/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz", - "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^7.0.0", - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", - "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-dom": "^5.0.0", - "hast-util-from-html": "^2.0.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/hast-util-from-html": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.2.tgz", - "integrity": "sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic/node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/hast-util-from-html/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/hast-util-from-html/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-has-property": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", @@ -23544,35 +22533,6 @@ "@types/unist": "*" } }, - "node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/hast-util-select": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.2.tgz", @@ -23671,68 +22631,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-estree": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", - "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "estree-util-attach-comments": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "unist-util-position": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", @@ -24417,62 +23315,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", - "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text/node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/hast-util-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", @@ -24714,21 +23556,10 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/htmlparser2": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "devOptional": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -24736,6 +23567,8 @@ "url": "https://github.com/sponsors/fb55" } ], + "optional": true, + "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -25216,25 +24049,6 @@ "url": "https://opencollective.com/ioredis" } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -25243,18 +24057,6 @@ "node": ">= 0.10" } }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -25462,15 +24264,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -25577,18 +24370,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -25678,15 +24459,6 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "devOptional": true }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -25789,18 +24561,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -27894,12 +26654,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, "node_modules/jsdom": { "version": "22.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", @@ -28376,15 +27130,6 @@ "shell-quote": "^1.8.1" } }, - "node_modules/lcm": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/lcm/-/lcm-0.0.3.tgz", - "integrity": "sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ==", - "dev": true, - "dependencies": { - "gcd": "^0.0.1" - } - }, "node_modules/leac": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", @@ -28686,34 +27431,6 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", @@ -28866,15 +27583,6 @@ "tmpl": "1.0.5" } }, - "node_modules/markdown-extensions": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", - "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -28904,13 +27612,6 @@ "is-buffer": "~1.1.6" } }, - "node_modules/mdast": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast/-/mdast-3.0.0.tgz", - "integrity": "sha512-xySmf8g4fPKMeC07jXGz971EkLbWAJ83s4US2Tj9lEdnZ142UP5grN73H1Xd3HzrdbU5o9GYYP/y8F9ZSwLE9g==", - "deprecated": "`mdast` was renamed to `remark`", - "dev": true - }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -28984,21 +27685,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, - "node_modules/mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-gfm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", @@ -29101,101 +27787,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-mdx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", - "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdx-jsx": "^2.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", - "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", - "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "mdast-util-from-markdown": "^1.1.0", - "mdast-util-to-markdown": "^1.3.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^4.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/mdast-util-mdx-jsx/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", - "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-phrasing": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", @@ -29394,35 +27985,6 @@ "uvu": "^0.5.0" } }, - "node_modules/micromark-extension-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", - "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", - "dev": true, - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dev": true, - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/micromark-extension-gfm": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", @@ -29560,161 +28122,6 @@ "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" }, - "node_modules/micromark-extension-mdx-expression": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", - "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", - "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", - "dev": true, - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", - "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", - "dev": true, - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", - "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", - "dev": true, - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^1.0.0", - "micromark-extension-mdx-jsx": "^1.0.0", - "micromark-extension-mdx-md": "^1.0.0", - "micromark-extension-mdxjs-esm": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", - "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-core-commonmark": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.1.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-factory-destination": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", @@ -29756,65 +28163,6 @@ "uvu": "^0.5.0" } }, - "node_modules/micromark-factory-mdx-expression": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", - "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/micromark-factory-mdx-expression/node_modules/unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-factory-space": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", @@ -30006,66 +28354,6 @@ } ] }, - "node_modules/micromark-util-events-to-acorn": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", - "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^2.0.0", - "estree-util-visit": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/micromark-util-events-to-acorn/node_modules/estree-util-visit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", - "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", - "dev": true, - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-util-html-tag-name": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", @@ -30355,12 +28643,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -30713,15 +28995,6 @@ "yargs": "^16.0.0 || ^17.0.0" } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/next": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", @@ -30771,26 +29044,6 @@ } } }, - "node_modules/next-mdx-remote": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", - "integrity": "sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==", - "dev": true, - "dependencies": { - "@mdx-js/mdx": "^2.2.1", - "@mdx-js/react": "^2.2.1", - "vfile": "^5.3.0", - "vfile-matter": "^3.0.1" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "peerDependencies": { - "react": ">=16.x <=18.x", - "react-dom": ">=16.x <=18.x" - } - }, "node_modules/next-plausible": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.12.2.tgz", @@ -30879,19 +29132,6 @@ "dev": true, "optional": true }, - "node_modules/nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -30999,28 +29239,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-html-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-html-markdown/-/node-html-markdown-1.3.0.tgz", - "integrity": "sha512-OeFi3QwC/cPjvVKZ114tzzu+YoR+v9UXW5RwSXGUqGb0qCl0DvP406tzdL7SFn8pZrMyzXoisfG2zcuF9+zw4g==", - "dev": true, - "dependencies": { - "node-html-parser": "^6.1.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dev": true, - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -31675,99 +29893,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/os-filter-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", @@ -31887,76 +30012,6 @@ "node": ">=6" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", - "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dev": true, - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -32033,21 +30088,6 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, - "node_modules/parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", - "dev": true, - "dependencies": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -32078,7 +30118,8 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -32091,7 +30132,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "entities": "^4.4.0" }, @@ -32103,7 +30145,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "parse5": "^7.0.0" }, @@ -32115,7 +30158,8 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "entities": "^4.4.0" }, @@ -32261,18 +30305,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "devOptional": true - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } + "optional": true, + "peer": true }, "node_modules/picocolors": { "version": "1.1.0", @@ -33341,7 +31375,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -33415,72 +31450,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -33521,106 +31490,6 @@ "node": ">=6" } }, - "node_modules/puppeteer": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", - "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@puppeteer/browsers": "2.3.0", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1312386", - "puppeteer-core": "22.15.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", - "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "2.3.0", - "chromium-bidi": "0.6.3", - "debug": "^4.3.6", - "devtools-protocol": "0.0.1312386", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -33675,12 +31544,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -34975,134 +32838,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-katex": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz", - "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/katex": "^0.14.0", - "hast-util-from-html-isomorphic": "^1.0.0", - "hast-util-to-text": "^3.1.0", - "katex": "^0.16.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/rehype-katex/node_modules/hast-util-from-dom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", - "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", - "dev": true, - "dependencies": { - "hastscript": "^7.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/hast-util-from-html-isomorphic": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz", - "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-dom": "^4.0.0", - "hast-util-from-html": "^1.0.0", - "unist-util-remove-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/hast-util-is-element": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", - "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/hast-util-to-text": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", - "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hast-util-is-element": "^2.0.0", - "unist-util-find-after": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dev": true, - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex/node_modules/unist-util-find-after": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", - "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-parse": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", @@ -36083,38 +33818,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", - "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "remark-parse": "^10.0.0", - "remark-stringify": "^10.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-frontmatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", - "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-frontmatter": "^1.0.0", - "micromark-extension-frontmatter": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", @@ -36198,20 +33901,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", - "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", - "dev": true, - "dependencies": { - "mdast-util-mdx": "^2.0.0", - "micromark-extension-mdxjs": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -36241,77 +33930,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-smartypants": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.1.0.tgz", - "integrity": "sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==", - "dev": true, - "dependencies": { - "retext": "^8.1.0", - "retext-smartypants": "^5.2.0", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-smartypants/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", - "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remove-markdown": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.5.5.tgz", @@ -36453,69 +34071,6 @@ "node": ">=8" } }, - "node_modules/retext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", - "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "retext-latin": "^3.0.0", - "retext-stringify": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-latin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", - "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "parse-latin": "^5.0.0", - "unherit": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-smartypants": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", - "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", - "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", - "dev": true, - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -36822,19 +34377,6 @@ "compute-scroll-into-view": "^1.0.20" } }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", @@ -37433,16 +34975,6 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -37470,46 +35002,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/sonic-boom": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", @@ -37713,21 +35205,6 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dev": true, - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/streamroller": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", @@ -37778,20 +35255,6 @@ "node": ">=10.0.0" } }, - "node_modules/streamx": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.0.tgz", - "integrity": "sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -37978,15 +35441,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -38559,31 +36013,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -38833,15 +36262,6 @@ "node": "*" } }, - "node_modules/text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -38936,6 +36356,22 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.47.tgz", + "integrity": "sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==", + "dependencies": { + "tldts-core": "^6.1.47" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.47.tgz", + "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==" + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -39633,7 +37069,8 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -39643,7 +37080,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, "funding": [ { "type": "github", @@ -39658,6 +37094,8 @@ "url": "https://feross.org/support" } ], + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -39667,21 +37105,12 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": ">=18.17" } }, - "node_modules/unherit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", - "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -39785,25 +37214,6 @@ "node": ">= 0.8.0" } }, - "node_modules/unist-builder": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.1.tgz", - "integrity": "sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-builder/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/unist-util-filter": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-5.0.1.tgz", @@ -39839,33 +37249,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-generated": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", @@ -39892,45 +37275,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, - "node_modules/unist-util-map": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-3.1.3.tgz", - "integrity": "sha512-4/mDauoxqZ6geK97lJ6n2kDk6JK88Vh+hWMSJqyaaP/7eqN1dDhjcjnNxKNm3YU6Sw7PVJtcFMUbnmHvYzb6Vg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-map/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/unist-util-modify-children": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", - "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "array-iterate": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-modify-children/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/unist-util-position": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", @@ -39943,65 +37287,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-position/node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, - "node_modules/unist-util-remove": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-3.1.1.tgz", - "integrity": "sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", - "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/unist-util-remove/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", @@ -40033,25 +37323,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit-children": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", - "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-children/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, "node_modules/unist-util-visit-parents": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", @@ -40468,82 +37739,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/vfile-matter": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", - "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", - "dev": true, - "dependencies": { - "@types/js-yaml": "^4.0.0", - "is-buffer": "^2.0.0", - "js-yaml": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-matter/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/vfile-matter/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/vfile-matter/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", @@ -41418,7 +38613,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "0.6.3" }, @@ -41430,7 +38626,8 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -41442,7 +38639,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": ">=18" } @@ -41773,7 +38971,8 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index 0b4703b38..187bffbd4 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "start:prod:frontend": "nx run frontend:serve:production", "start:prod:workers": "node dist/apps/workers/main.js", "start:prod:cron": "node dist/apps/cron/main.js", - "docs": "npx nx run docs:serve:development", "workers": "npx nx run workers:serve:development", "cron": "npx nx run cron:serve:development", "command": "rm -rf dist/apps/commands && npx nx run commands:build && npx nx run commands:command", @@ -137,6 +136,7 @@ "swr": "^2.2.5", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "3.4.3", + "tldts": "^6.1.47", "tslib": "^2.3.0", "twitter-api-v2": "^1.16.0", "use-debounce": "^10.0.0", @@ -146,7 +146,6 @@ "yup": "^1.4.0" }, "devDependencies": { - "@mintlify/scraping": "^3.0.90", "@nestjs/schematics": "^10.0.1", "@nestjs/testing": "^10.0.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", diff --git a/var/docker/Caddyfile b/var/docker/Caddyfile new file mode 100644 index 000000000..6c2429a58 --- /dev/null +++ b/var/docker/Caddyfile @@ -0,0 +1,9 @@ +:5000 { + handle_path /api/* { + reverse_proxy * localhost:3000 + } + + handle { + reverse_proxy * localhost:4200 + } +} diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh index 526ca6f32..e2914d747 100755 --- a/var/docker/entrypoint.sh +++ b/var/docker/entrypoint.sh @@ -5,8 +5,8 @@ set -o xtrace if [[ "$SKIP_CONFIG_CHECK" != "true" ]]; then echo "Entrypoint: Copying /config/postiz.env into /app/.env" - if [ ! -f /config/.env ]; then - echo "Entrypoint: WARNING: No .env file found in /config/postiz.env" + if [ ! -f /config/postiz.env ]; then + echo "Entrypoint: WARNING: No postiz.env file found in /config/postiz.env" fi cp -vf /config/postiz.env /app/.env @@ -22,6 +22,11 @@ npm run prisma-db-push mkdir -p /etc/supervisor.d/ +if [[ "$INTERNAL_PROXY_ENABLED" != "false" ]]; then + echo "Entrypoint: Starting internal proxy" + cp -vf /app/supervisord_available_configs/caddy.conf /etc/supervisor.d/ +fi + if [[ "$POSTIZ_APPS" == *"frontend"* ]]; then ln -sf /app/supervisord_available_configs/frontend.conf /etc/supervisor.d/ fi @@ -38,4 +43,4 @@ if [[ $POSTIZ_APPS == *"backend"* ]]; then ln -sf /app/supervisord_available_configs/backend.conf /etc/supervisor.d/ fi -/usr/bin/supervisord +/usr/bin/supervisord -c /etc/supervisord.conf diff --git a/var/docker/supervisord.conf b/var/docker/supervisord.conf index a957fc23e..f99f80df3 100644 --- a/var/docker/supervisord.conf +++ b/var/docker/supervisord.conf @@ -2,6 +2,7 @@ nodaemon=true logfile=/dev/null logfile_maxbytes=0 +user=root [unix_http_server] file=/run/supervisord.sock diff --git a/var/docker/supervisord/backend.conf b/var/docker/supervisord/backend.conf index be803a93e..97cbb4cc0 100644 --- a/var/docker/supervisord/backend.conf +++ b/var/docker/supervisord/backend.conf @@ -6,3 +6,4 @@ autorestart=false redirect_stderr=true stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 +startsecs=10 diff --git a/var/docker/supervisord/caddy.conf b/var/docker/supervisord/caddy.conf new file mode 100644 index 000000000..826374ceb --- /dev/null +++ b/var/docker/supervisord/caddy.conf @@ -0,0 +1,9 @@ +[program:caddy] +directory=/app +command=caddy run --config /app/Caddyfile +autostart=true +autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +startsecs=3 diff --git a/var/docker/supervisord/cron.conf b/var/docker/supervisord/cron.conf index ab653f5aa..0300b2f5a 100644 --- a/var/docker/supervisord/cron.conf +++ b/var/docker/supervisord/cron.conf @@ -6,3 +6,4 @@ autorestart=false redirect_stderr=true stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 +startsecs=3 diff --git a/var/docker/supervisord/frontend.conf b/var/docker/supervisord/frontend.conf index 53c03a6f5..67e1ac2cb 100644 --- a/var/docker/supervisord/frontend.conf +++ b/var/docker/supervisord/frontend.conf @@ -6,3 +6,5 @@ autorestart=false redirect_stderr=true stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 +environment=PORT=4200 +startsecs=3 diff --git a/var/docker/supervisord/workers.conf b/var/docker/supervisord/workers.conf index 5653ec8b6..d94b58f41 100644 --- a/var/docker/supervisord/workers.conf +++ b/var/docker/supervisord/workers.conf @@ -6,3 +6,4 @@ autorestart=false redirect_stderr=true stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 +startsecs=3