gitextract_on7951nt/ ├── .dockerignore ├── .eslintignore ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── FIREBASE_CONFIG.md │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── doc_issue.md │ │ └── feature_request.md │ ├── pull_request_template.md │ └── workflows/ │ ├── deploy.yml │ ├── dockerize.yml │ ├── integration.yml │ ├── lint.yml │ └── release.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.json ├── .releaserc ├── @types/ │ ├── bcrypt.d.ts │ ├── body-parser.d.ts │ ├── compression.d.ts │ ├── console.d.ts │ ├── diacriticless.d.ts │ ├── environment.d.ts │ ├── express-rate-limit.d.ts │ ├── is-word.d.ts │ ├── morgan.d.ts │ ├── react-scroll.d.ts │ ├── shelljs.d.ts │ ├── string-similarity.d.ts │ ├── supertest.d.ts │ └── uuid.d.ts ├── Dockerfile ├── LICENSE.md ├── README.md ├── __mocks__/ │ ├── @chakra-ui/ │ │ └── react.tsx │ ├── @sendgrid/ │ │ └── mail.ts │ ├── axios.ts │ ├── bcrypt.ts │ ├── firebase/ │ │ ├── app.ts │ │ ├── auth.ts │ │ └── functions.ts │ ├── firebase-admin.ts │ ├── firebase-functions/ │ │ └── v1.ts │ ├── i18next.ts │ ├── mongoose.ts │ ├── next/ │ │ ├── font/ │ │ │ └── google.ts │ │ └── router.ts │ ├── react-firebase-hooks/ │ │ └── auth.ts │ ├── shelljs.ts │ ├── stripe.ts │ └── uuid.ts ├── __tests__/ │ ├── __mocks__/ │ │ ├── data.mock.json │ │ ├── documentData.ts │ │ └── genericWords.mock.json │ ├── api-json.test.ts │ ├── api-mongo.test.ts │ ├── developers.test.ts │ ├── examples.test.ts │ ├── nsibidi_characters.test.ts │ ├── parse.test.ts │ ├── shared/ │ │ ├── commands.ts │ │ ├── constants.ts │ │ ├── uiFixtures.ts │ │ └── utils.ts │ └── stripe.test.ts ├── commitlint.config.js ├── cypress/ │ ├── e2e/ │ │ └── client.cy.js │ ├── fixtures/ │ │ └── example.json │ ├── plugins/ │ │ └── index.js │ └── support/ │ ├── commands.js │ └── e2e.js ├── cypress.config.js ├── docker-compose.yml ├── env.d.ts ├── eslint.config.mjs ├── firebase.json ├── functions/ │ ├── .gitignore │ ├── index.js │ ├── next-i18next.config.js │ ├── next.config.js │ ├── package.json │ ├── postcss.config.js │ └── tailwind.config.js ├── jest.backend.config.ts ├── jest.backend.database.config.ts ├── jest.frontend.config.ts ├── migrate-mongo-config.js ├── migrations/ │ ├── 20201106045436-add-suggestion-properties.js │ ├── 20201108164925-add-exampleForWordSuggestion-field.js │ ├── 20201109083748-remove-examples-from-words.js │ ├── 20201118192335-add-merged-by.js │ ├── 20201121195224-add-updated-on-for-words-and-examples.js │ ├── 20201206042142-add-accented-field.js │ ├── 20201213020925-uid-fields-on-suggestions.js │ ├── 20210225022115-create-dialects.js │ ├── 20210225235148-update-variations-to-array.js │ ├── 20210306224633-add-dialects-for-word-suggestions-and-generic-words.js │ ├── 20210325194345-add-central-igbo.js │ ├── 20210331134705-remove-developer-origin.js │ ├── 20210426171953-remove-normalized-field.js │ ├── 20210814210437-pre-populate-dialects.js │ ├── 20210820170937-merge-accented-and-word.js │ ├── 20210820175620-merge-accented-and-example.js │ ├── 20210822145619-change-central-to-standard.js │ ├── 20210831163032-add-is-complete-word.js │ ├── 20210903175644-remove-is-complete-word.js │ ├── 20211030133331-add-active-and-passive-verbs.js │ ├── 20211121214701-add-nyms.js │ ├── 20211218192401-add-isComplete.js │ ├── 20220107155512-add-nsibidi.js │ ├── 20220125175808-restructure-dialects.js │ ├── 20220208140327-example-pronunciations.js │ ├── 20220216030851-remove-verb-prefixes.js │ ├── 20220301211505-convert-unix-to-iso.js │ ├── 20220308132126-add-is-accented.js │ ├── 20220406005107-add-tenses.js │ ├── 20220423222134-add-attributes.js │ ├── 20220425130741-extend-example-sentences-with-style-and-meaning.js │ ├── 20220808024209-add-borrowed-term-field.js │ ├── 20220808033804-add-tags.js │ ├── 20220808042906-replace-nyms-for-related-terms.js │ ├── 20221014123241-add-is-stem.js │ ├── 20221030034746-restructure-definitions.js │ ├── 20221030054330-connect-example-associated-definitions.js │ ├── 20221107022314-resturcture-dialects-as-arrays.js │ ├── 20221124200346-expand-headword.js │ ├── 20221207003231-nominal-modifier.js │ ├── 20221217204603-definitions-with-nsibidi.js │ ├── 20230112035359-add-is-common.js │ ├── 20230118013604-convert-stems-to-object-id.js │ ├── 20230201191800-convert-medial-to-active.js │ ├── 20230201193438-add-present-passive-to-verbs.js │ ├── 20230314160556-convert-frequency-to-number.js │ ├── 20230409220217-convert-igbo-definitions-to-include-nsibidi.js │ ├── 20230522011130-pronunciation-to-pronunciations.js │ ├── 20230526231511-example-suggestions-approvals-denials-review.js │ ├── 20230607004329-trim-headword-and-tenses-whitespace-fix.js │ ├── 20240908000598-create-default-igbo-api-project.js │ ├── 20240908000599-change-source-to-origin.js │ ├── 20240908000600-generalize-examples.js │ ├── 20240908162526-assign-projectid-to-each-collection.js │ ├── 20240913215339-move-example-pronunciations-to-translations.js │ ├── 20240928023848-add-languages-to-corpus.js │ ├── 20240928024053-add-types-to-projecs.js │ ├── 20241116014146-add-bit-rate-audio-pronunciation.js │ ├── 20241203060241-insert-owner-firebase-id-on-project.js │ ├── 20241203060300-connect-paywall-to-project.js │ ├── 20241206235108-remove-crowdsourcing.js │ ├── 20250212184340-add-viewableSectionIds-to-example-suggestions.js │ └── 20250417110353-migrate-igbo-speech-example-suggestions.js ├── next-env.d.ts ├── next-i18next.config.js ├── next.config.js ├── package.json ├── postcss.config.js ├── public/ │ └── .hosting ├── script.js ├── src/ │ ├── APIs/ │ │ ├── FlagsAPI.ts │ │ ├── RedisAPI.ts │ │ └── __tests__/ │ │ └── FlagsAPI.test.ts │ ├── __data__/ │ │ └── assetStub.ts │ ├── __tests__/ │ │ ├── Card/ │ │ │ └── Card.test.tsx │ │ ├── Demo/ │ │ │ └── Demo.test.tsx │ │ ├── FadeIn/ │ │ │ └── FadeIn.test.tsx │ │ ├── Input/ │ │ │ └── Input.test.tsx │ │ ├── Statistics/ │ │ │ ├── Stat.test.tsx │ │ │ └── Statistics.test.tsx │ │ ├── components/ │ │ │ └── TestContext.tsx │ │ └── shared/ │ │ ├── fixtures.ts │ │ └── script.ts │ ├── app.ts │ ├── config.ts │ ├── controllers/ │ │ ├── __tests__/ │ │ │ ├── developers.test.ts │ │ │ ├── examples.test.ts │ │ │ ├── speechToText.test.ts │ │ │ ├── stripe.test.ts │ │ │ └── translation.test.ts │ │ ├── developers.ts │ │ ├── email.ts │ │ ├── examples.ts │ │ ├── nsibidi.ts │ │ ├── speechToText.ts │ │ ├── stats.ts │ │ ├── stripe/ │ │ │ ├── __mocks__/ │ │ │ │ └── webhooks.ts │ │ │ ├── __tests__/ │ │ │ │ └── index.test.ts │ │ │ ├── index.ts │ │ │ └── webhooks.ts │ │ ├── translation.ts │ │ ├── types.ts │ │ ├── utils/ │ │ │ ├── __mocks__/ │ │ │ │ └── fetchBase64Data.ts │ │ │ ├── __tests__/ │ │ │ │ ├── minimizeVerbsAndSuffixes.test.ts │ │ │ │ ├── parseAWS.test.ts │ │ │ │ └── queries.test.ts │ │ │ ├── buildDocs.ts │ │ │ ├── convertToSkipAndLimit.ts │ │ │ ├── fetchBase64Data.ts │ │ │ ├── index.ts │ │ │ ├── minimizeVerbsAndSuffixes.ts │ │ │ ├── minimizeWords.ts │ │ │ ├── parseAWS.ts │ │ │ ├── parseRange.ts │ │ │ ├── queries.ts │ │ │ ├── searchWordUsingEnglish.ts │ │ │ ├── searchWordUsingIgbo.ts │ │ │ ├── sortDocsBy.ts │ │ │ └── types.ts │ │ └── words.ts │ ├── dictionaries/ │ │ ├── buildDictionaries.ts │ │ ├── en-ig/ │ │ │ └── en-ig_normalized_expanded.json │ │ ├── ig-en/ │ │ │ ├── ig-en.json │ │ │ ├── ig-en_1000_common.json │ │ │ ├── ig-en_expanded.json │ │ │ └── ig-en_normalized_expanded.json │ │ ├── nsibidi/ │ │ │ └── nsibidi_dictionary.ts │ │ └── seed.ts │ ├── functions/ │ │ └── __tests__/ │ │ └── functions.test.ts │ ├── functions.ts │ ├── general.css │ ├── lib/ │ │ └── gtag.js │ ├── middleware/ │ │ ├── __tests__/ │ │ │ ├── authorizeCheckoutSession.test.ts │ │ │ ├── authorizePortalSession.test.ts │ │ │ └── developerAuthorization.test.ts │ │ ├── analytics.ts │ │ ├── attachRedisClient.ts │ │ ├── authorizeCheckoutSession.ts │ │ ├── authorizePortalSession.ts │ │ ├── cache.ts │ │ ├── developerAuthorization.ts │ │ ├── errorHandler.ts │ │ ├── helpers/ │ │ │ ├── __tests__/ │ │ │ │ ├── authorizeDeveloperUsage.test.ts │ │ │ │ ├── createDeveloperUsage.test.ts │ │ │ │ └── findDeveloperUsage.test.ts │ │ │ ├── authorizeDeveloperUsage.ts │ │ │ ├── createDeveloperUsage.ts │ │ │ ├── findDeveloper.ts │ │ │ └── findDeveloperUsage.ts │ │ ├── logger.ts │ │ ├── noCache.ts │ │ ├── validId.ts │ │ ├── validateAdminApiKey.ts │ │ ├── validateApiKey.ts │ │ ├── validateDeveloperBody.ts │ │ ├── validateStripeSignature.ts │ │ └── validateUpdateDeveloperBody.ts │ ├── models/ │ │ ├── Developer.ts │ │ ├── DeveloperUsage.ts │ │ ├── Example.ts │ │ ├── NsibidiCharacter.ts │ │ ├── Stat.ts │ │ ├── Word.ts │ │ └── plugins/ │ │ └── index.ts │ ├── pages/ │ │ ├── 404/ │ │ │ └── index.page.tsx │ │ ├── APIs/ │ │ │ ├── DevelopersAPI.ts │ │ │ ├── PredictionAPI.ts │ │ │ ├── __mocks__/ │ │ │ │ └── DevelopersAPI.ts │ │ │ └── __tests__/ │ │ │ ├── DevelopersAPI.test.tsx │ │ │ └── PredictionAPI.test.tsx │ │ ├── App.tsx │ │ ├── __tests__/ │ │ │ └── App.test.tsx │ │ ├── _app.page.tsx │ │ ├── _document.page.tsx │ │ ├── about/ │ │ │ └── index.page.tsx │ │ ├── assets/ │ │ │ └── favicon/ │ │ │ └── site.webmanifest │ │ ├── atoms/ │ │ │ ├── audioAtoms.ts │ │ │ ├── dashboardAtoms.ts │ │ │ ├── feedbackAtoms.ts │ │ │ ├── index.ts │ │ │ └── predictionAtoms.ts │ │ ├── components/ │ │ │ ├── CallToAction/ │ │ │ │ ├── CallToAction.tsx │ │ │ │ └── index.ts │ │ │ ├── Card/ │ │ │ │ ├── Card.tsx │ │ │ │ └── index.ts │ │ │ ├── Demo/ │ │ │ │ ├── Demo.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── IgboAPI.tsx │ │ │ │ │ ├── IgboSpeech/ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AudioOptions/ │ │ │ │ │ │ │ │ ├── AudioOption.tsx │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── AudioPlayer/ │ │ │ │ │ │ │ │ ├── AudioPlayerBase.tsx │ │ │ │ │ │ │ │ ├── RecordButton.tsx │ │ │ │ │ │ │ │ ├── UploadButton.tsx │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── ConvertToTextButton.tsx │ │ │ │ │ │ │ ├── DragState.tsx │ │ │ │ │ │ │ ├── ResultText.tsx │ │ │ │ │ │ │ └── ValidAudioType.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── StartBuilding.tsx │ │ │ │ │ └── Translate.tsx │ │ │ │ └── index.ts │ │ │ ├── Donate/ │ │ │ │ ├── Donate.tsx │ │ │ │ └── index.ts │ │ │ ├── FadeIn/ │ │ │ │ ├── FadeIn.tsx │ │ │ │ └── index.ts │ │ │ ├── Features/ │ │ │ │ ├── Features.tsx │ │ │ │ └── index.ts │ │ │ ├── Footer/ │ │ │ │ ├── Footer.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ └── Footer.test.tsx │ │ │ │ └── index.ts │ │ │ ├── GitHubStars/ │ │ │ │ ├── GitHubStars.tsx │ │ │ │ └── index.ts │ │ │ ├── Input/ │ │ │ │ ├── Input.tsx │ │ │ │ └── index.ts │ │ │ ├── LastCall/ │ │ │ │ ├── LastCall.tsx │ │ │ │ └── index.ts │ │ │ ├── MentionedIn/ │ │ │ │ ├── MentionedIn.tsx │ │ │ │ └── index.ts │ │ │ ├── Navbar/ │ │ │ │ ├── Navbar.tsx │ │ │ │ ├── NavigationMenu.tsx │ │ │ │ ├── NavigationOptions.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── Navbar.test.tsx │ │ │ │ │ ├── NavigationMenu.test.tsx │ │ │ │ │ └── NavigationOptions.test.tsx │ │ │ │ └── index.ts │ │ │ ├── Products/ │ │ │ │ ├── Products.tsx │ │ │ │ └── index.ts │ │ │ ├── Statistics/ │ │ │ │ ├── Stat.tsx │ │ │ │ ├── Statistics.tsx │ │ │ │ └── index.ts │ │ │ └── UseCases/ │ │ │ ├── UseCaseCard.tsx │ │ │ ├── UseCases.tsx │ │ │ └── index.ts │ │ ├── dashboard/ │ │ │ ├── __tests__/ │ │ │ │ ├── credentials.page.test.tsx │ │ │ │ ├── dashboard.test.tsx │ │ │ │ ├── layout.test.tsx │ │ │ │ ├── plans.page.test.tsx │ │ │ │ └── profile.test.tsx │ │ │ ├── components/ │ │ │ │ ├── DashboardMenu.tsx │ │ │ │ ├── DashboardNavigationMenu.tsx │ │ │ │ └── __tests__/ │ │ │ │ ├── DashboardMenu.test.tsx │ │ │ │ └── DashboardNavigationMenu.test.tsx │ │ │ ├── credentials.page.tsx │ │ │ ├── dashboard.tsx │ │ │ ├── error.tsx │ │ │ ├── index.page.tsx │ │ │ ├── layout.tsx │ │ │ ├── plans.page.tsx │ │ │ ├── profile.page.tsx │ │ │ └── shared/ │ │ │ └── pricingFeatures.tsx │ │ ├── hooks/ │ │ │ ├── __mocks__/ │ │ │ │ └── useCallable.ts │ │ │ ├── useCallable.ts │ │ │ └── useRecorder.ts │ │ ├── index.page.tsx │ │ ├── managers/ │ │ │ ├── AuthManager.tsx │ │ │ └── __tests__/ │ │ │ └── AuthManager.test.tsx │ │ ├── pricing/ │ │ │ ├── __tests__/ │ │ │ │ └── _index.page.test.tsx │ │ │ ├── _index.page.tsx │ │ │ ├── components/ │ │ │ │ ├── PricingCard.tsx │ │ │ │ └── __tests__/ │ │ │ │ └── PricingCard.test.tsx │ │ │ └── types.ts │ │ ├── privacy/ │ │ │ └── index.page.tsx │ │ ├── shared/ │ │ │ └── useCases.ts │ │ ├── signup/ │ │ │ ├── index.page.tsx │ │ │ └── login.tsx │ │ ├── terms/ │ │ │ └── index.page.tsx │ │ └── utils/ │ │ ├── getAWSAsset.ts │ │ └── isProduction.ts │ ├── public/ │ │ └── locales/ │ │ ├── en/ │ │ │ ├── about.json │ │ │ ├── common.json │ │ │ ├── index.js │ │ │ └── signup.json │ │ └── ig/ │ │ ├── about.json │ │ ├── common.json │ │ ├── index.js │ │ └── signup.json │ ├── routers/ │ │ ├── index.ts │ │ ├── router.ts │ │ ├── routerV2.ts │ │ ├── siteRouter.ts │ │ ├── stripeRouter.ts │ │ └── testRouter.ts │ ├── server.ts │ ├── services/ │ │ ├── __tests__/ │ │ │ ├── database.test.ts │ │ │ └── stripe.test.ts │ │ ├── database.ts │ │ ├── firebase-admin.ts │ │ ├── firebaseConfigs.ts │ │ ├── stripe.ts │ │ └── words.ts │ ├── shared/ │ │ ├── constants/ │ │ │ ├── AccountStatus.ts │ │ │ ├── ApiType.ts │ │ │ ├── ApiTypeToRoute.ts │ │ │ ├── ApiUsageLimit.ts │ │ │ ├── ChakraTheme.ts │ │ │ ├── DefaultAudios.ts │ │ │ ├── DemoOption.ts │ │ │ ├── Dialect.ts │ │ │ ├── DialectEnum.ts │ │ │ ├── Endpoint.ts │ │ │ ├── ExampleStyleEnum.ts │ │ │ ├── ExampleStyles.ts │ │ │ ├── Feedback.ts │ │ │ ├── LanguageEnum.ts │ │ │ ├── PartTypes.ts │ │ │ ├── Plan.ts │ │ │ ├── SentenceTypes.ts │ │ │ ├── StatTypes.ts │ │ │ ├── StopWords.ts │ │ │ ├── SuggestionSourceEnum.ts │ │ │ ├── Tenses.ts │ │ │ ├── Version.ts │ │ │ ├── WordAttributeEnum.ts │ │ │ ├── WordAttributes.ts │ │ │ ├── WordClass.ts │ │ │ ├── WordClassEnum.ts │ │ │ ├── WordTagEnum.ts │ │ │ ├── WordTags.ts │ │ │ ├── diacriticCodes.ts │ │ │ ├── errorMessages.ts │ │ │ ├── navigationLinks.ts │ │ │ └── parseFileLocations.ts │ │ └── utils/ │ │ ├── __tests__/ │ │ │ ├── createRegExp.test.ts │ │ │ └── getErrorMessage.test.ts │ │ ├── blobToBase64.ts │ │ ├── blobUrlToBase64.ts │ │ ├── createQueryRegex.ts │ │ ├── createRegExp.ts │ │ ├── documentUtils.ts │ │ ├── getErrorMessage.ts │ │ ├── normalization.js │ │ ├── removeAccents.ts │ │ ├── removePrefix.ts │ │ ├── replaceAbbreviations.ts │ │ └── wrapConsole.ts │ ├── siteConstants.ts │ ├── styles.css │ └── types/ │ ├── databaseStats.ts │ ├── developer.ts │ ├── developerUsage.ts │ ├── example.ts │ ├── express.ts │ ├── formFields.ts │ ├── index.ts │ ├── nsibidiCharacter.ts │ ├── stat.ts │ └── word.ts ├── tailwind.config.js ├── testSetup.ts ├── theme.config.jsx ├── tsconfig.json └── tsconfig.test.json