From 358e484a121136cc16471bba6ed61bc210cad7f3 Mon Sep 17 00:00:00 2001 From: CJ_Clippy Date: Tue, 9 Jul 2024 18:34:23 -0800 Subject: [PATCH] begin refactor for monorepo build --- Makefile | 5 +- Tiltfile | 139 +- charts/fp/templates/boop.yaml | 15 + charts/fp/templates/bot.yaml | 40 + charts/fp/templates/next.yaml | 2 +- charts/fp/templates/uppy.yaml | 6 +- charts/fp/values-prod.yaml | 31 - charts/fp/{values-dev.yaml => values.yaml} | 16 +- charts/trigger/.gitignore | 1 + charts/trigger/.helmignore | 24 + charts/trigger/Chart.lock | 2 + charts/trigger/Chart.yaml | 24 + charts/trigger/README.md | 3 + charts/trigger/package-lock.json | 203 + charts/trigger/package.json | 15 + charts/trigger/templates/_helpers.tpl | 71 + charts/trigger/templates/ingress.yaml | 43 + charts/trigger/templates/trigger.yaml | 95 + charts/trigger/values.yaml | 276 + d.bot.dockerfile | 20 - d.next.dockerfile | 21 - d.packages.dockerfile | 110 +- packages/archive/.npmrc | 4 + packages/archive/README.md | 4 + packages/archive/node.d.ts | 4 + packages/archive/package.json | 16 + packages/archive/pnpm-lock.yaml | 1469 ++ packages/archive/src/generateThumbnail.ts | 240 + .../src/temporal/activities.ts | 0 packages/archive/tsconfig.json | 31 + packages/boop/index.ts | 18 + packages/boop/package.json | 18 + packages/boop/pnpm-lock.yaml | 16 + packages/bot/.gitignore | 1 - packages/bot/.npmrc | 1 - packages/bot/.nvmrc | 1 - packages/bot/Dockerfile | 19 - packages/bot/README.md | 25 +- packages/bot/components.js | 106 - packages/bot/embeds.js | 94 - packages/bot/futurebutt.js | 261 - packages/bot/index.js | 70 + packages/bot/interactions.js | 171 - packages/bot/package.json | 22 +- packages/bot/pnpm-lock.yaml | 1189 +- packages/bot/src/configs.ts | 28 - packages/bot/src/index.ts | 58 - packages/bot/src/rest/README.md | 9 - packages/bot/tsconfig.json | 30 - packages/image/.mocharc.json | 3 + .../src/image.spec.js => image/index.spec.ts} | 8 +- packages/image/index.ts | 30 + packages/image/package.json | 26 + packages/image/pnpm-lock.yaml | 1263 ++ packages/image/tsconfig.json | 30 + packages/next/app/about/page.tsx | 2 +- packages/next/app/components/upload-form.tsx | 69 +- packages/next/app/components/vod-card.tsx | 8 +- .../app/connect/patreon/redirect/page.tsx | 2 +- packages/next/app/lib/b2File.ts | 2 +- packages/next/app/lib/streams.ts | 27 - packages/next/app/lib/tag-vod-relations.ts | 2 +- packages/next/app/lib/tags.ts | 2 +- packages/next/app/lib/timestamps.ts | 2 +- packages/next/app/lib/toys.ts | 2 +- packages/next/app/lib/tweets.ts | 2 +- packages/next/app/lib/types.ts | 46 - packages/next/app/lib/users.ts | 2 +- packages/next/app/lib/vods.ts | 2 +- packages/next/app/lib/vtubers.ts | 45 +- packages/next/app/uppy.tsx | 23 +- packages/next/package.json | 3 +- packages/next/pnpm-lock.yaml | 9 +- packages/scout/package.json | 3 + packages/scout/src/cb.js | 2 +- packages/scout/src/image.js | 33 - packages/scout/src/s3.js | 61 - packages/scout/src/{ua.js => ua.ts} | 0 packages/scout/src/utils.js | 69 - packages/scout/src/utils.spec.js | 25 - packages/scout/src/vtuber.js | 1 - packages/storage/.mocharc.json | 3 + packages/storage/package.json | 22 + packages/storage/pnpm-lock.yaml | 1362 ++ .../.gitkeep => storage/src/mux.ts} | 0 .../src/s3.spec.js => storage/src/s3.spec.ts} | 0 packages/storage/src/s3.ts | 51 + packages/storage/tsconfig.json | 30 + packages/strapi-borked/.dockerignore | 4 - packages/strapi-borked/.gitignore | 118 - packages/strapi-borked/.npmrc | 5 - packages/strapi-borked/.strapi/client/app.js | 14 - .../strapi-borked/.strapi/client/index.html | 62 - packages/strapi-borked/README.md | 13 - .../backup/Dockerfile.1704607848934 | 49 - packages/strapi-borked/config/admin.js | 13 - packages/strapi-borked/config/api.js | 7 - packages/strapi-borked/config/database.js | 49 - packages/strapi-borked/config/middlewares.js | 26 - packages/strapi-borked/config/plugins.js | 75 - packages/strapi-borked/config/server.js | 15 - .../strapi-borked/database/daily-backup.sh | 13 - packages/strapi-borked/database/devDb.sh | 21 - ...2023-08-01-relate-vods-to-vtubers-part2.js | 25 - .../migrations/2023-08-17-reformat-cdnUrl.js | 18 - .../2023-08-20-strip-query-string-from-cid.js | 23 - .../2023-08-30-remove-cloudinary.js | 13 - .../2023-08-30-toy-image-field-simplify.js | 33 - .../2023-09-08-change-date-to-string.js | 23 - .../migrations/2023-09-08-drop-toys-image.js | 11 - .../2023-09-08-drop-vod-videosrc.js | 11 - .../migrations/2023-12-24-add-cuid-to-vods.js | 31 - .../2023-12-26-add-cuid-to-streams.js | 33 - .../2023-12-27-relate-vods-to-streams.js | 35 - .../2023.05.09-video-src-sanity.js.noexec | 26 - ...12.32.00.convert-to-video-src-b2.js.noexec | 98 - ....000Z.migrate-tags-to-tag-vod-relations.js | 43 - .../2023.05.15T02.44.00.000Z.drop-vod-tags.js | 12 - .../2023.05.25-gimme-the-tags.js.noexec | 110 - ...023.05.25T20.44.00.000Z.get-the-og-tags.js | 124 - .../2023.07.17.relate-vods-to-vtubers.js | 70 - .../2023.07.31.add-b2-file-cdnUrl.js | 18 - .../2024-01-08-add-streams.js.noexec | 30 - .../2024-01-14-add-date2-to-streams.js | 29 - .../2024-01-15-add-platform-to-streams.js | 49 - packages/strapi-borked/database/og-tags.json | 1009 -- packages/strapi-borked/favicon.png | Bin 497 -> 0 bytes .../misc/2023-05-26-export-og-tags.js | 202 - packages/strapi-borked/misc/generateCuid.js | 7 - packages/strapi-borked/package.json | 84 - packages/strapi-borked/pnpm-lock.yaml | 14978 ---------------- packages/strapi-borked/public/robots.txt | 3 - .../strapi-borked/public/uploads/.gitkeep | 0 .../strapi-borked/src/admin/app.example.js | 39 - .../src/admin/webpack.config.example.js | 9 - packages/strapi-borked/src/api/.gitkeep | 0 .../b2-file/content-types/b2-file/schema.json | 36 - .../src/api/b2-file/controllers/b2-file.js | 9 - .../src/api/b2-file/routes/b2-file.js | 9 - .../src/api/b2-file/services/b2-file.js | 9 - .../content-types/contributor/schema.json | 30 - .../contributor/controllers/contributor.js | 9 - .../src/api/contributor/routes/contributor.js | 9 - .../api/contributor/services/contributor.js | 9 - .../discord-interaction/schema.json | 26 - .../controllers/discord-interaction.js | 9 - .../routes/discord-interaction.js | 9 - .../services/discord-interaction.js | 9 - .../api/goal/content-types/goal/schema.json | 30 - .../src/api/goal/controllers/goal.js | 9 - .../strapi-borked/src/api/goal/routes/goal.js | 9 - .../src/api/goal/services/goal.js | 11 - .../api/gogs/content-types/gogs/schema.json | 24 - .../src/api/gogs/controllers/gogs.js | 29 - .../strapi-borked/src/api/gogs/routes/gogs.js | 34 - .../src/api/gogs/services/gogs.js | 42 - .../api/issue/content-types/issue/schema.json | 36 - .../src/api/issue/controllers/issue.js | 9 - .../src/api/issue/routes/issue.js | 9 - .../src/api/issue/services/issue.js | 9 - .../content-types/mux-asset/schema.json | 28 - .../api/mux-asset/controllers/mux-asset.js | 56 - .../src/api/mux-asset/routes/mux-asset.js | 33 - .../src/api/mux-asset/services/mux-asset.js | 78 - .../patreon/content-types/patreon/schema.json | 39 - .../src/api/patreon/controllers/patreon.js | 37 - .../src/api/patreon/routes/patreon.js | 37 - .../src/api/patreon/services/patreon.js | 45 - .../platform-notification/schema.json | 56 - .../controllers/platform-notification.js | 9 - .../routes/platform-notification.js | 9 - .../services/platform-notification.js | 9 - .../src/api/profile/controllers/profile.js | 21 - .../src/api/profile/routes/profile.js | 23 - .../src/api/profile/services/profile.js | 7 - .../stream/content-types/stream/lifecycles.js | 119 - .../stream/content-types/stream/schema.json | 79 - .../src/api/stream/controllers/stream.js | 9 - .../src/api/stream/routes/stream.js | 9 - .../src/api/stream/services/stream.js | 9 - .../tag-vod-relation/schema.json | 39 - .../controllers/tag-vod-relation.js | 222 - .../routes/tag-vod-relation.js | 51 - .../services/tag-vod-relation.js | 69 - .../src/api/tag/content-types/tag/schema.json | 38 - .../src/api/tag/controllers/tag.js | 87 - .../strapi-borked/src/api/tag/routes/tag.js | 37 - .../strapi-borked/src/api/tag/services/tag.js | 46 - .../content-types/timestamp/schema.json | 47 - .../api/timestamp/controllers/timestamp.js | 166 - .../src/api/timestamp/routes/timestamp.js | 53 - .../src/api/timestamp/services/timestamp.js | 44 - .../src/api/toy/content-types/toy/schema.json | 51 - .../src/api/toy/controllers/toy.js | 9 - .../strapi-borked/src/api/toy/routes/toy.js | 9 - .../strapi-borked/src/api/toy/services/toy.js | 9 - .../tweet/content-types/tweet/lifecycles.js | 136 - .../api/tweet/content-types/tweet/schema.json | 49 - .../src/api/tweet/controllers/tweet.js | 9 - .../src/api/tweet/routes/tweet.js | 9 - .../src/api/tweet/services/tweet.js | 9 - .../user-submitted-content/lifecycles.js | 57 - .../user-submitted-content/schema.json | 57 - .../controllers/user-submitted-content.js | 64 - .../routes/user-submitted-content.js | 33 - .../services/user-submitted-content.js | 9 - .../src/api/vod/content-types/lifecycles.js | 25 - .../src/api/vod/content-types/vod/schema.json | 142 - .../src/api/vod/controllers/vod.js | 85 - .../strapi-borked/src/api/vod/routes/vod.js | 38 - .../strapi-borked/src/api/vod/services/vod.js | 9 - .../vtuber/content-types/vtuber/lifecycles.js | 23 - .../vtuber/content-types/vtuber/schema.json | 127 - .../src/api/vtuber/controllers/vtuber.js | 9 - .../src/api/vtuber/routes/vtuber.js | 9 - .../src/api/vtuber/services/vtuber.js | 9 - .../strapi-borked/src/extensions/.gitkeep | 0 .../users-permissions/.eslintignore | 2 - .../extensions/users-permissions/.eslintrc.js | 14 - .../src/extensions/users-permissions/LICENSE | 22 - .../extensions/users-permissions/README.md | 1 - .../components/BoundRoute/getMethodColor.js | 41 - .../admin/src/components/BoundRoute/index.js | 72 - .../src/components/FormModal/Input/index.js | 123 - .../admin/src/components/FormModal/index.js | 126 - .../PermissionRow/CheckboxWrapper.js | 30 - .../Permissions/PermissionRow/SubCategory.js | 131 - .../Permissions/PermissionRow/index.js | 55 - .../admin/src/components/Permissions/index.js | 57 - .../admin/src/components/Permissions/init.js | 9 - .../src/components/Permissions/reducer.js | 27 - .../admin/src/components/Policies/index.js | 62 - .../src/components/UsersPermissions/index.js | 95 - .../src/components/UsersPermissions/init.js | 10 - .../components/UsersPermissions/reducer.js | 62 - .../contexts/UsersPermissionsContext/index.js | 18 - .../admin/src/hooks/index.js | 5 - .../admin/src/hooks/useFetchRole/index.js | 67 - .../admin/src/hooks/useFetchRole/reducer.js | 31 - .../admin/src/hooks/useForm/index.js | 70 - .../admin/src/hooks/useForm/reducer.js | 40 - .../admin/src/hooks/usePlugins.js | 71 - .../admin/src/hooks/useRolesList/index.js | 65 - .../admin/src/hooks/useRolesList/init.js | 5 - .../admin/src/hooks/useRolesList/reducer.js | 31 - .../users-permissions/admin/src/index.js | 125 - .../admin/src/pages/AdvancedSettings/index.js | 246 - .../src/pages/AdvancedSettings/utils/api.js | 18 - .../pages/AdvancedSettings/utils/layout.js | 96 - .../pages/AdvancedSettings/utils/schema.js | 19 - .../EmailTemplates/components/EmailForm.js | 176 - .../EmailTemplates/components/EmailTable.js | 128 - .../admin/src/pages/EmailTemplates/index.js | 163 - .../src/pages/EmailTemplates/utils/api.js | 18 - .../src/pages/EmailTemplates/utils/schema.js | 22 - .../admin/src/pages/Providers/index.js | 275 - .../admin/src/pages/Providers/reducer.js | 54 - .../admin/src/pages/Providers/utils/api.js | 26 - .../Providers/utils/createProvidersArray.js | 21 - .../admin/src/pages/Providers/utils/forms.js | 259 - .../admin/src/pages/Roles/CreatePage.js | 185 - .../admin/src/pages/Roles/EditPage.js | 197 - .../Roles/ListPage/components/TableBody.js | 93 - .../admin/src/pages/Roles/ListPage/index.js | 243 - .../src/pages/Roles/ListPage/utils/api.js | 32 - .../src/pages/Roles/ProtectedCreatePage.js | 15 - .../src/pages/Roles/ProtectedEditPage.js | 15 - .../src/pages/Roles/ProtectedListPage.js | 17 - .../admin/src/pages/Roles/constants.js | 7 - .../admin/src/pages/Roles/index.js | 30 - .../admin/src/permissions.js | 31 - .../users-permissions/admin/src/pluginId.js | 5 - .../admin/src/translations/ar.json | 40 - .../admin/src/translations/cs.json | 46 - .../admin/src/translations/de.json | 58 - .../admin/src/translations/dk.json | 82 - .../admin/src/translations/en.json | 82 - .../admin/src/translations/es.json | 82 - .../admin/src/translations/fr.json | 46 - .../admin/src/translations/id.json | 58 - .../admin/src/translations/it.json | 58 - .../admin/src/translations/ja.json | 44 - .../admin/src/translations/ko.json | 82 - .../admin/src/translations/ms.json | 45 - .../admin/src/translations/nl.json | 44 - .../admin/src/translations/pl.json | 82 - .../admin/src/translations/pt-BR.json | 40 - .../admin/src/translations/pt.json | 44 - .../admin/src/translations/ru.json | 82 - .../admin/src/translations/sk.json | 46 - .../admin/src/translations/sv.json | 82 - .../admin/src/translations/th.json | 56 - .../admin/src/translations/tr.json | 81 - .../admin/src/translations/uk.json | 45 - .../admin/src/translations/vi.json | 46 - .../admin/src/translations/zh-Hans.json | 82 - .../admin/src/translations/zh.json | 82 - .../admin/src/utils/cleanPermissions.js | 25 - .../admin/src/utils/formatPluginName.js | 26 - .../admin/src/utils/formatPolicies.js | 8 - .../admin/src/utils/getRequestURL.js | 5 - .../admin/src/utils/getTrad.js | 5 - .../admin/src/utils/index.js | 4 - .../content-types/user/schema.json | 88 - .../documentation/content-api.yaml | 878 - .../users-permissions/jest.config.front.js | 7 - .../extensions/users-permissions/package.json | 81 - .../server/bootstrap/grant-config.js | 131 - .../server/bootstrap/index.js | 133 - .../bootstrap/users-permissions-actions.js | 80 - .../users-permissions/server/config.js | 23 - .../server/content-types/index.js | 11 - .../server/content-types/permission/index.js | 34 - .../server/content-types/role/index.js | 51 - .../server/content-types/user/index.js | 75 - .../content-types/user/schema-config.js | 15 - .../server/controllers/auth.js | 416 - .../controllers/content-manager-user.js | 178 - .../server/controllers/index.js | 17 - .../server/controllers/permissions.js | 26 - .../server/controllers/role.js | 77 - .../server/controllers/settings.js | 85 - .../server/controllers/user.js | 209 - .../server/controllers/validation/auth.js | 57 - .../controllers/validation/email-template.js | 74 - .../server/controllers/validation/user.js | 59 - .../users-permissions/server/graphql/index.js | 44 - .../graphql/mutations/auth/change-password.js | 38 - .../mutations/auth/email-confirmation.js | 39 - .../graphql/mutations/auth/forgot-password.js | 35 - .../server/graphql/mutations/auth/login.js | 35 - .../server/graphql/mutations/auth/register.js | 36 - .../graphql/mutations/auth/reset-password.js | 38 - .../mutations/crud/role/create-role.js | 34 - .../mutations/crud/role/delete-role.js | 25 - .../mutations/crud/role/update-role.js | 35 - .../mutations/crud/user/create-user.js | 45 - .../mutations/crud/user/delete-user.js | 39 - .../mutations/crud/user/update-user.js | 46 - .../server/graphql/mutations/index.js | 43 - .../server/graphql/queries/index.js | 13 - .../server/graphql/queries/me.js | 17 - .../server/graphql/resolvers-configs.js | 42 - .../graphql/types/create-role-payload.js | 11 - .../graphql/types/delete-role-payload.js | 11 - .../server/graphql/types/index.js | 21 - .../server/graphql/types/login-input.js | 13 - .../server/graphql/types/login-payload.js | 12 - .../server/graphql/types/me-role.js | 14 - .../server/graphql/types/me.js | 16 - .../server/graphql/types/password-payload.js | 11 - .../server/graphql/types/register-input.js | 13 - .../graphql/types/update-role-payload.js | 11 - .../users-permissions/server/graphql/utils.js | 27 - .../users-permissions/server/index.js | 21 - .../server/middlewares/index.js | 7 - .../server/middlewares/rateLimit.js | 27 - .../users-permissions/server/register.js | 29 - .../server/routes/admin/index.js | 10 - .../server/routes/admin/permissions.js | 20 - .../server/routes/admin/role.js | 79 - .../server/routes/admin/settings.js | 95 - .../server/routes/content-api/auth.js | 82 - .../server/routes/content-api/index.js | 11 - .../server/routes/content-api/permissions.js | 9 - .../server/routes/content-api/role.js | 29 - .../server/routes/content-api/user.js | 60 - .../users-permissions/server/routes/index.js | 6 - .../server/services/index.js | 19 - .../users-permissions/server/services/jwt.js | 79 - .../server/services/permission.js | 45 - .../server/services/providers-registry.js | 382 - .../server/services/providers.js | 156 - .../users-permissions/server/services/role.js | 177 - .../users-permissions/server/services/user.js | 148 - .../server/services/users-permissions.js | 249 - .../server/strategies/users-permissions.js | 114 - .../users-permissions/server/utils/index.d.ts | 18 - .../users-permissions/server/utils/index.js | 12 - .../server/utils/sanitize/index.js | 9 - .../server/utils/sanitize/sanitizers.js | 19 - .../server/utils/sanitize/visitors/index.js | 5 - ...remove-user-relation-from-role-entities.js | 11 - .../users-permissions/strapi-admin.js | 3 - .../users-permissions/strapi-server.js | 12 - packages/strapi-borked/src/index.js | 80 - .../src/policies/updateOwnerOnly.js | 34 - packages/strapi/.strapi/client/app.js | 8 +- packages/strapi/package.json | 2 +- packages/taco/index.js | 5 + packages/taco/package.json | 13 + packages/taco/pnpm-lock.yaml | 9 + packages/temporal-worker/.eslintignore | 1 + .../lib/temporal-worker/worker.d.ts | 2 + .../lib/temporal-worker/worker.d.ts.map | 1 + .../lib/temporal-worker/worker.js | 49 + .../lib/temporal-worker/worker.js.map | 1 + .../src/all-activities.d.ts | 4 + .../src/all-activities.d.ts.map | 1 + .../temporal-workflows/src/all-activities.js | 20 + .../src/all-activities.js.map | 1 + .../src/workflowA/activities/activitiesA.d.ts | 2 + .../workflowA/activities/activitiesA.d.ts.map | 1 + .../src/workflowA/activities/activitiesA.js | 9 + .../workflowA/activities/activitiesA.js.map | 1 + .../src/workflowA/activities/activitiesB.d.ts | 2 + .../workflowA/activities/activitiesB.d.ts.map | 1 + .../src/workflowA/activities/activitiesB.js | 9 + .../workflowA/activities/activitiesB.js.map | 1 + .../src/workflowB/activities.d.ts | 3 + .../src/workflowB/activities.d.ts.map | 1 + .../src/workflowB/activities.js | 14 + .../src/workflowB/activities.js.map | 1 + packages/temporal-worker/lib/worker.d.ts | 2 + packages/temporal-worker/lib/worker.d.ts.map | 1 + packages/temporal-worker/lib/worker.js | 49 + packages/temporal-worker/lib/worker.js.map | 1 + packages/temporal-worker/package.json | 21 + packages/temporal-worker/pnpm-lock.yaml | 1638 ++ packages/temporal-worker/tsconfig.json | 11 + packages/temporal-worker/worker.ts | 28 + packages/temporal-workflows/.eslintignore | 1 + packages/temporal-workflows/.gitignore | 1 + packages/temporal-workflows/README.md | 5 + packages/temporal-workflows/package.json | 30 + packages/temporal-workflows/pnpm-lock.yaml | 1684 ++ .../temporal-workflows/src/all-activities.ts | 3 + .../temporal-workflows/src/all-workflows.ts | 2 + .../activities/upsertPlatformNotification.ts | 60 + .../activities/upsertStream.ts | 139 + .../activities/upsertVtuber.ts | 124 + .../src/processNotifEmail/workflow.ts | 23 + .../src/temporal.old/README.md | 1 + .../src/temporal.old/activities.ts.noexec | 121 + .../src/temporal.old/worker.ts.noexec} | 0 .../src/temporal.old/workflows.ts.noexec} | 11 +- .../src/workflowA/activities/activitiesA.ts | 6 + .../src/workflowA/activities/activitiesB.ts | 6 + .../src/workflowA/workflow.ts | 19 + .../src/workflowB/activities.ts | 11 + .../src/workflowB/workflow.ts | 15 + packages/temporal-workflows/tsconfig.json | 30 + packages/types/.eslintignore | 1 + packages/types/.gitignore | 1 + packages/types/index.d.ts | 128 + packages/types/package.json | 18 + packages/types/pnpm-lock.yaml | 32 + packages/types/tsconfig.json | 13 + packages/utils/.mocharc.json | 5 + packages/utils/index.spec.ts | 25 + packages/utils/index.ts | 65 + packages/utils/package.json | 25 + packages/utils/pnpm-lock.yaml | 801 + packages/utils/tsconfig.json | 30 + scripts/k8s-secrets.sh | 12 + scripts/kind-load.sh | 16 + scripts/kind-with-local-registry.sh | 2 +- scripts/postgres-create.sh | 15 +- 458 files changed, 11511 insertions(+), 34015 deletions(-) create mode 100644 charts/fp/templates/boop.yaml create mode 100644 charts/fp/templates/bot.yaml delete mode 100644 charts/fp/values-prod.yaml rename charts/fp/{values-dev.yaml => values.yaml} (77%) create mode 100644 charts/trigger/.gitignore create mode 100644 charts/trigger/.helmignore create mode 100644 charts/trigger/Chart.lock create mode 100644 charts/trigger/Chart.yaml create mode 100644 charts/trigger/README.md create mode 100644 charts/trigger/package-lock.json create mode 100644 charts/trigger/package.json create mode 100644 charts/trigger/templates/_helpers.tpl create mode 100644 charts/trigger/templates/ingress.yaml create mode 100644 charts/trigger/templates/trigger.yaml create mode 100644 charts/trigger/values.yaml delete mode 100644 d.bot.dockerfile create mode 100644 packages/archive/.npmrc create mode 100644 packages/archive/README.md create mode 100644 packages/archive/node.d.ts create mode 100644 packages/archive/package.json create mode 100644 packages/archive/pnpm-lock.yaml create mode 100644 packages/archive/src/generateThumbnail.ts rename packages/{scout => archive}/src/temporal/activities.ts (100%) create mode 100644 packages/archive/tsconfig.json create mode 100644 packages/boop/index.ts create mode 100644 packages/boop/package.json create mode 100644 packages/boop/pnpm-lock.yaml delete mode 100644 packages/bot/.gitignore delete mode 100644 packages/bot/.npmrc delete mode 100644 packages/bot/.nvmrc delete mode 100644 packages/bot/Dockerfile delete mode 100644 packages/bot/components.js delete mode 100644 packages/bot/embeds.js delete mode 100644 packages/bot/futurebutt.js create mode 100644 packages/bot/index.js delete mode 100644 packages/bot/interactions.js delete mode 100644 packages/bot/src/configs.ts delete mode 100644 packages/bot/src/index.ts delete mode 100644 packages/bot/src/rest/README.md delete mode 100644 packages/bot/tsconfig.json create mode 100644 packages/image/.mocharc.json rename packages/{scout/src/image.spec.js => image/index.spec.ts} (82%) create mode 100644 packages/image/index.ts create mode 100644 packages/image/package.json create mode 100644 packages/image/pnpm-lock.yaml create mode 100644 packages/image/tsconfig.json delete mode 100644 packages/next/app/lib/types.ts delete mode 100644 packages/scout/src/image.js delete mode 100644 packages/scout/src/s3.js rename packages/scout/src/{ua.js => ua.ts} (100%) create mode 100644 packages/storage/.mocharc.json create mode 100644 packages/storage/package.json create mode 100644 packages/storage/pnpm-lock.yaml rename packages/{strapi-borked/database/migrations/.gitkeep => storage/src/mux.ts} (100%) rename packages/{scout/src/s3.spec.js => storage/src/s3.spec.ts} (100%) create mode 100644 packages/storage/src/s3.ts create mode 100644 packages/storage/tsconfig.json delete mode 100644 packages/strapi-borked/.dockerignore delete mode 100644 packages/strapi-borked/.gitignore delete mode 100644 packages/strapi-borked/.npmrc delete mode 100644 packages/strapi-borked/.strapi/client/app.js delete mode 100644 packages/strapi-borked/.strapi/client/index.html delete mode 100644 packages/strapi-borked/README.md delete mode 100644 packages/strapi-borked/backup/Dockerfile.1704607848934 delete mode 100644 packages/strapi-borked/config/admin.js delete mode 100644 packages/strapi-borked/config/api.js delete mode 100644 packages/strapi-borked/config/database.js delete mode 100644 packages/strapi-borked/config/middlewares.js delete mode 100644 packages/strapi-borked/config/plugins.js delete mode 100644 packages/strapi-borked/config/server.js delete mode 100644 packages/strapi-borked/database/daily-backup.sh delete mode 100755 packages/strapi-borked/database/devDb.sh delete mode 100644 packages/strapi-borked/database/migrations/2023-08-01-relate-vods-to-vtubers-part2.js delete mode 100644 packages/strapi-borked/database/migrations/2023-08-17-reformat-cdnUrl.js delete mode 100644 packages/strapi-borked/database/migrations/2023-08-20-strip-query-string-from-cid.js delete mode 100644 packages/strapi-borked/database/migrations/2023-08-30-remove-cloudinary.js delete mode 100644 packages/strapi-borked/database/migrations/2023-08-30-toy-image-field-simplify.js delete mode 100644 packages/strapi-borked/database/migrations/2023-09-08-change-date-to-string.js delete mode 100644 packages/strapi-borked/database/migrations/2023-09-08-drop-toys-image.js delete mode 100644 packages/strapi-borked/database/migrations/2023-09-08-drop-vod-videosrc.js delete mode 100644 packages/strapi-borked/database/migrations/2023-12-24-add-cuid-to-vods.js delete mode 100644 packages/strapi-borked/database/migrations/2023-12-26-add-cuid-to-streams.js delete mode 100644 packages/strapi-borked/database/migrations/2023-12-27-relate-vods-to-streams.js delete mode 100644 packages/strapi-borked/database/migrations/2023.05.09-video-src-sanity.js.noexec delete mode 100644 packages/strapi-borked/database/migrations/2023.05.11T12.32.00.convert-to-video-src-b2.js.noexec delete mode 100644 packages/strapi-borked/database/migrations/2023.05.14T00.42.00.000Z.migrate-tags-to-tag-vod-relations.js delete mode 100644 packages/strapi-borked/database/migrations/2023.05.15T02.44.00.000Z.drop-vod-tags.js delete mode 100644 packages/strapi-borked/database/migrations/2023.05.25-gimme-the-tags.js.noexec delete mode 100644 packages/strapi-borked/database/migrations/2023.05.25T20.44.00.000Z.get-the-og-tags.js delete mode 100644 packages/strapi-borked/database/migrations/2023.07.17.relate-vods-to-vtubers.js delete mode 100644 packages/strapi-borked/database/migrations/2023.07.31.add-b2-file-cdnUrl.js delete mode 100644 packages/strapi-borked/database/migrations/2024-01-08-add-streams.js.noexec delete mode 100644 packages/strapi-borked/database/migrations/2024-01-14-add-date2-to-streams.js delete mode 100644 packages/strapi-borked/database/migrations/2024-01-15-add-platform-to-streams.js delete mode 100644 packages/strapi-borked/database/og-tags.json delete mode 100644 packages/strapi-borked/favicon.png delete mode 100644 packages/strapi-borked/misc/2023-05-26-export-og-tags.js delete mode 100644 packages/strapi-borked/misc/generateCuid.js delete mode 100644 packages/strapi-borked/package.json delete mode 100644 packages/strapi-borked/pnpm-lock.yaml delete mode 100644 packages/strapi-borked/public/robots.txt delete mode 100644 packages/strapi-borked/public/uploads/.gitkeep delete mode 100644 packages/strapi-borked/src/admin/app.example.js delete mode 100644 packages/strapi-borked/src/admin/webpack.config.example.js delete mode 100644 packages/strapi-borked/src/api/.gitkeep delete mode 100644 packages/strapi-borked/src/api/b2-file/content-types/b2-file/schema.json delete mode 100644 packages/strapi-borked/src/api/b2-file/controllers/b2-file.js delete mode 100644 packages/strapi-borked/src/api/b2-file/routes/b2-file.js delete mode 100644 packages/strapi-borked/src/api/b2-file/services/b2-file.js delete mode 100644 packages/strapi-borked/src/api/contributor/content-types/contributor/schema.json delete mode 100644 packages/strapi-borked/src/api/contributor/controllers/contributor.js delete mode 100644 packages/strapi-borked/src/api/contributor/routes/contributor.js delete mode 100644 packages/strapi-borked/src/api/contributor/services/contributor.js delete mode 100644 packages/strapi-borked/src/api/discord-interaction/content-types/discord-interaction/schema.json delete mode 100644 packages/strapi-borked/src/api/discord-interaction/controllers/discord-interaction.js delete mode 100644 packages/strapi-borked/src/api/discord-interaction/routes/discord-interaction.js delete mode 100644 packages/strapi-borked/src/api/discord-interaction/services/discord-interaction.js delete mode 100644 packages/strapi-borked/src/api/goal/content-types/goal/schema.json delete mode 100644 packages/strapi-borked/src/api/goal/controllers/goal.js delete mode 100644 packages/strapi-borked/src/api/goal/routes/goal.js delete mode 100644 packages/strapi-borked/src/api/goal/services/goal.js delete mode 100644 packages/strapi-borked/src/api/gogs/content-types/gogs/schema.json delete mode 100644 packages/strapi-borked/src/api/gogs/controllers/gogs.js delete mode 100644 packages/strapi-borked/src/api/gogs/routes/gogs.js delete mode 100644 packages/strapi-borked/src/api/gogs/services/gogs.js delete mode 100644 packages/strapi-borked/src/api/issue/content-types/issue/schema.json delete mode 100644 packages/strapi-borked/src/api/issue/controllers/issue.js delete mode 100644 packages/strapi-borked/src/api/issue/routes/issue.js delete mode 100644 packages/strapi-borked/src/api/issue/services/issue.js delete mode 100644 packages/strapi-borked/src/api/mux-asset/content-types/mux-asset/schema.json delete mode 100644 packages/strapi-borked/src/api/mux-asset/controllers/mux-asset.js delete mode 100644 packages/strapi-borked/src/api/mux-asset/routes/mux-asset.js delete mode 100644 packages/strapi-borked/src/api/mux-asset/services/mux-asset.js delete mode 100644 packages/strapi-borked/src/api/patreon/content-types/patreon/schema.json delete mode 100644 packages/strapi-borked/src/api/patreon/controllers/patreon.js delete mode 100644 packages/strapi-borked/src/api/patreon/routes/patreon.js delete mode 100644 packages/strapi-borked/src/api/patreon/services/patreon.js delete mode 100644 packages/strapi-borked/src/api/platform-notification/content-types/platform-notification/schema.json delete mode 100644 packages/strapi-borked/src/api/platform-notification/controllers/platform-notification.js delete mode 100644 packages/strapi-borked/src/api/platform-notification/routes/platform-notification.js delete mode 100644 packages/strapi-borked/src/api/platform-notification/services/platform-notification.js delete mode 100644 packages/strapi-borked/src/api/profile/controllers/profile.js delete mode 100644 packages/strapi-borked/src/api/profile/routes/profile.js delete mode 100644 packages/strapi-borked/src/api/profile/services/profile.js delete mode 100644 packages/strapi-borked/src/api/stream/content-types/stream/lifecycles.js delete mode 100644 packages/strapi-borked/src/api/stream/content-types/stream/schema.json delete mode 100644 packages/strapi-borked/src/api/stream/controllers/stream.js delete mode 100644 packages/strapi-borked/src/api/stream/routes/stream.js delete mode 100644 packages/strapi-borked/src/api/stream/services/stream.js delete mode 100644 packages/strapi-borked/src/api/tag-vod-relation/content-types/tag-vod-relation/schema.json delete mode 100644 packages/strapi-borked/src/api/tag-vod-relation/controllers/tag-vod-relation.js delete mode 100644 packages/strapi-borked/src/api/tag-vod-relation/routes/tag-vod-relation.js delete mode 100644 packages/strapi-borked/src/api/tag-vod-relation/services/tag-vod-relation.js delete mode 100644 packages/strapi-borked/src/api/tag/content-types/tag/schema.json delete mode 100644 packages/strapi-borked/src/api/tag/controllers/tag.js delete mode 100644 packages/strapi-borked/src/api/tag/routes/tag.js delete mode 100644 packages/strapi-borked/src/api/tag/services/tag.js delete mode 100644 packages/strapi-borked/src/api/timestamp/content-types/timestamp/schema.json delete mode 100644 packages/strapi-borked/src/api/timestamp/controllers/timestamp.js delete mode 100644 packages/strapi-borked/src/api/timestamp/routes/timestamp.js delete mode 100644 packages/strapi-borked/src/api/timestamp/services/timestamp.js delete mode 100644 packages/strapi-borked/src/api/toy/content-types/toy/schema.json delete mode 100644 packages/strapi-borked/src/api/toy/controllers/toy.js delete mode 100644 packages/strapi-borked/src/api/toy/routes/toy.js delete mode 100644 packages/strapi-borked/src/api/toy/services/toy.js delete mode 100644 packages/strapi-borked/src/api/tweet/content-types/tweet/lifecycles.js delete mode 100644 packages/strapi-borked/src/api/tweet/content-types/tweet/schema.json delete mode 100644 packages/strapi-borked/src/api/tweet/controllers/tweet.js delete mode 100644 packages/strapi-borked/src/api/tweet/routes/tweet.js delete mode 100644 packages/strapi-borked/src/api/tweet/services/tweet.js delete mode 100644 packages/strapi-borked/src/api/user-submitted-content/content-types/user-submitted-content/lifecycles.js delete mode 100644 packages/strapi-borked/src/api/user-submitted-content/content-types/user-submitted-content/schema.json delete mode 100644 packages/strapi-borked/src/api/user-submitted-content/controllers/user-submitted-content.js delete mode 100644 packages/strapi-borked/src/api/user-submitted-content/routes/user-submitted-content.js delete mode 100644 packages/strapi-borked/src/api/user-submitted-content/services/user-submitted-content.js delete mode 100644 packages/strapi-borked/src/api/vod/content-types/lifecycles.js delete mode 100644 packages/strapi-borked/src/api/vod/content-types/vod/schema.json delete mode 100644 packages/strapi-borked/src/api/vod/controllers/vod.js delete mode 100644 packages/strapi-borked/src/api/vod/routes/vod.js delete mode 100644 packages/strapi-borked/src/api/vod/services/vod.js delete mode 100644 packages/strapi-borked/src/api/vtuber/content-types/vtuber/lifecycles.js delete mode 100644 packages/strapi-borked/src/api/vtuber/content-types/vtuber/schema.json delete mode 100644 packages/strapi-borked/src/api/vtuber/controllers/vtuber.js delete mode 100644 packages/strapi-borked/src/api/vtuber/routes/vtuber.js delete mode 100644 packages/strapi-borked/src/api/vtuber/services/vtuber.js delete mode 100644 packages/strapi-borked/src/extensions/.gitkeep delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/.eslintignore delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/.eslintrc.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/LICENSE delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/README.md delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/BoundRoute/getMethodColor.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/BoundRoute/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/FormModal/Input/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/FormModal/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/init.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Policies/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/init.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/usePlugins.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/init.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/layout.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/utils/api.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/utils/schema.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Providers/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Providers/reducer.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Providers/utils/api.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Providers/utils/createProvidersArray.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Providers/utils/forms.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/CreatePage.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/EditPage.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ListPage/components/TableBody.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ListPage/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ProtectedCreatePage.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ProtectedEditPage.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/ProtectedListPage.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/constants.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/Roles/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/pluginId.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/ar.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/cs.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/de.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/dk.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/en.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/es.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/fr.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/id.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/it.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/ja.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/ko.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/ms.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/nl.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/pl.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/pt-BR.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/pt.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/ru.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/sk.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/sv.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/th.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/tr.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/uk.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/vi.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/zh-Hans.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/translations/zh.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/cleanPermissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/formatPluginName.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/formatPolicies.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/getRequestURL.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/getTrad.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/admin/src/utils/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/content-types/user/schema.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/documentation/content-api.yaml delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/jest.config.front.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/package.json delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/bootstrap/grant-config.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/bootstrap/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/bootstrap/users-permissions-actions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/config.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/content-types/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/content-types/permission/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/content-types/role/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/content-types/user/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/content-types/user/schema-config.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/auth.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/content-manager-user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/settings.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/validation/auth.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/validation/email-template.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/controllers/validation/user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/change-password.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/email-confirmation.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/forgot-password.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/login.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/register.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/auth/reset-password.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/role/create-role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/role/delete-role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/role/update-role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/user/create-user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/user/delete-user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/crud/user/update-user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/mutations/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/queries/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/queries/me.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/resolvers-configs.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/create-role-payload.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/delete-role-payload.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/login-input.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/login-payload.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/me-role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/me.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/password-payload.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/register-input.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/types/update-role-payload.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/graphql/utils.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/middlewares/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/middlewares/rateLimit.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/register.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/admin/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/admin/permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/admin/role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/admin/settings.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/content-api/auth.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/content-api/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/content-api/permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/content-api/role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/content-api/user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/routes/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/jwt.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/permission.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/providers-registry.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/providers.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/role.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/user.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/services/users-permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/strategies/users-permissions.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/index.d.ts delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/sanitize/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/sanitize/sanitizers.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/sanitize/visitors/index.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/strapi-admin.js delete mode 100644 packages/strapi-borked/src/extensions/users-permissions/strapi-server.js delete mode 100644 packages/strapi-borked/src/index.js delete mode 100644 packages/strapi-borked/src/policies/updateOwnerOnly.js create mode 100644 packages/taco/index.js create mode 100644 packages/taco/package.json create mode 100644 packages/taco/pnpm-lock.yaml create mode 100644 packages/temporal-worker/.eslintignore create mode 100644 packages/temporal-worker/lib/temporal-worker/worker.d.ts create mode 100644 packages/temporal-worker/lib/temporal-worker/worker.d.ts.map create mode 100644 packages/temporal-worker/lib/temporal-worker/worker.js create mode 100644 packages/temporal-worker/lib/temporal-worker/worker.js.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/all-activities.d.ts create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/all-activities.d.ts.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/all-activities.js create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/all-activities.js.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesA.d.ts create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesA.d.ts.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesA.js create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesA.js.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesB.d.ts create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesB.d.ts.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesB.js create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowA/activities/activitiesB.js.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowB/activities.d.ts create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowB/activities.d.ts.map create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowB/activities.js create mode 100644 packages/temporal-worker/lib/temporal-workflows/src/workflowB/activities.js.map create mode 100644 packages/temporal-worker/lib/worker.d.ts create mode 100644 packages/temporal-worker/lib/worker.d.ts.map create mode 100644 packages/temporal-worker/lib/worker.js create mode 100644 packages/temporal-worker/lib/worker.js.map create mode 100644 packages/temporal-worker/package.json create mode 100644 packages/temporal-worker/pnpm-lock.yaml create mode 100644 packages/temporal-worker/tsconfig.json create mode 100644 packages/temporal-worker/worker.ts create mode 100644 packages/temporal-workflows/.eslintignore create mode 100644 packages/temporal-workflows/.gitignore create mode 100644 packages/temporal-workflows/README.md create mode 100644 packages/temporal-workflows/package.json create mode 100644 packages/temporal-workflows/pnpm-lock.yaml create mode 100644 packages/temporal-workflows/src/all-activities.ts create mode 100644 packages/temporal-workflows/src/all-workflows.ts create mode 100644 packages/temporal-workflows/src/processNotifEmail/activities/upsertPlatformNotification.ts create mode 100644 packages/temporal-workflows/src/processNotifEmail/activities/upsertStream.ts create mode 100644 packages/temporal-workflows/src/processNotifEmail/activities/upsertVtuber.ts create mode 100644 packages/temporal-workflows/src/processNotifEmail/workflow.ts create mode 100644 packages/temporal-workflows/src/temporal.old/README.md create mode 100644 packages/temporal-workflows/src/temporal.old/activities.ts.noexec rename packages/{scout/src/temporal/worker.ts => temporal-workflows/src/temporal.old/worker.ts.noexec} (100%) rename packages/{scout/src/temporal/workflows.ts => temporal-workflows/src/temporal.old/workflows.ts.noexec} (90%) create mode 100644 packages/temporal-workflows/src/workflowA/activities/activitiesA.ts create mode 100644 packages/temporal-workflows/src/workflowA/activities/activitiesB.ts create mode 100644 packages/temporal-workflows/src/workflowA/workflow.ts create mode 100644 packages/temporal-workflows/src/workflowB/activities.ts create mode 100644 packages/temporal-workflows/src/workflowB/workflow.ts create mode 100644 packages/temporal-workflows/tsconfig.json create mode 100644 packages/types/.eslintignore create mode 100644 packages/types/.gitignore create mode 100644 packages/types/index.d.ts create mode 100644 packages/types/package.json create mode 100644 packages/types/pnpm-lock.yaml create mode 100644 packages/types/tsconfig.json create mode 100644 packages/utils/.mocharc.json create mode 100644 packages/utils/index.spec.ts create mode 100644 packages/utils/index.ts create mode 100644 packages/utils/package.json create mode 100644 packages/utils/pnpm-lock.yaml create mode 100644 packages/utils/tsconfig.json create mode 100755 scripts/kind-load.sh diff --git a/Makefile b/Makefile index a9a877f..1b1c2a5 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ namespaces: ./scripts/k8s-namespaces.sh secrets: - dotenvx run -f .env.$(ENV) -- ./scripts/k8s-secrets.sh + dotenvx run -f .env.${ENV} -- ./scripts/k8s-secrets.sh flux: ./scripts/flux-bootstrap.sh @@ -31,6 +31,9 @@ exoscale: kind: ./scripts/kind-with-local-registry.sh +kindload: + ./scripts/kind-load.sh + chisel: ./scripts/k8s-chisel-operator.sh diff --git a/Tiltfile b/Tiltfile index 7364768..15b5878 100644 --- a/Tiltfile +++ b/Tiltfile @@ -1,4 +1,9 @@ -# Tiltfile for working with Next and Strapi locally +## Tiltfile for working with Futureporn cluster locally + + +secret_settings( + disable_scrub=True +) ## cert-manager slows down Tilt updates so I prefer to keep it commented unless I specifically need to test certs load('ext://cert_manager', 'deploy_cert_manager') @@ -7,13 +12,10 @@ deploy_cert_manager( version='v1.15.1', ) - -default_registry('localhost:5001') load('ext://helm_remote', 'helm_remote') -# load('ext://dotenv', 'dotenv') -# dotenv(fn='.env') -# allow_k8s_contexts('vke-e41885d3-7f93-4f01-bfaa-426f20bf9f3f') +load('ext://dotenv', 'dotenv') +dotenv(fn='.env.development') # helm_remote( @@ -113,55 +115,34 @@ helm_remote( k8s_yaml(helm( './charts/fp', - values=['./charts/fp/values-dev.yaml'], + values=['./charts/fp/values.yaml'], )) -# k8s_yaml(helm( -# './charts/trigger', -# set=[ -# 'trigger.name=trigger', -# 'trigger.replicaCount=2', -# 'trigger.image.tag=self-host-rc.2', -# 'trigger.image.pullPolicy=IfNotPresent', -# 'trigger.env.ENCRYPTION_KEY=%s' % os.getenv('TRIGGER_ENCRYPTION_KEY'), -# 'trigger.env.MAGIC_LINK_SECRET=%s' % os.getenv('TRIGGER_MAGIC_LINK_SECRET'), -# 'trigger.env.DATABASE_URL=%s' % os.getenv('TRIGGER_DATABASE_URL'), -# 'trigger.env.LOGIN_ORIGIN=%s' % os.getenv('TRIGGER_LOGIN_ORIGIN'), -# 'trigger.env.APP_ORIGIN=%s' % os.getenv('TRIGGER_APP_ORIGIN'), -# 'trigger.env.PORT=%s' % os.getenv('TRIGGER_PORT'), -# 'trigger.env.REMIX_APP_PORT=%s' % os.getenv('TRIGGER_REMIX_APP_PORT'), -# 'trigger.env.REDIS_HOST=redis-master.futureporn.svc.cluster.local', -# 'trigger.env.REDIS_PORT=6379', -# 'trigger.ingress.nginx.enabled=false', -# 'trigger.ingress.enabled=false', -# 'postgres.enabled=false' -# ] -# )) -# k8s_resource( -# workload='trigger', -# port_forwards=['3030'], -# ) + + # docker_build('fp/link2cid', './packages/link2cid') docker_build( 'fp/strapi', '.', - only=['./packages/strapi'], + only=['./packages/strapi', './packages/types'], dockerfile='./d.strapi.dev.dockerfile', live_update=[ sync('./packages/strapi', '/app') ] ) -# docker_build( -# 'fp/bot', -# '.', -# only=['./packages/bot'], -# dockerfile='./d.bot.dockerfile', -# live_update=[ -# sync('./packages/bot', '/app') -# ] -# ) +docker_build( + 'fp/bot', + '.', + only=['./pnpm-lock.yaml', './package.json', './packages/types', './packages/bot'], + dockerfile='./d.packages.dockerfile', + target='bot-dev', + live_update=[ + sync('./packages/bot', '/app'), + run('cd /app && pnpm i', trigger=['./packages/bot/package.json', './packages/bot/pnpm-lock.yaml']) + ] +) @@ -170,7 +151,7 @@ docker_build( load('ext://uibutton', 'cmd_button') cmd_button('postgres:create', - argv=['dotenvx', 'run', '-f', '.env.development', '--', 'sh', './scripts/postgres-create.sh'], + argv=['./scripts/postgres-create.sh'], resource='postgres', icon_name='dataset', text='create (empty) databases', @@ -212,9 +193,9 @@ cmd_button('temporal-web:namespace', docker_build( 'fp/next', '.', - only=['./pnpm-lock.yaml', './package.json', './packages/next', './ca/letsencrypt-stg-root-x1.pem'], + # only=['./pnpm-lock.yaml', './package.json', './packages/next', './packages/types', './ca/letsencrypt-stg-root-x1.pem'], dockerfile='d.next.dockerfile', - target='dev', + target='next', build_args={ 'NEXT_PUBLIC_STRAPI_URL': 'https://strapi.fp.sbtp.xyz' }, @@ -227,7 +208,7 @@ docker_build( docker_build( 'fp/scout-manager', '.', - only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/next', './ca/letsencrypt-stg-root-x1.pem'], + only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/types', './ca/letsencrypt-stg-root-x1.pem'], dockerfile='d.packages.dockerfile', target='scout-manager', live_update=[ @@ -238,13 +219,30 @@ docker_build( # entrypoint='pnpm tsx watch ./src/index.ts' ) + +docker_build( + 'fp/boop', + '.', + # only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/types', './ca/letsencrypt-stg-root-x1.pem'], + dockerfile='d.packages.dockerfile', + target='boop', + live_update=[ + sync('./packages/boop', '/app'), + # run('cd /app && pnpm i', trigger=['./packages/boop/package.json', './packages/boop/pnpm-lock.yaml']), + ], + # entrypoint='pnpm nodemon --ext js,ts,json,yaml --exec node --no-warnings=ExperimentalWarning --loader ts-node/esm ./src/index.ts' + # entrypoint='pnpm tsx watch ./src/index.ts' +) + + + docker_build( 'fp/scout-worker', '.', - only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/next', './ca/letsencrypt-stg-root-x1.pem'], + only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/types', './ca/letsencrypt-stg-root-x1.pem'], # ignore=['./packages/next'], # I wish I could use this ignore to ignore file changes in this dir, but that's not how it works dockerfile='d.packages.dockerfile', - target='scout:worker', + target='scout-worker', live_update=[ # idk if this run() is effective # run('cd /app && pnpm i', trigger=['./packages/scout/package.json', './packages/scout/pnpm-lock.yaml']), @@ -259,6 +257,10 @@ docker_build( # this entrypoint is a godsend. It lets me restart the node app (fast) without having to rebuild the docker container (slow) entrypoint='pnpm nodemon --ext js,ts,json,yaml --exec node --no-warnings=ExperimentalWarning --loader ts-node/esm ./src/temporal/worker.ts' ) + + + + # k8s_resource( # workload='kubernetes-ingress-controller-manager', # links=[ @@ -336,6 +338,11 @@ k8s_resource( labels=['backend'], ) +# k8s_resource( +# workload='', + +# ) + # k8s_resource( # workload='pgadmin', # port_forwards=['5050'], @@ -387,8 +394,8 @@ helm_remote( namespace='futureporn', version='0.37.0', set=[ - 'admintools.image.tag=1.24.1-tctl-1.18.1-cli-0.12.0', - 'web.image.tag=2.27.2', + 'admintools.image.tag=1.24.2-tctl-1.18.1-cli-0.13.0', + 'web.image.tag=2.28.0', 'prometheus.enabled=false', 'grafana.enabled=false', 'elasticsearch.enabled=false', @@ -421,7 +428,7 @@ k8s_resource( ]) k8s_resource( workload='temporal-frontend', - labels='temporal', port_forwards=['7233'], + labels='temporal', resource_deps=[ 'postgres', 'strapi' @@ -485,24 +492,18 @@ k8s_resource( labels=['backend'] ) -# k8s_resource( -# workload='bot', -# labels=['backend'] -# ) +k8s_resource( + workload='bot', + labels=['backend'], + resource_deps=['strapi', 'temporal-web'], +) # k8s_resource( -# workload='cert-manager', -# labels='cert-manager' -# ) -# k8s_resource( -# workload='cert-manager-webhook', -# labels='cert-manager' -# ) -# k8s_resource( -# workload='cert-manager-cainjector', -# labels='cert-manager' -# ) -# k8s_resource( -# workload='cert-manager-startupapicheck', -# labels='cert-manager' +# workload='trigger', +# labels=['backend'], +# port_forwards=['3030:3000'], +# resource_deps=['postgres', 'redis-master'], +# links=[ +# link('http://localhost:3030') +# ], # ) diff --git a/charts/fp/templates/boop.yaml b/charts/fp/templates/boop.yaml new file mode 100644 index 0000000..3749fb9 --- /dev/null +++ b/charts/fp/templates/boop.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: boop + namespace: futureporn + labels: + app.kubernetes.io/name: boop +spec: + containers: + - name: boop + image: fp/boop + resources: {} + restartPolicy: OnFailure + diff --git a/charts/fp/templates/bot.yaml b/charts/fp/templates/bot.yaml new file mode 100644 index 0000000..989b428 --- /dev/null +++ b/charts/fp/templates/bot.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bot + namespace: futureporn + labels: + app: bot +spec: + replicas: {{ .Values.scout.worker.replicas }} + selector: + matchLabels: + app: bot + template: + metadata: + labels: + app: bot + spec: + containers: + - name: bot + image: "{{ .Values.bot.imageName }}" + imagePullPolicy: Always + ports: + - containerPort: 8080 + env: + - name: DISCORD_CHANNEL_ID + value: "{{ .Values.bot.discordChannelId }}" + - name: DISCORD_TOKEN + valueFrom: + secretKeyRef: + name: discord + key: token + resources: + limits: + cpu: "500m" + memory: "512Mi" + requests: + cpu: "250m" + memory: "256Mi" + + diff --git a/charts/fp/templates/next.yaml b/charts/fp/templates/next.yaml index 6cba062..2ed0e5e 100644 --- a/charts/fp/templates/next.yaml +++ b/charts/fp/templates/next.yaml @@ -14,7 +14,7 @@ spec: - name: HOSTNAME value: 0.0.0.0 - name: NEXT_PUBLIC_UPPY_COMPANION_URL - value: "{{ .Values.uppy.hostname }}" + value: "{{ .Values.uppy.url }}" ports: - name: web containerPort: 3000 diff --git a/charts/fp/templates/uppy.yaml b/charts/fp/templates/uppy.yaml index d4ce20b..db0f756 100644 --- a/charts/fp/templates/uppy.yaml +++ b/charts/fp/templates/uppy.yaml @@ -98,8 +98,10 @@ spec: value: "{{ .Values.uppy.s3.bucket }}" - name: COMPANION_AWS_REGION value: "{{ .Values.uppy.s3.region }}" - - name: COMPANION_AWS_PREFIX - value: "{{ .Values.uppy.s3.prefix }}" + - name: COMPANION_AWS_ENDPOINT + value: "{{ .Values.uppy.s3.endpoint }}" + # - name: COMPANION_AWS_PREFIX + # value: "{{ .Values.uppy.s3.prefix }}" ## COMPANION_OAUTH_DOMAIN is only necessary if using a different domain per each uppy pod. ## We don't need this because we are load balancing the pods so they all use the same domain name. diff --git a/charts/fp/values-prod.yaml b/charts/fp/values-prod.yaml deleted file mode 100644 index 1c4812c..0000000 --- a/charts/fp/values-prod.yaml +++ /dev/null @@ -1,31 +0,0 @@ -environment: production -storageClassName: vultr-block-storage-hdd -link2cid: - imageName: gitea.futureporn.net/futureporn/link2cid:latest -scout: - manager: - imageName: gitea.futureporn.net/futureporn/scout-manager:latest - worker: - imageName: gitea.futureporn.net/futureporn/scout-worker:latest - replicas: 2 - pubsubServerUrl: https://realtime.futureporn.net/faye - cdnBucketUrl: https://futureporn-b2.b-cdn.net - s3BucketName: futureporn -next: - imageName: gitea.futureporn.net/futureporn/next:latest - hostname: next.sbtp.xyz -capture: - imageName: gitea.futureporn.net/futureporn/capture:latest -strapi: - imageName: sjc.vultrcr.com/fpcontainers/strapi - port: 1339 - url: https://portal.futureporn.net - hostname: strapi.sbtp.xyz - ingressClassName: traefik -managedBy: Helm -adminEmail: cj@futureporn.net -extraArgs: - - --dns01-recursive-nameservers-only - - --dns01-recursive-nameservers=8.8.8.8:53,1.1.1.1:53 -certManager: - issuer: letsencrypt-production \ No newline at end of file diff --git a/charts/fp/values-dev.yaml b/charts/fp/values.yaml similarity index 77% rename from charts/fp/values-dev.yaml rename to charts/fp/values.yaml index 91f3034..cacf789 100644 --- a/charts/fp/values-dev.yaml +++ b/charts/fp/values.yaml @@ -38,12 +38,22 @@ uppy: hostname: uppy.fp.sbtp.xyz imageName: fp/uppy s3: - endpoint: s3.us-west-000.backblazeb2.com - bucket: futureporn-usc + endpoint: https://s3.us-west-000.backblazeb2.com + bucket: fp-usc-dev region: us-west-000 prefix: s3 clientOrigins: next.fp.sbtp.xyz domain: uppy.fp.sbtp.xyz uploadUrls: https://uppy.fp.sbtp.xyz/files + url: https://uppy.fp.sbtp.xyz certManager: - issuer: letsencrypt-staging \ No newline at end of file + issuer: letsencrypt-staging +bot: + discordChannelId: "1185024773231759481" + imageName: fp/bot +trigger: + imageName: ghcr.io/triggerdotdev/trigger.dev:self-host-rc.3 + worker: + replicas: 2 + webapp: + replicas: 1 \ No newline at end of file diff --git a/charts/trigger/.gitignore b/charts/trigger/.gitignore new file mode 100644 index 0000000..711a39c --- /dev/null +++ b/charts/trigger/.gitignore @@ -0,0 +1 @@ +charts/ \ No newline at end of file diff --git a/charts/trigger/.helmignore b/charts/trigger/.helmignore new file mode 100644 index 0000000..a58a8cc --- /dev/null +++ b/charts/trigger/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +node_modules/ diff --git a/charts/trigger/Chart.lock b/charts/trigger/Chart.lock new file mode 100644 index 0000000..cb9bde9 --- /dev/null +++ b/charts/trigger/Chart.lock @@ -0,0 +1,2 @@ +digest: sha256:e439e4b30ba18357defec97ba080973743a4724c423b78913990409f78f1ebd8 +generated: "2023-10-20T14:22:57.044126+05:30" diff --git a/charts/trigger/Chart.yaml b/charts/trigger/Chart.yaml new file mode 100644 index 0000000..dc5991e --- /dev/null +++ b/charts/trigger/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: trigger +description: A Helm chart for a full Trigger application stack + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/charts/trigger/README.md b/charts/trigger/README.md new file mode 100644 index 0000000..b596771 --- /dev/null +++ b/charts/trigger/README.md @@ -0,0 +1,3 @@ +# Trigger.dev Helm Chart + +@see https://github.com/triggerdotdev/trigger.dev/tree/main/helm-charts \ No newline at end of file diff --git a/charts/trigger/package-lock.json b/charts/trigger/package-lock.json new file mode 100644 index 0000000..803b94a --- /dev/null +++ b/charts/trigger/package-lock.json @@ -0,0 +1,203 @@ +{ + "name": "helm-charts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "helm-charts", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@bitnami/readme-generator-for-helm": "^2.6.0" + } + }, + "node_modules/@bitnami/readme-generator-for-helm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@bitnami/readme-generator-for-helm/-/readme-generator-for-helm-2.6.0.tgz", + "integrity": "sha512-LcByNCryaC2OJExL9rnhyFJ18+vrZu1gVoN2Z7j/HI42EjV4kLgT4G1KEPNnrKbls9HvozBqMG+sKZIDh0McFg==", + "dependencies": { + "commander": "^7.1.0", + "dot-object": "^2.1.4", + "lodash": "^4.17.21", + "markdown-table": "^2.0.0", + "yaml": "^2.0.0-3" + }, + "bin": { + "readme-generator": "bin/index.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "dependencies": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "bin": { + "dot-object": "bin/dot-object" + } + }, + "node_modules/dot-object/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "readme-generator-for-helm": { + "version": "2.6.1", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "commander": "^7.1.0", + "dot-object": "^2.1.4", + "lodash": "^4.17.21", + "markdown-table": "^2.0.0", + "yaml": "^2.0.0-3" + }, + "bin": { + "readme-generator": "bin/index.js" + }, + "devDependencies": { + "eslint": "^7.24.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-import": "^2.22.1", + "jest": "^29.2.1", + "temp": "^0.9.4" + } + } + } +} diff --git a/charts/trigger/package.json b/charts/trigger/package.json new file mode 100644 index 0000000..78404a5 --- /dev/null +++ b/charts/trigger/package.json @@ -0,0 +1,15 @@ +{ + "name": "helm-charts", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "generate-docs": "readme-generator --readme README.md --values values.yaml" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@bitnami/readme-generator-for-helm": "^2.6.0" + } +} \ No newline at end of file diff --git a/charts/trigger/templates/_helpers.tpl b/charts/trigger/templates/_helpers.tpl new file mode 100644 index 0000000..5d060c4 --- /dev/null +++ b/charts/trigger/templates/_helpers.tpl @@ -0,0 +1,71 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "trigger.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "trigger.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create unified labels for trigger components +*/}} +{{- define "trigger.common.matchLabels" -}} +app: {{ template "trigger.name" . }} +release: {{ .Release.Name }} +{{- end -}} + +{{- define "trigger.common.metaLabels" -}} +chart: {{ template "trigger.chart" . }} +heritage: {{ .Release.Service }} +{{- end -}} + +{{- define "trigger.common.labels" -}} +{{ include "trigger.common.matchLabels" . }} +{{ include "trigger.common.metaLabels" . }} +{{- end -}} + +{{- define "trigger.labels" -}} +{{ include "trigger.matchLabels" . }} +{{ include "trigger.common.metaLabels" . }} +{{- end -}} + +{{- define "trigger.matchLabels" -}} +component: {{ .Values.trigger.name | quote }} +{{ include "trigger.common.matchLabels" . }} +{{- end -}} + +{{/* +Create a fully qualified postgresql name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "trigger.postgresql.hostname" -}} +{{- if .Values.postgresql.fullnameOverride -}} +{{- .Values.postgresql.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.postgresql.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.postgresql.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create the postgresql connection string. +*/}} +{{- define "trigger.postgresql.connectionString" -}} +{{- $host := include "trigger.postgresql.hostname" . -}} +{{- $port := 5432 -}} +{{- $username := .Values.postgresql.global.postgresql.postgresqlUsername | default "postgres" -}} +{{- $password := .Values.postgresql.global.postgresql.postgresqlPassword | default "password" -}} +{{- $database := .Values.postgresql.global.postgresql.postgresqlDatabase | default "trigger" -}} +{{- $connectionString := printf "postgresql://%s:%s@%s:%d/%s" $username $password $host $port $database -}} +{{- printf "%s" $connectionString -}} +{{- end -}} \ No newline at end of file diff --git a/charts/trigger/templates/ingress.yaml b/charts/trigger/templates/ingress.yaml new file mode 100644 index 0000000..3f4e73f --- /dev/null +++ b/charts/trigger/templates/ingress.yaml @@ -0,0 +1,43 @@ +{{ if .Values.ingress.enabled }} +{{- $ingress := .Values.ingress }} +{{- if and $ingress.ingressClassName (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey $ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set $ingress.annotations "kubernetes.io/ingress.class" $ingress.ingressClassName}} + {{- end }} +{{- end }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: trigger-ingress + {{- with $ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and $ingress.ingressClassName (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ $ingress.ingressClassName | default "nginx" }} + {{- end }} +{{- if $ingress.tls }} + tls: + {{- range $ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + - http: + paths: + - path: {{ $ingress.trigger.path }} + pathType: {{ $ingress.trigger.pathType }} + backend: + service: + name: {{ include "trigger.name" . }} + port: + number: 3000 + {{- if $ingress.hostName }} + host: {{ $ingress.hostName }} + {{- end }} +{{ end }} \ No newline at end of file diff --git a/charts/trigger/templates/trigger.yaml b/charts/trigger/templates/trigger.yaml new file mode 100644 index 0000000..78d3a3b --- /dev/null +++ b/charts/trigger/templates/trigger.yaml @@ -0,0 +1,95 @@ +{{- $trigger := .Values.trigger -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "trigger.name" . }} + namespace: futureporn + annotations: + updatedAt: {{ now | date "2006-01-01 MST 15:04:05" | quote }} + {{- with $trigger.deploymentAnnotations }} + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + {{- include "trigger.labels" . | nindent 4 }} +spec: + replicas: {{ $trigger.replicaCount }} + selector: + matchLabels: + {{- include "trigger.matchLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "trigger.matchLabels" . | nindent 8 }} + annotations: + updatedAt: {{ now | date "2006-01-01 MST 15:04:05" | quote }} + {{- with $trigger.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with $trigger.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ $trigger.name }} + image: "{{ $trigger.image.repository }}:{{ $trigger.image.tag | default "latest" }}" + imagePullPolicy: {{ $trigger.image.pullPolicy }} + ports: + - name: http + containerPort: 3000 + protocol: TCP + readinessProbe: + httpGet: + path: / + port: 3000 + envFrom: + - secretRef: + name: {{ $trigger.kubeSecretRef | default (include "trigger.name" .) }} + {{- if $trigger.resources }} + resources: {{- toYaml $trigger.resources | nindent 12 }} + {{- end }} +--- + +apiVersion: v1 +kind: Service +metadata: + name: trigger + labels: + annotations: +spec: + type: {{ $trigger.service.type }} + selector: + {{- include "trigger.matchLabels" . | nindent 8 }} + ports: + - port: 3000 + targetPort: 3000 + protocol: TCP + {{- if eq $trigger.service.type "NodePort" }} + nodePort: {{ $trigger.service.nodePort }} + {{- end }} + +--- + +{{ if not $trigger.kubeSecretRef }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "trigger.name" . }} + annotations: + "helm.sh/resource-policy": "keep" +type: Opaque +stringData: + {{- $requiredVars := dict "MAGIC_LINK_SECRET" (randAlphaNum 32 | lower) + "SESSION_SECRET" (randAlphaNum 32 | lower) + "ENCRYPTION_KEY" (randAlphaNum 32 | lower) + "DIRECT_URL" (include "trigger.postgresql.connectionString" .) + "DATABASE_URL" (include "trigger.postgresql.connectionString" .) }} + {{- $secretObj := (lookup "v1" "Secret" .Release.Namespace (include "trigger.name" .)) | default dict }} + {{- $secretData := (get $secretObj "data") | default dict }} + {{ range $key, $value := .Values.trigger.env }} + {{- $default := get $requiredVars $key -}} + {{- $current := get $secretData $key | b64dec -}} + {{- $v := $value | default ($current | default $default) -}} + {{ $key }}: {{ $v | quote }} + {{ end -}} +{{- end }} \ No newline at end of file diff --git a/charts/trigger/values.yaml b/charts/trigger/values.yaml new file mode 100644 index 0000000..713d918 --- /dev/null +++ b/charts/trigger/values.yaml @@ -0,0 +1,276 @@ +# Default values for helm-charts. +# This is a YAML-formatted file. +## @section Common parameters +## + +## @param nameOverride Override release name +## +nameOverride: "" +## @param fullnameOverride Override release fullname +## +fullnameOverride: "" + +## @section Trigger.dev parameters +## +trigger: + ## @param trigger.name + name: trigger + ## @param trigger.fullnameOverride trigger fullnameOverride + ## + fullnameOverride: "" + ## @param trigger.podAnnotations trigger pod annotations + ## + podAnnotations: {} + ## @param trigger.deploymentAnnotations trigger deployment annotations + ## + deploymentAnnotations: {} + ## @param trigger.replicaCount trigger replica count + ## + replicaCount: 2 + ## trigger image parameters + ## + image: + ## @param trigger.image.repository trigger image repository + ## + repository: ghcr.io/triggerdotdev/trigger.dev + ## @param trigger.image.tag trigger image tag + ## + tag: "latest" + ## @param trigger.image.pullPolicy trigger image pullPolicy + ## + pullPolicy: Always + ## @param trigger.resources.limits.memory container memory limit [(docs)](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) + ## @param trigger.resources.requests.cpu container CPU requests [(docs)](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) + ## + resources: + limits: + memory: 800Mi + requests: + cpu: 250m + ## @param trigger.affinity Backend pod affinity + ## + affinity: {} + ## @param trigger.kubeSecretRef trigger secret resource reference name + ## + kubeSecretRef: "" + ## trigger service + ## + service: + ## @param trigger.service.annotations trigger service annotations + ## + annotations: {} + ## @param trigger.service.type trigger service type + ## + type: ClusterIP + ## @param trigger.service.nodePort trigger service nodePort (used if above type is `NodePort`) + ## + nodePort: "" + ## @skip trigger.env + ## + env: + ENCRYPTION_KEY: "" + MAGIC_LINK_SECRET: "" + SESSION_SECRET: "" + LOGIN_ORIGIN: "" + APP_ORIGIN: "" + DIRECT_URL: "" + DATABASE_URL: "" + FROM_EMAIL: "" + REPLY_TO_EMAIL: "" + RESEND_API_KEY: "" + AUTH_GITHUB_CLIENT_ID: "" + AUTH_GITHUB_CLIENT_SECRET: "" + +## @section Postgres parameters +## Documentation: https://github.com/bitnami/charts/tree/main/bitnami/postgresql-ha +## +postgresql: + ## @param postgresql.enabled Enable Postgres + ## + enabled: true + ## @param postgresql.name Name used to build variables (deprecated) + ## + name: "postgresql" + ## @param postgresql.nameOverride Name override + ## + nameOverride: "postgresql" + ## @param postgresql.fullnameOverride Fullname override + ## + fullnameOverride: "postgresql" + + global: + postgresql: + ## @param postgresql.global.postgresql.auth.postgresPassword Password for the "postgres" admin user (overrides `auth.postgresPassword`) + ## @param postgresql.global.postgresql.auth.username Name for a custom user to create (overrides `auth.username`) + ## @param postgresql.global.postgresql.auth.password Password for the custom user to create (overrides `auth.password`) + ## @param postgresql.global.postgresql.auth.database Name for a custom database to create (overrides `auth.database`) + ## @param postgresql.global.postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials (overrides `auth.existingSecret`). + ## @param postgresql.global.postgresql.auth.secretKeys.adminPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.adminPasswordKey`). Only used when `postgresql.global.postgresql.auth.existingSecret` is set. + ## @param postgresql.global.postgresql.auth.secretKeys.userPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.userPasswordKey`). Only used when `postgresql.global.postgresql.auth.existingSecret` is set. + ## @param postgresql.global.postgresql.auth.secretKeys.replicationPasswordKey Name of key in existing secret to use for PostgreSQL credentials (overrides `auth.secretKeys.replicationPasswordKey`). Only used when `postgresql.global.postgresql.auth.existingSecret` is set. + ## + auth: + postgresPassword: "password" + username: "postgres" + password: "password" + database: "trigger" + existingSecret: "" + secretKeys: + adminPasswordKey: "" + userPasswordKey: "" + replicationPasswordKey: "" + ## @param postgresql.global.postgresql.service.ports.postgresql PostgreSQL service port (overrides `service.ports.postgresql`) + ## + service: + ports: + postgresql: "5432" + + ## Bitnami PostgreSQL image version + ## ref: https://hub.docker.com/r/bitnami/postgresql/tags/ + ## @param postgresql.image.registry PostgreSQL image registry + ## @param postgresql.image.repository PostgreSQL image repository + ## @param postgresql.image.tag PostgreSQL image tag (immutable tags are recommended) + ## @param postgresql.image.digest PostgreSQL image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag + ## @param postgresql.image.pullPolicy PostgreSQL image pull policy + ## @param postgresql.image.pullSecrets Specify image pull secrets + ## @param postgresql.image.debug Specify if debug values should be set + ## + image: + registry: docker.io + repository: bitnami/postgresql + tag: 14.10.0-debian-11-r21 + digest: "" + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## Example: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## Set to true if you would like to see extra information on logs + ## + debug: false + + ## @param postgresql.architecture PostgreSQL architecture (`standalone` or `replication`) + ## + architecture: standalone + ## Replication configuration + ## Ignored if `postgresql.architecture` is `standalone` + ## + ## @param postgresql.containerPorts.postgresql PostgreSQL container port + ## + containerPorts: + postgresql: 5432 + + ## @param postgresql.postgresqlDataDir PostgreSQL data dir + ## + postgresqlDataDir: /bitnami/postgresql/data + ## @param postgresql.postgresqlSharedPreloadLibraries Shared preload libraries (comma-separated list) + ## + postgresqlSharedPreloadLibraries: "pgaudit" + ## @section PostgreSQL Primary parameters + ## + primary: + ## Configure extra options for PostgreSQL Primary containers' liveness, readiness and startup probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes + ## @param postgresql.primary.livenessProbe.enabled Enable livenessProbe on PostgreSQL Primary containers + ## @param postgresql.primary.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param postgresql.primary.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param postgresql.primary.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param postgresql.primary.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param postgresql.primary.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param postgresql.primary.readinessProbe.enabled Enable readinessProbe on PostgreSQL Primary containers + ## @param postgresql.primary.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param postgresql.primary.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param postgresql.primary.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param postgresql.primary.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param postgresql.primary.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param postgresql.primary.startupProbe.enabled Enable startupProbe on PostgreSQL Primary containers + ## @param postgresql.primary.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param postgresql.primary.startupProbe.periodSeconds Period seconds for startupProbe + ## @param postgresql.primary.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param postgresql.primary.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param postgresql.primary.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + persistence: + ## @param postgresql.primary.persistence.enabled Enable PostgreSQL Primary data persistence using PVC + ## + enabled: true + ## @param postgresql.primary.persistence.existingClaim Name of an existing PVC to use + ## + existingClaim: "" + ## @param postgresql.primary.persistence.accessModes PVC Access Mode for PostgreSQL volume + ## + accessModes: + - ReadWriteOnce + ## @param postgresql.primary.persistence.size PVC Storage Request for PostgreSQL volume + ## + size: 8Gi + +## @section Ingress parameters +## Documentation: https://kubernetes.io/docs/concepts/services-networking/ingress/ +## +ingress: + ## @param ingress.enabled Enable ingress + ## + enabled: true + ## @param ingress.ingressClassName Ingress class name + ## + ingressClassName: nginx + ## @param ingress.nginx.enabled Ingress controller + ## + nginx: + enabled: false + ## @param ingress.annotations Ingress annotations + ## + annotations: + {} + # kubernetes.io/ingress.class: "nginx" + # cert-manager.io/issuer: letsencrypt-nginx + ## @param ingress.hostName Ingress hostname (your custom domain name, e.g. `infisical.example.org`) + ## Replace with your own domain + ## + hostName: "" + ## @param ingress.tls Ingress TLS hosts (matching above hostName) + ## Replace with your own domain + ## + tls: + [] + # - secretName: letsencrypt-nginx + # hosts: + # - infisical.local + ## @param ingress.trigger.path Trigger.dev ingress path + ## @param ingress.trigger.pathType Trigger.dev ingress path type + ## + trigger: + path: / + pathType: Prefix diff --git a/d.bot.dockerfile b/d.bot.dockerfile deleted file mode 100644 index a1a4f01..0000000 --- a/d.bot.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM node:20 AS base -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable - -FROM base AS build -ENV NODE_ENV=production -COPY ./packages/bot /usr/src/app -WORKDIR /usr/src/app -RUN mkdir -p /prod/scout -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile -RUN pnpm deploy --filter=bot --prod /prod/scout - - - -FROM base AS bot -COPY --from=build /prod/bot /app -WORKDIR /app -ENTRYPOINT ["pnpm"] -CMD ["run", "start"] diff --git a/d.next.dockerfile b/d.next.dockerfile index 2a2fe7a..3ded232 100644 --- a/d.next.dockerfile +++ b/d.next.dockerfile @@ -28,29 +28,8 @@ RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install FROM install AS dev CMD ["pnpm", "run", "dev"] - - FROM install AS build RUN pnpm run build -# COPY --chown=node:node --from=install /app/package.json /app/pnpm-lock.yaml ./ -# RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile -# COPY --from=install /app /app # i think this is duplicate -# can't get these to work because errors like "/prod/next/.next/standalone": not found -# as if pnpm is not copying the build artifacts. -# also this makes the build REALLY slow (adds ~10mins to build time) -# RUN pnpm deploy --filter=@futureporn/next --prod /prod/next -# RUN pnpm deploy --filter=@futureporn/link2cid --prod /prod/link2cid - -# FROM deps as release -# # ENV NEXT_SHARP_PATH=/app/node_modules/sharp -# ENV NODE_ENV=production -# WORKDIR /app -# COPY --from=build /app/public ./public -# COPY --from=build /app/.next/standalone ./ -# COPY --from=build /app/.next/static ./.next/static -# CMD [ "dumb-init", "node", "server.js" ] - - FROM deps AS next RUN apt-get update && apt-get install -y -qq --no-install-recommends dumb-init diff --git a/d.packages.dockerfile b/d.packages.dockerfile index c6361a8..6f8dee6 100644 --- a/d.packages.dockerfile +++ b/d.packages.dockerfile @@ -2,7 +2,7 @@ ## Because we are using monorepo with pnpm workspaces, we have many npm packages in this single git repo. ## Some of these packages in the monorepo depend on other packages in the monorepo. ## In order to build these individual packages which inter-depend on eachother, -## all of the dependent code must be present in the build. +## all of the dependent code must be present in the build context. ## ## Below, COPY . /usr/src/app copies all the app code into the build context. ## Because we use Tilt, only specific path directories are visible to docker. This helps with build performance. @@ -16,27 +16,107 @@ FROM node:20 AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable +WORKDIR /app +ENTRYPOINT ["pnpm"] + FROM base AS build ENV NODE_ENV=production COPY . /usr/src/app WORKDIR /usr/src/app RUN mkdir -p /prod/scout -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile -RUN pnpm deploy --filter=scout --prod /prod/scout +RUN pnpm fetch +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile --offline +RUN pnpm --recursive build +RUN pnpm deploy --filter=boop /prod/boop +# RUN pnpm deploy --filter=scout --prod /prod/scout # RUN pnpm deploy --filter=bot --prod /prod/bot +# RUN pnpm deploy --filter=temporal-worker --prod /prod/temporal-worker +# RUN pnpm deploy --filter=next /prod/next +# RUN pnpm deploy --filter=next /prod/next-dev + +FROM base AS boop +COPY --from=build /prod/boop /app +CMD ["start"] -FROM base AS scout-manager -COPY --from=build /prod/scout /app -WORKDIR /app -ENTRYPOINT ["pnpm"] -CMD ["run", "start:manager"] -FROM base AS scout-worker -COPY --from=build /prod/scout /app -COPY --from=build /usr/src/app/certs/letsencrypt-stg-root-x1.pem -ENV NODE_EXTRA_CA_CERTS "/app/certs/letsencrypt-stg-root-x1.pem" -WORKDIR /app -ENTRYPOINT ["pnpm"] -CMD ["run", "start:worker"] +# COPY pnpm-lock.yaml ./ +# RUN pnpm fetch +# COPY ./packages/next /app +# RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install + +# FROM base AS next-prep +# ARG NEXT_PUBLIC_SITE_URL=https://futureporn.net +# ARG NEXT_PUBLIC_STRAPI_URL=https://portal.futureporn.net +# ARG NEXT_PUBLIC_UPPY_COMPANION_URL=https://uppy.futureporn.net +# ENV NEXT_PUBLIC_SITE_URL ${NEXT_PUBLIC_SITE_URL} +# ENV NEXT_PUBLIC_STRAPI_URL ${NEXT_PUBLIC_STRAPI_URL} +# ENV NEXT_PUBLIC_UPPY_COMPANION_URL ${NEXT_PUBLIC_UPPY_COMPANION_URL} +# ENV NEXT_TELEMETRY_DISABLED 1 + +# COPY pnpm-lock.yaml ./ +# COPY ./packages/next /app +# RUN pnpm fetch +# RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install + +FROM base AS next-build +COPY --from=build /prod/next /app +# RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store pnpm install +# RUN ls -la +RUN pnpm run build + +FROM base as next +COPY --from=next-build /app /app +ENV TZ=UTC +ENV NODE_ENV=production +ENV HOSTNAME="0.0.0.0" +ENTRYPOINT [ "dumb-init", "node", "server.js" ] + +# FROM base AS next-pre +# COPY --from=build /prod/next /app +# ENV NODE_EXTRA_CA_CERTS "/app/letsencrypt-stg-root-x1.pem" +# FROM next-pre AS next-dev +# CMD ["pnpm", "run", "dev"] +# FROM next-pre AS next-build +# RUN pnpm run build +# FROM base AS next +# RUN apt-get update && apt-get install -y -qq --no-install-recommends dumb-init +# # COPY --chown=node:node --from=build /prod/next . +# COPY --chown=node:node --from=next-build /app/package.json /app/pnpm-lock.yaml ./ +# RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile +# COPY --chown=node:node --from=next-build /app/public ./public +# COPY --chown=node:node --from=next-build /app/.next/standalone ./ +# COPY --chown=node:node --from=next-build /app/.next/static ./.next/static +# RUN ls -la . +# ENV TZ=UTC +# ENV NODE_ENV=production +# ENV HOSTNAME="0.0.0.0" +# ENTRYPOINT [ "dumb-init", "node", "server.js" ] + + + +# FROM base AS scout-manager +# COPY --from=build /prod/scout /app +# CMD ["run", "start:manager"] + + +# FROM base AS scout-worker +# COPY --from=build /prod/scout /app +# COPY --from=build /usr/src/app/certs/letsencrypt-stg-root-x1.pem /app +# ENV NODE_EXTRA_CA_CERTS "/app/certs/letsencrypt-stg-root-x1.pem" +# CMD ["run", "start:worker"] + + +# FROM base AS temporal-worker +# COPY --from=build /prod/temporal-worker /app +# CMD ["run", "start"] + + +# FROM base AS bot-prep +# COPY --from=build /prod/bot /app +# FROM bot-prep AS bot +# CMD ["run", "start"] +# FROM bot-prep AS bot-dev +# CMD ["run", "dev"] + diff --git a/packages/archive/.npmrc b/packages/archive/.npmrc new file mode 100644 index 0000000..234fa05 --- /dev/null +++ b/packages/archive/.npmrc @@ -0,0 +1,4 @@ +engine-strict=true +package-manager-strict=true +use-node-version=20.13.1 +node-version=20.13.1 \ No newline at end of file diff --git a/packages/archive/README.md b/packages/archive/README.md new file mode 100644 index 0000000..96f7232 --- /dev/null +++ b/packages/archive/README.md @@ -0,0 +1,4 @@ +# archive + +This module does vod processing on the backend. + diff --git a/packages/archive/node.d.ts b/packages/archive/node.d.ts new file mode 100644 index 0000000..a9bed81 --- /dev/null +++ b/packages/archive/node.d.ts @@ -0,0 +1,4 @@ +interface ImportMeta { + dirname: string; + url: string; +} \ No newline at end of file diff --git a/packages/archive/package.json b/packages/archive/package.json new file mode 100644 index 0000000..83f7b13 --- /dev/null +++ b/packages/archive/package.json @@ -0,0 +1,16 @@ +{ + "name": "archive", + "version": "0.0.1", + "description": "", + "main": "index.ts", + "scripts": { + "test": "mocha" + }, + "keywords": [], + "author": "@CJ_Clippy", + "license": "Unlicense", + "dependencies": { + "@aws-sdk/client-s3": "^3.583.0", + "prevvy": "^7.0.1" + } +} diff --git a/packages/archive/pnpm-lock.yaml b/packages/archive/pnpm-lock.yaml new file mode 100644 index 0000000..d660e00 --- /dev/null +++ b/packages/archive/pnpm-lock.yaml @@ -0,0 +1,1469 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@aws-sdk/client-s3': + specifier: ^3.583.0 + version: 3.609.0 + prevvy: + specifier: ^7.0.1 + version: 7.5.0 + +packages: + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.609.0': + resolution: {integrity: sha512-lh8NxL9qm8eSphEcsTGjNMArYRlga4yTZCr3d7UPCRFiV1oz3e0EIA5EnxSriYi9P5Houi5d9GSWtPOel2mAow==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.609.0': + resolution: {integrity: sha512-0bNPAyPdkWkS9EGB2A9BZDkBNrnVCBzk5lYRezoT4K3/gi9w1DTYH5tuRdwaTZdxW19U1mq7CV0YJJARKO1L9Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.609.0 + + '@aws-sdk/client-sso@3.609.0': + resolution: {integrity: sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.609.0': + resolution: {integrity: sha512-A0B3sDKFoFlGo8RYRjDBWHXpbgirer2bZBkCIzhSPHc1vOFHt/m2NcUoE2xnBKXJFrptL1xDkvo1P+XYp/BfcQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.609.0': + resolution: {integrity: sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.609.0': + resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.609.0': + resolution: {integrity: sha512-GQQfB9Mk4XUZwaPsk4V3w8MqleS6ApkZKVQn3vTLAKa8Y7B2Imcpe5zWbKYjDd8MPpMWjHcBGFTVlDRFP4zwSQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.609.0': + resolution: {integrity: sha512-hwaBfXuBTv6/eAdEsDfGcteYUW6Km7lvvubbxEdxIuJNF3vswR7RMGIXaEC37hhPkTTgd3H0TONammhwZIfkog==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.609.0 + + '@aws-sdk/credential-provider-node@3.609.0': + resolution: {integrity: sha512-4J8/JRuqfxJDGD9jTHVCBxCvYt7/Vgj2Stlhj930mrjFPO/yRw8ilAAZxBWe0JHPX3QwepCmh4ErZe53F5ysxQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.609.0': + resolution: {integrity: sha512-Ux35nGOSJKZWUIM3Ny0ROZ8cqPRUEkh+tR3X2o9ydEbFiLq3eMMyEnHJqx4EeUjLRchidlm4CCid9GxMe5/gdw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.609.0': + resolution: {integrity: sha512-oQPGDKMMIxjvTcm86g07RPYeC7mCNk+29dPpY15ZAPRpAF7F0tircsC3wT9fHzNaKShEyK5LuI5Kg/uxsdy+Iw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.609.0': + resolution: {integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.609.0 + + '@aws-sdk/middleware-bucket-endpoint@3.609.0': + resolution: {integrity: sha512-QhHRfr4e7FqaMUAnOAFdQVOR3yDLw40i1IZPo+TeiKyev9LEyYEX2l6DbdaIwAztofOpAxfFNj/IJ0V/efzz/w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-expect-continue@3.609.0': + resolution: {integrity: sha512-+zeg//mSer4JZRxOB/4mUOMUJyuYPwATnIC5moBB8P8Xe+mJaVRFy8qlCtzYNj2TycnlsBPzTK0j7P1yvDh97w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.609.0': + resolution: {integrity: sha512-TJ4WE+ehT+qcrhr7/yJCzmJJPmUoPPWIbCnFzqGxauH/dpVBCslmd1vZg3h2VnfRiaDkc6f68dqYVc29CaurhQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.609.0': + resolution: {integrity: sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-location-constraint@3.609.0': + resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.609.0': + resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.609.0': + resolution: {integrity: sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.609.0': + resolution: {integrity: sha512-kvwjL6OJFhAGWoYaIWR7HmILjiVk6xVj6QEU6qZMA7FtGgvlKi4pLfs8Of+hQqo+2TEhUoxG/5t6WqwB8uxjsw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-signing@3.609.0': + resolution: {integrity: sha512-2w3dBLjQVKIajYzokO4hduq8/0hSMUYHHmIo1Kdl+MSY8uwRBt12bLL6pyreobTcRMxizvn2ph/CQ9I1ST/WGQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-ssec@3.609.0': + resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.609.0': + resolution: {integrity: sha512-nbq7MXRmeXm4IDqh+sJRAxGPAq0OfGmGIwKvJcw66hLoG8CmhhVMZmIAEBDFr57S+YajGwnLLRt+eMI05MMeVA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.609.0': + resolution: {integrity: sha512-lMHBG8zg9GWYBc9/XVPKyuAUd7iKqfPP7z04zGta2kGNOKbUTeqmAdc1gJGku75p4kglIPlGBorOxti8DhRmKw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.609.0': + resolution: {integrity: sha512-FJs0BxVMyYOKNu7nzFI1kehfgWoYmdto5B8BSS29geUACF7jlOoeCfNZWVrnMjvAxVlSQ5O7Mr575932BnsycA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.609.0': + resolution: {integrity: sha512-WvhW/7XSf+H7YmtiIigQxfDVZVZI7mbKikQ09YpzN7FeN3TmYib1+0tB+EE9TbICkwssjiFc71FEBEh4K9grKQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.609.0 + + '@aws-sdk/types@3.609.0': + resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-arn-parser@3.568.0': + resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.609.0': + resolution: {integrity: sha512-Rh+3V8dOvEeE1aQmUy904DYWtLUEJ7Vf5XBPlQ6At3pBhp+zpXbsnpZzVL33c8lW1xfj6YPwtO6gOeEsl1juCQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.609.0': + resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + + '@aws-sdk/util-user-agent-node@3.609.0': + resolution: {integrity: sha512-DlZBwQ/HkZyf3pOWc7+wjJRk5R7x9YxHhs2szHwtv1IW30KMabjjjX0GMlGJ9LLkBHkbaaEY/w9Tkj12XRLhRg==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.609.0': + resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==} + engines: {node: '>=16.0.0'} + + '@smithy/abort-controller@3.1.1': + resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} + engines: {node: '>=16.0.0'} + + '@smithy/chunked-blob-reader-native@3.0.0': + resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} + + '@smithy/chunked-blob-reader@3.0.0': + resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==} + + '@smithy/config-resolver@3.0.4': + resolution: {integrity: sha512-VwiOk7TwXoE7NlNguV/aPq1hFH72tqkHCw8eWXbr2xHspRyyv9DLpLXhq+Ieje+NwoqXrY0xyQjPXdOE6cGcHA==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.2.4': + resolution: {integrity: sha512-qdY3LpMOUyLM/gfjjMQZui+UTNS7kBRDWlvyIhVOql5dn2J3isk9qUTBtQ1CbDH8MTugHis1zu3h4rH+Qmmh4g==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.1.3': + resolution: {integrity: sha512-U1Yrv6hx/mRK6k8AncuI6jLUx9rn0VVSd9NPEX6pyYFBfkSkChOc/n4zUb8alHUVg83TbI4OdZVo1X0Zfj3ijA==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-codec@3.1.2': + resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} + + '@smithy/eventstream-serde-browser@3.0.4': + resolution: {integrity: sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-config-resolver@3.0.3': + resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-node@3.0.4': + resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-serde-universal@3.0.4': + resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.2.0': + resolution: {integrity: sha512-vFvDxMrc6sO5Atec8PaISckMcAwsCrRhYxwUylg97bRT2KZoumOF7qk5+6EVUtuM1IG9AJV5aqXnHln9ZdXHpg==} + + '@smithy/hash-blob-browser@3.1.2': + resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} + + '@smithy/hash-node@3.0.3': + resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} + engines: {node: '>=16.0.0'} + + '@smithy/hash-stream-node@3.1.2': + resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.3': + resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/md5-js@3.0.3': + resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==} + + '@smithy/middleware-content-length@3.0.3': + resolution: {integrity: sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.0.4': + resolution: {integrity: sha512-whUJMEPwl3ANIbXjBXZVdJNgfV2ZU8ayln7xUM47rXL2txuenI7jQ/VFFwCzy5lCmXScjp6zYtptW5Evud8e9g==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.7': + resolution: {integrity: sha512-f5q7Y09G+2h5ivkSx5CHvlAT4qRR3jBFEsfXyQ9nFNiWQlr8c48blnu5cmbTQ+p1xmIO14UXzKoF8d7Tm0Gsjw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.3': + resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.3': + resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.3': + resolution: {integrity: sha512-rxdpAZczzholz6CYZxtqDu/aKTxATD5DAUDVj7HoEulq+pDSQVWzbg0btZDlxeFfa6bb2b5tUvgdX5+k8jUqcg==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.1.1': + resolution: {integrity: sha512-L71NLyPeP450r2J/mfu1jMc//Z1YnqJt2eSNw7uhiItaONnBLDA68J5jgxq8+MBDsYnFwNAIc7dBG1ImiWBiwg==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.3': + resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.0.3': + resolution: {integrity: sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.3': + resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.3': + resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.3': + resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.3': + resolution: {integrity: sha512-Z8Y3+08vgoDgl4HENqNnnzSISAaGrF2RoKupoC47u2wiMp+Z8P/8mDh1CL8+8ujfi2U5naNvopSBmP/BUj8b5w==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@3.1.2': + resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.1.5': + resolution: {integrity: sha512-x9bL9Mx2CT2P1OiUlHM+ZNpbVU6TgT32f9CmTRzqIHA7M4vYrROCWEoC3o4xHNJASoGd4Opos3cXYPgh+/m4Ww==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.3.0': + resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.3': + resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.7': + resolution: {integrity: sha512-Q2txLyvQyGfmjsaDbVV7Sg8psefpFcrnlGapDzXGFRPFKRBeEg6OvFK8FljqjeHSaCZ6/UuzQExUPqBR/2qlDA==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.7': + resolution: {integrity: sha512-F4Qcj1fG6MGi2BSWCslfsMSwllws/WzYONBGtLybyY+halAcXdWhcew+mej8M5SKd5hqPYp4f7b+ABQEaeytgg==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.4': + resolution: {integrity: sha512-ZAtNf+vXAsgzgRutDDiklU09ZzZiiV/nATyqde4Um4priTmasDH+eLpp3tspL0hS2dEootyFMhu1Y6Y+tzpWBQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.3': + resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.3': + resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.0.5': + resolution: {integrity: sha512-xC3L5PKMAT/Bh8fmHNXP9sdQ4+4aKVUU3EEJ2CF/lLk7R+wtMJM+v/1B4en7jO++Wa5spGzFDBCl0QxgbUc5Ug==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-waiter@3.1.2': + resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} + engines: {node: '>=16.0.0'} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/fluent-ffmpeg@2.1.24': + resolution: {integrity: sha512-g5oQO8Jgi2kFS3tTub7wLvfLztr1s8tdXmRd8PiL/hLMLzTIAyMR2sANkTggM/rdEDAg3d63nYRRVepwBiCw5A==} + + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + + async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + + fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + luxon@1.28.1: + resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + prevvy@7.5.0: + resolution: {integrity: sha512-4aKAl2fBhD7rkn2xfxApUP4Il6ILBBJCNMk1TURdXAfXfakSynhjNmnpgb/bj1xSRW0lJYXjULdZFEy8bQdCNw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + +snapshots: + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.609.0 + tslib: 2.6.3 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.6.3 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.3 + + '@aws-sdk/client-s3@3.609.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.609.0(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/client-sts': 3.609.0 + '@aws-sdk/core': 3.609.0 + '@aws-sdk/credential-provider-node': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/middleware-bucket-endpoint': 3.609.0 + '@aws-sdk/middleware-expect-continue': 3.609.0 + '@aws-sdk/middleware-flexible-checksums': 3.609.0 + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-location-constraint': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-sdk-s3': 3.609.0 + '@aws-sdk/middleware-signing': 3.609.0 + '@aws-sdk/middleware-ssec': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.609.0 + '@aws-sdk/region-config-resolver': 3.609.0 + '@aws-sdk/signature-v4-multi-region': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.609.0 + '@aws-sdk/xml-builder': 3.609.0 + '@smithy/config-resolver': 3.0.4 + '@smithy/core': 2.2.4 + '@smithy/eventstream-serde-browser': 3.0.4 + '@smithy/eventstream-serde-config-resolver': 3.0.3 + '@smithy/eventstream-serde-node': 3.0.4 + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/hash-blob-browser': 3.1.2 + '@smithy/hash-node': 3.0.3 + '@smithy/hash-stream-node': 3.1.2 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/md5-js': 3.0.3 + '@smithy/middleware-content-length': 3.0.3 + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-retry': 3.0.7 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/node-http-handler': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.7 + '@smithy/util-defaults-mode-node': 3.0.7 + '@smithy/util-endpoints': 2.0.4 + '@smithy/util-retry': 3.0.3 + '@smithy/util-stream': 3.0.5 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.1.2 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.609.0 + '@aws-sdk/core': 3.609.0 + '@aws-sdk/credential-provider-node': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.609.0 + '@aws-sdk/region-config-resolver': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.609.0 + '@smithy/config-resolver': 3.0.4 + '@smithy/core': 2.2.4 + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.3 + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-retry': 3.0.7 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/node-http-handler': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.7 + '@smithy/util-defaults-mode-node': 3.0.7 + '@smithy/util-endpoints': 2.0.4 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.609.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.609.0 + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.609.0 + '@aws-sdk/region-config-resolver': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.609.0 + '@smithy/config-resolver': 3.0.4 + '@smithy/core': 2.2.4 + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.3 + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-retry': 3.0.7 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/node-http-handler': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.7 + '@smithy/util-defaults-mode-node': 3.0.7 + '@smithy/util-endpoints': 2.0.4 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.609.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.609.0(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/core': 3.609.0 + '@aws-sdk/credential-provider-node': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.609.0 + '@aws-sdk/region-config-resolver': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.609.0 + '@smithy/config-resolver': 3.0.4 + '@smithy/core': 2.2.4 + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.3 + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-retry': 3.0.7 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/node-http-handler': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.7 + '@smithy/util-defaults-mode-node': 3.0.7 + '@smithy/util-endpoints': 2.0.4 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.609.0': + dependencies: + '@smithy/core': 2.2.4 + '@smithy/protocol-http': 4.0.3 + '@smithy/signature-v4': 3.1.2 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-env@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-http@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/node-http-handler': 3.1.1 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.0.5 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-ini@3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0)': + dependencies: + '@aws-sdk/client-sts': 3.609.0 + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.609.0 + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.609.0 + '@aws-sdk/credential-provider-ini': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-sso@3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))': + dependencies: + '@aws-sdk/client-sso': 3.609.0 + '@aws-sdk/token-providers': 3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0)) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.609.0)': + dependencies: + '@aws-sdk/client-sts': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-bucket-endpoint@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-expect-continue@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-flexible-checksums@3.609.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-sdk/types': 3.609.0 + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-host-header@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-location-constraint@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-logger@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-recursion-detection@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-sdk-s3@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-arn-parser': 3.568.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/signature-v4': 3.1.2 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-signing@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/signature-v4': 3.1.2 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@aws-sdk/middleware-ssec@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/middleware-user-agent@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/region-config-resolver@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@aws-sdk/signature-v4-multi-region@3.609.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@smithy/protocol-http': 4.0.3 + '@smithy/signature-v4': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.609.0(@aws-sdk/client-sso-oidc@3.609.0(@aws-sdk/client-sts@3.609.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.609.0(@aws-sdk/client-sts@3.609.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/types@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/util-arn-parser@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-endpoints@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + '@smithy/util-endpoints': 2.0.4 + tslib: 2.6.3 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-browser@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-node@3.609.0': + dependencies: + '@aws-sdk/types': 3.609.0 + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@aws-sdk/xml-builder@3.609.0': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/abort-controller@3.1.1': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader-native@3.0.0': + dependencies: + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/chunked-blob-reader@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/config-resolver@3.0.4': + dependencies: + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/core@2.2.4': + dependencies: + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-retry': 3.0.7 + '@smithy/middleware-serde': 3.0.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/credential-provider-imds@3.1.3': + dependencies: + '@smithy/node-config-provider': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + tslib: 2.6.3 + + '@smithy/eventstream-codec@3.1.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-browser@3.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-config-resolver@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-node@3.0.4': + dependencies: + '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/eventstream-serde-universal@3.0.4': + dependencies: + '@smithy/eventstream-codec': 3.1.2 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/fetch-http-handler@3.2.0': + dependencies: + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-blob-browser@3.1.2': + dependencies: + '@smithy/chunked-blob-reader': 3.0.0 + '@smithy/chunked-blob-reader-native': 3.0.0 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/hash-node@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-stream-node@3.1.2': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/invalid-dependency@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.3 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/md5-js@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/middleware-content-length@3.0.3': + dependencies: + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-endpoint@3.0.4': + dependencies: + '@smithy/middleware-serde': 3.0.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + '@smithy/url-parser': 3.0.3 + '@smithy/util-middleware': 3.0.3 + tslib: 2.6.3 + + '@smithy/middleware-retry@3.0.7': + dependencies: + '@smithy/node-config-provider': 3.1.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/service-error-classification': 3.0.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + tslib: 2.6.3 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/middleware-stack@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-config-provider@3.1.3': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/node-http-handler@3.1.1': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/protocol-http': 4.0.3 + '@smithy/querystring-builder': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/property-provider@3.1.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/protocol-http@4.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/querystring-builder@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.3 + + '@smithy/querystring-parser@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/service-error-classification@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + + '@smithy/shared-ini-file-loader@3.1.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/signature-v4@3.1.2': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/types': 3.3.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/smithy-client@3.1.5': + dependencies: + '@smithy/middleware-endpoint': 3.0.4 + '@smithy/middleware-stack': 3.0.3 + '@smithy/protocol-http': 4.0.3 + '@smithy/types': 3.3.0 + '@smithy/util-stream': 3.0.5 + tslib: 2.6.3 + + '@smithy/types@3.3.0': + dependencies: + tslib: 2.6.3 + + '@smithy/url-parser@3.0.3': + dependencies: + '@smithy/querystring-parser': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-defaults-mode-browser@3.0.7': + dependencies: + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + bowser: 2.11.0 + tslib: 2.6.3 + + '@smithy/util-defaults-mode-node@3.0.7': + dependencies: + '@smithy/config-resolver': 3.0.4 + '@smithy/credential-provider-imds': 3.1.3 + '@smithy/node-config-provider': 3.1.3 + '@smithy/property-provider': 3.1.3 + '@smithy/smithy-client': 3.1.5 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-endpoints@2.0.4': + dependencies: + '@smithy/node-config-provider': 3.1.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-middleware@3.0.3': + dependencies: + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-retry@3.0.3': + dependencies: + '@smithy/service-error-classification': 3.0.3 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@smithy/util-stream@3.0.5': + dependencies: + '@smithy/fetch-http-handler': 3.2.0 + '@smithy/node-http-handler': 3.1.1 + '@smithy/types': 3.3.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.6.3 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.3 + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-waiter@3.1.2': + dependencies: + '@smithy/abort-controller': 3.1.1 + '@smithy/types': 3.3.0 + tslib: 2.6.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/fluent-ffmpeg@2.1.24': + dependencies: + '@types/node': 20.14.9 + + '@types/luxon@3.4.2': {} + + '@types/ms@0.7.34': {} + + '@types/node@20.14.9': + dependencies: + undici-types: 5.26.5 + + async@0.2.10: {} + + bowser@2.11.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fast-xml-parser@4.2.5: + dependencies: + strnum: 1.0.5 + + fluent-ffmpeg@2.1.3: + dependencies: + async: 0.2.10 + which: 1.3.1 + + get-stream@8.0.1: {} + + human-signals@5.0.0: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + luxon@1.28.1: {} + + merge-stream@2.0.0: {} + + mimic-fn@4.0.0: {} + + ms@2.1.2: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + prevvy@7.5.0: + dependencies: + '@types/debug': 4.1.12 + '@types/fluent-ffmpeg': 2.1.24 + '@types/luxon': 3.4.2 + '@types/node': 20.14.9 + debug: 4.3.5 + execa: 8.0.1 + fluent-ffmpeg: 2.1.3 + luxon: 1.28.1 + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + strip-final-newline@3.0.0: {} + + strnum@1.0.5: {} + + tslib@2.6.3: {} + + typescript@5.5.3: {} + + undici-types@5.26.5: {} + + uuid@9.0.1: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 diff --git a/packages/archive/src/generateThumbnail.ts b/packages/archive/src/generateThumbnail.ts new file mode 100644 index 0000000..ab0b88c --- /dev/null +++ b/packages/archive/src/generateThumbnail.ts @@ -0,0 +1,240 @@ + + +import Prevvy from 'prevvy'; +import path from 'node:path'; +import os from 'node:os'; +import { promisify } from 'util'; +import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; + + +type CVod = { + id: number, + attributes: { + date: string, + note: null, + date2: string, + title: string, + vtuber: { + data: { + id: number, + attributes: { + slug: string, + image: string, + imageBlur: string, + displayName: string + } + } + }, + chatLog: null, + muxAsset: { + data: { + assetId: string, + playbackId: string + } + }, + spoilers: null, + thinHash: null, + createdAt: null, + thiccHash: null, + thumbnail: { + data: { + id: number, + attributes: { + url: string, + cdnUrl: string + } + } + }, + updatedAt: string, + videoSrcB2: { + data: { + id: number, + attributes: { + key: string, + url: string, + cdnUrl: string, + uploadId: string + } + } + }, + announceUrl: string, + publishedAt: string, + video240Hash: string, + video360Hash: null, + video480Hash: null, + video720Hash: null, + videoSrcHash: string, + announceTitle: string, + archiveStatus: null, + tagVodRelations: { + data: any[] + } + } + +} + +type CStrapi = { + strapiUrl: string, + strapiApiKey: string + +} + +type S3 = { + port: number, + bucket: string, + region: string, + useSSL: boolean, + endPoint: string, + accessKey: string, + pathStyle: boolean, + secretKey: string + +} + +type CBunnyPullZone = { + cdnHostname: string + +} + +interface IUploadData { + uploadId: string; + key: string; + url: string; +} + +export async function __generateThumbnail(vod: CVod): Promise { + const fileName = `vod-${vod?.id}-thumb.png`; + const thumbnailFilePath = path.join(os.tmpdir(), fileName); + const videoInputUrl = vod.attributes.videoSrcB2?.data?.attributes?.cdnUrl; + if (!videoInputUrl) { + console.error(vod?.attributes?.videoSrcB2); + throw new Error(`videoInputUrl in __generateThumbnail was undefined`); + } + console.log(`🫰 Creating thumbnail from ${videoInputUrl} ---> ${thumbnailFilePath}`); + const thumb = new Prevvy({ + input: videoInputUrl, + output: thumbnailFilePath, + throttleTimeout: 2000, + width: 128, + cols: 5, + rows: 5, + }); + thumb.on('progress', async (data: { percentage: number }) => { + console.log(`Thumbnail generation ${data.percentage}%`); + }); + + await thumb.generate(); + return thumbnailFilePath; +} + +function createId(): string { +const timestamp: number = new Date().getTime(); +const randomPart: number = Math.floor(Math.random() * 10000); +return `${timestamp}-${randomPart}`; +} + +export async function uploadToB2 (s3Resource: S3, filePath: string): IUploadData { +const { bucket, endPoint, region, accessKey, secretKey } = s3Resource; +const keyName = `${createId()}-${path.basename(filePath)}` +console.log(`uploadToB2 begin. bucket:${bucket} endpoint:${endPoint}`) +const urlPrefix = 'https://f000.backblazeb2.com/b2api/v1/b2_download_file_by_id?fileId=' +const s3 = new S3Client({ + endpoint: `https://${endPoint}`, + region: region, + credentials: { + accessKeyId: accessKey, + secretAccessKey: secretKey, + } +}); + +const file = Bun.file(filePath); +const fileStream = await file.arrayBuffer(); + +var params = {Bucket: bucket, Key: keyName, Body: fileStream}; +const res = await s3.send(new PutObjectCommand(params)); +if (!res.VersionId) { + const msg = 'res was missing VersionId' + throw new Error(msg) +} +const url = `${urlPrefix}${res.VersionId}`; +const blah: IUploadData = { + uploadId: res.VersionId, + key: keyName, + url: url +} +console.log(url) +console.log(blah) +return blah; +} + +export async function associateB2WithVod(vod: IVod, strapi: CStrapi, uploadData: IUploadData, zone: CBunnyPullZone) { +if (!vod) throw new Error('vod argument was missing'); +if (!strapi) throw new Error('strapi argument was missing'); +if (!uploadData) throw new Error('uploadData argument was missing'); +const { cdnHostname } = zone; +const { strapiApiKey, strapiUrl } = strapi; +console.log(`🥤 lets create b2-file in Strapi`); + +// Create the B2 file +const thumbResponse = await fetch(`${strapiUrl}/api/b2-files`, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${strapiApiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: { + key: uploadData.key, + uploadId: uploadData.uploadId, + url: uploadData.url, + cdnUrl: `https://${cdnHostname}/${uploadData.key}` + }, + }), +}); + +if (!thumbResponse.ok) { + const msg = `🟠 Failed to create B2 file: ${thumbResponse.statusText}` + console.error(msg) + throw new Error(msg); +} + +const thumbData = await thumbResponse.json() as IB2File; + +console.log(`📀 B2 file creation complete for B2 file id: ${thumbData.data.id}`); +console.log(`🪇 lets associate B2-file with VOD ${vod.id} in Strapi`); + +// Associate B2 file with VOD +const associateResponse = await fetch(`${strapiUrl}/api/vods/${vod.id}`, { + method: 'PUT', + headers: { + 'Authorization': `Bearer ${strapiApiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: { + thumbnail: thumbData.data.id, + }, + }), +}); + +if (!associateResponse.ok) { + const msg = `💀 Failed to associate B2 file with VOD: ${associateResponse.statusText}`; + console.error(msg) + throw new Error(msg) +} + +console.log(`🫚 Association complete`); +const json = await associateResponse.json() + +return json; +} + +export async function main(vod: CVod, strapi: CStrapi, s3: S3, zone: CBunnyPullZone): CVod { +if (!vod) throw new Error('vod param is missing, and it is required.'); +if (!strapi) throw new Error('strapi param is missing, and it is required.'); +if (!s3) throw new Error(`s3 param is missing, and it is required.`); +if (!zone) throw new Error(`zone param is missing, and it is required.`); +const thumbnailFilePath = await __generateThumbnail(vod); +const b2Record = await uploadToB2(s3, thumbnailFilePath); +return associateB2WithVod(vod, strapi, b2Record, zone); +} diff --git a/packages/scout/src/temporal/activities.ts b/packages/archive/src/temporal/activities.ts similarity index 100% rename from packages/scout/src/temporal/activities.ts rename to packages/archive/src/temporal/activities.ts diff --git a/packages/archive/tsconfig.json b/packages/archive/tsconfig.json new file mode 100644 index 0000000..760a398 --- /dev/null +++ b/packages/archive/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + // Base Options recommended for all projects + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": false, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + // Enable strict type checking so you can catch bugs early + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + // Transpile our TypeScript code to JavaScript + "module": "NodeNext", + "outDir": "lib", + "lib": [ + "es2022" + ] + }, + // Include the necessary files for your project + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/packages/boop/index.ts b/packages/boop/index.ts new file mode 100644 index 0000000..a2cb338 --- /dev/null +++ b/packages/boop/index.ts @@ -0,0 +1,18 @@ +import { bell } from 'taco' +import { IPagination } from 'types' + +function main() { + const page: IPagination = { + page: 5, + pageCount: 20, + pageSize: 50, + total: 365 + } + + console.log(bell()+' '+page) + setTimeout(() => { + return main() + }, 2000) +} + +main() diff --git a/packages/boop/package.json b/packages/boop/package.json new file mode 100644 index 0000000..29ae838 --- /dev/null +++ b/packages/boop/package.json @@ -0,0 +1,18 @@ +{ + "name": "boop", + "type": "module", + "version": "1.0.1", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node index.js" + }, + "dependencies": { + "taco": "workspace:*", + "types": "workspace:*" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/packages/boop/pnpm-lock.yaml b/packages/boop/pnpm-lock.yaml new file mode 100644 index 0000000..240936c --- /dev/null +++ b/packages/boop/pnpm-lock.yaml @@ -0,0 +1,16 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + taco: + specifier: workspace:* + version: link:../taco + types: + specifier: workspace:* + version: link:../types diff --git a/packages/bot/.gitignore b/packages/bot/.gitignore deleted file mode 100644 index b512c09..0000000 --- a/packages/bot/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/packages/bot/.npmrc b/packages/bot/.npmrc deleted file mode 100644 index c189dac..0000000 --- a/packages/bot/.npmrc +++ /dev/null @@ -1 +0,0 @@ -use-node-version=>=20.0.0 \ No newline at end of file diff --git a/packages/bot/.nvmrc b/packages/bot/.nvmrc deleted file mode 100644 index 0a47c85..0000000 --- a/packages/bot/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -lts/iron \ No newline at end of file diff --git a/packages/bot/Dockerfile b/packages/bot/Dockerfile deleted file mode 100644 index 0d65757..0000000 --- a/packages/bot/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM node:20-alpine AS base -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -WORKDIR /app -RUN corepack enable - -FROM base AS build -COPY ./packages/bot/package.json ./ -COPY ./packages/bot/src ./ -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install - -FROM build AS dev -ENTRYPOINT ["pnpm"] -CMD ["run", "dev"] - -FROM build AS run -ENTRYPOINT ["pnpm"] -CMD ["start"] - diff --git a/packages/bot/README.md b/packages/bot/README.md index 9eb8e5b..fab5015 100644 --- a/packages/bot/README.md +++ b/packages/bot/README.md @@ -1,3 +1,26 @@ # bot -A.K.A. FutureButt, the discord bot that integrates into FP backend. \ No newline at end of file +A.K.A. FutureButt, the discord bot that integrates into Futureporn backend. + +## Features + +* [ ] User submitted content (USC) notifications + * [ ] Embedded video + * [ ] Prevvy storyboard + * [ ] USC publishing + * [ ] USC rejection + + +## Usage + +bot is a node.js app which uses ENV variables to ingest secrets. The following ENV vars are required. + +``` +DISCORD_TOKEN +DISCORD_CHANNEL_ID +``` + +Example invocation as follows. + +DISCORD_TOKEN=your-token-goes-here DISCORD_CHANNEL_ID=1185024773231759481 node index.js + diff --git a/packages/bot/components.js b/packages/bot/components.js deleted file mode 100644 index fec32f5..0000000 --- a/packages/bot/components.js +++ /dev/null @@ -1,106 +0,0 @@ -const { ButtonStyles, Client, ComponentTypes, ChannelTypes } = require("oceanic.js"); - -const client = new Client({ - auth: `Bot ${process.env.DISCORD_TOKEN}`, - gateway: { - intents: ["GUILD_MESSAGES"] // If the message does not start with a mention to or somehow relate to your client, you will need the MESSAGE_CONTENT intent as well - } -}); - -client.on("ready", () => console.log("Ready as", client.user.tag)); - -client.on("messageCreate", async (msg) => { - if(msg.content.includes("!component")) { - await client.rest.channels.createMessage(msg.channelID, { - content: `Here's some buttons for you, ${msg.author.mention}.`, - components: [ - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.TextButton.html - type: ComponentTypes.BUTTON, - style: ButtonStyles.PRIMARY, // The style of button - full list: https://docs.oceanic.ws/latest/enums/Constants.ButtonStyles.html - customID: "some-string-you-will-see-later", - label: "Click!", - disabled: false, // If the button is disabled, false by default. - }, - { - type: ComponentTypes.BUTTON, - style: ButtonStyles.PRIMARY, - customID: "some-other-string", - label: "This Is Disabled", - disabled: true - }, - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.URLButton.html - type: ComponentTypes.BUTTON, - style: ButtonStyles.LINK, - label: "Open Link", - url: "https://docs.oceanic.ws" - } - ] - }, - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectMenu.html - type: ComponentTypes.STRING_SELECT, - customID: "string-select", - disabled: false, - maxValues: 1, // The maximum number of values that can be selected (default 1) - minValues: 1, // The minimum number of values that can be selected (default 1) - options: [ - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectOption.html - { - default: true, // If this option is selected by default - description: "The description of the option", // Optional description - label: "Option One", - value: "value-1" - }, - { - label: "Option Two", - value: "option-2" - } - ], - placeholder: "Some Placeholder Text" - } - ] - }, - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectMenu.html - type: ComponentTypes.CHANNEL_SELECT, - channelTypes: [ChannelTypes.GUILD_TEXT, ChannelTypes.GUILD_VOICE], // The types of channels that can be selected - customID: "channel-select", - disabled: false, - maxValues: 1, // The maximum number of values that can be selected (default 1) - minValues: 1, // The minimum number of values that can be selected (default 1) - placeholder: "Some Placeholder Text" - } - ] - } - ] - }); - } -}); - -// An error handler -client.on("error", (error) => { - console.error("Something went wrong:", error); -}); - -// Connect to Discord -client.connect(); \ No newline at end of file diff --git a/packages/bot/embeds.js b/packages/bot/embeds.js deleted file mode 100644 index 1b6f1b7..0000000 --- a/packages/bot/embeds.js +++ /dev/null @@ -1,94 +0,0 @@ -const { Client } = require("oceanic.js"); -const { readFileSync } = require("fs"); - -const client = new Client({ - auth: `Bot ${process.env.DISCORD_TOKEN}`, - gateway: { - intents: ["GUILD_MESSAGES"] // If the message does not start with a mention to or somehow relate to your client, you will need the MESSAGE_CONTENT intent as well - } -}); - -client.on("ready", () => console.log("Ready as", client.user.tag)); - -client.on("messageCreate", async (msg) => { - if(msg.content.includes("!embed")) { - console.log(`'!embeds' was seen in chat!`) - console.log(msg) - await client.rest.channels.createMessage(msg.channelID, { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedOptions.html - // Up to 10 in one message - embeds: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedAuthorOptions.html - author: { - name: "Author Name", - // An image url, or attachment://filename.ext - iconURL: "https://i.furry.cool/DonPride.png", // Optional - url: "https://docs.oceanic.ws" // Optional - }, - // Array of https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedField.html - // Up to 25 in one message - fields: [ - { - name: "Field One", - value: "Field One Value", - inline: true // If this field should be displayed inline (default: false) - }, - { - name: "Field Two", - value: "Field Two Value", - inline: false - } - ], - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedFooterOptions.html - footer: { - text: "Footer Text", - // An image url, or attachment://filename.ext - iconURL: "https://i.furry.cool/DonPride.png" // Optional - }, - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedImageOptions.html - image: { - // An image url, or attachment://filename.ext - url: "https://i.furry.cool/DonPride.png" - }, - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedThumbnailOptions.html - thumbnail: { - // An image url, or attachment://filename.ext - url: "https://i.furry.cool/DonPride.png" - }, - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.EmbedOptions.html - color: 0xFFA500, // Base-10 color (0x prefix can be used for hex codes) - description: "My Cool Embed", - timestamp: new Date().toISOString(), // The current time - ISO 8601 format - title: "My Amazing Embed", - url: "https://docs.oceanic.ws" - } - ] - }); - } else if(msg.content.includes("!file")) { - await client.rest.channels.createMessage(msg.channelID, { - embeds: [ - { - image: { - // This can also be used for author & footer images - url: "attachment://image.png" - } - } - ], - files: [ - { - name: "image.png", - contents: readFileSync(`${__dirname}/image.png`) - } - ] - }); - } -}); - -// An error handler -client.on("error", (error) => { - console.error("Something went wrong:", error); -}); - -// Connect to Discord -client.connect(); \ No newline at end of file diff --git a/packages/bot/futurebutt.js b/packages/bot/futurebutt.js deleted file mode 100644 index b9fe9e2..0000000 --- a/packages/bot/futurebutt.js +++ /dev/null @@ -1,261 +0,0 @@ -const { ButtonStyles, Client, ComponentTypes, ChannelTypes } = require("oceanic.js"); - -const client = new Client({ - auth: `Bot ${process.env.DISCORD_TOKEN}`, - gateway: { - intents: ["GUILD_MESSAGES"] // If the message does not start with a mention to or somehow relate to your client, you will need the MESSAGE_CONTENT intent as well - } -}); - -client.on("ready", () => console.log("Ready as", client.user.tag)); - -client.on("messageCreate", async (msg) => { - console.log(msg.content) - if(msg.content.includes("!test")) { - await client.rest.channels.createMessage(msg.channelID, { - content: `HGERE IZ BUTTN'z 5 u, ${msg.author.mention}.`, - components: [ - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.TextButton.html - type: ComponentTypes.BUTTON, - style: ButtonStyles.PRIMARY, // The style of button - full list: https://docs.oceanic.ws/latest/enums/Constants.ButtonStyles.html - customID: "some-string-you-will-see-later", - label: "Click!", - disabled: false, // If the button is disabled, false by default. - }, - { - type: ComponentTypes.BUTTON, - style: ButtonStyles.PRIMARY, - customID: "some-other-string", - label: "This Is Disabled", - disabled: true - }, - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.URLButton.html - type: ComponentTypes.BUTTON, - style: ButtonStyles.LINK, - label: "Open Link", - url: "https://docs.oceanic.ws" - } - ] - }, - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectMenu.html - type: ComponentTypes.STRING_SELECT, - customID: "string-select", - disabled: false, - maxValues: 1, // The maximum number of values that can be selected (default 1) - minValues: 1, // The minimum number of values that can be selected (default 1) - options: [ - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectOption.html - { - default: true, // If this option is selected by default - description: "The description of the option", // Optional description - label: "Option One", - value: "value-1" - }, - { - label: "Option Two", - value: "option-2" - } - ], - placeholder: "Some Placeholder Text" - } - ] - }, - { - // The top level component must always be an action row. - // Full list of types: https://docs.oceanic.ws/latest/enums/Constants.ComponentTypes.html - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.MessageActionRow.html - type: ComponentTypes.ACTION_ROW, - components: [ - { - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.SelectMenu.html - type: ComponentTypes.CHANNEL_SELECT, - channelTypes: [ChannelTypes.GUILD_TEXT, ChannelTypes.GUILD_VOICE], // The types of channels that can be selected - customID: "channel-select", - disabled: false, - maxValues: 1, // The maximum number of values that can be selected (default 1) - minValues: 1, // The minimum number of values that can be selected (default 1) - placeholder: "Some Placeholder Text" - } - ] - } - ] - }); - } -}); - - -client.on("interactionCreate", async(interaction) => { - console.log(`interaction!@`) - console.log(interaction) - switch(interaction.type) { - // https://docs.oceanic.ws/latest/classes/CommandInteraction.CommandInteraction.html - case InteractionTypes.APPLICATION_COMMAND: { - // defer interactions as soon as possible, you have three seconds to send any initial response - // if you wait too long, the interaction may be invalidated - await interaction.defer(); - // If you want the response to be ephemeral, you can provide the flag to the defer function, like so: - // await interaction.defer(MessageFlags.EPHEMERAL); - - // data = https://docs.oceanic.ws/latest/interfaces/Types_Interactions.ApplicationCommandInteractionData.html - switch(interaction.data.type) { - // Chat Input commands are what you use in the chat, i.e. slash commands - case ApplicationCommandTypes.CHAT_INPUT: { - if(interaction.data.name === "greet") { - // assume we have two options, user (called user) then string (called greeting) - first is required, second is not - - // Get an option named `user` with the type USER - https://docs.oceanic.ws/dev/classes/InteractionOptionsWrapper.InteractionOptionsWrapper.html#getUser - // Setting the second parameter to true will throw an error if the option is not present - const user = interaction.data.options.getUser("user", true); - const greeting = interaction.data.options.getString("greeting", false) || "Hello, "; - - // since we've already deferred the interaction, we cannot use createMessage (this is an initial response) - // we can only have one initial response, so we use createFollowup - await interaction.createFollowup({ - content: `${greeting} ${user.mention}!`, - allowedMentions: { - users: [user.id] - } - }); - } - - // Chat Input application command interactions also have a set of resolved data, which is structured as so: - // https://docs.oceanic.ws/latest/interfaces/Types_Interactions.ApplicationCommandInteractionResolvedData.html - // the options wrapper pulls values out of resolved automatically, if you use the right method - break; - } - - // User application commands are shown in the context menu when right-clicking on users - // `data` will have a target (and targetID) property with the user that the command was executed on - // These don't have options - case ApplicationCommandTypes.USER: { - if(interaction.data.name === "ping") { - await interaction.createFollowup({ - content: `Pong! ${interaction.data.target.mention}`, - allowedMentions: { - users: [interaction.data.target.id] - } - }); - } - break; - } - - // Message application commands are shown in the context menu when right-clicking on messages - // `data` will have a target (and targetID) property with the message that the command was executed on - // Same as user commands, these don't have options - case ApplicationCommandTypes.MESSAGE: { - if(interaction.data.name === "author") { - await interaction.createFollowup({ - content: `${interaction.data.target.author.mention} is the author of that message!`, - allowedMentions: { - users: [interaction.data.target.author.id] - } - }); - } - break; - } - } - break; - } - - // https://docs.oceanic.ws/latest/classes/ComponentInteraction.ComponentInteraction.html - case InteractionTypes.MESSAGE_COMPONENT: { - // same spiel as above - await interaction.defer(); - // when you create a message with components, this will correspond with what you provided as the customID there - if(interaction.data.componentType === ComponentTypes.BUTTON) { - if(interaction.data.customID === "edit-message") { - // Edits the original message. This has an initial response variant: editParent - await interaction.editOriginal({ - content: `This message was edited by ${interaction.user.mention}!`, - allowedMentions: { - users: [interaction.user.id] - } - }); - } else if(interaction.data.customID === "my-amazing-button") { - await interaction.createFollowup({ - content: "You clicked an amazing button!" - }); - } - } else if(interaction.data.componentType === ComponentTypes.SELECT_MENU) { - // The `values` property under data contains all the selected values - await interaction.createFollowup({ - content: `You selected: **${interaction.data.values.join("**, **")}**` - }); - } - break; - } - - // https://docs.oceanic.ws/latest/classes/AutocompleteInteraction.AutocompleteInteraction.html - case InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE: { - // Autocomplete Interactions cannot be deferred - switch(interaction.data.name) { - case "test-autocomplete": { - // Autocomplete interactions data has a partial `options` property, which is the tree of options that are currently being filled in - // along with one at the end, which will have focused - // Setting the first parameter to true will throw an error if no focused option is present - const option = interaction.data.options.getFocused(true); - switch(option.name) { - case "test-option": { - return interaction.result([ - { - name: "Choice 1", - nameLocalizations: { - "es-ES": "Opción 1" - }, - value: "choice-1" - }, - { - name: "Choice 2", - nameLocalizations: { - "es-ES": "Opción 2" - }, - value: "choice-2" - } - ]); - break; - } - } - } - } - break; - } - - // https://docs.oceanic.ws/latest/classes/ModalSubmitInteraction.ModalSubmitInteraction.html - case InteractionTypes.MODAL_SUBMIT: { - // this will correspond with the customID you provided when creating the modal - switch(interaction.data.customID) { - case "test-modal": { - // the `components` property under data contains all the components that were submitted - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.ModalActionRow.html - console.log(interaction.data.components); - break; - } - } - break; - } - } -}); - - -// An error handler -client.on("error", (error) => { - console.error("Something went wrong:", error); -}); - -// Connect to Discord -client.connect(); \ No newline at end of file diff --git a/packages/bot/index.js b/packages/bot/index.js new file mode 100644 index 0000000..548f039 --- /dev/null +++ b/packages/bot/index.js @@ -0,0 +1,70 @@ +import 'dotenv/config'; +import { Client, Events, GatewayIntentBits, Partials } from 'discord.js'; + +if (!process.env.DISCORD_TOKEN) throw new Error("DISCORD_TOKEN was missing from env"); +if (!process.env.DISCORD_CHANNEL_ID) throw new Error("DISCORD_CHANNEL_ID was missing from env"); + +const channelId = ''+process.env.DISCORD_CHANNEL_ID +console.log(`channelId is ${channelId}`) + +// Create a new client instance +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.GuildMessageReactions, + ], + partials: [ + Partials.Message, + Partials.Channel, + Partials.Reaction, + ] +}); + +// When the client is ready, run this code (only once). +// The distinction between `client: Client` and `readyClient: Client` is important for TypeScript developers. +// It makes some properties non-nullable. +client.once(Events.ClientReady, readyClient => { + console.log(`Ready! Logged in as ${readyClient.user.tag} yuhu`); + // client.channels.cache.get(process.env.DISCORD_CHANNEL_ID).send('testing 123'); + readyClient.channels.fetch(channelId).then(channel => { + channel.send('generic welcome message!') + }); + // console.log(readyClient.channels) + // const channel = readyClient.channels.cache.get(process.env.DISCORD_CHANNEL_ID); + // channel.send('testing 135'); +}); + +client.on(Events.InteractionCreate, async interaction => { + if (!interaction.isChatInputCommand()) return; + + const { commandName } = interaction; + + if (commandName === 'react') { + const message = await interaction.reply({ content: 'You can react with Unicode emojis!', fetchReply: true }); + message.react('😄'); + } +}) + +client.on(Events.MessageReactionAdd, async (reaction, user) => { + // When a reaction is received, check if the structure is partial + if (reaction.partial) { + // If the message this reaction belongs to was removed, the fetching might result in an API error which should be handled + try { + await reaction.fetch(); + } catch (error) { + console.error('Something went wrong when fetching the message:', error); + // Return as `reaction.message.author` may be undefined/null + return; + } + } + + // Now the message has been cached and is fully available + console.log(`${reaction.message.author}'s message "${reaction.message.content}" gained a reaction!`); + // The reaction is now also fully available and the properties will be reflected accurately: + console.log(`${reaction.count} user(s) have given the same reaction to this message!`); +}); + + +// Log in to Discord with your client's token +client.login(process.env.DISCORD_TOKEN); diff --git a/packages/bot/interactions.js b/packages/bot/interactions.js deleted file mode 100644 index 91940a4..0000000 --- a/packages/bot/interactions.js +++ /dev/null @@ -1,171 +0,0 @@ -const { Client, InteractionTypes, MessageFlags, ComponentTypes, ApplicationCommandTypes } = require("oceanic.js"); - -const client = new Client({ - auth: `Bot ${process.env.DISCORD_TOKEN}`, - gateway: { - intents: 0 // No intents are needed if you are only using interactions - } -}); - - -client.on("ready", async() => { - console.log("Ready as", client.user.tag); -}); - -client.on("interactionCreate", async(interaction) => { - switch(interaction.type) { - // https://docs.oceanic.ws/latest/classes/CommandInteraction.CommandInteraction.html - case InteractionTypes.APPLICATION_COMMAND: { - // defer interactions as soon as possible, you have three seconds to send any initial response - // if you wait too long, the interaction may be invalidated - await interaction.defer(); - // If you want the response to be ephemeral, you can provide the flag to the defer function, like so: - // await interaction.defer(MessageFlags.EPHEMERAL); - - // data = https://docs.oceanic.ws/latest/interfaces/Types_Interactions.ApplicationCommandInteractionData.html - switch(interaction.data.type) { - // Chat Input commands are what you use in the chat, i.e. slash commands - case ApplicationCommandTypes.CHAT_INPUT: { - if(interaction.data.name === "greet") { - // assume we have two options, user (called user) then string (called greeting) - first is required, second is not - - // Get an option named `user` with the type USER - https://docs.oceanic.ws/dev/classes/InteractionOptionsWrapper.InteractionOptionsWrapper.html#getUser - // Setting the second parameter to true will throw an error if the option is not present - const user = interaction.data.options.getUser("user", true); - const greeting = interaction.data.options.getString("greeting", false) || "Hello, "; - - // since we've already deferred the interaction, we cannot use createMessage (this is an initial response) - // we can only have one initial response, so we use createFollowup - await interaction.createFollowup({ - content: `${greeting} ${user.mention}!`, - allowedMentions: { - users: [user.id] - } - }); - } - - // Chat Input application command interactions also have a set of resolved data, which is structured as so: - // https://docs.oceanic.ws/latest/interfaces/Types_Interactions.ApplicationCommandInteractionResolvedData.html - // the options wrapper pulls values out of resolved automatically, if you use the right method - break; - } - - // User application commands are shown in the context menu when right-clicking on users - // `data` will have a target (and targetID) property with the user that the command was executed on - // These don't have options - case ApplicationCommandTypes.USER: { - if(interaction.data.name === "ping") { - await interaction.createFollowup({ - content: `Pong! ${interaction.data.target.mention}`, - allowedMentions: { - users: [interaction.data.target.id] - } - }); - } - break; - } - - // Message application commands are shown in the context menu when right-clicking on messages - // `data` will have a target (and targetID) property with the message that the command was executed on - // Same as user commands, these don't have options - case ApplicationCommandTypes.MESSAGE: { - if(interaction.data.name === "author") { - await interaction.createFollowup({ - content: `${interaction.data.target.author.mention} is the author of that message!`, - allowedMentions: { - users: [interaction.data.target.author.id] - } - }); - } - break; - } - } - break; - } - - // https://docs.oceanic.ws/latest/classes/ComponentInteraction.ComponentInteraction.html - case InteractionTypes.MESSAGE_COMPONENT: { - // same spiel as above - await interaction.defer(); - // when you create a message with components, this will correspond with what you provided as the customID there - if(interaction.data.componentType === ComponentTypes.BUTTON) { - if(interaction.data.customID === "edit-message") { - // Edits the original message. This has an initial response variant: editParent - await interaction.editOriginal({ - content: `This message was edited by ${interaction.user.mention}!`, - allowedMentions: { - users: [interaction.user.id] - } - }); - } else if(interaction.data.customID === "my-amazing-button") { - await interaction.createFollowup({ - content: "You clicked an amazing button!" - }); - } - } else if(interaction.data.componentType === ComponentTypes.SELECT_MENU) { - // The `values` property under data contains all the selected values - await interaction.createFollowup({ - content: `You selected: **${interaction.data.values.join("**, **")}**` - }); - } - break; - } - - // https://docs.oceanic.ws/latest/classes/AutocompleteInteraction.AutocompleteInteraction.html - case InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE: { - // Autocomplete Interactions cannot be deferred - switch(interaction.data.name) { - case "test-autocomplete": { - // Autocomplete interactions data has a partial `options` property, which is the tree of options that are currently being filled in - // along with one at the end, which will have focused - // Setting the first parameter to true will throw an error if no focused option is present - const option = interaction.data.options.getFocused(true); - switch(option.name) { - case "test-option": { - return interaction.result([ - { - name: "Choice 1", - nameLocalizations: { - "es-ES": "Opción 1" - }, - value: "choice-1" - }, - { - name: "Choice 2", - nameLocalizations: { - "es-ES": "Opción 2" - }, - value: "choice-2" - } - ]); - break; - } - } - } - } - break; - } - - // https://docs.oceanic.ws/latest/classes/ModalSubmitInteraction.ModalSubmitInteraction.html - case InteractionTypes.MODAL_SUBMIT: { - // this will correspond with the customID you provided when creating the modal - switch(interaction.data.customID) { - case "test-modal": { - // the `components` property under data contains all the components that were submitted - // https://docs.oceanic.ws/latest/interfaces/Types_Channels.ModalActionRow.html - console.log(interaction.data.components); - break; - } - } - break; - } - } -}); - -// An error handler -client.on("error", (error) => { - console.error("Something went wrong:", error); -}); - -// Connect to Discord -client.connect(); \ No newline at end of file diff --git a/packages/bot/package.json b/packages/bot/package.json index f050c54..45f72c9 100644 --- a/packages/bot/package.json +++ b/packages/bot/package.json @@ -1,22 +1,20 @@ { - "name": "fp-bot", + "name": "bot", + "type": "module", "version": "1.0.0", "description": "", - "main": "index.ts", + "main": "index.js", "scripts": { - "dev": "node --import=tsx --watch ./src/index.ts" + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node index", + "dev": "nodemon index" }, "keywords": [], "author": "", - "license": "CC0-1.0", - "devDependencies": { - "tsx": "^4.7.2" - }, + "license": "Unlicense", "dependencies": { - "@types/express": "^4.17.21", - "@types/node": "^20.12.6", - "discordeno": "^18.0.1", - "express": "^4.19.2", - "oceanic.js": "^1.10.0" + "discord.js": "^14.15.3", + "dotenv": "^16.4.5", + "nodemon": "^3.1.4" } } diff --git a/packages/bot/pnpm-lock.yaml b/packages/bot/pnpm-lock.yaml index a530c5e..026c747 100644 --- a/packages/bot/pnpm-lock.yaml +++ b/packages/bot/pnpm-lock.yaml @@ -8,532 +8,226 @@ importers: .: dependencies: - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 - '@types/node': - specifier: ^20.12.6 - version: 20.12.6 - discordeno: - specifier: ^18.0.1 - version: 18.0.1 - express: - specifier: ^4.19.2 - version: 4.19.2 - oceanic.js: - specifier: ^1.10.0 - version: 1.10.0 - devDependencies: - tsx: - specifier: ^4.7.2 - version: 4.7.2 + discord.js: + specifier: ^14.15.3 + version: 14.15.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + nodemon: + specifier: ^3.1.4 + version: 3.1.4 packages: - '@deno/shim-deno-test@0.3.3': - resolution: {integrity: sha512-Ge0Tnl7zZY0VvEfgsyLhjid8DzI1d0La0dgm+3m0/A8gZXgp5xwlyIyue5e4SCUuVB/3AH/0lun9LcJhhTwmbg==} - - '@deno/shim-deno@0.9.0': - resolution: {integrity: sha512-iP+qdI4Oy/Mw9yv40TqdjNKL+stpKDo8drki2cKisTXgZf+GoIdMhIuODxSypRyv6wxIuHNx7ZiKE3Sl3kAHuw==} - - '@deno/shim-timers@0.1.0': - resolution: {integrity: sha512-XFRnB5Rtbkd5RiYHwhugNK9gvDgYXmFTUOT5dmhWCKG7WnOWZggbJMnH1NcyYS3QgHvmaTOaHCyNFNSv57j3Dg==} - - '@discordjs/voice@0.16.1': - resolution: {integrity: sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==} + '@discordjs/builders@1.8.2': + resolution: {integrity: sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==} engines: {node: '>=16.11.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] + '@discordjs/collection@1.5.3': + resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} + engines: {node: '>=16.11.0'} - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] + '@discordjs/collection@2.1.0': + resolution: {integrity: sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==} + engines: {node: '>=18'} - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] + '@discordjs/formatters@0.4.0': + resolution: {integrity: sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==} + engines: {node: '>=16.11.0'} - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] + '@discordjs/rest@2.3.0': + resolution: {integrity: sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==} + engines: {node: '>=16.11.0'} - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + '@discordjs/util@1.1.0': + resolution: {integrity: sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==} + engines: {node: '>=16.11.0'} - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] + '@discordjs/ws@1.1.1': + resolution: {integrity: sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==} + engines: {node: '>=16.11.0'} - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + '@sapphire/async-queue@1.5.2': + resolution: {integrity: sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + '@sapphire/shapeshift@3.9.7': + resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} + engines: {node: '>=v16'} - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + '@sapphire/snowflake@3.5.3': + resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/node@20.12.6': - resolution: {integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==} - - '@types/qs@6.9.14': - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + '@vladfrangu/async_event_emitter@2.4.1': + resolution: {integrity: sha512-cedU1DrzO4oliUigSAOqSgts6wEfGGSbpO1hYxvKbz8sr7a0meyP3GxnL6hIUtBK0nMG6zHfIYWcqOIb+MRI7w==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + discord-api-types@0.37.83: + resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + discord.js@14.15.3: + resolution: {integrity: sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==} + engines: {node: '>=16.11.0'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - discord-api-types@0.37.61: - resolution: {integrity: sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==} - - discordeno@18.0.1: - resolution: {integrity: sha512-d3D/HpC39YGInmxy2HK90kPpMMu2gYYsWuwtEEFPWpq2hlR9dvad4ihvLursPz5bj4Ob1NWOgPv3kz/bwMSIpw==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - hasBin: true - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + magic-bytes.js@1.10.0: + resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + nodemon@3.1.4: + resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} + engines: {node: '>=10'} hasBin: true - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} - oceanic.js@1.10.0: - resolution: {integrity: sha512-WYgtdBHBSVX/2kCycU64WA0c2b4BOsAREXek06dOz1cqfX8464HFRamSJir6pOiTQvnW/nk/WN8r3Bq6Yt9lrQ==} - engines: {node: '>=18.13.0'} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} - prism-media@1.3.5: - resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} - peerDependencies: - '@discordjs/opus': '>=0.8.0 <1.0.0' - ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 - node-opus: ^0.3.3 - opusscript: ^0.0.8 - peerDependenciesMeta: - '@discordjs/opus': - optional: true - ffmpeg-static: - optional: true - node-opus: - optional: true - opusscript: - optional: true + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.7.2: - resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} - engines: {node: '>=18.0.0'} - hasBin: true - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@6.13.0: + resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} + engines: {node: '>=18.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -546,515 +240,220 @@ packages: snapshots: - '@deno/shim-deno-test@0.3.3': {} - - '@deno/shim-deno@0.9.0': + '@discordjs/builders@1.8.2': dependencies: - '@deno/shim-deno-test': 0.3.3 - which: 2.0.2 - - '@deno/shim-timers@0.1.0': {} - - '@discordjs/voice@0.16.1': - dependencies: - '@types/ws': 8.5.10 - discord-api-types: 0.37.61 - prism-media: 1.3.5 + '@discordjs/formatters': 0.4.0 + '@discordjs/util': 1.1.0 + '@sapphire/shapeshift': 3.9.7 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + ts-mixer: 6.0.4 tslib: 2.6.2 - ws: 8.16.0 + + '@discordjs/collection@1.5.3': {} + + '@discordjs/collection@2.1.0': {} + + '@discordjs/formatters@0.4.0': + dependencies: + discord-api-types: 0.37.83 + + '@discordjs/rest@2.3.0': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@sapphire/snowflake': 3.5.3 + '@vladfrangu/async_event_emitter': 2.4.1 + discord-api-types: 0.37.83 + magic-bytes.js: 1.10.0 + tslib: 2.6.2 + undici: 6.13.0 + + '@discordjs/util@1.1.0': {} + + '@discordjs/ws@1.1.1': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/rest': 2.3.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@types/ws': 8.5.10 + '@vladfrangu/async_event_emitter': 2.4.1 + discord-api-types: 0.37.83 + tslib: 2.6.2 + ws: 8.18.0 transitivePeerDependencies: - - '@discordjs/opus' - bufferutil - - ffmpeg-static - - node-opus - - opusscript - utf-8-validate - optional: true - '@esbuild/aix-ppc64@0.19.12': - optional: true + '@sapphire/async-queue@1.5.2': {} - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-loong64@0.19.12': - optional: true - - '@esbuild/linux-mips64el@0.19.12': - optional: true - - '@esbuild/linux-ppc64@0.19.12': - optional: true - - '@esbuild/linux-riscv64@0.19.12': - optional: true - - '@esbuild/linux-s390x@0.19.12': - optional: true - - '@esbuild/linux-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@fastify/busboy@2.1.1': {} - - '@types/body-parser@1.19.5': + '@sapphire/shapeshift@3.9.7': dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.12.6 + fast-deep-equal: 3.1.3 + lodash: 4.17.21 - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.6 + '@sapphire/snowflake@3.5.3': {} - '@types/express-serve-static-core@4.19.0': - dependencies: - '@types/node': 20.12.6 - '@types/qs': 6.9.14 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.14 - '@types/serve-static': 1.15.7 - - '@types/http-errors@2.0.4': {} - - '@types/mime@1.3.5': {} - - '@types/node@20.12.6': + '@types/node@20.14.10': dependencies: undici-types: 5.26.5 - '@types/qs@6.9.14': {} - - '@types/range-parser@1.2.7': {} - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.12.6 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 20.12.6 - '@types/send': 0.17.4 - '@types/ws@8.5.10': dependencies: - '@types/node': 20.12.6 - optional: true + '@types/node': 20.14.10 - accepts@1.3.8: + '@vladfrangu/async_event_emitter@2.4.1': {} + + anymatch@3.1.3: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + normalize-path: 3.0.0 + picomatch: 2.3.1 - array-flatten@1.1.1: {} + balanced-match@1.0.2: {} - body-parser@1.20.2: + binary-extensions@2.3.0: {} + + brace-expansion@1.1.11: dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + balanced-match: 1.0.2 + concat-map: 0.0.1 - bytes@3.1.2: {} - - call-bind@1.0.7: + braces@3.0.3: dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + fill-range: 7.1.1 - content-disposition@0.5.4: + chokidar@3.6.0: dependencies: - safe-buffer: 5.2.1 + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - content-type@1.0.5: {} + concat-map@0.0.1: {} - cookie-signature@1.0.6: {} - - cookie@0.6.0: {} - - debug@2.6.9: + debug@4.3.5(supports-color@5.5.0): dependencies: - ms: 2.0.0 + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 - define-data-property@1.1.4: + discord-api-types@0.37.83: {} + + discord.js@14.15.3: dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - depd@2.0.0: {} - - destroy@1.2.0: {} - - discord-api-types@0.37.61: - optional: true - - discordeno@18.0.1: - dependencies: - '@deno/shim-deno': 0.9.0 - '@deno/shim-timers': 0.1.0 - undici: 5.28.4 - ws: 8.16.0 + '@discordjs/builders': 1.8.2 + '@discordjs/collection': 1.5.3 + '@discordjs/formatters': 0.4.0 + '@discordjs/rest': 2.3.0 + '@discordjs/util': 1.1.0 + '@discordjs/ws': 1.1.1 + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + lodash.snakecase: 4.1.1 + tslib: 2.6.2 + undici: 6.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate - ee-first@1.1.1: {} + dotenv@16.4.5: {} - encodeurl@1.0.2: {} + fast-deep-equal@3.1.3: {} - es-define-property@1.0.0: + fill-range@7.1.1: dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - escape-html@1.0.3: {} - - etag@1.8.1: {} - - express@4.19.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - finalhandler@1.2.0: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - forwarded@0.2.0: {} - - fresh@0.5.2: {} + to-regex-range: 5.0.1 fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - get-intrinsic@1.2.4: + glob-parent@5.1.2: dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 + is-glob: 4.0.3 - get-tsconfig@4.7.3: + has-flag@3.0.0: {} + + ignore-by-default@1.0.1: {} + + is-binary-path@2.1.0: dependencies: - resolve-pkg-maps: 1.0.0 + binary-extensions: 2.3.0 - gopd@1.0.1: + is-extglob@2.1.1: {} + + is-glob@4.0.3: dependencies: - get-intrinsic: 1.2.4 + is-extglob: 2.1.1 - has-property-descriptors@1.0.2: + is-number@7.0.0: {} + + lodash.snakecase@4.1.1: {} + + lodash@4.17.21: {} + + magic-bytes.js@1.10.0: {} + + minimatch@3.1.2: dependencies: - es-define-property: 1.0.0 + brace-expansion: 1.1.11 - has-proto@1.0.3: {} + ms@2.1.2: {} - has-symbols@1.0.3: {} - - hasown@2.0.2: + nodemon@3.1.4: dependencies: - function-bind: 1.1.2 + chokidar: 3.6.0 + debug: 4.3.5(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.6.2 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 - http-errors@2.0.0: + normalize-path@3.0.0: {} + + picomatch@2.3.1: {} + + pstree.remy@1.1.8: {} + + readdirp@3.6.0: dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 + picomatch: 2.3.1 - iconv-lite@0.4.24: + semver@7.6.2: {} + + simple-update-notifier@2.0.0: dependencies: - safer-buffer: 2.1.2 + semver: 7.6.2 - inherits@2.0.4: {} - - ipaddr.js@1.9.1: {} - - isexe@2.0.0: {} - - media-typer@0.3.0: {} - - merge-descriptors@1.0.1: {} - - methods@1.1.2: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: + supports-color@5.5.0: dependencies: - mime-db: 1.52.0 + has-flag: 3.0.0 - mime@1.6.0: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - negotiator@0.6.3: {} - - object-inspect@1.13.1: {} - - oceanic.js@1.10.0: + to-regex-range@5.0.1: dependencies: - tslib: 2.6.2 - ws: 8.16.0 - optionalDependencies: - '@discordjs/voice': 0.16.1 - transitivePeerDependencies: - - '@discordjs/opus' - - bufferutil - - ffmpeg-static - - node-opus - - opusscript - - utf-8-validate + is-number: 7.0.0 - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + touch@3.1.1: {} - parseurl@1.3.3: {} - - path-to-regexp@0.1.7: {} - - prism-media@1.3.5: - optional: true - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - qs@6.11.0: - dependencies: - side-channel: 1.0.6 - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - resolve-pkg-maps@1.0.0: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - setprototypeof@1.2.0: {} - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - - statuses@2.0.1: {} - - toidentifier@1.0.1: {} + ts-mixer@6.0.4: {} tslib@2.6.2: {} - tsx@4.7.2: - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.3 - optionalDependencies: - fsevents: 2.3.3 - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + undefsafe@2.0.5: {} undici-types@5.26.5: {} - undici@5.28.4: - dependencies: - '@fastify/busboy': 2.1.1 + undici@6.13.0: {} - unpipe@1.0.0: {} - - utils-merge@1.0.1: {} - - vary@1.1.2: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - ws@8.16.0: {} + ws@8.18.0: {} diff --git a/packages/bot/src/configs.ts b/packages/bot/src/configs.ts deleted file mode 100644 index 6deb9c9..0000000 --- a/packages/bot/src/configs.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { getBotIdFromToken, Intents } from 'discordeno'; - - -/** The bot id, derived from the bot token. */ -export const BOT_ID = getBotIdFromToken(process.env.DISCORD_TOKEN as string); -export const EVENT_HANDLER_URL = `http://${process.env.EVENT_HANDLER_HOST}:${process.env.EVENT_HANDLER_PORT}`; -export const REST_URL = `http://${process.env.REST_HOST}:${process.env.REST_PORT}`; -export const GATEWAY_URL = `http://${process.env.GATEWAY_HOST}:${process.env.GATEWAY_PORT}`; - -// Gateway Proxy Configurations -/** The gateway intents you would like to use. */ -export const INTENTS: Intents = - // SETUP-DD-TEMP: Add the intents you want enabled here. Or Delete the intents you don't want in your bot. - Intents.DirectMessageReactions | - Intents.DirectMessageTyping | - Intents.DirectMessages | - Intents.GuildBans | - Intents.GuildEmojis | - Intents.GuildIntegrations | - Intents.GuildInvites | - Intents.GuildMembers | - Intents.GuildMessageReactions | - Intents.GuildMessageTyping | - Intents.GuildMessages | - Intents.GuildPresences | - Intents.GuildVoiceStates | - Intents.GuildWebhooks | - Intents.Guilds; \ No newline at end of file diff --git a/packages/bot/src/index.ts b/packages/bot/src/index.ts deleted file mode 100644 index ac2c148..0000000 --- a/packages/bot/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ - -import { BASE_URL, createRestManager } from 'discordeno'; -import express, { Request, Response } from 'express'; -// import { setupAnalyticsHooks } from '../analytics.js'; -import { REST_URL } from './configs.js'; - -const DISCORD_TOKEN = process.env.DISCORD_TOKEN as string; -const REST_AUTHORIZATION = process.env.REST_AUTHORIZATION as string; -const REST_PORT = process.env.REST_PORT as string; - -const rest = createRestManager({ - token: DISCORD_TOKEN, - secretKey: REST_AUTHORIZATION, - customUrl: REST_URL, - debug: console.log, -}); - -// Add send fetching analytics hook to rest -// setupAnalyticsHooks(rest); - -// @ts-expect-error -rest.convertRestError = (errorStack, data) => { - if (!data) return { message: errorStack.message }; - return { ...data, message: errorStack.message }; -}; - -const app = express(); - -app.use( - express.urlencoded({ - extended: true, - }), -); - -app.use(express.json()); - -app.all('/*', async (req: Request, res: Response) => { - if (!REST_AUTHORIZATION || REST_AUTHORIZATION !== req.headers.authorization) { - return res.status(401).json({ error: 'Invalid authorization key.' }); - } - - try { - const result = await rest.runMethod(rest, req.method, `${BASE_URL}${req.url}`, req.body); - - if (result) { - res.status(200).json(result); - } else { - res.status(204).json(); - } - } catch (error: any) { - console.log(error); - res.status(500).json(error); - } -}); - -app.listen(REST_PORT, () => { - console.log(`REST listening at ${REST_URL}`); -}); \ No newline at end of file diff --git a/packages/bot/src/rest/README.md b/packages/bot/src/rest/README.md deleted file mode 100644 index fedd9ca..0000000 --- a/packages/bot/src/rest/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# REST Proxy - -This folder will contain the code for our REST proxy. This is going to become the single source that all of our bot will -use to communciate to the Discord API. - -## Further Steps - -- Express framework to create the listener however, you can replace it with anything you like. Express is quite a - bloated framework. Feel free to optimize to a better framework. \ No newline at end of file diff --git a/packages/bot/tsconfig.json b/packages/bot/tsconfig.json deleted file mode 100644 index 23b8976..0000000 --- a/packages/bot/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "es2022", - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "outDir": "./dist", - "rootDir": "./src", - "esModuleInterop": true, - "importHelpers": true, - "allowUnusedLabels": false, - "noImplicitOverride": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noUncheckedIndexedAccess": true, - "strict": true, - "stripInternal": true, - "noFallthroughCasesInSwitch": true, - "useUnknownInCatchVariables": false, - "allowUnreachableCode": false, - "skipLibCheck": true, - "moduleResolution": "node" - }, - "include": ["./src/**/*", ".env"], - "ts-node": { - "esm": true, - "experimentalSpecifierResolution": "node", - "swc": true - } -} \ No newline at end of file diff --git a/packages/image/.mocharc.json b/packages/image/.mocharc.json new file mode 100644 index 0000000..9c05d8d --- /dev/null +++ b/packages/image/.mocharc.json @@ -0,0 +1,3 @@ +{ + "loader": "ts-node/esm" +} \ No newline at end of file diff --git a/packages/scout/src/image.spec.js b/packages/image/index.spec.ts similarity index 82% rename from packages/scout/src/image.spec.js rename to packages/image/index.spec.ts index af3167d..a8dfe55 100644 --- a/packages/scout/src/image.spec.js +++ b/packages/image/index.spec.ts @@ -1,5 +1,5 @@ -import { getProminentColor, rgbToHex, getStoryboard } from './image.js' +import { getProminentColor, rgbToHex, getStoryboard } from './index.js' import { expect } from 'chai' import { describe } from 'mocha' import path from 'node:path' @@ -14,9 +14,9 @@ describe('image', function () { }) describe('rgbToHex', function () { it('should convert color to hex {String} hexidecimal code', function () { - const mulberry = [255, 87, 51] - const screaminGreen = [77, 255, 106] - const amaranth = [227, 64, 81] + const mulberry = [255, 87, 51] as const + const screaminGreen = [77, 255, 106] as const + const amaranth = [227, 64, 81] as const expect(rgbToHex(...mulberry)).to.equal('#ff5733') expect(rgbToHex(...screaminGreen)).to.equal('#4dff6a') expect(rgbToHex(...amaranth)).to.equal('#e34051') diff --git a/packages/image/index.ts b/packages/image/index.ts new file mode 100644 index 0000000..1a3d315 --- /dev/null +++ b/packages/image/index.ts @@ -0,0 +1,30 @@ +// import ColorThief from 'colorthief'; +import sharp from 'sharp'; +import Prevvy from 'prevvy'; +import path from 'path'; +import { getTmpFile } from 'utils'; + +export async function getProminentColor(imageFile: string): Promise { + const { dominant } = await sharp(imageFile).stats(); + const { r, g, b } = dominant; + return rgbToHex(r, g, b); +} + +export function rgbToHex(r: number, g: number, b: number): string { + return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1); +} + +export async function getStoryboard(imageFileOrUrl: string): Promise { + let base = path.basename(imageFileOrUrl); + let outputImagePath = getTmpFile(base); + let options = { + input: imageFileOrUrl, + output: outputImagePath, + width: 265, + cols: 5, + rows: 5, + }; + let prevvy = new Prevvy(options); + await prevvy.generate(); + return outputImagePath; +} \ No newline at end of file diff --git a/packages/image/package.json b/packages/image/package.json new file mode 100644 index 0000000..772fce3 --- /dev/null +++ b/packages/image/package.json @@ -0,0 +1,26 @@ +{ + "name": "image", + "type": "module", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "Unlicense", + "dependencies": { + "@types/chai": "^4.3.16", + "@types/mocha": "^10.0.7", + "prevvy": "^7.0.1", + "sharp": "^0.33.4", + "utils": "workspace:^" + }, + "devDependencies": { + "chai": "^5.1.1", + "mocha": "^10.6.0", + "ts-node": "^10.9.2", + "typescript": "^5.5.3" + } +} diff --git a/packages/image/pnpm-lock.yaml b/packages/image/pnpm-lock.yaml new file mode 100644 index 0000000..44fa8c1 --- /dev/null +++ b/packages/image/pnpm-lock.yaml @@ -0,0 +1,1263 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/chai': + specifier: ^4.3.16 + version: 4.3.16 + '@types/mocha': + specifier: ^10.0.7 + version: 10.0.7 + prevvy: + specifier: ^7.0.1 + version: 7.5.0 + sharp: + specifier: ^0.33.4 + version: 0.33.4 + utils: + specifier: workspace:^ + version: link:../utils + devDependencies: + chai: + specifier: ^5.1.1 + version: 5.1.1 + mocha: + specifier: ^10.6.0 + version: 10.6.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) + typescript: + specifier: ^5.5.3 + version: 5.5.3 + +packages: + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + + '@img/sharp-darwin-arm64@0.33.4': + resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.4': + resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.2': + resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.2': + resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.2': + resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.2': + resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.2': + resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.2': + resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.4': + resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.4': + resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.4': + resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} + engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.4': + resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.4': + resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.4': + resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.4': + resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.4': + resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.4': + resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/fluent-ffmpeg@2.1.24': + resolution: {integrity: sha512-g5oQO8Jgi2kFS3tTub7wLvfLztr1s8tdXmRd8PiL/hLMLzTIAyMR2sANkTggM/rdEDAg3d63nYRRVepwBiCw5A==} + + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + + '@types/mocha@10.0.7': + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + + luxon@1.28.1: + resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + mocha@10.6.0: + resolution: {integrity: sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + prevvy@7.5.0: + resolution: {integrity: sha512-4aKAl2fBhD7rkn2xfxApUP4Il6ILBBJCNMk1TURdXAfXfakSynhjNmnpgb/bj1xSRW0lJYXjULdZFEy8bQdCNw==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + sharp@0.33.4: + resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} + engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/runtime@1.2.0': + dependencies: + tslib: 2.6.3 + optional: true + + '@img/sharp-darwin-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.2 + optional: true + + '@img/sharp-darwin-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.2': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.2': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.2': + optional: true + + '@img/sharp-linux-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.2 + optional: true + + '@img/sharp-linux-arm@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.2 + optional: true + + '@img/sharp-linux-s390x@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.2 + optional: true + + '@img/sharp-linux-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + optional: true + + '@img/sharp-wasm32@0.33.4': + dependencies: + '@emnapi/runtime': 1.2.0 + optional: true + + '@img/sharp-win32-ia32@0.33.4': + optional: true + + '@img/sharp-win32-x64@0.33.4': + optional: true + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/chai@4.3.16': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/fluent-ffmpeg@2.1.24': + dependencies: + '@types/node': 20.14.10 + + '@types/luxon@3.4.2': {} + + '@types/mocha@10.0.7': {} + + '@types/ms@0.7.34': {} + + '@types/node@20.14.10': + dependencies: + undici-types: 5.26.5 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + async@0.2.10: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + camelcase@6.3.0: {} + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.5(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + deep-eql@5.0.2: {} + + detect-libc@2.0.3: {} + + diff@4.0.2: {} + + diff@5.2.0: {} + + emoji-regex@8.0.0: {} + + escalade@3.1.2: {} + + escape-string-regexp@4.0.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + fluent-ffmpeg@2.1.3: + dependencies: + async: 0.2.10 + which: 1.3.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + has-flag@4.0.0: {} + + he@1.2.0: {} + + human-signals@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-stream@3.0.0: {} + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + + luxon@1.28.1: {} + + make-error@1.3.6: {} + + merge-stream@2.0.0: {} + + mimic-fn@4.0.0: {} + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + mocha@10.6.0: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.5(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.2: {} + + ms@2.1.3: {} + + normalize-path@3.0.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + pathval@2.0.0: {} + + picomatch@2.3.1: {} + + prevvy@7.5.0: + dependencies: + '@types/debug': 4.1.12 + '@types/fluent-ffmpeg': 2.1.24 + '@types/luxon': 3.4.2 + '@types/node': 20.14.10 + debug: 4.3.5(supports-color@8.1.1) + execa: 8.0.1 + fluent-ffmpeg: 2.1.3 + luxon: 1.28.1 + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + safe-buffer@5.2.1: {} + + semver@7.6.2: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + sharp@0.33.4: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.4 + '@img/sharp-darwin-x64': 0.33.4 + '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-linux-arm': 0.33.4 + '@img/sharp-linux-arm64': 0.33.4 + '@img/sharp-linux-s390x': 0.33.4 + '@img/sharp-linux-x64': 0.33.4 + '@img/sharp-linuxmusl-arm64': 0.33.4 + '@img/sharp-linuxmusl-x64': 0.33.4 + '@img/sharp-wasm32': 0.33.4 + '@img/sharp-win32-ia32': 0.33.4 + '@img/sharp-win32-x64': 0.33.4 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.10 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@2.6.3: + optional: true + + typescript@5.5.3: {} + + undici-types@5.26.5: {} + + v8-compile-cache-lib@3.0.1: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/packages/image/tsconfig.json b/packages/image/tsconfig.json new file mode 100644 index 0000000..c06f27c --- /dev/null +++ b/packages/image/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + // Base Options recommended for all projects + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + // Enable strict type checking so you can catch bugs early + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + // Transpile our TypeScript code to JavaScript + "module": "NodeNext", + "outDir": "lib", + "lib": [ + "es2022" + ] + }, + // Include the necessary files for your project + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] + } \ No newline at end of file diff --git a/packages/next/app/about/page.tsx b/packages/next/app/about/page.tsx index af98cae..a936463 100644 --- a/packages/next/app/about/page.tsx +++ b/packages/next/app/about/page.tsx @@ -13,7 +13,7 @@ export default async function Page() {

About

-

It's the worst feeling when a VOD disappears from the internet. It means you missed out, it's gone, and you may never experience what your peers got to take part in.

+

It's the worst feeling when a VOD disappears from the internet. It means you missed out, it's gone, and you may never experience what your peers got to take part in.

Futureporn is created by fans, for fans. Missed a stream? We got you, bro.

Together we can end 404s and create an everlasting archive of lewdtuber livestreams.

diff --git a/packages/next/app/components/upload-form.tsx b/packages/next/app/components/upload-form.tsx index f5db015..4c5e7d9 100644 --- a/packages/next/app/components/upload-form.tsx +++ b/packages/next/app/components/upload-form.tsx @@ -5,6 +5,8 @@ import { IStream } from "@/lib/streams"; import { useSearchParams } from 'next/navigation'; import React, { useContext, useState, useEffect } from 'react'; import { UppyContext } from 'app/uppy'; +import AwsS3 from '@uppy/aws-s3'; +import RemoteSources from '@uppy/remote-sources'; import { LoginButton, useAuth } from '@/components/auth'; import { Dashboard } from '@uppy/react'; import styles from '@/assets/styles/fp.module.css' @@ -19,6 +21,10 @@ import * as Yup from 'yup'; import qs from 'qs'; import { toast } from "react-toastify"; import { ErrorMessage } from "@hookform/error-message" +import Uppy from '@uppy/core'; +import { companionUrl } from '@/lib/constants'; + + interface IUploadFormProps { vtubers: IVtuber[]; @@ -58,9 +64,38 @@ const validationSchema = Yup.object().shape({ export default function UploadForm({ vtubers }: IUploadFormProps) { const searchParams = useSearchParams(); const cuid = searchParams.get('cuid'); - const uppy = useContext(UppyContext); + const { authData } = useAuth(); + const uppy = new Uppy( + { + autoProceed: true, + debug: true, + logger: { + debug: console.info, + warn: console.log, + error: console.error + }, + } + ) + .use(RemoteSources, { + companionUrl, + sources: [ + 'GoogleDrive', + 'Dropbox', + 'Url' + ] + }) + .use(AwsS3, { + companionUrl, + shouldUseMultipart: true, + abortMultipartUpload: () => {}, // @see https://github.com/transloadit/uppy/issues/1197#issuecomment-491756118 + companionHeaders: { + 'authorization': `Bearer ${authData?.accessToken}` + } + }) + + const formOptions = { resolver: yupResolver(validationSchema), @@ -159,23 +194,24 @@ export default function UploadForm({ vtubers }: IUploadFormProps) { uppy.on('complete', async (result: any) => { - console.log('uppy complete! ') - console.log(result) for (const s of result.successful) { if (!s?.s3Multipart) { + const m = 'file was missing s3Multipart' + toast.error(`${m}`, { theme: 'dark' }); setError('root.serverError', { type: 'remote', - message: 'file was missing s3Multipart' + message: m }) - // throw new Error('file was missing s3Multipart') + throw new Error(m) } } + console.log('uppy complete! ') + console.log(result) + toast.success(`upload complete`); let files = result.successful.map((f: any) => ({ key: f.s3Multipart.key, uploadId: f.s3Multipart.uploadId })); setValue('files', files); }); - - return ( <> @@ -215,19 +251,30 @@ export default function UploadForm({ vtubers }: IUploadFormProps) { uppy={uppy} theme='dark' proudlyDisplayPoweredByUppy={true} - showProgressDetails={true} /> - {/* This form is hidden. Why? */} + {/* + Here is how we upload the files to the server. + From uppy, we get a list of files. + we add the files to a hidden input box. + the input box is part of the form which gets POSTed. + */} + + {errors.files &&

{errors.files.message?.toString()}

} @@ -363,7 +410,7 @@ export default function UploadForm({ vtubers }: IUploadFormProps) { )} {isSubmitSuccessful && ( <> - + - } - endActions={ - - } - /> - - ); - }} - - - ); -}; - -FormModal.defaultProps = { - initialData: null, - providerToEditName: null, -}; - -FormModal.propTypes = { - headerBreadcrumbs: PropTypes.arrayOf(PropTypes.string).isRequired, - initialData: PropTypes.object, - layout: PropTypes.shape({ - form: PropTypes.arrayOf(PropTypes.array), - schema: PropTypes.object, - }).isRequired, - isOpen: PropTypes.bool.isRequired, - isSubmiting: PropTypes.bool.isRequired, - onSubmit: PropTypes.func.isRequired, - onToggle: PropTypes.func.isRequired, - providerToEditName: PropTypes.string, -}; - -export default FormModal; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js deleted file mode 100644 index e3165e2..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +++ /dev/null @@ -1,30 +0,0 @@ -import { Box } from '@strapi/design-system'; -import styled, { css } from 'styled-components'; - -const activeCheckboxWrapperStyles = css` - background: ${(props) => props.theme.colors.primary100}; - svg { - opacity: 1; - } -`; - -const CheckboxWrapper = styled(Box)` - display: flex; - justify-content: space-between; - align-items: center; - - svg { - opacity: 0; - path { - fill: ${(props) => props.theme.colors.primary600}; - } - } - - /* Show active style both on hover and when the action is selected */ - ${(props) => props.isActive && activeCheckboxWrapperStyles} - &:hover { - ${activeCheckboxWrapperStyles} - } -`; - -export default CheckboxWrapper; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js deleted file mode 100644 index a9a91bd..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js +++ /dev/null @@ -1,131 +0,0 @@ -import React, { useCallback, useMemo } from 'react'; - -import { - Box, - Checkbox, - Flex, - Typography, - Grid, - GridItem, - VisuallyHidden, -} from '@strapi/design-system'; -import { Cog as CogIcon } from '@strapi/icons'; -import get from 'lodash/get'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import styled from 'styled-components'; - -import { useUsersPermissions } from '../../../contexts/UsersPermissionsContext'; - -import CheckboxWrapper from './CheckboxWrapper'; - -const Border = styled.div` - flex: 1; - align-self: center; - border-top: 1px solid ${({ theme }) => theme.colors.neutral150}; -`; - -const SubCategory = ({ subCategory }) => { - const { formatMessage } = useIntl(); - const { onChange, onChangeSelectAll, onSelectedAction, selectedAction, modifiedData } = - useUsersPermissions(); - - const currentScopedModifiedData = useMemo(() => { - return get(modifiedData, subCategory.name, {}); - }, [modifiedData, subCategory]); - - const hasAllActionsSelected = useMemo(() => { - return Object.values(currentScopedModifiedData).every((action) => action.enabled === true); - }, [currentScopedModifiedData]); - - const hasSomeActionsSelected = useMemo(() => { - return ( - Object.values(currentScopedModifiedData).some((action) => action.enabled === true) && - !hasAllActionsSelected - ); - }, [currentScopedModifiedData, hasAllActionsSelected]); - - const handleChangeSelectAll = useCallback( - ({ target: { name } }) => { - onChangeSelectAll({ target: { name, value: !hasAllActionsSelected } }); - }, - [hasAllActionsSelected, onChangeSelectAll] - ); - - const isActionSelected = useCallback( - (actionName) => { - return selectedAction === actionName; - }, - [selectedAction] - ); - - return ( - - - - - {subCategory.label} - - - - - - handleChangeSelectAll({ target: { name: subCategory.name, value } }) - } - indeterminate={hasSomeActionsSelected} - > - {formatMessage({ id: 'app.utils.select-all', defaultMessage: 'Select all' })} - - - - - - {subCategory.actions.map((action) => { - const name = `${action.name}.enabled`; - - return ( - - - onChange({ target: { name, value } })} - > - {action.label} - - - - - ); - })} - - - - ); -}; - -SubCategory.propTypes = { - subCategory: PropTypes.object.isRequired, -}; - -export default SubCategory; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/index.js deleted file mode 100644 index 08ff3ff..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/PermissionRow/index.js +++ /dev/null @@ -1,55 +0,0 @@ -import React, { useMemo } from 'react'; - -import { Box } from '@strapi/design-system'; -import sortBy from 'lodash/sortBy'; -import PropTypes from 'prop-types'; - -import SubCategory from './SubCategory'; - -const PermissionRow = ({ name, permissions }) => { - const subCategories = useMemo(() => { - return sortBy( - Object.values(permissions.controllers).reduce((acc, curr, index) => { - const currentName = `${name}.controllers.${Object.keys(permissions.controllers)[index]}`; - const actions = sortBy( - Object.keys(curr).reduce((acc, current) => { - return [ - ...acc, - { - ...curr[current], - label: current, - name: `${currentName}.${current}`, - }, - ]; - }, []), - 'label' - ); - - return [ - ...acc, - { - actions, - label: Object.keys(permissions.controllers)[index], - name: currentName, - }, - ]; - }, []), - 'label' - ); - }, [name, permissions]); - - return ( - - {subCategories.map((subCategory) => ( - - ))} - - ); -}; - -PermissionRow.propTypes = { - name: PropTypes.string.isRequired, - permissions: PropTypes.object.isRequired, -}; - -export default PermissionRow; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/index.js deleted file mode 100644 index 260ae00..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/index.js +++ /dev/null @@ -1,57 +0,0 @@ -import React, { useReducer } from 'react'; - -import { Accordion, AccordionContent, AccordionToggle, Box, Flex } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; - -import { useUsersPermissions } from '../../contexts/UsersPermissionsContext'; -import formatPluginName from '../../utils/formatPluginName'; - -import init from './init'; -import PermissionRow from './PermissionRow'; -import { initialState, reducer } from './reducer'; - -const Permissions = () => { - const { modifiedData } = useUsersPermissions(); - const { formatMessage } = useIntl(); - const [{ collapses }, dispatch] = useReducer(reducer, initialState, (state) => - init(state, modifiedData) - ); - - const handleToggle = (index) => - dispatch({ - type: 'TOGGLE_COLLAPSE', - index, - }); - - return ( - - {collapses.map((collapse, index) => ( - handleToggle(index)} - key={collapse.name} - variant={index % 2 === 0 ? 'secondary' : undefined} - > - - - - - - - - ))} - - ); -}; - -export default Permissions; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/init.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/init.js deleted file mode 100644 index 4125920..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/init.js +++ /dev/null @@ -1,9 +0,0 @@ -const init = (initialState, permissions) => { - const collapses = Object.keys(permissions) - .sort() - .map((name) => ({ name, isOpen: false })); - - return { ...initialState, collapses }; -}; - -export default init; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/reducer.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/reducer.js deleted file mode 100644 index 705e580..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Permissions/reducer.js +++ /dev/null @@ -1,27 +0,0 @@ -import produce from 'immer'; - -const initialState = { - collapses: [], -}; - -const reducer = (state, action) => - // eslint-disable-next-line consistent-return - produce(state, (draftState) => { - switch (action.type) { - case 'TOGGLE_COLLAPSE': { - draftState.collapses = state.collapses.map((collapse, index) => { - if (index === action.index) { - return { ...collapse, isOpen: !collapse.isOpen }; - } - - return { ...collapse, isOpen: false }; - }); - - break; - } - default: - return draftState; - } - }); - -export { initialState, reducer }; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Policies/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Policies/index.js deleted file mode 100644 index e9c53b3..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/Policies/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; - -import { Flex, GridItem, Typography } from '@strapi/design-system'; -import get from 'lodash/get'; -import isEmpty from 'lodash/isEmpty'; -import without from 'lodash/without'; -import { useIntl } from 'react-intl'; - -import { useUsersPermissions } from '../../contexts/UsersPermissionsContext'; -import BoundRoute from '../BoundRoute'; - -const Policies = () => { - const { formatMessage } = useIntl(); - const { selectedAction, routes } = useUsersPermissions(); - - const path = without(selectedAction.split('.'), 'controllers'); - const controllerRoutes = get(routes, path[0]); - const pathResolved = path.slice(1).join('.'); - - const displayedRoutes = isEmpty(controllerRoutes) - ? [] - : controllerRoutes.filter((o) => o.handler.endsWith(pathResolved)); - - return ( - - {selectedAction ? ( - - {displayedRoutes.map((route, key) => ( - // eslint-disable-next-line react/no-array-index-key - - ))} - - ) : ( - - - {formatMessage({ - id: 'users-permissions.Policies.header.title', - defaultMessage: 'Advanced settings', - })} - - - {formatMessage({ - id: 'users-permissions.Policies.header.hint', - defaultMessage: - "Select the application's actions or the plugin's actions and click on the cog icon to display the bound route", - })} - - - )} - - ); -}; - -export default Policies; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/index.js deleted file mode 100644 index 6f40fa3..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/index.js +++ /dev/null @@ -1,95 +0,0 @@ -import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react'; - -import { Flex, Grid, GridItem, Typography } from '@strapi/design-system'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; - -import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext'; -import getTrad from '../../utils/getTrad'; -import Permissions from '../Permissions'; -import Policies from '../Policies'; - -import init from './init'; -import reducer, { initialState } from './reducer'; - -const UsersPermissions = forwardRef(({ permissions, routes }, ref) => { - const { formatMessage } = useIntl(); - const [state, dispatch] = useReducer(reducer, initialState, (state) => - init(state, permissions, routes) - ); - - useImperativeHandle(ref, () => ({ - getPermissions() { - return { - permissions: state.modifiedData, - }; - }, - resetForm() { - dispatch({ type: 'ON_RESET' }); - }, - setFormAfterSubmit() { - dispatch({ type: 'ON_SUBMIT_SUCCEEDED' }); - }, - })); - - const handleChange = ({ target: { name, value } }) => - dispatch({ - type: 'ON_CHANGE', - keys: name.split('.'), - value: value === 'empty__string_value' ? '' : value, - }); - - const handleChangeSelectAll = ({ target: { name, value } }) => - dispatch({ - type: 'ON_CHANGE_SELECT_ALL', - keys: name.split('.'), - value, - }); - - const handleSelectedAction = (actionToSelect) => - dispatch({ - type: 'SELECT_ACTION', - actionToSelect, - }); - - const providerValue = { - ...state, - onChange: handleChange, - onChangeSelectAll: handleChangeSelectAll, - onSelectedAction: handleSelectedAction, - }; - - return ( - - - - - - - {formatMessage({ - id: getTrad('Plugins.header.title'), - defaultMessage: 'Permissions', - })} - - - {formatMessage({ - id: getTrad('Plugins.header.description'), - defaultMessage: 'Only actions bound by a route are listed below.', - })} - - - - - - - - - ); -}); - -UsersPermissions.propTypes = { - permissions: PropTypes.object.isRequired, - routes: PropTypes.object.isRequired, -}; - -export default memo(UsersPermissions); diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/init.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/init.js deleted file mode 100644 index e124042..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/init.js +++ /dev/null @@ -1,10 +0,0 @@ -const init = (state, permissions, routes) => { - return { - ...state, - initialData: permissions, - modifiedData: permissions, - routes, - }; -}; - -export default init; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/reducer.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/reducer.js deleted file mode 100644 index 8a03a18..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/components/UsersPermissions/reducer.js +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable consistent-return */ -import produce from 'immer'; -import get from 'lodash/get'; -import set from 'lodash/set'; -import take from 'lodash/take'; - -export const initialState = { - initialData: {}, - modifiedData: {}, - routes: {}, - selectedAction: '', - policies: [], -}; - -const reducer = (state, action) => - produce(state, (draftState) => { - switch (action.type) { - case 'ON_CHANGE': { - const keysLength = action.keys.length; - const isChangingCheckbox = action.keys[keysLength - 1] === 'enabled'; - - if (action.value && isChangingCheckbox) { - const selectedAction = take(action.keys, keysLength - 1).join('.'); - draftState.selectedAction = selectedAction; - } - - set(draftState, ['modifiedData', ...action.keys], action.value); - break; - } - case 'ON_CHANGE_SELECT_ALL': { - const pathToValue = ['modifiedData', ...action.keys]; - const oldValues = get(state, pathToValue, {}); - const updatedValues = Object.keys(oldValues).reduce((acc, current) => { - acc[current] = { ...oldValues[current], enabled: action.value }; - - return acc; - }, {}); - - set(draftState, pathToValue, updatedValues); - - break; - } - case 'ON_RESET': { - draftState.modifiedData = state.initialData; - break; - } - case 'ON_SUBMIT_SUCCEEDED': { - draftState.initialData = state.modifiedData; - break; - } - - case 'SELECT_ACTION': { - const { actionToSelect } = action; - draftState.selectedAction = actionToSelect === state.selectedAction ? '' : actionToSelect; - break; - } - default: - return draftState; - } - }); - -export default reducer; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js deleted file mode 100644 index ce66c34..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React, { createContext, useContext } from 'react'; - -import PropTypes from 'prop-types'; - -const UsersPermissions = createContext({}); - -const UsersPermissionsProvider = ({ children, value }) => { - return {children}; -}; - -const useUsersPermissions = () => useContext(UsersPermissions); - -UsersPermissionsProvider.propTypes = { - children: PropTypes.node.isRequired, - value: PropTypes.object.isRequired, -}; - -export { UsersPermissions, UsersPermissionsProvider, useUsersPermissions }; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/index.js deleted file mode 100644 index 9988733..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// eslint-disable-next-line import/prefer-default-export -export { default as useForm } from './useForm'; -export { default as useRolesList } from './useRolesList'; -export * from './usePlugins'; -export { default as useFetchRole } from './useFetchRole'; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/index.js deleted file mode 100644 index 629e001..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/index.js +++ /dev/null @@ -1,67 +0,0 @@ -import { useCallback, useEffect, useReducer, useRef } from 'react'; - -import { useFetchClient, useNotification } from '@strapi/helper-plugin'; - -import pluginId from '../../pluginId'; - -import reducer, { initialState } from './reducer'; - -const useFetchRole = (id) => { - const [state, dispatch] = useReducer(reducer, initialState); - const toggleNotification = useNotification(); - const isMounted = useRef(null); - const { get } = useFetchClient(); - - useEffect(() => { - isMounted.current = true; - - if (id) { - fetchRole(id); - } else { - dispatch({ - type: 'GET_DATA_SUCCEEDED', - role: {}, - }); - } - - return () => (isMounted.current = false); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [id]); - - const fetchRole = async (roleId) => { - try { - const { - data: { role }, - } = await get(`/${pluginId}/roles/${roleId}`); - - // Prevent updating state on an unmounted component - if (isMounted.current) { - dispatch({ - type: 'GET_DATA_SUCCEEDED', - role, - }); - } - } catch (err) { - console.error(err); - - dispatch({ - type: 'GET_DATA_ERROR', - }); - toggleNotification({ - type: 'warning', - message: { id: 'notification.error' }, - }); - } - }; - - const handleSubmitSucceeded = useCallback((data) => { - dispatch({ - type: 'ON_SUBMIT_SUCCEEDED', - ...data, - }); - }, []); - - return { ...state, onSubmitSucceeded: handleSubmitSucceeded }; -}; - -export default useFetchRole; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/reducer.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/reducer.js deleted file mode 100644 index 99dcf0d..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useFetchRole/reducer.js +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable consistent-return */ -import produce from 'immer'; - -export const initialState = { - role: {}, - isLoading: true, -}; - -const reducer = (state, action) => - produce(state, (draftState) => { - switch (action.type) { - case 'GET_DATA_SUCCEEDED': { - draftState.role = action.role; - draftState.isLoading = false; - break; - } - case 'GET_DATA_ERROR': { - draftState.isLoading = false; - break; - } - case 'ON_SUBMIT_SUCCEEDED': { - draftState.role.name = action.name; - draftState.role.description = action.description; - break; - } - default: - return draftState; - } - }); - -export default reducer; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/index.js deleted file mode 100644 index 0cf0ef6..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/index.js +++ /dev/null @@ -1,70 +0,0 @@ -import { useCallback, useEffect, useReducer, useRef } from 'react'; - -import { useFetchClient, useNotification, useRBAC } from '@strapi/helper-plugin'; - -import { getRequestURL } from '../../utils'; - -import reducer, { initialState } from './reducer'; - -const useUserForm = (endPoint, permissions) => { - const { isLoading: isLoadingForPermissions, allowedActions } = useRBAC(permissions); - const [{ isLoading, modifiedData }, dispatch] = useReducer(reducer, initialState); - const toggleNotification = useNotification(); - const isMounted = useRef(true); - - const { get } = useFetchClient(); - - useEffect(() => { - const getData = async () => { - try { - dispatch({ - type: 'GET_DATA', - }); - - const { data } = await get(getRequestURL(endPoint)); - - dispatch({ - type: 'GET_DATA_SUCCEEDED', - data, - }); - } catch (err) { - // The user aborted the request - if (isMounted.current) { - dispatch({ - type: 'GET_DATA_ERROR', - }); - console.error(err); - toggleNotification({ - type: 'warning', - message: { id: 'notification.error' }, - }); - } - } - }; - - if (!isLoadingForPermissions) { - getData(); - } - - return () => { - isMounted.current = false; - }; - }, [isLoadingForPermissions, endPoint, get, toggleNotification]); - - const dispatchSubmitSucceeded = useCallback((data) => { - dispatch({ - type: 'ON_SUBMIT_SUCCEEDED', - data, - }); - }, []); - - return { - allowedActions, - dispatchSubmitSucceeded, - isLoading, - isLoadingForPermissions, - modifiedData, - }; -}; - -export default useUserForm; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/reducer.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/reducer.js deleted file mode 100644 index 1d05786..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useForm/reducer.js +++ /dev/null @@ -1,40 +0,0 @@ -import produce from 'immer'; - -const initialState = { - isLoading: true, - modifiedData: {}, -}; - -const reducer = (state, action) => - // eslint-disable-next-line consistent-return - produce(state, (draftState) => { - switch (action.type) { - case 'GET_DATA': { - draftState.isLoading = true; - draftState.modifiedData = {}; - - break; - } - case 'GET_DATA_SUCCEEDED': { - draftState.isLoading = false; - draftState.modifiedData = action.data; - - break; - } - case 'GET_DATA_ERROR': { - draftState.isLoading = true; - break; - } - case 'ON_SUBMIT_SUCCEEDED': { - draftState.modifiedData = action.data; - - break; - } - default: { - return draftState; - } - } - }); - -export default reducer; -export { initialState }; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/usePlugins.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/usePlugins.js deleted file mode 100644 index ce1f0e8..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/usePlugins.js +++ /dev/null @@ -1,71 +0,0 @@ -import { useEffect } from 'react'; - -import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin'; -import { useQueries } from 'react-query'; - -import pluginId from '../pluginId'; -import { cleanPermissions, getTrad } from '../utils'; - -export const usePlugins = () => { - const toggleNotification = useNotification(); - const { get } = useFetchClient(); - const { formatAPIError } = useAPIErrorHandler(getTrad); - - const [ - { - data: permissions, - isLoading: isLoadingPermissions, - error: permissionsError, - refetch: refetchPermissions, - }, - { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes }, - ] = useQueries([ - { - queryKey: [pluginId, 'permissions'], - async queryFn() { - const res = await get(`/${pluginId}/permissions`); - - return res.data.permissions; - }, - }, - { - queryKey: [pluginId, 'routes'], - async queryFn() { - const res = await get(`/${pluginId}/routes`); - - return res.data.routes; - }, - }, - ]); - - const refetchQueries = async () => { - await Promise.all([refetchPermissions(), refetchRoutes()]); - }; - - useEffect(() => { - if (permissionsError) { - toggleNotification({ - type: 'warning', - message: formatAPIError(permissionsError), - }); - } - }, [toggleNotification, permissionsError, formatAPIError]); - - useEffect(() => { - if (routesError) { - toggleNotification({ - type: 'warning', - message: formatAPIError(routesError), - }); - } - }, [toggleNotification, routesError, formatAPIError]); - - const isLoading = isLoadingPermissions || isLoadingRoutes; - - return { - permissions: permissions ? cleanPermissions(permissions) : {}, - routes: routes ?? {}, - getData: refetchQueries, - isLoading, - }; -}; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/index.js deleted file mode 100644 index aae9175..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/index.js +++ /dev/null @@ -1,65 +0,0 @@ -import { useCallback, useEffect, useReducer, useRef } from 'react'; - -import { useFetchClient, useNotification } from '@strapi/helper-plugin'; -import get from 'lodash/get'; - -import pluginId from '../../pluginId'; - -import init from './init'; -import reducer, { initialState } from './reducer'; - -const useRolesList = (shouldFetchData = true) => { - const [{ roles, isLoading }, dispatch] = useReducer(reducer, initialState, () => - init(initialState, shouldFetchData) - ); - const toggleNotification = useNotification(); - - const isMounted = useRef(true); - const fetchClient = useFetchClient(); - - const fetchRolesList = useCallback(async () => { - try { - dispatch({ - type: 'GET_DATA', - }); - - const { - data: { roles }, - } = await fetchClient.get(`/${pluginId}/roles`); - - dispatch({ - type: 'GET_DATA_SUCCEEDED', - data: roles, - }); - } catch (err) { - const message = get(err, ['response', 'payload', 'message'], 'An error occured'); - - if (isMounted.current) { - dispatch({ - type: 'GET_DATA_ERROR', - }); - - if (message !== 'Forbidden') { - toggleNotification({ - type: 'warning', - message, - }); - } - } - } - }, [fetchClient, toggleNotification]); - - useEffect(() => { - if (shouldFetchData) { - fetchRolesList(); - } - - return () => { - isMounted.current = false; - }; - }, [shouldFetchData, fetchRolesList]); - - return { roles, isLoading, getData: fetchRolesList }; -}; - -export default useRolesList; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/init.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/init.js deleted file mode 100644 index dfe71d9..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/init.js +++ /dev/null @@ -1,5 +0,0 @@ -const init = (initialState, shouldFetchData) => { - return { ...initialState, isLoading: shouldFetchData }; -}; - -export default init; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/reducer.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/reducer.js deleted file mode 100644 index a6d347b..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/hooks/useRolesList/reducer.js +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable consistent-return */ -import produce from 'immer'; - -export const initialState = { - roles: [], - isLoading: true, -}; - -const reducer = (state, action) => - produce(state, (draftState) => { - switch (action.type) { - case 'GET_DATA': { - draftState.isLoading = true; - draftState.roles = []; - break; - } - case 'GET_DATA_SUCCEEDED': { - draftState.roles = action.data; - draftState.isLoading = false; - break; - } - case 'GET_DATA_ERROR': { - draftState.isLoading = false; - break; - } - default: - return draftState; - } - }); - -export default reducer; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/index.js deleted file mode 100644 index ba721ed..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/index.js +++ /dev/null @@ -1,125 +0,0 @@ -// NOTE TO PLUGINS DEVELOPERS: -// If you modify this file by adding new options to the plugin entry point -// Here's the file: strapi/docs/3.0.0-beta.x/plugin-development/frontend-field-api.md -// Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md -// Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated -// IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED -import { prefixPluginTranslations } from '@strapi/helper-plugin'; - -import pluginPkg from '../../package.json'; - -import pluginPermissions from './permissions'; -import pluginId from './pluginId'; -import getTrad from './utils/getTrad'; - -const name = pluginPkg.strapi.name; - -export default { - register(app) { - // Create the plugin's settings section - app.createSettingSection( - { - id: pluginId, - intlLabel: { - id: getTrad('Settings.section-label'), - defaultMessage: 'Users & Permissions plugin', - }, - }, - [ - { - intlLabel: { - id: 'global.roles', - defaultMessage: 'Roles', - }, - id: 'roles', - to: `/settings/${pluginId}/roles`, - async Component() { - const component = await import( - /* webpackChunkName: "users-roles-settings-page" */ './pages/Roles' - ); - - return component; - }, - permissions: pluginPermissions.accessRoles, - }, - { - intlLabel: { - id: getTrad('HeaderNav.link.providers'), - defaultMessage: 'Providers', - }, - id: 'providers', - to: `/settings/${pluginId}/providers`, - async Component() { - const component = await import( - /* webpackChunkName: "users-providers-settings-page" */ './pages/Providers' - ); - - return component; - }, - permissions: pluginPermissions.readProviders, - }, - { - intlLabel: { - id: getTrad('HeaderNav.link.emailTemplates'), - defaultMessage: 'Email templates', - }, - id: 'email-templates', - to: `/settings/${pluginId}/email-templates`, - async Component() { - const component = await import( - /* webpackChunkName: "users-email-settings-page" */ './pages/EmailTemplates' - ); - - return component; - }, - permissions: pluginPermissions.readEmailTemplates, - }, - { - intlLabel: { - id: getTrad('HeaderNav.link.advancedSettings'), - defaultMessage: 'Advanced Settings', - }, - id: 'advanced-settings', - to: `/settings/${pluginId}/advanced-settings`, - async Component() { - const component = await import( - /* webpackChunkName: "users-advanced-settings-page" */ './pages/AdvancedSettings' - ); - - return component; - }, - permissions: pluginPermissions.readAdvancedSettings, - }, - ] - ); - - app.registerPlugin({ - id: pluginId, - name, - }); - }, - bootstrap() {}, - async registerTrads({ locales }) { - const importedTrads = await Promise.all( - locales.map((locale) => { - return import( - /* webpackChunkName: "users-permissions-translation-[request]" */ `./translations/${locale}.json` - ) - .then(({ default: data }) => { - return { - data: prefixPluginTranslations(data, pluginId), - locale, - }; - }) - .catch(() => { - return { - data: {}, - locale, - }; - }); - }) - ); - - return Promise.resolve(importedTrads); - }, -}; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/index.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/index.js deleted file mode 100644 index 3f0726f..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/index.js +++ /dev/null @@ -1,246 +0,0 @@ -import React, { useMemo } from 'react'; - -import { - Box, - Button, - ContentLayout, - Flex, - Grid, - GridItem, - HeaderLayout, - Main, - Option, - Select, - Typography, - useNotifyAT, -} from '@strapi/design-system'; -import { - CheckPagePermissions, - Form, - GenericInput, - LoadingIndicatorPage, - SettingsPageTitle, - useFocusWhenNavigate, - useNotification, - useOverlayBlocker, - useRBAC, -} from '@strapi/helper-plugin'; -import { Check } from '@strapi/icons'; -import { Formik } from 'formik'; -import { useIntl } from 'react-intl'; -import { useMutation, useQuery, useQueryClient } from 'react-query'; - -import pluginPermissions from '../../permissions'; -import { getTrad } from '../../utils'; - -import { fetchData, putAdvancedSettings } from './utils/api'; -import layout from './utils/layout'; -import schema from './utils/schema'; - -const ProtectedAdvancedSettingsPage = () => ( - - - -); - -const AdvancedSettingsPage = () => { - const { formatMessage } = useIntl(); - const toggleNotification = useNotification(); - const { lockApp, unlockApp } = useOverlayBlocker(); - const { notifyStatus } = useNotifyAT(); - const queryClient = useQueryClient(); - useFocusWhenNavigate(); - - const updatePermissions = useMemo( - () => ({ update: pluginPermissions.updateAdvancedSettings }), - [] - ); - const { - isLoading: isLoadingForPermissions, - allowedActions: { canUpdate }, - } = useRBAC(updatePermissions); - - const { status: isLoadingData, data } = useQuery('advanced', () => fetchData(), { - onSuccess() { - notifyStatus( - formatMessage({ - id: getTrad('Form.advancedSettings.data.loaded'), - defaultMessage: 'Advanced settings data has been loaded', - }) - ); - }, - onError() { - toggleNotification({ - type: 'warning', - message: { id: getTrad('notification.error'), defaultMessage: 'An error occured' }, - }); - }, - }); - - const isLoading = isLoadingForPermissions || isLoadingData !== 'success'; - - const submitMutation = useMutation((body) => putAdvancedSettings(body), { - async onSuccess() { - await queryClient.invalidateQueries('advanced'); - toggleNotification({ - type: 'success', - message: { id: getTrad('notification.success.saved'), defaultMessage: 'Saved' }, - }); - - unlockApp(); - }, - onError() { - toggleNotification({ - type: 'warning', - message: { id: getTrad('notification.error'), defaultMessage: 'An error occured' }, - }); - unlockApp(); - }, - refetchActive: true, - }); - - const { isLoading: isSubmittingForm } = submitMutation; - - const handleSubmit = async (body) => { - lockApp(); - - const urlConfirmation = body.email_confirmation ? body.email_confirmation_redirection : ''; - - await submitMutation.mutateAsync({ ...body, email_confirmation_redirection: urlConfirmation }); - }; - - if (isLoading) { - return ( -
- - - - - -
- ); - } - - return ( -
- - - {({ errors, values, handleChange, isSubmitting }) => { - return ( -
- } - size="S" - > - {formatMessage({ id: 'global.save', defaultMessage: 'Save' })} - - } - /> - - - - - {formatMessage({ - id: 'global.settings', - defaultMessage: 'Settings', - })} - - - - - - {layout.map((input) => { - let value = values[input.name]; - - if (!value) { - value = input.type === 'bool' ? false : ''; - } - - return ( - - - - ); - })} - - - - - - ); - }} -
-
- ); -}; - -export default ProtectedAdvancedSettingsPage; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js deleted file mode 100644 index 238862a..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js +++ /dev/null @@ -1,18 +0,0 @@ -import { getFetchClient } from '@strapi/helper-plugin'; - -import { getRequestURL } from '../../../utils'; - -const fetchData = async () => { - const { get } = getFetchClient(); - const { data } = await get(getRequestURL('advanced')); - - return data; -}; - -const putAdvancedSettings = (body) => { - const { put } = getFetchClient(); - - return put(getRequestURL('advanced'), body); -}; - -export { fetchData, putAdvancedSettings }; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/layout.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/layout.js deleted file mode 100644 index 094e5a6..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/layout.js +++ /dev/null @@ -1,96 +0,0 @@ -import { getTrad } from '../../../utils'; - -const layout = [ - { - intlLabel: { - id: getTrad('EditForm.inputToggle.label.email'), - defaultMessage: 'One account per email address', - }, - description: { - id: getTrad('EditForm.inputToggle.description.email'), - defaultMessage: - 'Disallow the user to create multiple accounts using the same email address with different authentication providers.', - }, - name: 'unique_email', - type: 'bool', - size: { - col: 12, - xs: 12, - }, - }, - { - intlLabel: { - id: getTrad('EditForm.inputToggle.label.sign-up'), - defaultMessage: 'Enable sign-ups', - }, - description: { - id: getTrad('EditForm.inputToggle.description.sign-up'), - defaultMessage: - 'When disabled (OFF), the registration process is forbidden. No one can subscribe anymore no matter the used provider.', - }, - name: 'allow_register', - type: 'bool', - size: { - col: 12, - xs: 12, - }, - }, - { - intlLabel: { - id: getTrad('EditForm.inputToggle.label.email-reset-password'), - defaultMessage: 'Reset password page', - }, - description: { - id: getTrad('EditForm.inputToggle.description.email-reset-password'), - defaultMessage: "URL of your application's reset password page.", - }, - placeholder: { - id: getTrad('EditForm.inputToggle.placeholder.email-reset-password'), - defaultMessage: 'ex: https://youtfrontend.com/reset-password', - }, - name: 'email_reset_password', - type: 'text', - size: { - col: 6, - xs: 12, - }, - }, - { - intlLabel: { - id: getTrad('EditForm.inputToggle.label.email-confirmation'), - defaultMessage: 'Enable email confirmation', - }, - description: { - id: getTrad('EditForm.inputToggle.description.email-confirmation'), - defaultMessage: 'When enabled (ON), new registered users receive a confirmation email.', - }, - name: 'email_confirmation', - type: 'bool', - size: { - col: 12, - xs: 12, - }, - }, - { - intlLabel: { - id: getTrad('EditForm.inputToggle.label.email-confirmation-redirection'), - defaultMessage: 'Redirection url', - }, - description: { - id: getTrad('EditForm.inputToggle.description.email-confirmation-redirection'), - defaultMessage: 'After you confirmed your email, choose where you will be redirected.', - }, - placeholder: { - id: getTrad('EditForm.inputToggle.placeholder.email-confirmation-redirection'), - defaultMessage: 'ex: https://youtfrontend.com/email-confirmation', - }, - name: 'email_confirmation_redirection', - type: 'text', - size: { - col: 6, - xs: 12, - }, - }, -]; - -export default layout; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js deleted file mode 100644 index b8958a8..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js +++ /dev/null @@ -1,19 +0,0 @@ -import { translatedErrors } from '@strapi/helper-plugin'; -import * as yup from 'yup'; - -// eslint-disable-next-line prefer-regex-literals -const URL_REGEX = new RegExp('(^$)|((.+:\\/\\/.*)(d*)\\/?(.*))'); - -const schema = yup.object().shape({ - email_confirmation_redirection: yup.mixed().when('email_confirmation', { - is: true, - then: yup.string().matches(URL_REGEX).required(), - otherwise: yup.string().nullable(), - }), - email_reset_password: yup - .string(translatedErrors.string) - .matches(URL_REGEX, translatedErrors.regex) - .nullable(), -}); - -export default schema; diff --git a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js b/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js deleted file mode 100644 index 5d98122..0000000 --- a/packages/strapi-borked/src/extensions/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js +++ /dev/null @@ -1,176 +0,0 @@ -import React from 'react'; - -import { - Button, - Grid, - GridItem, - ModalBody, - ModalFooter, - ModalHeader, - ModalLayout, - Textarea, -} from '@strapi/design-system'; -import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; -import { Form, GenericInput } from '@strapi/helper-plugin'; -import { Formik } from 'formik'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; - -import { getTrad } from '../../../utils'; -import schema from '../utils/schema'; - -const EmailForm = ({ template, onToggle, onSubmit }) => { - const { formatMessage } = useIntl(); - - return ( - - - - - {formatMessage({ - id: getTrad('PopUpForm.header.edit.email-templates'), - defaultMessage: 'Edit email template', - })} - - - {formatMessage({ id: getTrad(template.display), defaultMessage: template.display })} - - - - - {({ errors, values, handleChange, isSubmitting }) => { - return ( -
- - - - - - - - - - - - - - - -