├── .dockerignore ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── technology-request.md └── workflows │ ├── ci.yaml │ ├── local-github-action.yaml │ ├── published-github-action.yaml │ ├── release.yaml │ └── renovate.yml ├── .gitignore ├── .npmignore ├── .nvmrc ├── .releaserc.cjs ├── .renovaterc.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── TODO.todo ├── action.yml ├── eslint.config.js ├── package-lock.json ├── package.json ├── src ├── analyser │ ├── __snapshots__ │ │ ├── index.github.test.ts.snap │ │ └── index.test.ts.snap │ ├── index.test.ts │ └── index.ts ├── autoload.ts ├── cli.test.ts ├── cli.ts ├── common │ ├── languages.ts │ ├── log.ts │ ├── nid.ts │ └── rules │ │ └── matchFiles.ts ├── github-action.ts ├── index.ts ├── loader.ts ├── matchAllFiles.test.ts ├── matchAllFiles.ts ├── matchDependencies.ts ├── payload │ ├── __snapshots__ │ │ ├── helpers.test.ts.snap │ │ └── index.test.ts.snap │ ├── helpers.test.ts │ ├── helpers.ts │ ├── index.test.ts │ └── index.ts ├── provider │ ├── base.ts │ ├── fake.ts │ └── fs.ts ├── register.ts ├── rules │ ├── __snapshots__ │ │ ├── all.test.ts.snap │ │ ├── ci.test.ts.snap │ │ ├── cloud.test.ts.snap │ │ ├── hosting.test.ts.snap │ │ └── index.test.ts.snap │ ├── ai │ │ ├── anthropic.ts │ │ ├── aws.bedrock.ts │ │ ├── aws.comprehend.ts │ │ ├── aws.polly.ts │ │ ├── aws.rekognition.ts │ │ ├── aws.sagemaker.ts │ │ ├── aws.transcribe.ts │ │ ├── aws.translate.ts │ │ ├── azure.openai.ts │ │ ├── cohere.ts │ │ ├── deepseek.ts │ │ ├── gcp.aiplatform.ts │ │ ├── gcp.dialogflow.ts │ │ ├── gcp.language.ts │ │ ├── gcp.speech.ts │ │ ├── gcp.translate.ts │ │ ├── gcp.vertex.ts │ │ ├── gcp.vision.ts │ │ ├── geminiai.ts │ │ ├── groq.ts │ │ ├── huggingface.ts │ │ ├── index.ts │ │ ├── mistralai.ts │ │ ├── ollama.ts │ │ ├── openai.ts │ │ ├── perplexityai.ts │ │ ├── vercel.ai.ts │ │ └── xai.ts │ ├── all.test.ts │ ├── analytics │ │ ├── amplitude.ts │ │ ├── googleanalytics.ts │ │ ├── hotjar.ts │ │ ├── index.ts │ │ ├── koalaanalytics.ts │ │ ├── logsnag.ts │ │ ├── matomo.ts │ │ ├── mixpanel.ts │ │ ├── pirschanalytics.ts │ │ ├── plausible.ts │ │ ├── posthog.ts │ │ ├── segment.ts │ │ ├── tinybird.ts │ │ └── vercel.analytics.ts │ ├── app │ │ ├── adminer.ts │ │ ├── caddy.ts │ │ ├── consul.ts │ │ ├── discourse.ts │ │ ├── grafana.ts │ │ ├── haproxy.ts │ │ ├── httpd.ts │ │ ├── index.ts │ │ ├── kibana.ts │ │ ├── kong.ts │ │ ├── mongoexpress.ts │ │ ├── nginx.ts │ │ ├── postgrest.ts │ │ ├── teamspeak.ts │ │ ├── telegraf.ts │ │ ├── traefik.ts │ │ └── zookeeper.ts │ ├── auth │ │ ├── auth0.ts │ │ ├── aws.cognito.ts │ │ ├── betterauth.ts │ │ ├── clerk.ts │ │ ├── frontegg.ts │ │ ├── fusionauth.ts │ │ ├── hanko.ts │ │ ├── index.ts │ │ ├── kinde.ts │ │ ├── logto.ts │ │ ├── okta.ts │ │ ├── orysh.ts │ │ ├── properlauth.ts │ │ ├── stytch.ts │ │ ├── supabase.auth.ts │ │ ├── supertokens.ts │ │ └── workos.ts │ ├── automation │ │ ├── apify.ts │ │ ├── aws.sfn.ts │ │ ├── browerbase.ts │ │ ├── browseruse.ts │ │ ├── firecrawl.ts │ │ ├── index.ts │ │ ├── inngest.ts │ │ └── n8n.ts │ ├── ci.test.ts │ ├── ci │ │ ├── appveyor.ts │ │ ├── atlassian.bitbucketpipelines.ts │ │ ├── aws.codebuild.ts │ │ ├── aws.codepipeline.ts │ │ ├── azure.ci.ts │ │ ├── browserstack.ts │ │ ├── circleci.ts │ │ ├── cirrusci.ts │ │ ├── cloudbees.codeship.ts │ │ ├── codeclimate.ts │ │ ├── codecov.ts │ │ ├── codesandboxci.ts │ │ ├── concourseci.ts │ │ ├── coveralls.ts │ │ ├── cypressci.ts │ │ ├── deepsource.ts │ │ ├── dependabot.ts │ │ ├── depotdev.ts │ │ ├── droneci.ts │ │ ├── gcp.cloudbuild.ts │ │ ├── github.codeql.ts │ │ ├── gitlab.ci.ts │ │ ├── index.ts │ │ ├── jenkins.ts │ │ ├── nxcloud.ts │ │ ├── relativeci.ts │ │ ├── renovate.ts │ │ ├── sonarcloud.ts │ │ ├── sonarqube.ts │ │ ├── styleci.ts │ │ ├── teamcity.ts │ │ ├── travisci.ts │ │ └── trufflesecurity.ts │ ├── cloud.test.ts │ ├── cloud │ │ ├── adobe.ts │ │ ├── akamai.ts │ │ ├── alibabacloud.ts │ │ ├── apple.ts │ │ ├── atlassian.ts │ │ ├── aws.ts │ │ ├── azure.ts │ │ ├── cloudbees.ts │ │ ├── cloudflare.ts │ │ ├── dokku.ts │ │ ├── equinix.ts │ │ ├── firebase.ts │ │ ├── flyio.ts │ │ ├── gcp.ts │ │ ├── google.ts │ │ ├── heroku.ts │ │ ├── hetzner.ts │ │ ├── hostinger.ts │ │ ├── ibmcloud.ts │ │ ├── index.ts │ │ ├── microsoft.ts │ │ ├── netlify.ts │ │ ├── nextcloud.ts │ │ ├── oraclecloud.ts │ │ ├── ovh.ts │ │ ├── qovery.ts │ │ ├── railway.ts │ │ ├── scaleway.ts │ │ ├── supabase.ts │ │ ├── upstash.ts │ │ └── vercel.ts │ ├── cms │ │ ├── adobe.commercecloud.ts │ │ ├── bigcommerce.ts │ │ ├── commercetools.ts │ │ ├── contentful.ts │ │ ├── datocms.ts │ │ ├── drupal.ts │ │ ├── fabric.ts │ │ ├── ghost.ts │ │ ├── gitbook.ts │ │ ├── index.ts │ │ ├── joomla.ts │ │ ├── kentico.ts │ │ ├── magento.ts │ │ ├── payloadcms.ts │ │ ├── prestashop.ts │ │ ├── sanity.ts │ │ ├── shopify.ts │ │ ├── sitecore.xmcloud.ts │ │ ├── squarespace.ts │ │ ├── strapi.ts │ │ ├── webflow.ts │ │ ├── woocommerce.ts │ │ └── wordpress.ts │ ├── collaboration │ │ ├── airtable.ts │ │ ├── asana.ts │ │ ├── atlassian.confluence.ts │ │ ├── atlassian.jira.ts │ │ ├── atlassian.opsgenie.ts │ │ ├── atlassian.trello.ts │ │ ├── calcom.ts │ │ ├── calendly.ts │ │ ├── clickup.ts │ │ ├── crowdin.ts │ │ ├── google.calendar.ts │ │ ├── google.chat.ts │ │ ├── google.docs.ts │ │ ├── google.drive.ts │ │ ├── google.forms.ts │ │ ├── google.gmail.ts │ │ ├── google.keep.ts │ │ ├── google.meet.ts │ │ ├── google.sheets.ts │ │ ├── google.slides.ts │ │ ├── google.tasks.ts │ │ ├── index.ts │ │ ├── linear.ts │ │ ├── microsoft.onedrive.ts │ │ ├── miro.ts │ │ ├── monday.ts │ │ └── notion.ts │ ├── communication │ │ ├── aircall.ts │ │ ├── discord.ts │ │ ├── facebook.ts │ │ ├── freshdesk.ts │ │ ├── index.ts │ │ ├── instagram.ts │ │ ├── intercom.ts │ │ ├── linkedin.ts │ │ ├── mattermost.ts │ │ ├── reddit.ts │ │ ├── slack.ts │ │ ├── telegram.ts │ │ ├── twitch.ts │ │ ├── twitter.ts │ │ ├── youtube.ts │ │ ├── zendesk.ts │ │ └── zoom.ts │ ├── crm │ │ ├── hubspot.ts │ │ ├── index.ts │ │ ├── klaviyo.ts │ │ ├── salesforce.ts │ │ └── twentycrm.ts │ ├── db │ │ ├── algolia.ts │ │ ├── apacheCassandra.ts │ │ ├── apacheCouchdb.ts │ │ ├── apacheHadoop.ts │ │ ├── apacheHive.ts │ │ ├── apacheIceberg.ts │ │ ├── apacheSolr.ts │ │ ├── apacheSpark.ts │ │ ├── aws.athena.ts │ │ ├── aws.cloudsearch.ts │ │ ├── aws.documentdb.ts │ │ ├── aws.dynamodb.ts │ │ ├── aws.elasticache.ts │ │ ├── aws.memorydb.ts │ │ ├── aws.neptune.ts │ │ ├── aws.opensearch.ts │ │ ├── aws.rds.ts │ │ ├── aws.redshift.ts │ │ ├── aws.secretsmanager.ts │ │ ├── aws.timestream.ts │ │ ├── azure.cosmosdb.ts │ │ ├── azure.mariadb.ts │ │ ├── azure.mysql.ts │ │ ├── azure.postgres.ts │ │ ├── azure.redis.ts │ │ ├── azure.sql.ts │ │ ├── chromadb.ts │ │ ├── clickhouse.ts │ │ ├── cockroachdb.ts │ │ ├── convex.ts │ │ ├── couchbase.ts │ │ ├── cratedb.ts │ │ ├── datastax.ts │ │ ├── duckdb.ts │ │ ├── elasticsearch.ts │ │ ├── firebase.firestore.ts │ │ ├── gcp.bigquery.ts │ │ ├── gcp.bigtable.ts │ │ ├── gcp.datastore.ts │ │ ├── gcp.memorystore.ts │ │ ├── gcp.secretmanager.ts │ │ ├── gcp.spanner.ts │ │ ├── gcp.sql.ts │ │ ├── hashicorpVault.ts │ │ ├── index.ts │ │ ├── infisical.ts │ │ ├── influxdb.ts │ │ ├── libsql.ts │ │ ├── mariadb.ts │ │ ├── meilisearch.ts │ │ ├── meilisearchcloud.ts │ │ ├── memcached.ts │ │ ├── milvusdb.ts │ │ ├── mongodb.ts │ │ ├── mssql.ts │ │ ├── mysql.ts │ │ ├── neo4j.ts │ │ ├── neondb.ts │ │ ├── oceanbase.ts │ │ ├── ovh.database.ts │ │ ├── percona.ts │ │ ├── pinecone.ts │ │ ├── planetscale.ts │ │ ├── postgres.ts │ │ ├── qdrant.ts │ │ ├── qovery.database.ts │ │ ├── questdb.ts │ │ ├── railway.mongodb.ts │ │ ├── railway.mysql.ts │ │ ├── railway.postgres.ts │ │ ├── railway.redis.ts │ │ ├── redis.ts │ │ ├── replit.database.ts │ │ ├── replit.postgres.ts │ │ ├── rethinkdb.ts │ │ ├── scaleway.database.ts │ │ ├── scaleway.documentdb.ts │ │ ├── scaleway.redis.ts │ │ ├── scaleway.secretmanager.ts │ │ ├── snowflake.ts │ │ ├── sqlite.ts │ │ ├── supabase.postgres.ts │ │ ├── surrealdb.ts │ │ ├── swiftype.ts │ │ ├── tdengine.ts │ │ ├── tidb.ts │ │ ├── timescaledb.ts │ │ ├── tursodb.ts │ │ ├── typesense.ts │ │ ├── typesensecloud.ts │ │ ├── upstash.redis.ts │ │ ├── vercel.blob.ts │ │ ├── vercel.kv.ts │ │ ├── vercel.postgres.ts │ │ └── victoriametrics.ts │ ├── etl │ │ ├── airbyte.ts │ │ ├── apacheAirflow.ts │ │ ├── apacheFlink.ts │ │ ├── apacheStorm.ts │ │ ├── apideck.ts │ │ ├── aws.glue.ts │ │ ├── databricks.ts │ │ ├── dataiku.ts │ │ ├── gcp.dataflow.ts │ │ ├── gcp.dataproc.ts │ │ ├── index.ts │ │ ├── integrationapp.ts │ │ ├── logstash.ts │ │ ├── mergedev.ts │ │ ├── nango.ts │ │ ├── trayio.ts │ │ └── useparagon.ts │ ├── files.test.ts │ ├── framework │ │ ├── apacheThrift.ts │ │ ├── apiplatform.ts │ │ ├── assemble.ts │ │ ├── astro.ts │ │ ├── blitzjs.ts │ │ ├── django.ts │ │ ├── docusaurus.ts │ │ ├── eleventy.ts │ │ ├── emberjs.ts │ │ ├── expojs.ts │ │ ├── fern.ts │ │ ├── gatsby.ts │ │ ├── gradio.ts │ │ ├── gridsome.ts │ │ ├── hexojs.ts │ │ ├── hugo.ts │ │ ├── index.ts │ │ ├── jekyll.ts │ │ ├── laravel.ts │ │ ├── meteorjs.ts │ │ ├── mintlify.ts │ │ ├── nestjs.ts │ │ ├── nextjs.ts │ │ ├── nuxtjs.ts │ │ ├── phaserjs.ts │ │ ├── rails.ts │ │ ├── readthedocs.ts │ │ ├── redwoodjs.ts │ │ ├── refinedev.ts │ │ ├── remixrun.ts │ │ ├── shopify.hydrogen.ts │ │ ├── symfony.ts │ │ ├── tanstackstart.ts │ │ ├── tauri.ts │ │ ├── wasp.ts │ │ └── yii2.ts │ ├── hosting.test.ts │ ├── hosting │ │ ├── aws.amplifyhosting.ts │ │ ├── aws.apigateway.ts │ │ ├── aws.ec2.ts │ │ ├── aws.ecs.ts │ │ ├── aws.eks.ts │ │ ├── aws.fargate.ts │ │ ├── aws.lambda.ts │ │ ├── aws.lightsail.ts │ │ ├── azure.aks.ts │ │ ├── azure.functions.ts │ │ ├── azure.staticwebapps.ts │ │ ├── cloudflare.pages.ts │ │ ├── cloudflare.workers.ts │ │ ├── denodeploy.ts │ │ ├── digitalocean.ts │ │ ├── elasticcloud.ts │ │ ├── expodev.ts │ │ ├── fastly.ts │ │ ├── gcp.appengine.ts │ │ ├── gcp.cloudrun.ts │ │ ├── gcp.functions.ts │ │ ├── gcp.gce.ts │ │ ├── gcp.gke.ts │ │ ├── gcp.tasks.ts │ │ ├── github.pages.ts │ │ ├── index.ts │ │ ├── koyeb.ts │ │ ├── kubernetes.ts │ │ ├── mongodbatlas.ts │ │ ├── ovh.dedicated.ts │ │ ├── ovh.kubernetes.ts │ │ ├── ovh.vps.ts │ │ ├── platformsh.ts │ │ ├── qovery.cluster.ts │ │ ├── render.ts │ │ ├── replit.ts │ │ ├── scaleway.container.ts │ │ ├── scaleway.elasticmetal.ts │ │ ├── scaleway.functions.ts │ │ ├── scaleway.kubernetes.ts │ │ ├── sitecore.ts │ │ ├── supabase.functions.ts │ │ ├── tencentcloud.ts │ │ └── vercel.edge.ts │ ├── iac │ │ ├── ansible.ts │ │ ├── aws.cloudformation.ts │ │ ├── chef.ts │ │ ├── helm.ts │ │ ├── index.ts │ │ ├── pulumi.ts │ │ └── terragrunt.ts │ ├── index.ts │ ├── language │ │ ├── bash.ts │ │ ├── c.ts │ │ ├── clojure.ts │ │ ├── cplusplus.ts │ │ ├── csharp.ts │ │ ├── css.ts │ │ ├── dart.ts │ │ ├── elixir.ts │ │ ├── glsl.ts │ │ ├── index.ts │ │ ├── java.ts │ │ ├── javascript.ts │ │ ├── jsx.ts │ │ ├── scss.ts │ │ ├── swift.ts │ │ ├── typescript.ts │ │ └── vue.ts │ ├── linter │ │ ├── biomejs.ts │ │ ├── eslint.ts │ │ ├── golangcilint.ts │ │ ├── index.ts │ │ ├── phpstan.ts │ │ ├── prettier.ts │ │ ├── rubocop.ts │ │ ├── sonarlint.ts │ │ ├── stylelint.ts │ │ └── vale.ts │ ├── maps │ │ ├── apple.maps.ts │ │ ├── azure.maps.ts │ │ ├── gcp.maps.ts │ │ ├── heremaps.ts │ │ ├── index.ts │ │ └── mapbox.ts │ ├── monitoring │ │ ├── aws.cloudwatch.ts │ │ ├── betterstack.ts │ │ ├── blackfire.ts │ │ ├── bugsnag.ts │ │ ├── datadog.ts │ │ ├── dynatrace.ts │ │ ├── gcp.logging.ts │ │ ├── healthchecksio.ts │ │ ├── hyperdx.ts │ │ ├── index.ts │ │ ├── newrelic.ts │ │ ├── onlineornot.ts │ │ ├── papertrail.ts │ │ ├── pingdom.ts │ │ ├── prometheus.ts │ │ ├── rollbar.ts │ │ ├── scoutapm.ts │ │ ├── sentry.ts │ │ ├── signoz.ts │ │ ├── uptimekuma.ts │ │ └── zipkin.ts │ ├── network │ │ ├── gcp.dns.ts │ │ └── index.ts │ ├── notification │ │ ├── aws.ses.ts │ │ ├── aws.sns.ts │ │ ├── beehiiv.ts │ │ ├── brevo.ts │ │ ├── clicksend.ts │ │ ├── ifttt.ts │ │ ├── index.ts │ │ ├── mailchimp.ts │ │ ├── mailgun.ts │ │ ├── mailjet.ts │ │ ├── novu.ts │ │ ├── resend.ts │ │ ├── sendgrid.ts │ │ ├── twilio.ts │ │ └── zapier.ts │ ├── orm │ │ ├── dieselrs.ts │ │ ├── doctrinephp.ts │ │ ├── drizzeleorm.ts │ │ ├── goent.ts │ │ ├── gorm.ts │ │ ├── index.ts │ │ ├── kysely.ts │ │ ├── prisma.ts │ │ ├── sequelize.ts │ │ ├── sequelruby.ts │ │ ├── sqlalchemy.ts │ │ └── typeorm.ts │ ├── package_manager │ │ ├── asdf.ts │ │ ├── bundler.ts │ │ ├── cargo.ts │ │ ├── goenv.ts │ │ ├── index.ts │ │ ├── npm.ts │ │ ├── nuget.ts │ │ ├── nvm.ts │ │ ├── phpcomposer.ts │ │ ├── phpenv.ts │ │ ├── pipenv.ts │ │ ├── pnpm.ts │ │ ├── poetry.ts │ │ ├── rubyenv.ts │ │ └── yarn.ts │ ├── payment │ │ ├── adyen.ts │ │ ├── chargebee.ts │ │ ├── index.ts │ │ ├── intuit.ts │ │ ├── klarna.ts │ │ ├── lemonsqueezy.ts │ │ ├── paddle.ts │ │ ├── paypal.ts │ │ ├── squareup.ts │ │ ├── stripe.ts │ │ └── zuora.ts │ ├── quality.test.ts │ ├── queue │ │ ├── apacheKafka.ts │ │ ├── aws.kafka.ts │ │ ├── aws.kinesis.ts │ │ ├── aws.mq.ts │ │ ├── aws.sqs.ts │ │ ├── celery.ts │ │ ├── gcp.pubsub.ts │ │ ├── index.ts │ │ ├── nats.ts │ │ ├── rabbitmq.ts │ │ ├── scaleway.mq.ts │ │ ├── supabase.realtime.ts │ │ ├── upstash.kafka.ts │ │ └── upstash.qstash.ts │ ├── runtime │ │ ├── bunsh.ts │ │ └── index.ts │ ├── saas │ │ ├── atlassian.bitbucket.ts │ │ ├── box.ts │ │ ├── docusign.ts │ │ ├── dropbox.ts │ │ ├── figma.ts │ │ ├── github.ts │ │ ├── hypertune.ts │ │ ├── index.ts │ │ ├── lago.ts │ │ ├── launchdarkly.ts │ │ ├── logrocket.ts │ │ ├── metabase.ts │ │ ├── optimizely.ts │ │ ├── pagerduty.ts │ │ ├── placekit.ts │ │ ├── postman.ts │ │ ├── postmark.ts │ │ ├── prismacloud.ts │ │ ├── sap.ts │ │ ├── sas.ts │ │ ├── servicenow.ts │ │ ├── splitio.ts │ │ ├── splunk.ts │ │ ├── tailscale.ts │ │ ├── veriff.ts │ │ ├── vialink.ts │ │ ├── withorb.ts │ │ └── yousign.ts │ ├── security │ │ ├── aws.kms.ts │ │ ├── datadome.ts │ │ ├── gcp.kms.ts │ │ ├── gitguardian.ts │ │ ├── index.ts │ │ ├── snyk.ts │ │ ├── sqreen.ts │ │ └── wiz.ts │ ├── spec │ │ ├── deno │ │ │ ├── __snapshots__ │ │ │ │ └── lockfile.test.ts.snap │ │ │ ├── index.ts │ │ │ ├── lockfile.test.ts │ │ │ └── lockfile.ts │ │ ├── docker │ │ │ ├── __snapshots__ │ │ │ │ └── component.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ └── index.ts │ │ ├── dotenv │ │ │ ├── __snapshots__ │ │ │ │ └── index.test.ts.snap │ │ │ ├── index.test.ts │ │ │ ├── index.ts │ │ │ └── matcher.ts │ │ ├── githubActions │ │ │ ├── __snapshots__ │ │ │ │ └── component.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ └── index.ts │ │ ├── golang │ │ │ ├── __snapshots__ │ │ │ │ ├── component.test.ts.snap │ │ │ │ └── lockfile.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ ├── index.ts │ │ │ ├── lockfile.test.ts │ │ │ └── lockfile.ts │ │ ├── index.ts │ │ ├── licenses │ │ │ ├── index.test.ts │ │ │ └── index.ts │ │ ├── nodejs │ │ │ ├── __snapshots__ │ │ │ │ └── component.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ └── index.ts │ │ ├── php │ │ │ ├── __snapshots__ │ │ │ │ └── component.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ └── index.ts │ │ ├── python │ │ │ ├── __snapshots__ │ │ │ │ └── lockfile.test.ts.snap │ │ │ ├── index.ts │ │ │ ├── lockfile.test.ts │ │ │ └── lockfile.ts │ │ ├── ruby │ │ │ ├── __snapshots__ │ │ │ │ └── lockfile.test.ts.snap │ │ │ ├── index.ts │ │ │ ├── lockfile.test.ts │ │ │ └── lockfile.ts │ │ ├── rust │ │ │ ├── __snapshots__ │ │ │ │ └── component.test.ts.snap │ │ │ ├── component.test.ts │ │ │ ├── component.ts │ │ │ └── index.ts │ │ ├── terraform │ │ │ ├── __snapshots__ │ │ │ │ ├── lockfile.test.ts.snap │ │ │ │ └── resource.test.ts.snap │ │ │ ├── index.ts │ │ │ ├── lockfile.test.ts │ │ │ ├── lockfile.ts │ │ │ ├── resource.test.ts │ │ │ └── resource.ts │ │ └── zig │ │ │ └── index.ts │ ├── storage │ │ ├── aws.cloudfront.ts │ │ ├── aws.ebs.ts │ │ ├── aws.ecr.ts │ │ ├── aws.efs.ts │ │ ├── aws.glacier.ts │ │ ├── aws.s3.ts │ │ ├── azure.storage.ts │ │ ├── cloudflare.r2.ts │ │ ├── gcp.artifactregistry.ts │ │ ├── gcp.containerregistry.ts │ │ ├── gcp.gcs.ts │ │ ├── index.ts │ │ ├── ovh.storage.ts │ │ ├── scaleway.storage.ts │ │ └── supabase.storage.ts │ ├── test │ │ ├── index.ts │ │ ├── jest.ts │ │ ├── k6.ts │ │ ├── lighthouse.ts │ │ ├── mochajs.ts │ │ ├── phppest.ts │ │ ├── phpunit.ts │ │ ├── storybook.ts │ │ └── vitest.ts │ ├── tool │ │ ├── atlasgo.ts │ │ ├── bytebase.ts │ │ ├── checkov.ts │ │ ├── electron.ts │ │ ├── esbuild.ts │ │ ├── express.ts │ │ ├── fastify.ts │ │ ├── flyway.ts │ │ ├── gitlab.ts │ │ ├── goacmelego.ts │ │ ├── index.ts │ │ ├── koa.ts │ │ ├── liquibase.ts │ │ ├── mailhog.ts │ │ ├── nxjs.ts │ │ ├── playwright.ts │ │ ├── puppeteer.ts │ │ ├── pytorch.ts │ │ ├── reactEmail.ts │ │ ├── rollup.ts │ │ ├── selenium.ts │ │ ├── socketio.ts │ │ ├── tensorflow.ts │ │ ├── turborepo.ts │ │ ├── twig.ts │ │ ├── vite.ts │ │ └── webpack.ts │ ├── ui │ │ ├── bootstrap.ts │ │ ├── d3js.ts │ │ ├── index.ts │ │ ├── radixui.ts │ │ ├── tailwind.ts │ │ └── tiptap.ts │ └── ui_framework │ │ ├── alpinejs.ts │ │ ├── angular.ts │ │ ├── htmx.ts │ │ ├── index.ts │ │ ├── infernojs.ts │ │ ├── litjs.ts │ │ ├── mithriljs.ts │ │ ├── preactjs.ts │ │ ├── qwikjs.ts │ │ ├── react.ts │ │ ├── solidjs.ts │ │ ├── stenciljs.ts │ │ ├── sveltejs.ts │ │ └── vue.ts ├── scripts │ └── prebuild.ts ├── tests │ └── helpers.ts └── types │ ├── index.ts │ ├── licenses.ts │ ├── rule.ts │ ├── techs.ts │ └── utils.ts ├── tests └── __fixtures__ │ ├── .env.example │ ├── .github │ └── workflows │ │ ├── invalid.yml │ │ └── test.yaml │ ├── deno │ └── deno.lock │ ├── docker-compose.yml │ ├── golang │ ├── cmd │ │ └── server │ │ │ └── main.go │ └── go.mod │ ├── package.json │ ├── php │ └── composer.json │ ├── pkgs │ ├── api │ │ └── package.json │ └── app │ │ ├── .vercel │ │ └── .gitkeep │ │ ├── package.json │ │ └── src │ │ ├── index.html │ │ └── index.scss │ ├── ruby │ └── Gemfile │ ├── rust │ └── Cargo.toml │ └── terraform │ └── .terraform.lock.hcl ├── tsconfig.json ├── tsconfig.lint.json └── vitest.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [bodinsamuel] 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/technology-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Technology request 3 | about: Suggest a missing technology 4 | title: "[TECH] Add __NAME__" 5 | labels: tech request 6 | assignees: bodinsamuel 7 | 8 | --- 9 | 10 | **Please describe what is missing.** 11 | 12 | 13 | - **Name** 14 | - **Website** 15 | - **Github** 16 | - **Dependencies** 17 | - npm: 18 | - ruby gems: 19 | - golang: 20 | - docker: 21 | - terraform: 22 | - deno: 23 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.test.js 2 | *.test.d.ts 3 | src/ 4 | tests/ 5 | *.tgz 6 | .github 7 | .eslint* 8 | TODO.todo 9 | .env 10 | coverage/ 11 | action/ 12 | __snapshots__/ 13 | __fixtures__/ 14 | *.ts.map 15 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.18.1 2 | -------------------------------------------------------------------------------- /.renovaterc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "github>algolia/renovate-config-algolia" 4 | ], 5 | "baseBranches": [ 6 | "chore/renovateBaseBranch" 7 | ], 8 | "prHourlyLimit": 10, 9 | "prConcurrentLimit": 10, 10 | "schedule": [ 11 | "after 10pm every weekday" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /TODO.todo: -------------------------------------------------------------------------------- 1 | - cloudinary 2 | - replicate 3 | - paystack 4 | - spotify 5 | - ADOBE_ANALYTICS 6 | - bing 7 | - alexa 8 | - gmail 9 | - rakuten 10 | - gdrive 11 | - revenuecat 12 | - HONEYBADGER 13 | - whatsapp 14 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Run Stack Analyser 2 | author: Specfy 3 | description: |- 4 | Analyse your stack and save output to a file. Detect Languages, SaaS, Cloud, Infrastructure, Dependencies, etc. 5 | 6 | 7 | runs: 8 | using: 'docker' 9 | image: 'Dockerfile' 10 | 11 | branding: 12 | icon: 'box' 13 | color: 'white' 14 | -------------------------------------------------------------------------------- /src/analyser/index.ts: -------------------------------------------------------------------------------- 1 | import { Payload } from '../payload/index.js'; 2 | 3 | import type { BaseProvider } from '../provider/base.js'; 4 | 5 | export interface AnalyserOptions { 6 | provider: BaseProvider; 7 | } 8 | 9 | export async function analyser(opts: AnalyserOptions): Promise { 10 | const provider = opts.provider; 11 | const pl = new Payload({ name: 'main', folderPath: '/' }); 12 | 13 | await pl.recurse(provider, provider.basePath); 14 | 15 | return pl; 16 | } 17 | -------------------------------------------------------------------------------- /src/autoload.ts: -------------------------------------------------------------------------------- 1 | import { loadAllRules } from './loader.js'; 2 | import './rules/index.js'; 3 | 4 | loadAllRules(); 5 | -------------------------------------------------------------------------------- /src/common/log.ts: -------------------------------------------------------------------------------- 1 | import { consola } from 'consola'; 2 | 3 | import type { LogLevel } from 'consola'; 4 | 5 | export const l = consola.create({ 6 | level: (process.env.LOG_LEVEL || process.env.CONSOLA_LEVEL || 'info') as unknown as LogLevel, 7 | }); 8 | -------------------------------------------------------------------------------- /src/common/nid.ts: -------------------------------------------------------------------------------- 1 | import { customAlphabet } from 'nanoid/non-secure'; 2 | 3 | export const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 4 | export const minSize = 10; 5 | export const maxSize = 12; 6 | export const nid = customAlphabet(alphabet, maxSize); 7 | -------------------------------------------------------------------------------- /src/rules/__snapshots__/cloud.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`hosting > should match everything with files 1`] = ` 4 | [ 5 | "firebase", 6 | "flyio", 7 | "netlify", 8 | "railway", 9 | "vercel", 10 | ] 11 | `; 12 | -------------------------------------------------------------------------------- /src/rules/__snapshots__/hosting.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`hosting > should match everything with files 1`] = ` 4 | [ 5 | "cloudflare.workers", 6 | "expodev", 7 | "github.pages", 8 | "koyeb", 9 | "platformsh", 10 | "render", 11 | "replit", 12 | ] 13 | `; 14 | -------------------------------------------------------------------------------- /src/rules/ai/aws.bedrock.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.bedrock', 5 | name: 'AWS Bedrock', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@aws-sdk/client-bedrock' }, 9 | { type: 'npm', name: '@aws-sdk/client-bedrock-runtime' }, 10 | { type: 'npm', name: '@aws-sdk/client-bedrock-agent-runtime' }, 11 | { type: 'npm', name: '@ai-sdk/amazon-bedrock' }, 12 | { type: 'npm', name: '@anthropic-ai/bedrock-sdk' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/ai/aws.comprehend.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.comprehend', 5 | name: 'AWS Comprehend', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@aws-sdk/client-comprehend' }, 9 | { type: 'npm', name: '@aws-sdk/client-comprehendmedical' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/ai/aws.polly.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.polly', 5 | name: 'AWS Polly', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@aws-sdk/client-polly' }, 9 | { type: 'npm', name: '@aws-cdk/aws-polly' }, 10 | { type: 'rust', name: 'aws-sdk-polly' }, 11 | { type: 'ruby', name: 'aws-sdk-polly' }, 12 | { 13 | type: 'golang', 14 | name: 'github.com/aws/aws-sdk-go-v2/service/polly', 15 | }, 16 | ], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/ai/aws.transcribe.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.transcribe', 5 | name: 'AWS Transcribe', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@aws-sdk/middleware-sdk-transcribe-streaming' }, 9 | { type: 'npm', name: '@aws-sdk/client-transcribe-streaming' }, 10 | { type: 'npm', name: '@aws-sdk/client-transcribe' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ai/azure.openai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'azure.openai', 5 | name: 'Azure Openai', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@ai-sdk/azure' }, 9 | { type: 'npm', name: 'genkitx-azure-openai' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/ai/cohere.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cohereai', 5 | name: 'Cohere AI', 6 | type: 'ai', 7 | dotenv: ['COHERE_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@langchain/cohere' }, 10 | { type: 'npm', name: '@ai-sdk/cohere' }, 11 | { type: 'npm', name: '@llamaindex/cohere' }, 12 | { type: 'npm', name: 'cohere-ai' }, 13 | { type: 'python', name: 'cohere' }, 14 | { type: 'golang', name: 'github.com/cohere-ai/cohere-go/v2' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/ai/deepseek.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'deepseek', 5 | name: 'Deepseek', 6 | type: 'ai', 7 | dotenv: ['DEEPSEEK_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@ai-sdk/deepsek' }, 10 | { type: 'npm', name: '@langchain/deepsek' }, 11 | { type: 'npm', name: 'n8n-nodes-deepseek' }, 12 | { type: 'python', name: 'langchain-deepseek' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/ai/gcp.language.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.language', 5 | name: 'Cloud Language', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@google-cloud/language' }, 9 | { 10 | type: 'ruby', 11 | name: /^google-cloud-language/, 12 | example: 'google-cloud-language-v1', 13 | }, 14 | { type: 'golang', name: 'cloud.google.com/go/language' }, 15 | { type: 'php', name: 'google/cloud-language' }, 16 | ], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/ai/gcp.speech.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.speech', 5 | name: 'Cloud Speech', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@google-cloud/speech' }, 9 | { 10 | type: 'ruby', 11 | name: /^google-cloud-speech/, 12 | example: 'google-cloud-speech-v1', 13 | }, 14 | { type: 'golang', name: 'cloud.google.com/go/speech' }, 15 | { type: 'php', name: 'google/cloud-speech' }, 16 | ], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/ai/gcp.vertex.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.vertex', 5 | name: 'Vertex AI', 6 | type: 'ai', 7 | dotenv: ['VERTEX_AI'], 8 | dependencies: [ 9 | { type: 'npm', name: '@ai-sdk/google-vertex' }, 10 | { type: 'npm', name: '@google-cloud/vertexai' }, 11 | { type: 'npm', name: '@langchain/google-vertexai' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/ai/gcp.vision.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.vision', 5 | name: 'Cloud Vision', 6 | type: 'ai', 7 | dependencies: [ 8 | { type: 'npm', name: '@google-cloud/vision' }, 9 | { 10 | type: 'ruby', 11 | name: /^google-cloud-vision/, 12 | example: 'google-cloud-vision-v1', 13 | }, 14 | { type: 'golang', name: 'cloud.google.com/go/vision' }, 15 | { type: 'php', name: 'google/cloud-vision' }, 16 | ], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/ai/geminiai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'geminiai', 5 | name: 'Gemini AI', 6 | type: 'ai', 7 | dotenv: ['GEMINI_'], 8 | dependencies: [ 9 | { type: 'python', name: 'genai' }, 10 | { type: 'npm', name: '@google/genai' }, 11 | { type: 'npm', name: 'gemini-ai' }, 12 | { type: 'python', name: 'langchain-google-genai' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/ai/groq.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'groq', 5 | name: 'Groq', 6 | type: 'ai', 7 | dotenv: ['GROQ_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@langchain/groq' }, 10 | { type: 'npm', name: '@ai-sdk/groq' }, 11 | { type: 'npm', name: 'groq-sdk' }, 12 | { type: 'npm', name: 'genkitx-groq ' }, 13 | { type: 'python', name: 'langchain-groq' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/ai/huggingface.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'huggingface', 5 | name: 'Hugging Face', 6 | type: 'ai', 7 | dotenv: ['HUGGINGFACE_'], 8 | dependencies: [ 9 | { type: 'npm', name: /^@huggingface\//, example: '@huggingface/inference' }, 10 | { type: 'python', name: 'langchain-huggingface' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ai/ollama.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ollama', 5 | name: 'Ollama', 6 | type: 'ai', 7 | dotenv: ['OLLAMA_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@langchain/ollama' }, 10 | { type: 'npm', name: 'ollama-ai-provider' }, 11 | { type: 'npm', name: 'genkitx-ollama' }, 12 | { type: 'npm', name: 'ollama' }, 13 | { type: 'python', name: 'langchain-ollama' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/ai/perplexityai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'perplexityai', 5 | name: 'Perplexity AI', 6 | type: 'ai', 7 | dotenv: ['PERPLEXITY_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@ai-sdk/perplexity' }, 10 | { type: 'npm', name: '@langchain/perplexity' }, 11 | { type: 'npm', name: '@watzon/n8n-nodes-perplexity' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/ai/vercel.ai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.ai', 5 | name: 'Vercel AI', 6 | type: 'ai', 7 | dependencies: [{ type: 'npm', name: '@vercel/ai' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ai/xai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'xai', 5 | name: 'X AI', 6 | type: 'ai', 7 | dotenv: ['XAI_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@ai-sdk/xai' }, 10 | { type: 'python', name: 'langchain-xai' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/all.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { registeredTech } from '../register.js'; 4 | import '../autoload.js'; 5 | 6 | describe('all', () => { 7 | it('should match everything', () => { 8 | expect([...registeredTech.values()].sort()).toMatchSnapshot(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /src/rules/analytics/amplitude.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'amplitude', 5 | name: 'Amplitude Analytics', 6 | type: 'analytics', 7 | dotenv: ['AMPLITUDE_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'amplitude-js' }, 10 | { type: 'npm', name: '@amplitude/analytics-browser' }, 11 | { type: 'php', name: 'zumba/amplitude-php' }, 12 | { type: 'terraform.resource', name: 'airbyte_source_amplitude' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/analytics/hotjar.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hotjar', 5 | name: 'Hotjar', 6 | type: 'analytics', 7 | dotenv: ['HOTJAR_'], 8 | dependencies: [{ type: 'npm', name: '@hotjar/browser' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/analytics/index.ts: -------------------------------------------------------------------------------- 1 | import './amplitude.js'; 2 | import './googleanalytics.js'; 3 | import './hotjar.js'; 4 | import './koalaanalytics.js'; 5 | import './logsnag.js'; 6 | import './matomo.js'; 7 | import './mixpanel.js'; 8 | import './pirschanalytics.js'; 9 | import './plausible.js'; 10 | import './posthog.js'; 11 | import './segment.js'; 12 | import './tinybird.js'; 13 | import './vercel.analytics.js'; 14 | -------------------------------------------------------------------------------- /src/rules/analytics/koalaanalytics.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'koalaanalytics', 5 | name: 'Koala Analytics', 6 | type: 'analytics', 7 | dependencies: [{ type: 'npm', name: '@getkoala/browser' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/analytics/logsnag.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'logsnag', 5 | name: 'LogSnag', 6 | type: 'analytics', 7 | dotenv: ['LOGSNAG_'], 8 | dependencies: [{ type: 'npm', name: 'logsnag' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/analytics/matomo.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'matomo', 5 | name: 'Matomo', 6 | type: 'analytics', 7 | dotenv: ['MATOMO'], 8 | dependencies: [ 9 | { type: 'docker', name: 'matomo' }, 10 | { type: 'docker', name: 'bitnami/matomo' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/analytics/pirschanalytics.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pirschanalytics', 5 | name: 'Pirsch Analytics', 6 | type: 'analytics', 7 | dependencies: [ 8 | { type: 'npm', name: 'pirsch-sdk' }, 9 | { type: 'ruby', name: 'pirsch_api' }, 10 | { type: 'php', name: 'pirsch-analytics/sdk' }, 11 | { type: 'golang', name: 'github.com/pirsch-analytics/pirsch-go-sdk/v2' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/analytics/tinybird.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tinybird', 5 | name: 'Tinybird', 6 | type: 'analytics', 7 | dotenv: ['TINYBIRD'], 8 | dependencies: [ 9 | { 10 | type: 'npm', 11 | name: /^@tinybirdco\//, 12 | example: '@tinybirdco/next-tinybird', 13 | }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/analytics/vercel.analytics.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.analytics', 5 | name: 'Vercel Analytics', 6 | type: 'analytics', 7 | dependencies: [{ type: 'npm', name: '@vercel/analytics' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/adminer.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'adminer', 5 | name: 'Adminer', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'adminer' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/caddy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'caddy', 5 | name: 'Caddy', 6 | type: 'app', 7 | files: /\.Caddyfile$/, 8 | example: 'test.Caddyfile', 9 | dependencies: [{ type: 'docker', name: /caddy/, example: 'caddy:0.0.0' }], 10 | }); 11 | -------------------------------------------------------------------------------- /src/rules/app/consul.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'consul', 5 | name: 'Consul', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'consul' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/discourse.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'discourse', 5 | name: 'Discourse', 6 | type: 'app', 7 | dependencies: [ 8 | { type: 'docker', name: 'bitnami/discourse' }, 9 | { type: 'docker', name: 'discourse/base' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/app/haproxy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'haproxy', 5 | name: 'HAProxy', 6 | type: 'app', 7 | dependencies: [ 8 | { type: 'docker', name: 'haproxy' }, 9 | { type: 'docker', name: 'haproxytech/haproxy-debian' }, 10 | { type: 'docker', name: 'haproxytech/haproxy-alpine' }, 11 | { type: 'docker', name: 'haproxytech/haproxy-ubuntu' }, 12 | { type: 'docker', name: 'haproxytech/kubernetes-ingress' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/app/httpd.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'httpd', 5 | name: 'HTTPD', 6 | type: 'app', 7 | files: ['httpd.conf'], 8 | dependencies: [{ type: 'docker', name: /httpd/, example: 'httpd:0.0.0' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/app/index.ts: -------------------------------------------------------------------------------- 1 | import './adminer.js'; 2 | import './caddy.js'; 3 | import './consul.js'; 4 | import './discourse.js'; 5 | import './grafana.js'; 6 | import './haproxy.js'; 7 | import './httpd.js'; 8 | import './kibana.js'; 9 | import './kong.js'; 10 | import './mongoexpress.js'; 11 | import './nginx.js'; 12 | import './postgrest.js'; 13 | import './teamspeak.js'; 14 | import './telegraf.js'; 15 | import './traefik.js'; 16 | import './zookeeper.js'; 17 | -------------------------------------------------------------------------------- /src/rules/app/kibana.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'kibana', 5 | name: 'Kibana', 6 | type: 'app', 7 | dotenv: ['KIBANA_'], 8 | dependencies: [{ type: 'docker', name: /kibana/, example: 'kibana:0.0.0' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/app/kong.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'kong', 5 | name: 'Kong', 6 | type: 'app', 7 | files: ['kong.conf'], 8 | dependencies: [{ type: 'docker', name: 'kong' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/app/mongoexpress.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mongoexpress', 5 | name: 'Mongo Express', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'mongo-express' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/postgrest.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'postgrest', 5 | name: 'Postgrest', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'postgrest/postgrest' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/teamspeak.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'teamspeak', 5 | name: 'Teamspeak', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'teamspeak' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/telegraf.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'telegraf', 5 | name: 'Telegraf', 6 | type: 'app', 7 | dependencies: [{ type: 'docker', name: 'telegraf' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/app/traefik.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'traefik', 5 | name: 'Traefik', 6 | type: 'app', 7 | files: ['traefik.yml', 'traefik.yaml', 'traefik.toml'], 8 | dependencies: [{ type: 'docker', name: 'traefik' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/app/zookeeper.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'zookeeper', 5 | name: 'Zookeeper', 6 | type: 'app', 7 | dependencies: [ 8 | { type: 'docker', name: /zookeeper/, example: 'zookeeper:0.0.0' }, 9 | { type: 'rust', name: 'zookeeper' }, 10 | { type: 'ruby', name: 'zookeeper' }, 11 | { type: 'php', name: 'sparkinfluence/zookeeper' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/auth/aws.cognito.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.cognito', 5 | name: 'AWS Cognito', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'golang', name: 'github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider' }, 9 | { type: 'npm', name: '@aws-sdk/client-cognito-identity-provider' }, 10 | { type: 'ruby', name: 'aws-sdk-cognitoidentityprovider' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/auth/betterauth.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'betterauth', 5 | name: 'Betterauth', 6 | type: 'auth', 7 | dotenv: ['BETTER_AUTH_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'better-auth' }, 10 | { type: 'npm', name: '@better-auth/cli' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/auth/frontegg.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'frontegg', 5 | name: 'Frontegg', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@frontegg\//, example: '@frontegg/js' }, 9 | { type: 'python', name: 'frontegg' }, 10 | { type: 'terraform', name: 'registry.terraform.io/frontegg/frontegg' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/auth/hanko.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hanko', 5 | name: 'Hanko', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@teamhanko\//, example: '@teamhanko/hanko-frontend-sdk' }, 9 | { type: 'npm', name: '@nuxtjs/hanko' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/auth/index.ts: -------------------------------------------------------------------------------- 1 | import './auth0.js'; 2 | import './aws.cognito.js'; 3 | import './betterauth.js'; 4 | import './clerk.js'; 5 | import './frontegg.js'; 6 | import './fusionauth.js'; 7 | import './hanko.js'; 8 | import './kinde.js'; 9 | import './logto.js'; 10 | import './okta.js'; 11 | import './orysh.js'; 12 | import './properlauth.js'; 13 | import './stytch.js'; 14 | import './supabase.auth.js'; 15 | import './supertokens.js'; 16 | import './workos.js'; 17 | -------------------------------------------------------------------------------- /src/rules/auth/kinde.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'kinde', 5 | name: 'Kinde', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@kinde-oss\//, example: '@kinde-oss/kinde-typescript-sdk' }, 9 | { type: 'python', name: 'kinde-python-sdk' }, 10 | { type: 'ruby', name: 'kinde_sdk' }, 11 | { type: 'php', name: 'kinde-oss/kinde-auth-php' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/auth/logto.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'logtoio', 5 | name: 'Logto', 6 | type: 'auth', 7 | dotenv: ['LOGTO_'], 8 | dependencies: [ 9 | { type: 'npm', name: /^@logto\//, example: '@logto/js' }, 10 | { type: 'golang', name: 'github.com/logto-io/go' }, 11 | { type: 'php', name: 'logto/sdk' }, 12 | { type: 'python', name: 'logto' }, 13 | { type: 'ruby', name: 'logto' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/auth/orysh.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'orysh', 5 | name: 'Ory', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@ory\//, example: '@ory/client' }, 9 | { type: 'golang', name: 'github.com/ory/client-go' }, 10 | { type: 'php', name: 'ory/client' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/auth/properlauth.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'propelauth', 5 | name: 'PropelAuth', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@propelauth\//, example: '@propelauth/node' }, 9 | { type: 'python', name: 'propelauth_fastapi' }, 10 | { type: 'rust', name: 'propelauth' }, 11 | { type: 'golang', name: 'github.com/propelauth/propelauth-go' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/auth/stytch.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'stytch', 5 | name: 'Stytch', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: /^@stytch\//, example: '@stytch/vanilla-js' }, 9 | { type: 'npm', name: 'stytch' }, 10 | { type: 'python', name: 'stytch' }, 11 | { type: 'golang', name: 'github.com/stytchauth/stytch-go/v16' }, 12 | { type: 'ruby', name: 'stytch' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/auth/supabase.auth.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supabase.auth', 5 | name: 'Supabase Auth', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: '@supabase/gotrue-js' }, 9 | { type: 'docker', name: 'supabase/gotrue' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/auth/supertokens.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supertokens', 5 | name: 'SuperTokens', 6 | type: 'auth', 7 | dependencies: [ 8 | { type: 'npm', name: 'supertokens-web-js' }, 9 | { type: 'npm', name: 'supertokens-node' }, 10 | { type: 'golang', name: 'github.com/supertokens/supertokens-golang' }, 11 | { type: 'python', name: 'supertokens_python' }, 12 | { type: 'npm', name: 'supertokens-auth-react' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/automation/apify.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apify', 5 | name: 'Apify', 6 | type: 'automation', 7 | dotenv: ['APIFY_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'apify' }, 10 | { type: 'npm', name: 'apify-client' }, 11 | { type: 'npm', name: /^@apify\//, example: '@apify/utilities' }, 12 | { type: 'python', name: 'apify' }, 13 | { type: 'terraform.resource', name: 'airbyte_source_apify_dataset' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/automation/browerbase.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'browerbase', 5 | name: 'Browserbase', 6 | type: 'automation', 7 | dependencies: [ 8 | { type: 'php', name: '@browserbasehq/sdk' }, 9 | { type: 'python', name: 'browserbase' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/automation/browseruse.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'browseruse', 5 | name: 'Browser Use', 6 | type: 'automation', 7 | dependencies: [{ type: 'python', name: 'browser-use' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/automation/firecrawl.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'firecrawl', 5 | name: 'Firecrawl', 6 | type: 'automation', 7 | dotenv: ['FIRECRAWL_'], 8 | dependencies: [ 9 | { type: 'php', name: '@mendable/firecrawl-js' }, 10 | { type: 'python', name: 'firecrawl-py' }, 11 | { type: 'golang', name: 'github.com/mendableai/firecrawl-go' }, 12 | { type: 'rust', name: 'firecrawl' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/automation/index.ts: -------------------------------------------------------------------------------- 1 | import './apify.js'; 2 | import './aws.sfn.js'; 3 | import './browerbase.js'; 4 | import './browseruse.js'; 5 | import './firecrawl.js'; 6 | import './inngest.js'; 7 | import './n8n.js'; 8 | -------------------------------------------------------------------------------- /src/rules/automation/inngest.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'inngest', 5 | name: 'Inngest', 6 | type: 'automation', 7 | dotenv: ['INNGEST_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'inngest' }, 10 | { type: 'golang', name: 'github.com/inngest/inngestgo' }, 11 | { type: 'python', name: 'inngest' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/automation/n8n.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'n8n', 5 | name: 'n8n', 6 | type: 'automation', 7 | dotenv: ['N8N_'], 8 | dependencies: [ 9 | { type: 'docker', name: 'n8nio/n8n' }, 10 | { type: 'npm', name: 'n8n' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/appveyor.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'appveyor', 5 | name: 'AppVeyor', 6 | type: 'ci', 7 | files: ['.appveyor.yml', '.appveyor.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/atlassian.bitbucketpipelines.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'atlassian.bitbucketpipelines', 5 | name: 'Bitbucket Pipelines', 6 | type: 'ci', 7 | files: ['bitbucket-pipeline.yml'], 8 | dependencies: [], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/aws.codepipeline.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.codepipeline', 5 | name: 'AWS Code Pipeline', 6 | type: 'ci', 7 | dependencies: [{ type: 'githubAction', name: 'zulhfreelancer/aws-codepipeline-action' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/azure.ci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'azure.ci', 5 | name: 'AzureCI', 6 | type: 'ci', 7 | files: ['azure-pipelines.yml', 'azure-pipelines.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/browserstack.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'browserstack', 5 | name: 'Browserstack', 6 | type: 'ci', 7 | files: ['browserstack.json', 'browserstack.yml'], 8 | dependencies: [ 9 | { type: 'npm', name: 'browserstack' }, 10 | { type: 'ruby', name: 'browserstack-local' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/circleci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'circleci', 5 | name: 'CircleCI', 6 | type: 'ci', 7 | files: ['.circleci', 'circle.yml', 'circle.yaml'], 8 | dependencies: [ 9 | { type: 'ruby', name: 'circleci' }, 10 | { 11 | type: 'githubAction', 12 | name: 'CircleCI-Public/trigger-circleci-pipeline-action', 13 | }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/ci/cirrusci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cirrusci', 5 | name: 'CirrusCI', 6 | type: 'ci', 7 | files: ['.cirrus.yml', '.cirrus.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/cloudbees.codeship.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cloudbees.codeship', 5 | name: 'CloudBees Codeship', 6 | type: 'ci', 7 | files: ['codeship-services.yml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/codeclimate.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'codeclimate', 5 | name: 'Code Climate', 6 | type: 'ci', 7 | files: ['.codeclimate.yml'], 8 | dependencies: [ 9 | { type: 'githubAction', name: 'paambaati/codeclimate-action' }, 10 | { type: 'githubAction', name: 'remarkablemark/setup-codeclimate' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/codecov.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'codecov', 5 | name: 'Codecov', 6 | type: 'ci', 7 | files: ['.codecov.yml', 'codecov.yml'], 8 | dependencies: [{ type: 'githubAction', name: 'codecov/codecov-action' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/codesandboxci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'codesandboxci', 5 | name: 'CodeSandboxCI', 6 | type: 'ci', 7 | matchFullPath: true, 8 | files: /.codesandbox\/ci.json/, 9 | example: '.codesandbox/ci.json', 10 | }); 11 | -------------------------------------------------------------------------------- /src/rules/ci/concourseci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'concourseci', 5 | name: 'Concourse CI', 6 | type: 'ci', 7 | files: ['concourse-ci'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/deepsource.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'deepsource', 5 | name: 'Deepsource', 6 | type: 'ci', 7 | files: ['.deepsource.toml'], 8 | dependencies: [{ type: 'githubAction', name: 'deepsourcelabs/test-coverage-action' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/dependabot.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dependabot', 5 | name: 'Dependabot', 6 | type: 'ci', 7 | matchFullPath: true, 8 | files: /.github\/dependabot.y(a)?ml/, 9 | example: '.github/dependabot.yml', 10 | dependencies: [ 11 | { type: 'ruby', name: /^dependabot-/, example: 'dependabot-common' }, 12 | { type: 'githubAction', name: 'ahmadnassri/action-dependabot-auto-merge' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/ci/depotdev.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'depotdev', 5 | name: 'Depot.dev', 6 | type: 'ci', 7 | files: ['depot.json'], 8 | dependencies: [ 9 | { type: 'githubAction', name: 'depot/setup-action' }, 10 | { type: 'githubAction', name: 'depot/build-push-action' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/droneci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'droneci', 5 | name: 'DroneCI', 6 | type: 'ci', 7 | files: ['.drone.yml'], 8 | dependencies: [{ type: 'docker', name: 'drone/drone' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/github.codeql.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'github.codeql', 5 | name: 'GitHub CodeQL', 6 | type: 'ci', 7 | dependencies: [{ type: 'githubAction', name: 'github/codeql-action/analyze' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/gitlab.ci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gitlab.ci', 5 | name: 'Gitlab CI', 6 | type: 'ci', 7 | files: ['.gitlab-ci.yml', '.gitlab-ci.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/jenkins.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'jenkins', 5 | name: 'Jenkins', 6 | type: 'ci', 7 | files: ['.jenkins'], 8 | dependencies: [ 9 | { type: 'docker', name: /jenkins-docker/, example: 'jenkins-docker:0.0.0' }, 10 | { type: 'ruby', name: 'jenkins_api_client' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/nxcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nxcloud', 5 | name: 'NX Cloud', 6 | type: 'ci', 7 | dependencies: [{ type: 'npm', name: 'nx-cloud' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/relativeci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'relativeci', 5 | name: 'RelativeCI', 6 | type: 'ci', 7 | files: ['relativeci.config.js'], 8 | dependencies: [ 9 | { type: 'npm', name: '@relative-ci/agent' }, 10 | { type: 'githubAction', name: 'relative-ci/agent-action' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ci/renovate.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'renovate', 5 | name: 'Renovate', 6 | type: 'ci', 7 | files: ['.renovaterc.json', '.renovaterc', 'renovate.json', 'renovate.json5'], 8 | dependencies: [{ type: 'npm', name: 'renovate' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/sonarcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sonarcloud', 5 | name: 'SonarCloud', 6 | type: 'ci', 7 | dependencies: [{ type: 'githubAction', name: 'SonarSource/sonarcloud-github-action' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/sonarqube.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sonarqube', 5 | name: 'SonarQube', 6 | type: 'ci', 7 | files: ['.sonar-project.properties'], 8 | dependencies: [{ type: 'docker', name: 'sonarqube' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/styleci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'styleci', 5 | name: 'StyleCI', 6 | type: 'ci', 7 | files: ['.styleci.yml', '.styleci.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/teamcity.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'teamcity', 5 | name: 'TeamCity', 6 | type: 'ci', 7 | files: ['.teamcity'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ci/travisci.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'travisci', 5 | name: 'TravisCI', 6 | type: 'ci', 7 | files: ['.travis.yml', '.travis.yaml'], 8 | dependencies: [{ type: 'ruby', name: 'travis' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ci/trufflesecurity.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'trufflesecurity', 5 | name: 'Truffle Security', 6 | type: 'ci', 7 | dependencies: [ 8 | { type: 'docker', name: 'trufflesecurity/trufflehog' }, 9 | { type: 'githubAction', name: 'trufflesecurity/trufflehog' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/cloud/adobe.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'adobe', 5 | name: 'Adobe', 6 | type: 'cloud', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cloud/akamai.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'akamai', 5 | name: 'Akamai', 6 | type: 'cloud', 7 | dotenv: ['AKAMAI_'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/akamai/akamai' }, 10 | { type: 'npm', name: 'akamai-edgegrid' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cloud/alibabacloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'alibabacloud', 5 | name: 'Alibaba Cloud', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'terraform', name: 'registry.terraform.io/aliyun/alicloud' }, 9 | { type: 'php', name: 'alibabacloud/sdk' }, 10 | { type: 'php', name: 'alibabacloud/client' }, 11 | { type: 'githubAction', name: 'aliyun/acr-login' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cloud/apple.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apple', 5 | name: 'Apple', 6 | type: 'cloud', 7 | dotenv: ['APPLE_ID'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cloud/atlassian.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'atlassian', 5 | name: 'Atlassian', 6 | type: 'cloud', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cloud/cloudbees.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cloudbees', 5 | name: 'CloudBees', 6 | type: 'cloud', 7 | dotenv: ['CLOUDBEES_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cloud/dokku.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dokku', 5 | name: 'Dokku', 6 | type: 'cloud', 7 | dotenv: ['DOKKU_'], 8 | dependencies: [ 9 | { type: 'githubAction', name: 'dokku/github-action' }, 10 | { type: 'docker', name: 'dokku/ci-docker-image' }, 11 | { type: 'docker', name: 'dokku/dokku' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cloud/equinix.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'equinix', 5 | name: 'Equinix', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'terraform', name: 'registry.terraform.io/equinix/equinix' }, 9 | { type: 'terraform', name: 'registry.terraform.io/equinix/metal' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/cloud/flyio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'flyio', 5 | name: 'Flyio', 6 | type: 'cloud', 7 | files: ['fly.toml'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/fly-apps/fly' }, 10 | { type: 'githubAction', name: 'superfly/flyctl-actions/setup-flyctl' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cloud/google.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google', 5 | name: 'Google', 6 | type: 'cloud', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cloud/heroku.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'heroku', 5 | name: 'Heroku', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'terraform', name: 'registry.terraform.io/heroku/heroku' }, 9 | { type: 'ruby', name: 'platform-api' }, 10 | { type: 'php', name: 'heroku/heroku-buildpack-php' }, 11 | { type: 'githubAction', name: 'akhileshns/heroku-deploy' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cloud/hetzner.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hetzner', 5 | name: 'Hetzner', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'terraform', name: 'registry.terraform.io/hetznercloud/hcloud' }, 9 | { type: 'golang', name: 'github.com/hetznercloud/hcloud-go/v2/hcloud' }, 10 | { type: 'python', name: 'hcloud' }, 11 | { type: 'php', name: 'lkdevelopment/hetzner-cloud-php-sdk' }, 12 | { type: 'ruby', name: 'hetznercloud' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/cloud/hostinger.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hostinger', 5 | name: 'Hostinger', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'php', name: 'hostinger/api-php-sdk' }, 9 | { type: 'python', name: 'hostinger_api' }, 10 | { type: 'npm', name: 'hostinger-api-sdk' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cloud/ibmcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ibmcloud', 5 | name: 'IBM Cloud', 6 | type: 'cloud', 7 | dependencies: [{ type: 'terraform', name: 'registry.terraform.io/IBM-Cloud/ibm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cloud/microsoft.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'microsoft', 5 | name: 'Microsoft', 6 | type: 'cloud', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cloud/nextcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nextcloud', 5 | name: 'Nextcloud', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'docker', name: 'nextcloud/all-in-one' }, 9 | { type: 'docker', name: 'nextcloud' }, 10 | { type: 'docker', name: 'nextcloud/aio-nextcloud' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cloud/oraclecloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'oraclecloud', 5 | name: 'Oracle Cloud', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'npm', name: /^oci-/, example: 'oci-sdk' }, 9 | { type: 'terraform', name: 'registry.terraform.io/oracle/oci' }, 10 | { type: 'ruby', name: 'oci' }, 11 | { type: 'php', name: 'oracle/oci-php-sdk' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cloud/ovh.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh', 5 | name: 'OVH', 6 | type: 'cloud', 7 | dotenv: ['OVH_'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/ovh/ovh' }, 10 | { type: 'npm', name: '@ovh-api/api' }, 11 | { type: 'npm', name: '@ovhcloud/pulumi-ovh' }, 12 | { type: 'php', name: 'ovh/ovh' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/cloud/scaleway.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway', 5 | name: 'Scaleway', 6 | type: 'cloud', 7 | dependencies: [ 8 | { type: 'npm', name: '@scaleway/sdk' }, 9 | { type: 'terraform', name: 'registry.terraform.io/scaleway/scaleway' }, 10 | { type: 'githubAction', name: 'scaleway/action-scw' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cloud/supabase.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supabase', 5 | name: 'Supabase', 6 | type: 'cloud', 7 | dotenv: ['SUPABASE_'], 8 | dependencies: [ 9 | { type: 'npm', name: /^@supabase\//, example: '@supabase/supabase.js' }, 10 | { type: 'githubAction', name: 'supabase/setup-cli' }, 11 | { type: 'docker', name: 'supabase/studio' }, 12 | { type: 'python', name: 'supabase' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/cloud/upstash.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'upstash', 5 | name: 'Upstash', 6 | type: 'cloud', 7 | dependencies: [{ type: 'npm', name: /^@upstash\//, example: '@upstash/ratelimit' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cms/adobe.commercecloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'adobe.commercecloud', 5 | name: 'Adobe Commerce Cloud', 6 | type: 'cms', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cms/bigcommerce.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bigcommerce', 5 | name: 'BigCommerce', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'php', name: 'bigcommerce/api' }, 9 | { type: 'npm', name: '@bigcommerce/checkout-sdk' }, 10 | { type: 'terraform.resource', name: 'airbyte_source_bigcommerce' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cms/commercetools.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'commercetools', 5 | name: 'Commercetools', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'npm', name: '@commercetools/platform-sdk' }, 9 | { type: 'npm', name: '@commercetools/sdk-client-v2' }, 10 | { type: 'npm', name: '@commercetools/sdk-middleware-http' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cms/contentful.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'contentful', 5 | name: 'Contentful', 6 | type: 'cms', 7 | dotenv: ['CONTENTFUL_'], 8 | dependencies: [ 9 | { type: 'php', name: 'contentful/contentful' }, 10 | { type: 'php', name: 'contentful/contentful-management' }, 11 | { type: 'npm', name: 'contentful' }, 12 | { type: 'npm', name: 'contentful-management' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/cms/drupal.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'drupal', 5 | name: 'Drupal', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'docker', name: 'drupal' }, 9 | { type: 'php', name: 'drupal/core' }, 10 | { type: 'php', name: 'drupal/core-recommended' }, 11 | { type: 'php', name: 'drupal/drupal-extension' }, 12 | { type: 'php', name: 'webflo/drupal-finder' }, 13 | { type: 'php', name: 'mglaman/phpstan-drupal' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/cms/fabric.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'fabric', 5 | name: 'Fabric', 6 | type: 'cms', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/cms/ghost.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ghost', 5 | name: 'Ghost', 6 | type: 'cms', 7 | dotenv: ['GHOST_'], 8 | dependencies: [ 9 | { type: 'docker', name: 'ghost' }, 10 | { type: 'npm', name: 'ghost-cli' }, 11 | { type: 'npm', name: '@tryghost/content-api' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cms/gitbook.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gitbook', 5 | name: 'Gitbook', 6 | type: 'cms', 7 | dependencies: [{ type: 'npm', name: /^@gitbook\//, example: '@gitbook/api' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cms/joomla.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'joomla', 5 | name: 'Joomla!', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'php', name: 'joomla/application' }, 9 | { type: 'docker', name: 'joomla' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/cms/magento.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'magento', 5 | name: 'Magento', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'php', name: 'magento/composer' }, 9 | { type: 'php', name: 'fastly/magento2' }, 10 | { type: 'php', name: 'smile/elasticsuite' }, 11 | { type: 'npm', name: '@adobe/magento-storefront-events-sdk' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cms/payloadcms.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'payloadcms', 5 | name: 'Payload', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'npm', name: 'payload' }, 9 | { type: 'npm', name: '@payload/plugin-seo' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/cms/prestashop.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'prestashop', 5 | name: 'Prestashop', 6 | type: 'cms', 7 | dependencies: [ 8 | { type: 'php', name: 'prestashop/ps_facetedsearch' }, 9 | { type: 'php', name: 'prestashop/ps_shoppingcart' }, 10 | { type: 'php', name: 'prestashop/ps_currencyselector' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cms/sanity.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sanity', 5 | name: 'Sanity', 6 | type: 'cms', 7 | dependencies: [{ type: 'npm', name: 'sanity' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cms/sitecore.xmcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sitecore.xmlcloud', 5 | name: 'Sitecore XM cloud', 6 | type: 'cms', 7 | dependencies: [ 8 | { 9 | type: 'npm', 10 | name: /^@sitecore-jss\/sitecore-jss/, 11 | example: '@sitecore-jss/sitecore-jss-nextjs', 12 | }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/cms/squarespace.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'squarespace', 5 | name: 'Squarespace', 6 | type: 'cms', 7 | dependencies: [{ type: 'npm', name: /^@squarespace\//, example: '@squarespace/server' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/cms/strapi.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'strapi', 5 | name: 'Strapi', 6 | type: 'cms', 7 | dotenv: ['STRAPI_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'strapi' }, 10 | { type: 'npm', name: '@strapi/strapi' }, 11 | { type: 'docker', name: /strapi/, example: 'strapi:0.0.0' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/cms/webflow.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'webflow', 5 | name: 'Webflow', 6 | type: 'cms', 7 | dotenv: ['WEBFLOW_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'webflow-api' }, 10 | { type: 'terraform.resource', name: 'airbyte_source_webflow' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/cms/woocommerce.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'woocommerce', 5 | name: 'WooCommerce', 6 | type: 'cms', 7 | dotenv: ['WOOCOMMERCE_'], 8 | dependencies: [ 9 | { type: 'php', name: 'automattic/woocommerce' }, 10 | { type: 'terraform.resource', name: 'airbyte_source_woocommerce' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/collaboration/airtable.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'airtable', 5 | name: 'Airtable', 6 | type: 'collaboration', 7 | dotenv: ['AIRTABLE_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'airtable' }, 10 | { type: 'php', name: 'sleiman/airtable-php' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/collaboration/atlassian.opsgenie.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'atlassian.opsgenie', 5 | name: 'Atlassian OpsGenie', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: 'opsgenie-sdk' }, 9 | { type: 'npm', name: '@pulumi/opsgenie' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/collaboration/calcom.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'calcom', 5 | name: 'Cal.com', 6 | type: 'collaboration', 7 | dependencies: [{ type: 'npm', name: /^@calcom\//, example: '@calcom/sdk' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/collaboration/calendly.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'calendly', 5 | name: 'Calendly', 6 | type: 'collaboration', 7 | dotenv: ['CALENDLY_'], 8 | dependencies: [{ type: 'npm', name: 'react-calendly' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/collaboration/clickup.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'clickup', 5 | name: 'ClickUp', 6 | type: 'collaboration', 7 | dotenv: ['CLICKUP_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/collaboration/crowdin.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'crowdin', 5 | name: 'Crowdin', 6 | type: 'collaboration', 7 | files: ['crowdin.yml', 'crowdin.yaml'], 8 | dependencies: [ 9 | { 10 | type: 'npm', 11 | name: /^@crowdin\//, 12 | example: '@crowdin/crowdin-api-client', 13 | }, 14 | { type: 'php', name: 'crowdin/crowdin-api-client' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.calendar.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.calendar', 5 | name: 'Google Calendar', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/calendar' }, 9 | { type: 'php', name: 'spatie/laravel-google-calendar' }, 10 | { type: 'ruby', name: 'google-apis-calendar_v3' }, 11 | { type: 'ruby', name: 'google_calendar' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.chat.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.chat', 5 | name: 'Google Chat', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/chat' }, 9 | { type: 'terraform.resource', name: 'airbyte_source_google_calendar' }, 10 | { type: 'ruby', name: 'google-apis-chat_v1' }, 11 | { type: 'ruby', name: 'google-apps-chat-v1' }, 12 | { type: 'ruby', name: 'google-apps-chat' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.docs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.docs', 5 | name: 'Google Docs', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/docs' }, 9 | { type: 'ruby', name: 'google-apis-docs_v1' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.forms.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.forms', 5 | name: 'Google Forms', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/forms' }, 9 | { type: 'terraform.resource', name: 'airbyte_source_google_forms' }, 10 | { type: 'ruby', name: 'google-apis-forms_v1' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.gmail.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.gmail', 5 | name: 'Gmail', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/gmail' }, 9 | { type: 'ruby', name: 'google-apis-gmail_v1' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.keep.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.keep', 5 | name: 'Google Keep', 6 | type: 'collaboration', 7 | dependencies: [{ type: 'ruby', name: 'google-apis-keep_v1' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.meet.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.meet', 5 | name: 'Google Meet', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@google-apps/meet' }, 9 | { type: 'ruby', name: 'google-apis-meet_v2' }, 10 | { type: 'ruby', name: 'google-apps-meet-v2' }, 11 | { type: 'ruby', name: 'google-apps-meet' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.slides.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.slides', 5 | name: 'Google Slides', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/slides' }, 9 | { type: 'ruby', name: 'google-apis-slides_v1' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/collaboration/google.tasks.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'google.tasks', 5 | name: 'Google Tasks', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'npm', name: '@googleapis/tasks' }, 9 | { type: 'ruby', name: 'google-apis-tasks_v1' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/collaboration/linear.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'linear', 5 | name: 'Linear', 6 | type: 'collaboration', 7 | dotenv: ['LINEAR_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@linear/sdk' }, 10 | { type: 'python', name: 'linear-cli' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/collaboration/microsoft.onedrive.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'microsoft.onedrive', 5 | name: 'OneDrive', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { type: 'rust', name: 'onedrive-api' }, 9 | { type: 'php', name: 'krizalys/onedrive-php-sdk' }, 10 | { type: 'npm', name: '@uppy/onedrive' }, 11 | { type: 'terraform.resource', name: 'airbyte_source_microsoft_onedrive' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/collaboration/miro.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'miro', 5 | name: 'Miro', 6 | type: 'collaboration', 7 | dotenv: ['MIRO_'], 8 | dependencies: [{ type: 'npm', name: '@mirohq/miro-api' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/collaboration/monday.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'monday', 5 | name: 'Monday', 6 | type: 'collaboration', 7 | dependencies: [ 8 | { 9 | type: 'npm', 10 | name: 'monday-sdk-js', 11 | }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/collaboration/notion.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'notion', 5 | name: 'Notion', 6 | type: 'collaboration', 7 | dotenv: ['NOTION_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@notionhq/client' }, 10 | { type: 'npm', name: 'notion-to-md' }, 11 | { type: 'php', name: 'fiveam-code/laravel-notion-api' }, 12 | { type: 'ruby', name: 'notion-ruby-client' }, 13 | { type: 'rust', name: 'notion' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/communication/aircall.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aircall', 5 | name: 'Aircall', 6 | type: 'communication', 7 | dotenv: ['AIRCALL_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'aircall-everywhere' }, 10 | { type: 'npm', name: 'aircall' }, 11 | { type: 'terraform.resource', name: 'airbyte_source_aircall' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/communication/discord.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'discord', 5 | name: 'Discord', 6 | type: 'communication', 7 | dotenv: ['DISCORD_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'discord.js' }, 10 | { 11 | type: 'npm', 12 | name: 'discord-interactions', 13 | }, 14 | { type: 'githubAction', name: 'Ilshidur/action-discord' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/communication/facebook.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'facebook', 5 | name: 'Facebook', 6 | type: 'communication', 7 | dotenv: ['FACEBOOK_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'facebook-nodejs-business-sdk' }, 10 | { type: 'npm', name: 'passport-facebook' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/communication/index.ts: -------------------------------------------------------------------------------- 1 | import './aircall.js'; 2 | import './discord.js'; 3 | import './facebook.js'; 4 | import './freshdesk.js'; 5 | import './instagram.js'; 6 | import './intercom.js'; 7 | import './linkedin.js'; 8 | import './mattermost.js'; 9 | import './reddit.js'; 10 | import './slack.js'; 11 | import './telegram.js'; 12 | import './twitch.js'; 13 | import './twitter.js'; 14 | import './youtube.js'; 15 | import './zendesk.js'; 16 | import './zoom.js'; 17 | -------------------------------------------------------------------------------- /src/rules/communication/instagram.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'instagram', 5 | name: 'Instagram', 6 | type: 'communication', 7 | dotenv: ['INSTAGRAM_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/communication/linkedin.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'linkedin', 5 | name: 'Linkedin', 6 | type: 'communication', 7 | dotenv: ['LINKEDIN_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/communication/mattermost.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mattermost', 5 | name: 'Mattermost', 6 | type: 'communication', 7 | dependencies: [ 8 | { type: 'npm', name: 'mattermost-client' }, 9 | { type: 'npm', name: '@mattermost/client' }, 10 | { type: 'npm', name: 'hubot-matteruser' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/communication/reddit.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'reddit', 5 | name: 'Reddit', 6 | type: 'communication', 7 | dotenv: ['REDDIT_'], 8 | dependencies: [{ type: 'npm', name: 'snoowrap' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/communication/twitch.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'twitch', 5 | name: 'Twitch', 6 | type: 'communication', 7 | dotenv: ['TWITCH_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'tmi.js' }, 10 | { type: 'npm', name: 'passport-twitch-strategy' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/communication/twitter.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'twitter', 5 | name: 'X', 6 | type: 'communication', 7 | dotenv: ['TWITTER_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'twitter-api-v2' }, 10 | { type: 'python', name: 'tweepy' }, 11 | { type: 'npm', name: 'passport-twitter' }, 12 | { type: 'terraform.resource', name: 'airbyte_source_twitter' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/communication/youtube.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'youtube', 5 | name: 'Youtube', 6 | type: 'communication', 7 | dotenv: ['YOUTUBE_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/communication/zendesk.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'zendesk', 5 | name: 'Zendesk', 6 | type: 'communication', 7 | dotenv: ['ZENDESK_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'node-zendesk' }, 10 | { type: 'ruby', name: 'zendesk_api' }, 11 | { type: 'php', name: 'zendesk/zendesk_api_client_php' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/communication/zoom.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'zoom', 5 | name: 'Zoom', 6 | type: 'communication', 7 | dotenv: ['ZOOM_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@zoom/meetingsdk' }, 10 | { type: 'terraform.resource', name: 'airbyte_source_zoom' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/crm/hubspot.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hubspot', 5 | name: 'HubSpot', 6 | type: 'crm', 7 | dependencies: [ 8 | { type: 'npm', name: /^@hubpost\//, example: '@hubspot/api-client' }, 9 | { type: 'php', name: 'hubspot/hubspot-php' }, 10 | { type: 'php', name: 'hubspot/api-client' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/crm/index.ts: -------------------------------------------------------------------------------- 1 | import './hubspot.js'; 2 | import './klaviyo.js'; 3 | import './salesforce.js'; 4 | import './twentycrm.js'; 5 | -------------------------------------------------------------------------------- /src/rules/crm/klaviyo.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'klaviyo', 5 | name: 'Klaviyo', 6 | type: 'crm', 7 | dependencies: [ 8 | { type: 'php', name: 'klaviyo/magento2-extension' }, 9 | { type: 'terraform.resource', name: 'airbyte_source_klaviyo' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/crm/salesforce.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'salesforce', 5 | name: 'Salesforce', 6 | type: 'crm', 7 | dotenv: ['SALESFORCE_'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/hashicorp/salesforce' }, 10 | { 11 | type: 'npm', 12 | name: /^@salesforce\//, 13 | example: '@salesforce/kit', 14 | }, 15 | { type: 'npm', name: 'jsforce' }, 16 | ], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/crm/twentycrm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'twentycrm', 5 | name: 'Twenty CRM', 6 | type: 'crm', 7 | dependencies: [{ type: 'docker', name: 'twentycrm/twenty' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/apacheCassandra.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_cassandra', 5 | name: 'Apache Cassandra', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: /cassandra/, example: 'cassandra:0.0.0' }, 9 | { type: 'rust', name: 'discord-cassandra-cpp' }, 10 | { type: 'rust', name: 'cassandra-cpp' }, 11 | { type: 'npm', name: '@opentelemetry/instrumentation-cassandra-driver' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/db/apacheCouchdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_couchdb', 5 | name: 'Apache CouchDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'apache/couchdb' }, 9 | { type: 'php', name: 'doctrine/couchdb' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/db/apacheHadoop.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_hadoop', 5 | name: 'Apache Hadoop', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'apache/hadoop' }, 9 | { type: 'ruby', name: 'hadoop-metrics2' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/db/apacheHive.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_hive', 5 | name: 'Apache Hive', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'apache/hive' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/apacheIceberg.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_iceberg', 5 | name: 'Apache Iceberg', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'apache/spark-iceberg' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/apacheSolr.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_solr', 5 | name: 'Apache Solr', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'solr' }, 9 | { type: 'docker', name: 'bitnami/solr' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/db/apacheSpark.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_spark', 5 | name: 'Apache Spark', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'apache/spark' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/chromadb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'chromadb', 5 | name: 'ChromaDB', 6 | type: 'db', 7 | dependencies: [{ type: 'python', name: 'chromadb' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/cockroachdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cockroachdb', 5 | name: 'CockroachDB', 6 | type: 'db', 7 | dependencies: [ 8 | { 9 | type: 'terraform', 10 | name: 'registry.terraform.io/cockroachdb/cockroach', 11 | }, 12 | { type: 'php', name: 'nbj/cockroachdb-laravel' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/db/convex.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'convexdb', 5 | name: 'Convex', 6 | type: 'db', 7 | dotenv: ['CONVEX_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'convex' }, 10 | { type: 'python', name: 'convex' }, 11 | { type: 'rust', name: 'convex' }, 12 | { type: 'terraform.resource', name: 'airbyte_destination_convex' }, 13 | { type: 'terraform.resource', name: 'airbyte_source_convex' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/db/cratedb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cratedb', 5 | name: 'CrateDB', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'cratedb' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/datastax.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'datastax', 5 | name: 'Datastax', 6 | type: 'db', 7 | dependencies: [ 8 | { 9 | type: 'terraform', 10 | name: 'registry.terraform.io/datastax/astra', 11 | }, 12 | { type: 'terraform.resource', name: 'airbyte_destination_astra' }, 13 | { type: 'php', name: 'datastax/php-driver' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/db/duckdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'duckdb', 5 | name: 'DuckDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'npm', name: 'duckdb' }, 9 | { type: 'terraform.resource', name: 'airbyte_destination_duckdb' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/db/firebase.firestore.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'firebase.firestore', 5 | name: 'Firebase Firestore', 6 | type: 'db', 7 | dependencies: [ 8 | { 9 | type: 'terraform.resource', 10 | name: /^google_firestore_/, 11 | example: 'google_firestore_database', 12 | }, 13 | { type: 'php', name: 'google/cloud-firestore' }, 14 | { type: 'terraform.resource', name: 'airbyte_destination_firestore' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/db/infisical.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'infisical', 5 | name: 'Infisical', 6 | type: 'db', 7 | files: ['.infisical.json'], 8 | dotenv: ['INFISICAL_'], 9 | dependencies: [ 10 | { type: 'npm', name: 'infisical' }, 11 | { type: 'docker', name: 'infisical/infisical' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/db/mariadb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mariadb', 5 | name: 'MariaDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'npm', name: 'mariadb', example: 'mariadb' }, 9 | { type: 'docker', name: /mariadb/, example: 'mariadb:0.0.0' }, 10 | { type: 'ruby', name: 'tencentcloud-sdk-mariadb' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/db/meilisearchcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'meilisearchcloud', 5 | name: 'Meilisearch Cloud', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/memcached.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'memcached', 5 | name: 'Memcached', 6 | type: 'db', 7 | dotenv: ['MEMCACHED_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'memcached' }, 10 | { type: 'docker', name: /memcached/, example: 'memcached:0.0.0' }, 11 | { type: 'rust', name: 'memcache-async' }, 12 | { type: 'rust', name: 'memcache' }, 13 | { type: 'ruby', name: 'dalli' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/db/mssql.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mssql', 5 | name: 'MS SQL', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'ruby', name: 'jdbc-mssql' }, 9 | { type: 'npm', name: 'mssql' }, 10 | { type: 'npm', name: '@opentelemetry/instrumentation-tedious' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/db/neo4j.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'neo4j', 5 | name: 'Neo4j', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'npm', name: 'neo4j-driver' }, 9 | { type: 'docker', name: /neo4j/, example: 'neo4j:0.0.0' }, 10 | { type: 'rust', name: 'neo4rs' }, 11 | { type: 'ruby', name: 'neo4j-ruby-driver' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/db/neondb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'neondb', 5 | name: 'NeonDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'npm', name: '@neondatabase/serverless' }, 9 | { type: 'npm', name: '@neondatabase/api-client' }, 10 | { type: 'npm', name: '@prisma/adapter-neon' }, 11 | { type: 'docker', name: 'neondatabase/neon' }, 12 | { type: 'python', name: 'neon-api' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/db/oceanbase.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'oceanbase', 5 | name: 'Oceanbase', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'oceanbase/oceanbase-ce' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/ovh.database.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh.database', 5 | name: 'OVH Database', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'ovh_cloud_project_database' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/percona.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'percona', 5 | name: 'Percona', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: /percona/, example: 'percona:0.0.0' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/planetscale.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'planetscale', 5 | name: 'PlanetScale', 6 | type: 'db', 7 | dependencies: [{ type: 'githubAction', name: 'planetscale/create-branch-action' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/qovery.database.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'qovery.database', 5 | name: 'Qovery Database', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'qovery_database' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/questdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'questdb', 5 | name: 'QuestDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'questdb/questdb' }, 9 | { type: 'npm', name: '@questdb/nodejs-client' }, 10 | { type: 'golang', name: 'github.com/questdb/go-questdb-client' }, 11 | { type: 'rust', name: 'questdb-rs' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/db/railway.mongodb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'railway.mongodb', 5 | name: 'Railway MongoDB', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/railway.mysql.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'railway.mysql', 5 | name: 'Railway MySQL', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/railway.postgres.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'railway.postgres', 5 | name: 'Railway Postgres', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/railway.redis.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'railway.redis', 5 | name: 'Railway Redis', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/replit.database.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'replit.database', 5 | name: 'Replit Database', 6 | type: 'db', 7 | dependencies: [{ type: 'npm', name: '@replit/database' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/replit.postgres.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'replit.postgres', 5 | name: 'Replit Postgres', 6 | type: 'db', 7 | dependencies: [], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/rethinkdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'rethinkdb', 5 | name: 'RethinkDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'rethinkdb' }, 9 | { type: 'npm', name: 'rethinkdb' }, 10 | { type: 'php', name: 'danielmewes/php-rql' }, 11 | { type: 'ruby', name: 'rethinkdb' }, 12 | { type: 'golang', name: 'github.com/rethinkdb/rethinkdb-go' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/db/scaleway.database.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.database', 5 | name: 'Scaleway Database', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_rdb_instance' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/scaleway.documentdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.documentdb', 5 | name: 'Scaleway DocumentDB', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_documentdb_instance' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/scaleway.redis.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.redis', 5 | name: 'Scaleway Redis', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_redis_cluster' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/scaleway.secretmanager.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.secretmanager', 5 | name: 'Scaleway Secret Manager', 6 | type: 'db', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_secret' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/surrealdb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'surrealdb', 5 | name: 'SurrealDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'surrealdb/surrealdb' }, 9 | { type: 'npm', name: 'surrealdb.js' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/db/swiftype.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'swiftype', 5 | name: 'Swiftype', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'ruby', name: 'site-search-ruby' }, 9 | { type: 'npm', name: '@elastic/site-search-node' }, 10 | { type: 'python', name: 'elastic-site-search' }, 11 | { type: 'php', name: 'elastic/site-search' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/db/tdengine.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tdengine', 5 | name: 'TDengine', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'tdengine/tdengine' }, 9 | { type: 'npm', name: '@tdengine/rest' }, 10 | { type: 'npm', name: '@tdengine/client' }, 11 | { type: 'golang', name: 'github.com/taosdata/driver-go/v3/taosSql' }, 12 | { type: 'rust', name: 'taos' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/db/tidb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tidb', 5 | name: 'TiDB', 6 | type: 'db', 7 | dependencies: [{ type: 'docker', name: 'pingcap/tidb' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/timescaledb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'timescaledb', 5 | name: 'TimescaleDB', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'timescale/timescaledb-ha' }, 9 | { type: 'docker', name: 'timescale/timescaledb' }, 10 | { type: 'terraform', name: 'registry.terraform.io/timescale/timescale' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/db/tursodb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tursodb', 5 | name: 'Turso', 6 | type: 'db', 7 | dotenv: ['TURSO_'], 8 | dependencies: [{ type: 'npm', name: '@tursodatabase/api' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/db/typesensecloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'typesensecloud', 5 | name: 'Typesense Cloud', 6 | type: 'db', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/db/upstash.redis.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'upstash.redis', 5 | name: 'Upstash Redis', 6 | type: 'db', 7 | dotenv: ['UPSTASH_REDIS_'], 8 | dependencies: [{ type: 'npm', name: '@upstash/redis' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/db/vercel.blob.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.blob', 5 | name: 'Vercel Blob', 6 | type: 'db', 7 | dependencies: [{ type: 'npm', name: '@vercel/blob' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/vercel.kv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.kv', 5 | name: 'Vercel KV', 6 | type: 'db', 7 | dependencies: [{ type: 'npm', name: '@vercel/kv' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/vercel.postgres.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.postgres', 5 | name: 'Vercel Postgres', 6 | type: 'db', 7 | dependencies: [{ type: 'npm', name: '@vercel/postgres' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/db/victoriametrics.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'victoriametrics', 5 | name: 'VictoriaMetrics', 6 | type: 'db', 7 | dependencies: [ 8 | { type: 'docker', name: 'victoriametrics/victoria-metrics' }, 9 | { type: 'docker', name: 'victoriametrics/vmagent' }, 10 | { type: 'docker', name: 'victoriametrics/operator' }, 11 | { type: 'docker', name: 'victoriametrics/vminsert' }, 12 | { type: 'docker', name: 'victoriametrics/vmstorage' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/etl/airbyte.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'airbyte', 5 | name: 'Airbyte', 6 | type: 'etl', 7 | dependencies: [ 8 | { type: 'docker', name: /^airbyte\//, example: 'airbyte/worker' }, 9 | { 10 | type: 'terraform', 11 | name: 'registry.terraform.io/airbytehq/airbyte', 12 | }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/etl/apacheAirflow.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_airflow', 5 | name: 'Apache Airflow', 6 | type: 'etl', 7 | dependencies: [{ type: 'docker', name: 'apache/airflow' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/apacheFlink.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_flink', 5 | name: 'Apache Flink', 6 | type: 'etl', 7 | dependencies: [{ type: 'docker', name: 'apache/flink' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/apacheStorm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_storm', 5 | name: 'Apache Storm', 6 | type: 'etl', 7 | dependencies: [{ type: 'docker', name: 'apache/storm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/apideck.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apideck', 5 | name: 'Apideck', 6 | type: 'etl', 7 | dependencies: [ 8 | { type: 'npm', name: /^@apideck\//, example: '@apideck/unify' }, 9 | { type: 'php', name: 'apideck-libraries/sdk-php' }, 10 | { type: 'python', name: 'apideck-unify' }, 11 | { type: 'golang', name: 'github.com/apideck-libraries/sdk-go' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/etl/databricks.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'databricks', 5 | name: 'Databricks', 6 | type: 'etl', 7 | dotenv: ['DATABRICKS_'], 8 | dependencies: [ 9 | { 10 | type: 'terraform', 11 | name: 'registry.terraform.io/databricks/databricks', 12 | }, 13 | { type: 'githubAction', name: 'databricks/run-notebook' }, 14 | { type: 'terraform.resource', name: 'airbyte_destination_databricks' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/etl/dataiku.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dataiku', 5 | name: 'Dataiku', 6 | type: 'etl', 7 | dependencies: [{ type: 'python', name: 'dataiku' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/index.ts: -------------------------------------------------------------------------------- 1 | import './airbyte.js'; 2 | import './apacheAirflow.js'; 3 | import './apacheFlink.js'; 4 | import './apacheStorm.js'; 5 | import './apideck.js'; 6 | import './aws.glue.js'; 7 | import './databricks.js'; 8 | import './dataiku.js'; 9 | import './gcp.dataflow.js'; 10 | import './gcp.dataproc.js'; 11 | import './integrationapp.js'; 12 | import './logstash.js'; 13 | import './mergedev.js'; 14 | import './nango.js'; 15 | import './trayio.js'; 16 | import './useparagon.js'; 17 | -------------------------------------------------------------------------------- /src/rules/etl/integrationapp.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'integrationapp', 5 | name: 'Integration.app', 6 | type: 'etl', 7 | dependencies: [{ type: 'npm', name: /^@integration-app\//, example: '@integration-app/sdk' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/nango.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nango', 5 | name: 'Nango', 6 | type: 'etl', 7 | files: ['.nango', 'nango.yaml'], 8 | dotenv: ['NANGO_'], 9 | dependencies: [ 10 | { type: 'npm', name: 'nango' }, 11 | { type: 'npm', name: '@nangohq/node' }, 12 | { type: 'npm', name: '@nangohq/frontend' }, 13 | { type: 'docker', name: 'nangohq/nango' }, 14 | { type: 'docker', name: 'nangohq/nango-server' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/etl/trayio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'trayio', 5 | name: 'Tray.ai', 6 | type: 'etl', 7 | dependencies: [{ type: 'npm', name: /^@trayio-app\//, example: '@trayio/cdk-cli' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/etl/useparagon.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'useparagon', 5 | name: 'Paragon', 6 | type: 'etl', 7 | dependencies: [{ type: 'npm', name: /^@useparagon\//, example: '@useparagon/connect' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/apacheThrift.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apache_thrift', 5 | name: 'Apache Thrift', 6 | type: 'framework', 7 | dependencies: [ 8 | { type: 'docker', name: 'apache/thrift' }, 9 | { type: 'npm', name: 'thrift' }, 10 | { type: 'golang', name: 'github.com/apache/thrift' }, 11 | { type: 'rust', name: 'thrift' }, 12 | { type: 'ruby', name: 'thrift' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/framework/apiplatform.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apiplatform', 5 | name: 'Api Platform', 6 | type: 'framework', 7 | dependencies: [ 8 | { type: 'php', name: 'api-platform/core' }, 9 | { type: 'npm', name: '@api-platform/client' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/framework/assemble.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'assemble', 5 | name: 'Assemble', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: 'assemble' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/astro.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'astro', 5 | name: 'Astro', 6 | type: 'framework', 7 | files: ['astro.config.mjs'], 8 | dependencies: [{ type: 'npm', name: 'astro' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/blitzjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'blitzjs', 5 | name: 'Blitzjs', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: 'blitz' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/django.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'django', 5 | name: 'Django', 6 | type: 'framework', 7 | dependencies: [{ type: 'python', name: 'django' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/docusaurus.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'docusaurus', 5 | name: 'Docusaurus', 6 | type: 'framework', 7 | files: ['docusaurus.config.js'], 8 | dependencies: [ 9 | { type: 'npm', name: '@docusaurus/core' }, 10 | { type: 'npm', name: 'docusaurus' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/eleventy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'eleventy', 5 | name: 'Eleventy', 6 | type: 'framework', 7 | files: ['.eleventy.js', 'eleventy.config.js', 'eleventy.config.cjs'], 8 | dependencies: [ 9 | { type: 'npm', name: '@11ty/eleventy' }, 10 | { type: 'githubAction', name: 'TartanLlama/actions-eleventy' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/emberjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'emberjs', 5 | name: 'Ember', 6 | type: 'framework', 7 | files: ['ember-cli-build.js'], 8 | dependencies: [ 9 | { type: 'npm', name: 'ember-cli' }, 10 | { type: 'npm', name: 'ember' }, 11 | { type: 'npm', name: 'ember-data' }, 12 | { type: 'npm', name: 'ember-source' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/framework/expojs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'expojs', 5 | name: 'ExpoJS', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: 'expo' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/fern.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'builtwithfern', 5 | name: 'Fern', 6 | type: 'framework', 7 | files: ['fern.config.json'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/gradio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gradio', 5 | name: 'Gradio', 6 | type: 'framework', 7 | dependencies: [{ type: 'python', name: 'gradio' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/gridsome.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gridsome', 5 | name: 'Gridsome', 6 | type: 'framework', 7 | files: ['gridsome.config.js'], 8 | dependencies: [{ type: 'npm', name: 'gridsome' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/hexojs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hexojs', 5 | name: 'HexoJS', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: 'hexo' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/jekyll.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'jekyll', 5 | name: 'Jekyll', 6 | type: 'framework', 7 | dependencies: [{ type: 'githubAction', name: 'jeffreytse/jekyll-deploy-action' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/laravel.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'laravel', 5 | name: 'Laravel', 6 | type: 'framework', 7 | files: ['artisan'], 8 | dependencies: [{ type: 'php', name: 'laravel/framework' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/meteorjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'meteorjs', 5 | name: 'Meteor', 6 | type: 'framework', 7 | files: ['.meteor'], 8 | dependencies: [ 9 | { type: 'npm', name: 'meteor' }, 10 | { type: 'npm', name: 'meteor-node-stubs' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/mintlify.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mintlify', 5 | name: 'Mintlify', 6 | type: 'framework', 7 | files: ['mint.json'], 8 | dependencies: [{ type: 'npm', name: 'mintlify' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/nestjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nestjs', 5 | name: 'NestJS', 6 | type: 'framework', 7 | files: ['nest-cli.json'], 8 | dependencies: [{ type: 'npm', name: '@nestjs/cli' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/nextjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nextjs', 5 | name: 'Next.js', 6 | type: 'framework', 7 | files: ['next.config.js', 'next.config.mjs'], 8 | dependencies: [ 9 | { type: 'npm', name: 'next' }, 10 | { type: 'npm', name: '@netlify/plugin-nextjs' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/nuxtjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nuxtjs', 5 | name: 'Nuxt.js', 6 | type: 'framework', 7 | files: ['nuxt.config.js'], 8 | dependencies: [ 9 | { type: 'npm', name: 'nuxt' }, 10 | { type: 'npm', name: 'nuxt-edge' }, 11 | { type: 'npm', name: 'nuxt3' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/framework/phaserjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phaserjs', 5 | name: 'Phaser', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: 'phaser' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/rails.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'rails', 5 | name: 'Rails', 6 | type: 'framework', 7 | dependencies: [ 8 | { type: 'npm', name: /@rails\//, example: '@rails/actioncable' }, 9 | { type: 'npm', name: 'rails' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/framework/readthedocs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'readthedocs', 5 | name: 'Read The Docs', 6 | type: 'framework', 7 | files: ['.readthedocs.yml'], 8 | dependencies: [{ type: 'docker', name: 'readthedocs/build' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/framework/refinedev.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'refinedev', 5 | name: 'Refine', 6 | type: 'framework', 7 | dependencies: [ 8 | { type: 'npm', name: '@refinedev/core' }, 9 | { type: 'npm', name: '@refinedev/antd' }, 10 | { type: 'npm', name: '@refinedev/cli' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/remixrun.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'remixrun', 5 | name: 'Remix', 6 | type: 'framework', 7 | dependencies: [ 8 | { type: 'npm', name: '@remix-run/node' }, 9 | { type: 'npm', name: '@remix-run/react' }, 10 | { type: 'npm', name: '@remix-run/serve' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/shopify.hydrogen.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'shopify.hydrogen', 5 | name: 'Shopify Hydrogen', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: '@shopify/hydrogen' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/symfony.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'symfony', 5 | name: 'Symfony', 6 | type: 'framework', 7 | dependencies: [{ type: 'php', name: 'symfony/symfony' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/tanstackstart.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tanstackstart', 5 | name: 'Tanstack Start', 6 | type: 'framework', 7 | dependencies: [{ type: 'npm', name: '@tanstack/react-start' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/tauri.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tauri', 5 | name: 'Tauri', 6 | type: 'framework', 7 | files: ['tauri.conf.js'], 8 | dependencies: [ 9 | { type: 'rust', name: 'tauri' }, 10 | { type: 'npm', name: /^@tauri-apps\//, example: '@tauri-apps' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/framework/wasp.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'wasp', 5 | name: 'Wasp', 6 | type: 'framework', 7 | files: ['main.wasp', 'main.wasp.ts'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/framework/yii2.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'yii2', 5 | name: 'Yii2', 6 | type: 'framework', 7 | dependencies: [{ type: 'php', name: 'yiisoft/yii2' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/aws.amplifyhosting.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.amplifyhosting', 5 | name: 'AWS Amplify Hosting', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'npm', name: 'aws-amplify' }, 9 | { type: 'npm', name: /^@aws-amplify\//, example: '@aws-amplify/ui-react' }, 10 | { 11 | type: 'terraform.resource', 12 | name: /^aws_amplify_/, 13 | example: 'aws_amplify_app', 14 | }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/hosting/aws.fargate.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.fargate', 5 | name: 'AWS Fargate', 6 | type: 'hosting', 7 | dependencies: [{ type: 'githubAction', name: 'aws-actions/amazon-eks-fargate' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/azure.aks.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'azure.aks', 5 | name: 'Azure Kubernetes', 6 | type: 'hosting', 7 | dependencies: [ 8 | { 9 | type: 'terraform.resource', 10 | name: /^azurerm_kubernetes_/, 11 | example: 'azurerm_kubernetes_cluster', 12 | }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/hosting/cloudflare.pages.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cloudflare.pages', 5 | name: 'Cloudflare Pages', 6 | type: 'hosting', 7 | dependencies: [ 8 | { 9 | type: 'terraform.resource', 10 | name: /^cloudflare_pages_/, 11 | example: 'cloudflare_pages_domain', 12 | }, 13 | { type: 'githubAction', name: 'cloudflare/pages-action' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/hosting/denodeploy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'denodeploy', 5 | name: 'Deno Deploy', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'githubAction', name: 'denoland/deployctl' }, 9 | { 10 | type: 'deno', 11 | name: /\/x\/deploy(@[0-9.]+)?\/deployctl.ts/, 12 | example: 'https://deno.land/x/deploy@1.4.07/deployctl.ts', 13 | }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/hosting/digitalocean.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'digitalocean', 5 | name: 'DigitalOcean', 6 | type: 'hosting', 7 | dependencies: [ 8 | { 9 | type: 'terraform', 10 | name: 'registry.terraform.io/digitalocean/digitalocean', 11 | }, 12 | { type: 'githubAction', name: 'digitalocean/app_action' }, 13 | { type: 'githubAction', name: 'digitalocean/action-doctl' }, 14 | { type: 'npm', name: '@pulumi/digitalocean' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/hosting/elasticcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'elasticcloud', 5 | name: 'Elastic Cloud', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform', name: 'registry.terraform.io/elastic/ec' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/expodev.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'expodev', 5 | name: 'Expo.dev', 6 | type: 'hosting', 7 | files: ['expo.dev'], 8 | dependencies: [{ type: 'githubAction', name: 'expo/expo-github-action' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/hosting/gcp.gke.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.gke', 5 | name: 'Google Kubernetes', 6 | type: 'hosting', 7 | dependencies: [ 8 | { 9 | type: 'terraform.resource', 10 | name: /^google_container_/, 11 | example: 'google_container_cluster', 12 | }, 13 | { type: 'githubAction', name: 'google-github-actions/get-gke-credentials' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/hosting/koyeb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'koyeb', 5 | name: 'Koyeb', 6 | type: 'hosting', 7 | files: ['.koyeb.yaml', 'Dockerfile.koyeb'], 8 | dependencies: [{ type: 'npm', name: 'koyeb-api-client' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/hosting/mongodbatlas.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mongodbatlas', 5 | name: 'MongoDB Atlas', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'terraform', name: 'registry.terraform.io/mongodb/mongodbatlas' }, 9 | { type: 'npm', name: '@pulumi/mongodbatlas' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/hosting/ovh.dedicated.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh.dedicated', 5 | name: 'OVH Dedicated Server', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'terraform.resource', name: 'ovh_dedicated_server_install_task' }, 9 | { type: 'terraform.resource', name: 'ovh_me_installation_template' }, 10 | { type: 'terraform.resource', name: 'ovh_dedicated_server_update' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/hosting/ovh.kubernetes.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh.kubernetes', 5 | name: 'OVH Kubernetes', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform.resource', name: 'ovh_cloud_project_kube' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/ovh.vps.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh.vps', 5 | name: 'OVH VPS', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform.resource', name: 'ovh_vps' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/platformsh.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'platformsh', 5 | name: 'Platform.sh', 6 | type: 'hosting', 7 | files: ['.platform.app.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/qovery.cluster.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'qovery.cluster', 5 | name: 'Qovery Cluster', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform.resource', name: 'qovery_cluster' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/render.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'render', 5 | name: 'Render', 6 | type: 'hosting', 7 | files: ['render.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/replit.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'replit', 5 | name: 'Replit', 6 | type: 'hosting', 7 | files: ['.replit', 'replit.nix'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/scaleway.container.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.container', 5 | name: 'Scaleway Container', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'terraform.resource', name: 'scaleway_container' }, 9 | { type: 'terraform.resource', name: 'scaleway_container_cron' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/hosting/scaleway.elasticmetal.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.elasticmetal', 5 | name: 'Scaleway Elastic Metal', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_baremetal_server' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/scaleway.functions.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.function', 5 | name: 'Scaleway Function', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'terraform.resource', name: 'scaleway_function' }, 9 | { type: 'terraform.resource', name: 'scaleway_function_cron' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/hosting/scaleway.kubernetes.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.kubernetes', 5 | name: 'Scaleway Kubernetes', 6 | type: 'hosting', 7 | dependencies: [{ type: 'terraform.resource', name: 'scaleway_k8s_cluster' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/sitecore.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sitecore', 5 | name: 'Sitecore', 6 | type: 'hosting', 7 | dependencies: [{ type: 'npm', name: '@sitecore-jss/sitecore-jss' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/hosting/supabase.functions.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supabase.functions', 5 | name: 'Supabase Functions', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'npm', name: '@supabase/functions-js' }, 9 | { type: 'npm', name: 'supabase/functions-php' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/hosting/tencentcloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tencentcloud', 5 | name: 'Tencent Cloud', 6 | type: 'hosting', 7 | dependencies: [ 8 | { 9 | type: 'terraform', 10 | name: 'registry.terraform.io/tencentcloudstack/tencentcloud', 11 | }, 12 | { type: 'php', name: 'encentcloud/tencentcloud-sdk-php' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/hosting/vercel.edge.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vercel.edge', 5 | name: 'Vercel Edge', 6 | type: 'hosting', 7 | dependencies: [ 8 | { type: 'npm', name: '@vercel/edge' }, 9 | { type: 'npm', name: '@vercel/edge-config' }, 10 | { type: 'npm', name: '@vercel/edge-functions-ui' }, 11 | { type: 'npm', name: '@edge-runtime/primitives' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/iac/ansible.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ansible', 5 | name: 'Ansible', 6 | type: 'iac', 7 | dependencies: [ 8 | { type: 'githubAction', name: 'ansible/ansible-lint' }, 9 | { type: 'githubAction', name: 'ansible-community/ansible-test-gh-action' }, 10 | { type: 'docker', name: 'pipelinecomponents/ansible-lint' }, 11 | { type: 'docker', name: 'alpinelinux/ansible' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/iac/chef.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'chef', 5 | name: 'Chef', 6 | type: 'iac', 7 | dependencies: [{ type: 'docker', name: 'chef/chef' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/iac/helm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'helm', 5 | name: 'Helm', 6 | type: 'iac', 7 | files: ['Chart.yaml'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/hashicorp/helm' }, 10 | { type: 'ruby', name: 'helm-rb' }, 11 | { type: 'githubAction', name: 'azure/setup-helm' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/iac/index.ts: -------------------------------------------------------------------------------- 1 | import './ansible.js'; 2 | import './aws.cloudformation.js'; 3 | import './chef.js'; 4 | import './helm.js'; 5 | import './pulumi.js'; 6 | import './terragrunt.js'; 7 | -------------------------------------------------------------------------------- /src/rules/iac/pulumi.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pulumi', 5 | name: 'Pulumi', 6 | type: 'iac', 7 | files: ['Pulumi.yaml'], 8 | dependencies: [ 9 | { type: 'npm', name: '@pulumi/pulumi' }, 10 | { type: 'python', name: 'pulumi' }, 11 | { type: 'golang', name: 'github.com/pulumi/pulumi/sdk/v3' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/iac/terragrunt.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'terragrunt', 5 | name: 'Terragrunt', 6 | type: 'iac', 7 | files: ['terragrunt.hcl', 'terragrunt.hcl.json'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/bash.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bash', 5 | name: 'Bash', 6 | type: 'language', 7 | extensions: ['.sh'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/c.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'c', 5 | name: 'C', 6 | type: 'language', 7 | extensions: ['.c', '.h', '.idc'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/clojure.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'clojure', 5 | name: 'Clojure', 6 | type: 'language', 7 | extensions: ['.clj'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/cplusplus.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cplusplus', 5 | name: 'C++', 6 | type: 'language', 7 | extensions: ['.cpp', '.c++', '.cc', '.cp', '.cppm', '.h++', '.hh', '.hpp'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/csharp.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'csharp', 5 | name: 'C#', 6 | type: 'language', 7 | extensions: ['.cs', '.cake', '.csx', '.linq'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/css.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'css', 5 | name: 'CSS', 6 | type: 'language', 7 | extensions: ['.css'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/dart.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dart', 5 | name: 'Dart', 6 | type: 'language', 7 | extensions: ['.dart'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/elixir.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'elixir', 5 | name: 'Elixir', 6 | type: 'language', 7 | extensions: ['.ex', '.exs'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/glsl.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'glsl', 5 | name: 'GLSL', 6 | type: 'language', 7 | extensions: ['.glsl'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/index.ts: -------------------------------------------------------------------------------- 1 | import './bash.js'; 2 | import './c.js'; 3 | import './clojure.js'; 4 | import './cplusplus.js'; 5 | import './csharp.js'; 6 | import './css.js'; 7 | import './dart.js'; 8 | import './elixir.js'; 9 | import './glsl.js'; 10 | import './java.js'; 11 | import './javascript.js'; 12 | import './jsx.js'; 13 | import './scss.js'; 14 | import './swift.js'; 15 | import './typescript.js'; 16 | import './vue.js'; 17 | -------------------------------------------------------------------------------- /src/rules/language/java.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'java', 5 | name: 'Java', 6 | type: 'language', 7 | extensions: ['.java', '.jav', '.jsh'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/javascript.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'javascript', 5 | name: 'JavaScript', 6 | type: 'language', 7 | extensions: ['.js', '.mjs', '.cjs'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/jsx.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'jsx', 5 | name: 'JSX', 6 | type: 'language', 7 | extensions: ['.jsx', '.tsx'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/scss.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scss', 5 | name: 'SCSS', 6 | type: 'language', 7 | extensions: ['.scss'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/swift.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'swift', 5 | name: 'Swift', 6 | type: 'language', 7 | extensions: ['.swift'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/language/typescript.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'typescript', 5 | name: 'Typescript', 6 | type: 'language', 7 | files: /tsconfig(.[a-zA-Z0-9_-]+)?.json/, 8 | example: 'tsconfig.json', 9 | extensions: ['.ts', '.tsx'], 10 | dependencies: [{ type: 'npm', name: 'typescript' }], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/language/vue.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vuejs', 5 | name: 'Vue', 6 | type: 'language', 7 | extensions: ['.vue'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/linter/biomejs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'biomejs', 5 | name: 'Biome JS', 6 | type: 'linter', 7 | files: ['biome.json', 'biome.jsonc'], 8 | dependencies: [{ type: 'npm', name: '@biomejs/biome' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/linter/eslint.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'eslint', 5 | name: 'Eslint', 6 | type: 'linter', 7 | files: [ 8 | '.eslintrc', 9 | '.eslintrc.cjs', 10 | '.eslintrc.json', 11 | '.eslintrc.js', 12 | 'eslint.config.js', 13 | 'eslint.config.cjs', 14 | 'eslint.config.mjs', 15 | ], 16 | dependencies: [{ type: 'npm', name: 'eslint' }], 17 | }); 18 | -------------------------------------------------------------------------------- /src/rules/linter/golangcilint.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'golangcilint', 5 | name: 'GolangCI Lint', 6 | type: 'linter', 7 | files: ['.golangcit.yml'], 8 | dependencies: [ 9 | { type: 'golang', name: 'github.com/golangci/golangci-lint' }, 10 | { type: 'githubAction', name: 'golangci/golangci-lint-action' }, 11 | { type: 'docker', name: 'golangci/golangci-lint' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/linter/index.ts: -------------------------------------------------------------------------------- 1 | import './biomejs.js'; 2 | import './eslint.js'; 3 | import './golangcilint.js'; 4 | import './phpstan.js'; 5 | import './prettier.js'; 6 | import './rubocop.js'; 7 | import './sonarlint.js'; 8 | import './stylelint.js'; 9 | import './vale.js'; 10 | -------------------------------------------------------------------------------- /src/rules/linter/phpstan.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phpstan', 5 | name: 'PHPStan', 6 | type: 'linter', 7 | files: ['phpstan.neon'], 8 | dependencies: [{ type: 'php', name: 'phpstan/phpstan' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/linter/prettier.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'prettier', 5 | name: 'Prettier', 6 | type: 'linter', 7 | files: ['.prettierrc', '.prettierignore'], 8 | dependencies: [{ type: 'npm', name: 'prettier' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/linter/rubocop.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'rubocop', 5 | name: 'Rubocop', 6 | type: 'linter', 7 | files: ['.rubocop.yml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/linter/sonarlint.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sonarlint', 5 | name: 'SonarLint', 6 | type: 'linter', 7 | files: ['.sonarlint'], 8 | dependencies: [], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/linter/stylelint.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'stylelint', 5 | name: 'Stylelint', 6 | type: 'linter', 7 | files: ['.stylelint', '.stylelintrc.cjs', '.stylelintrc.json', '.stylelintrc.js'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/linter/vale.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vale', 5 | name: 'Vale', 6 | type: 'linter', 7 | files: ['.vale.ini'], 8 | dependencies: [ 9 | { type: 'docker', name: 'jdkato/vale' }, 10 | { type: 'githubAction', name: 'errata-ai/vale-action' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/maps/apple.maps.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'apple.maps', 5 | name: 'Apple Maps', 6 | type: 'maps', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/maps/azure.maps.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'azure.maps', 5 | name: 'Bing Maps', 6 | type: 'maps', 7 | dotenv: ['AZURE_MAPS_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@azure/maps-control' }, 10 | { type: 'npm', name: 'bingmaps' }, 11 | { type: 'npm', name: 'azure-maps-control' }, 12 | { type: 'npm', name: '@azure-rest/maps-search' }, 13 | { type: 'terraform.resource', name: 'azurerm_maps_account' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/maps/gcp.maps.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.maps', 5 | name: 'Google Maps', 6 | type: 'maps', 7 | dotenv: ['GOOGLE_MAPS_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@google-cloud/maps' }, 10 | { type: 'npm', name: /^@googlemaps\//, example: '@googlemaps/places' }, 11 | { type: 'ruby', name: 'google_maps_service' }, 12 | { type: 'golang', name: 'cloud.google.com/go/maps' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/maps/heremaps.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'heremaps', 5 | name: 'HERE Maps', 6 | type: 'maps', 7 | dotenv: ['HERE_MAPS_'], 8 | dependencies: [{ type: 'npm', name: '@types/heremaps' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/maps/index.ts: -------------------------------------------------------------------------------- 1 | import './apple.maps.js'; 2 | import './azure.maps.js'; 3 | import './gcp.maps.js'; 4 | import './heremaps.js'; 5 | import './mapbox.js'; 6 | -------------------------------------------------------------------------------- /src/rules/monitoring/blackfire.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'blackfire', 5 | name: 'Blackfire', 6 | type: 'monitoring', 7 | dotenv: ['BLACKFIRE_'], 8 | dependencies: [ 9 | { type: 'php', name: 'blackfire/php-sdk' }, 10 | { type: 'docker', name: 'blackfire/blackfire' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/monitoring/dynatrace.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dynatrace', 5 | name: 'Dynatrace', 6 | type: 'monitoring', 7 | dotenv: ['DYNATRACE_'], 8 | dependencies: [ 9 | { 10 | type: 'npm', 11 | name: /^@dynatrace\//, 12 | example: '@dynatrace/opentelemetry-core', 13 | }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/monitoring/healthchecksio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'healthchecksio', 5 | name: 'Healthchecks.io', 6 | type: 'monitoring', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/monitoring/onlineornot.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'onlineornot', 5 | name: 'OnlineOrNot', 6 | type: 'monitoring', 7 | dependencies: [{ type: 'npm', name: 'onlineornot' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/monitoring/papertrail.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'papertrail', 5 | name: 'Papertrail', 6 | type: 'monitoring', 7 | dotenv: ['PAPERTRAIL_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'winston-papertrail' }, 10 | { type: 'npm', name: 'pino-papertrail' }, 11 | { type: 'php', name: 'stephanecoinon/papertrail' }, 12 | { type: 'ruby', name: 'papertrail' }, 13 | { type: 'golang', name: 'github.com/papertrail/go-tail/follower' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/monitoring/pingdom.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pingdom', 5 | name: 'Pingdom', 6 | type: 'monitoring', 7 | dotenv: ['PINGDOM_'], 8 | dependencies: [{ type: 'terraform', name: 'registry.terraform.io/russellcardullo/pingdom' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/monitoring/scoutapm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scoutapm', 5 | name: 'Scout APM', 6 | type: 'monitoring', 7 | dependencies: [ 8 | { type: 'ruby', name: 'scout_apm' }, 9 | { type: 'php', name: 'scoutapp/scout-apm-php' }, 10 | { type: 'php', name: 'scoutapp/scout-apm-laravel' }, 11 | { type: 'npm', name: 'scoutapp/scout-apm-laravel' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/monitoring/signoz.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'signoz', 5 | name: 'Signoz', 6 | type: 'monitoring', 7 | dotenv: ['SIGNOZ_'], 8 | dependencies: [ 9 | { type: 'docker', name: 'signoz/frontend' }, 10 | { type: 'docker', name: 'signoz/alertmanager' }, 11 | { type: 'docker', name: 'signoz/query-service' }, 12 | { type: 'docker', name: 'signoz/signoz-otel-collector' }, 13 | { type: 'docker', name: 'signoz/locust' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/monitoring/uptimekuma.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'uptimekuma', 5 | name: 'Uptime Kuma', 6 | type: 'monitoring', 7 | dependencies: [{ type: 'docker', name: 'louislam/uptime-kuma' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/network/gcp.dns.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.dns', 5 | name: 'Google DNS', 6 | type: 'network', 7 | dependencies: [ 8 | { type: 'npm', name: '@google-cloud/dns' }, 9 | { 10 | type: 'terraform.resource', 11 | name: /^google_dns_/, 12 | example: 'google_dns_record_set', 13 | }, 14 | { type: 'ruby', name: 'google-cloud-dns' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/network/index.ts: -------------------------------------------------------------------------------- 1 | import './gcp.dns.js'; 2 | -------------------------------------------------------------------------------- /src/rules/notification/beehiiv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'beehiiv', 5 | name: 'Beehiiv', 6 | type: 'notification', 7 | dotenv: ['BEEHIIV_'], 8 | dependencies: [{ type: 'npm', name: '@beehiiv/sdk' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/notification/clicksend.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'clicksend', 5 | name: 'ClickSend', 6 | type: 'notification', 7 | dotenv: ['CLICKSEND_'], 8 | dependencies: [{ type: 'npm', name: 'clicksend' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/notification/ifttt.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ifttt', 5 | name: 'ifttt', 6 | type: 'notification', 7 | dotenv: ['IFTTT'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/notification/index.ts: -------------------------------------------------------------------------------- 1 | import './aws.ses.js'; 2 | import './aws.sns.js'; 3 | import './beehiiv.js'; 4 | import './brevo.js'; 5 | import './clicksend.js'; 6 | import './ifttt.js'; 7 | import './mailchimp.js'; 8 | import './mailgun.js'; 9 | import './mailjet.js'; 10 | import './novu.js'; 11 | import './resend.js'; 12 | import './sendgrid.js'; 13 | import './twilio.js'; 14 | import './zapier.js'; 15 | -------------------------------------------------------------------------------- /src/rules/notification/mailjet.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mailjet', 5 | name: 'Mailjet', 6 | type: 'notification', 7 | dotenv: ['MAILJET_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'node-mailjet' }, 10 | { type: 'rust', name: 'mailjet-rs' }, 11 | { type: 'ruby', name: 'mailjet' }, 12 | { type: 'php', name: 'mailjet/mailjet-apiv3-php' }, 13 | { type: 'php', name: 'mailjet/laravel-mailjet' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/notification/zapier.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'zapier', 5 | name: 'Zapier', 6 | type: 'notification', 7 | dotenv: ['ZAPIER_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'zapier-platform-core' }, 10 | { type: 'npm', name: 'zapier-platform-cli' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/orm/dieselrs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dieselrs', 5 | name: 'Diesel', 6 | type: 'orm', 7 | dependencies: [{ type: 'rust', name: 'diesel' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/doctrinephp.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'doctrinephp', 5 | name: 'Doctrine', 6 | type: 'orm', 7 | dependencies: [{ type: 'php', name: 'doctrine/orm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/drizzeleorm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'drizzleorm', 5 | name: 'Drizzle ORM', 6 | type: 'orm', 7 | dependencies: [{ type: 'npm', name: 'drizzle-orm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/goent.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'goent', 5 | name: 'ent.', 6 | type: 'orm', 7 | dependencies: [{ type: 'golang', name: 'entgo.io/ent' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/gorm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gorm', 5 | name: 'GORM', 6 | type: 'orm', 7 | dependencies: [{ type: 'golang', name: 'gorm.io/gorm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/index.ts: -------------------------------------------------------------------------------- 1 | import './dieselrs.js'; 2 | import './doctrinephp.js'; 3 | import './drizzeleorm.js'; 4 | import './goent.js'; 5 | import './gorm.js'; 6 | import './kysely.js'; 7 | import './prisma.js'; 8 | import './sequelize.js'; 9 | import './sequelruby.js'; 10 | import './sqlalchemy.js'; 11 | import './typeorm.js'; 12 | -------------------------------------------------------------------------------- /src/rules/orm/kysely.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'kysely', 5 | name: 'Kysely', 6 | type: 'orm', 7 | dependencies: [{ type: 'npm', name: 'kysely' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/prisma.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'prisma', 5 | name: 'Prisma', 6 | type: 'orm', 7 | files: ['schema.prisma'], 8 | dependencies: [{ type: 'npm', name: 'prisma' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/orm/sequelize.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sequelize', 5 | name: 'Sequelize', 6 | type: 'orm', 7 | files: ['.sequelizerc'], 8 | dependencies: [{ type: 'npm', name: /sequelize(-cli)?/, example: 'sequelize' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/orm/sequelruby.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sequelruby', 5 | name: 'Sequel', 6 | type: 'orm', 7 | dependencies: [{ type: 'ruby', name: 'sequel' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/sqlalchemy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sqlalchemy', 5 | name: 'SQLAlchemy', 6 | type: 'orm', 7 | dependencies: [{ type: 'python', name: 'SQLAlchemy' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/orm/typeorm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'typeorm', 5 | name: 'TypeORM', 6 | type: 'orm', 7 | dependencies: [{ type: 'npm', name: 'typeorm' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/asdf.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'asdf', 5 | name: 'asdf', 6 | type: 'package_manager', 7 | files: ['.tool-versions', '.asdfrc'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/bundler.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bundler', 5 | name: 'Bundler', 6 | type: 'package_manager', 7 | dependencies: [{ type: 'ruby', name: 'bundler' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/cargo.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cargo', 5 | name: 'Cargo', 6 | type: 'package_manager', 7 | // files: ['Cargo.toml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/goenv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'goenv', 5 | name: 'goenv', 6 | type: 'package_manager', 7 | files: ['.go-version'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/index.ts: -------------------------------------------------------------------------------- 1 | import './asdf.js'; 2 | import './bundler.js'; 3 | import './cargo.js'; 4 | import './goenv.js'; 5 | import './npm.js'; 6 | import './nuget.js'; 7 | import './nvm.js'; 8 | import './phpcomposer.js'; 9 | import './phpenv.js'; 10 | import './pipenv.js'; 11 | import './pnpm.js'; 12 | import './poetry.js'; 13 | import './rubyenv.js'; 14 | import './yarn.js'; 15 | -------------------------------------------------------------------------------- /src/rules/package_manager/npm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'npm', 5 | name: 'npm', 6 | type: 'package_manager', 7 | files: ['package-lock.json'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/nuget.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nuget', 5 | name: 'NuGet', 6 | type: 'package_manager', 7 | files: ['.csproj'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/nvm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nvm', 5 | name: 'nvm', 6 | type: 'package_manager', 7 | files: ['.nvmrc'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/phpcomposer.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phpcomposer', 5 | name: 'Composer', 6 | type: 'package_manager', 7 | // files: ['composer.json'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/phpenv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phpenv', 5 | name: 'phpenv', 6 | type: 'package_manager', 7 | files: ['.php-version'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/pipenv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pipenv', 5 | name: 'pipenv', 6 | type: 'package_manager', 7 | files: ['Pipfile.lock'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/pnpm.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pnpm', 5 | name: 'pnpm', 6 | type: 'package_manager', 7 | files: ['pnpm-lock.yaml'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/poetry.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'poetry', 5 | name: 'Poetry', 6 | type: 'package_manager', 7 | files: ['poetry.lock'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/rubyenv.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'rubyenv', 5 | name: 'rubyenv', 6 | type: 'package_manager', 7 | files: ['.ruby-version'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/package_manager/yarn.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'yarn', 5 | name: 'Yarn', 6 | type: 'package_manager', 7 | files: ['yarn.lock'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/payment/index.ts: -------------------------------------------------------------------------------- 1 | import './adyen.js'; 2 | import './chargebee.js'; 3 | import './intuit.js'; 4 | import './klarna.js'; 5 | import './lemonsqueezy.js'; 6 | import './paddle.js'; 7 | import './paypal.js'; 8 | import './squareup.js'; 9 | import './stripe.js'; 10 | import './zuora.js'; 11 | -------------------------------------------------------------------------------- /src/rules/payment/intuit.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'intuit', 5 | name: 'Intuit', 6 | type: 'payment', 7 | dotenv: ['INTUIT_'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/payment/klarna.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'klarna', 5 | name: 'Klarna', 6 | type: 'payment', 7 | dotenv: ['KLARNA_'], 8 | dependencies: [ 9 | { type: 'ruby', name: 'klarna_proxy' }, 10 | { type: 'ruby', name: 'klarna-checkout' }, 11 | { type: 'terraform.resource', name: 'airbyte_source_klarna' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/payment/lemonsqueezy.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'lemonsqueezy', 5 | name: 'Lemon Squeezy', 6 | type: 'payment', 7 | dotenv: ['LEMON_SQUEEZY_', 'LEMONSQUEEZY_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'lemonsqueezy.ts' }, 10 | { type: 'ruby', name: 'lemonsqueezy' }, 11 | { type: 'golang', name: 'github.com/NdoleStudio/lemonsqueezy-go' }, 12 | { type: 'php', name: 'lemonsqueezy/laravel' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/payment/paddle.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'paddle', 5 | name: 'Paddle', 6 | type: 'payment', 7 | dotenv: ['PADDLE_'], 8 | dependencies: [ 9 | { type: 'npm', name: '@paddle/paddle-js' }, 10 | { type: 'npm', name: '@paddle/paddle-node-sdk' }, 11 | { type: 'golang', name: 'github.com/PaddleHQ/paddle-go-sdk' }, 12 | { type: 'python', name: 'paddle-python-sdk' }, 13 | { type: 'php', name: 'paddlehq/paddle-php-sdk' }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/payment/squareup.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'squareup', 5 | name: 'Square', 6 | type: 'payment', 7 | dotenv: ['SQUARE_'], 8 | dependencies: [{ type: 'php', name: 'square/square' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/payment/zuora.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'zuora', 5 | name: 'Zuora', 6 | type: 'payment', 7 | dotenv: ['ZUORA_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'zuora-sdk-js' }, 10 | { type: 'python', name: 'zuora-sdk' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/queue/aws.kafka.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'aws.kafka', 5 | name: 'AWS Kafka', 6 | type: 'queue', 7 | dependencies: [ 8 | { type: 'npm', name: '@pulumi/kafka' }, 9 | { type: 'ruby', name: 'aws-sdk-kafka' }, 10 | { type: 'terraform.resource', name: 'aws_msk_cluster' }, 11 | { type: 'terraform.resource', name: 'aws_msk_configuration' }, 12 | { type: 'terraform.resource', name: 'aws_mskconnect_connector' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/queue/celery.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'celery', 5 | name: 'Celery', 6 | type: 'queue', 7 | dependencies: [{ type: 'python', name: 'celery' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/queue/index.ts: -------------------------------------------------------------------------------- 1 | import './apacheKafka.js'; 2 | import './aws.kafka.js'; 3 | import './aws.kinesis.js'; 4 | import './aws.mq.js'; 5 | import './aws.sqs.js'; 6 | import './celery.js'; 7 | import './gcp.pubsub.js'; 8 | import './nats.js'; 9 | import './rabbitmq.js'; 10 | import './scaleway.mq.js'; 11 | import './supabase.realtime.js'; 12 | import './upstash.kafka.js'; 13 | import './upstash.qstash.js'; 14 | -------------------------------------------------------------------------------- /src/rules/queue/scaleway.mq.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.mq', 5 | name: 'Scaleway M&Q', 6 | type: 'queue', 7 | dependencies: [ 8 | { type: 'terraform.resource', name: 'scaleway_mnq_namespace' }, 9 | { type: 'terraform.resource', name: 'scaleway_mnq_queue' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/queue/supabase.realtime.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supabase.realtime', 5 | name: 'Supabase Realtime', 6 | type: 'queue', 7 | dependencies: [ 8 | { type: 'npm', name: '@supabase/realtime-js' }, 9 | { type: 'docker', name: 'bitnami/supabase-realtime' }, 10 | { type: 'docker', name: 'supabase/realtime' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/queue/upstash.kafka.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'upstash.kafka', 5 | name: 'Upstash Kafka', 6 | type: 'queue', 7 | dotenv: ['UPSTASH_KAFKA_'], 8 | dependencies: [{ type: 'npm', name: '@upstash/kafka' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/queue/upstash.qstash.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'upstash.qstash', 5 | name: 'Upstash QStash', 6 | type: 'queue', 7 | dependencies: [{ type: 'npm', name: '@upstash/qstash' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/runtime/bunsh.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bunsh', 5 | name: 'Bun', 6 | type: 'runtime', 7 | files: ['bun.lock'], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/runtime/index.ts: -------------------------------------------------------------------------------- 1 | import './bunsh.js'; 2 | -------------------------------------------------------------------------------- /src/rules/saas/atlassian.bitbucket.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'atlassian.bitbucket', 5 | name: 'Atlassian Bitbucket', 6 | type: 'saas', 7 | dependencies: [{ type: 'php', name: 'bitbucket/client' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/box.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'box', 5 | name: 'Box', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'npm', name: 'box-node-sdk' }, 9 | { type: 'python', name: 'boxsdk' }, 10 | { type: 'php', name: 'box/box-php-sdk' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/docusign.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'docusign', 5 | name: 'Docusign', 6 | type: 'saas', 7 | dotenv: ['DOCUSIGN_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'docusign-esign' }, 10 | { type: 'ruby', name: 'docusign_esign' }, 11 | { type: 'php', name: 'docusign/esign-client' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/saas/dropbox.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'dropbox', 5 | name: 'Dropbox', 6 | type: 'saas', 7 | dotenv: ['DROPBOX_'], 8 | dependencies: [{ type: 'php', name: 'spatie/dropbox-api' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/saas/figma.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'figma', 5 | name: 'Figma', 6 | type: 'saas', 7 | dotenv: ['FIGMA_'], 8 | dependencies: [{ type: 'npm', name: /^@figma\//, example: '@figma/plugin-typings' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/saas/hypertune.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'hypertune', 5 | name: 'Hypertune', 6 | type: 'saas', 7 | dependencies: [{ type: 'npm', name: 'hypertune' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/logrocket.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'logrocket', 5 | name: 'LogRocket', 6 | type: 'saas', 7 | dependencies: [{ type: 'npm', name: 'logrocket' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/metabase.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'metabase', 5 | name: 'Metabase', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'npm', name: '@metabase/embedding-sdk-react' }, 9 | { type: 'docker', name: 'metabase/metabase' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/saas/placekit.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'placekit', 5 | name: 'PlaceKit', 6 | type: 'saas', 7 | dependencies: [{ type: 'npm', name: /^@placekit\//, example: '@placekit/client-js' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/postman.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'postman', 5 | name: 'Postman', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'npm', name: 'postman-collection' }, 9 | { type: 'npm', name: 'postman-request' }, 10 | { type: 'npm', name: 'newman' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/postmark.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'postmark', 5 | name: 'Postmark', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'npm', name: 'postmark' }, 9 | { type: 'npm', name: 'postman-cli' }, 10 | { type: 'ruby', name: 'postmark-rails' }, 11 | { type: 'ruby', name: 'postmark' }, 12 | { type: 'php', name: 'wildbit/postmark-php' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/saas/prismacloud.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'prismacloud', 5 | name: 'Prisma Cloud', 6 | type: 'saas', 7 | dependencies: [ 8 | { 9 | type: 'terraform', 10 | name: 'registry.terraform.io/PaloAltoNetworks/prismacloud', 11 | }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/saas/sap.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sap', 5 | name: 'SAP', 6 | type: 'saas', 7 | dependencies: [{ type: 'npm', name: '@sap/hana-client' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/sas.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sas', 5 | name: 'SAS', 6 | type: 'saas', 7 | dependencies: [{ type: 'python', name: 'sasviya' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/servicenow.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'servicenow', 5 | name: 'ServiceNow', 6 | type: 'saas', 7 | dependencies: [{ type: 'ruby', name: 'servicenow-api' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/saas/splitio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'splitio', 5 | name: 'Split', 6 | type: 'saas', 7 | dependencies: [ 8 | { 9 | type: 'npm', 10 | name: /^@splitsoftware\//, 11 | example: '@splitsoftware/splitio', 12 | }, 13 | { type: 'golang', name: 'github.com/splitio/go-client/v6' }, 14 | { type: 'ruby', name: 'splitclient-rb' }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/saas/splunk.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'splunk', 5 | name: 'Splunk', 6 | type: 'saas', 7 | dotenv: ['SPLUNK_'], 8 | dependencies: [ 9 | { type: 'terraform', name: 'registry.terraform.io/splunk/splunk' }, 10 | { type: 'terraform', name: 'registry.terraform.io/splunk/splunkconfig' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/tailscale.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tailscale', 5 | name: 'Tailscale', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'githubAction', name: 'tailscale/github-action' }, 9 | { type: 'githubAction', name: 'tailscale/gitops-acl-action' }, 10 | { type: 'npm', name: '@pulumi/tailscale' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/veriff.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'veriff', 5 | name: 'Veriff', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'npm', name: '@veriff/js-sdk' }, 9 | { type: 'npm', name: '@veriff/incontext-sdk' }, 10 | { type: 'ruby', name: 'veriff' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/vialink.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vialink', 5 | name: 'Vialink', 6 | type: 'saas', 7 | }); 8 | -------------------------------------------------------------------------------- /src/rules/saas/withorb.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'withorb', 5 | name: 'Orb', 6 | type: 'saas', 7 | dependencies: [ 8 | { type: 'python', name: 'orb-billing' }, 9 | { type: 'npm', name: 'orb-billing' }, 10 | { type: 'golang', name: 'github.com/orbcorp/orb-go' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/saas/yousign.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'yousign', 5 | name: 'Yousign', 6 | type: 'saas', 7 | dependencies: [{ type: 'php', name: 'androk/yousign-api' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/security/gitguardian.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gitguardian', 5 | name: 'GitGuardian', 6 | type: 'security', 7 | dependencies: [ 8 | { type: 'githubAction', name: 'GitGuardian/ggshield-action' }, 9 | { type: 'golang', name: 'github.com/Gaardsholt/go-gitguardian' }, 10 | { type: 'docker', name: 'gitguardian/ggshield' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/security/index.ts: -------------------------------------------------------------------------------- 1 | import './aws.kms.js'; 2 | import './datadome.js'; 3 | import './gcp.kms.js'; 4 | import './gitguardian.js'; 5 | import './snyk.js'; 6 | import './sqreen.js'; 7 | import './wiz.js'; 8 | -------------------------------------------------------------------------------- /src/rules/security/sqreen.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sqreen', 5 | name: 'Sqreen', 6 | type: 'security', 7 | dotenv: ['SQREEN_'], 8 | dependencies: [ 9 | { type: 'npm', name: 'sqreen' }, 10 | { type: 'ruby', name: 'sqreen' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/security/wiz.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'wiz', 5 | name: 'Wiz', 6 | type: 'security', 7 | dotenv: ['WIZ_'], 8 | dependencies: [{ type: 'terraform', name: 'registry.terraform.io/AxtonGrams/wiz' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/spec/deno/index.ts: -------------------------------------------------------------------------------- 1 | import { detectDenoLockfile } from './lockfile.js'; 2 | import { register } from '../../../register.js'; 3 | 4 | register({ 5 | tech: 'deno', 6 | name: 'Deno', 7 | type: 'runtime', 8 | files: ['deno.jsonc', 'deno.json', 'deno.lock'], 9 | dependencies: [ 10 | { type: 'docker', name: /denoland\/deno/, example: 'denoland/deno:0.0.0' }, 11 | { type: 'githubAction', name: 'denoland/setup-deno' }, 12 | ], 13 | detect: detectDenoLockfile, 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/spec/docker/index.ts: -------------------------------------------------------------------------------- 1 | import { detectDockerComponent } from './component.js'; 2 | import { register } from '../../../register.js'; 3 | 4 | register({ 5 | tech: 'docker', 6 | name: 'Docker', 7 | type: 'tool', 8 | files: ['.dockerignore', 'Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'], 9 | detect: detectDockerComponent, 10 | dependencies: [ 11 | { type: 'githubAction', name: 'docker/login-action' }, 12 | { type: 'npm', name: '@pulumi/docker' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/spec/githubActions/index.ts: -------------------------------------------------------------------------------- 1 | import { FILE_REG, detectGithubActionsComponent } from './component.js'; 2 | import { register } from '../../../register.js'; 3 | 4 | register({ 5 | tech: 'github.actions', 6 | name: 'Github Actions', 7 | type: 'ci', 8 | matchFullPath: true, 9 | files: FILE_REG, 10 | example: '.github/workflows/ci.yml', 11 | detect: detectGithubActionsComponent, 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/spec/index.ts: -------------------------------------------------------------------------------- 1 | import './deno/index.js'; 2 | import './docker/index.js'; 3 | import './githubActions/index.js'; 4 | import './golang/index.js'; 5 | import './nodejs/index.js'; 6 | import './php/index.js'; 7 | import './python/index.js'; 8 | import './ruby/index.js'; 9 | import './rust/index.js'; 10 | import './terraform/index.js'; 11 | import './zig/index.js'; 12 | -------------------------------------------------------------------------------- /src/rules/spec/ruby/index.ts: -------------------------------------------------------------------------------- 1 | import { detectRubyLockfile } from './lockfile.js'; 2 | import { register } from '../../../register.js'; 3 | 4 | register({ 5 | tech: 'ruby', 6 | name: 'Ruby', 7 | type: 'language', 8 | files: ['Gemfile', 'Rakefile'], 9 | extensions: ['.rb', '.rbx', '.ru', '.ruby'], 10 | dependencies: [ 11 | { type: 'docker', name: /ruby/, example: 'ruby:0.0.0' }, 12 | { type: 'githubAction', name: 'ruby/setup-ruby' }, 13 | ], 14 | detect: detectRubyLockfile, 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/spec/zig/index.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../../register.js'; 2 | 3 | register({ 4 | tech: 'zig', 5 | name: 'Zig', 6 | type: 'language', 7 | extensions: ['.zig'], 8 | dependencies: [{ type: 'githubAction', name: 'goto-bus-stop/setup-zig' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/storage/cloudflare.r2.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'cloudflare.r2', 5 | name: 'Cloudflare R2', 6 | type: 'storage', 7 | dependencies: [ 8 | { type: 'npm', name: 'node-cloudflare-r2' }, 9 | { 10 | type: 'terraform.resource', 11 | name: /^cloudflare_r2/, 12 | example: 'cloudflare_r2_bucket', 13 | }, 14 | ], 15 | }); 16 | -------------------------------------------------------------------------------- /src/rules/storage/gcp.containerregistry.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'gcp.containerregistry', 5 | name: 'Cloud Container Registry', 6 | type: 'storage', 7 | dependencies: [], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/storage/index.ts: -------------------------------------------------------------------------------- 1 | import './aws.cloudfront.js'; 2 | import './aws.ebs.js'; 3 | import './aws.ecr.js'; 4 | import './aws.efs.js'; 5 | import './aws.glacier.js'; 6 | import './aws.s3.js'; 7 | import './azure.storage.js'; 8 | import './cloudflare.r2.js'; 9 | import './gcp.artifactregistry.js'; 10 | import './gcp.containerregistry.js'; 11 | import './gcp.gcs.js'; 12 | import './ovh.storage.js'; 13 | import './scaleway.storage.js'; 14 | import './supabase.storage.js'; 15 | -------------------------------------------------------------------------------- /src/rules/storage/ovh.storage.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'ovh.storage', 5 | name: 'OVH Storage', 6 | type: 'storage', 7 | dependencies: [ 8 | { 9 | type: 'terraform.resource', 10 | name: 'ovh_cloud_project_region_storage_presign', 11 | }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/storage/scaleway.storage.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'scaleway.storage', 5 | name: 'Scaleway Storage', 6 | type: 'storage', 7 | dependencies: [ 8 | { type: 'terraform.resource', name: 'scaleway_object_bucket' }, 9 | { type: 'terraform.resource', name: 'scaleway_object_bucket_acl' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/storage/supabase.storage.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'supabase.storage', 5 | name: 'Supabase Storage', 6 | type: 'storage', 7 | dependencies: [ 8 | { type: 'npm', name: '@supabase/storage-js' }, 9 | { type: 'docker', name: 'bitnami/supabase-storage' }, 10 | { type: 'docker', name: 'supabase/storage-api' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/test/index.ts: -------------------------------------------------------------------------------- 1 | import './jest.js'; 2 | import './k6.js'; 3 | import './lighthouse.js'; 4 | import './mochajs.js'; 5 | import './phppest.js'; 6 | import './phpunit.js'; 7 | import './storybook.js'; 8 | import './vitest.js'; 9 | -------------------------------------------------------------------------------- /src/rules/test/jest.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'jest', 5 | name: 'Jest', 6 | type: 'test', 7 | files: /jest.config.(js|ts|mjs|cjs|json)/, 8 | example: 'jest.config.ts', 9 | dependencies: [ 10 | { type: 'npm', name: 'jest' }, 11 | { type: 'npm', name: 'babel-jest' }, 12 | { type: 'npm', name: 'jest-cli' }, 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/rules/test/k6.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'k6', 5 | name: 'Grafana K6', 6 | type: 'test', 7 | dependencies: [ 8 | { type: 'npm', name: 'k6' }, 9 | { type: 'golang', name: 'go.k6.io/xk6/cmd/xk6ver' }, 10 | { type: 'docker', name: 'grafana/k6' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/test/mochajs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mochajs', 5 | name: 'Mocha', 6 | type: 'test', 7 | files: /.mocharc.(js|cjs|json|jsonc|yaml|yml)/, 8 | example: 'jest.config.ts', 9 | dependencies: [{ type: 'npm', name: 'mocha' }], 10 | }); 11 | -------------------------------------------------------------------------------- /src/rules/test/phppest.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phppest', 5 | name: 'PHP Pest', 6 | type: 'test', 7 | dependencies: [{ type: 'php', name: 'pestphp/pest' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/test/phpunit.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'phpunit', 5 | name: 'PHPUnit', 6 | type: 'test', 7 | files: ['phpunit.xml.dist'], 8 | dependencies: [{ type: 'php', name: 'phpunit/phpunit' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/test/storybook.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'storybook', 5 | name: 'Storybook', 6 | type: 'test', 7 | files: ['.storybook'], 8 | dependencies: [{ type: 'npm', name: 'storybook' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/test/vitest.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vitest', 5 | name: 'Vitest', 6 | type: 'test', 7 | files: ['vitest.config.js', 'vitest.config.ts'], 8 | dependencies: [{ type: 'npm', name: 'vitest' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/tool/bytebase.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bytebase', 5 | name: 'Bytebase', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'docker', name: 'bytebase/bytebase' }, 9 | { type: 'githubAction', name: 'bytebase/sql-review-action' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/checkov.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'checkov', 5 | name: 'Checkov', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'githubAction', name: 'bridgecrewio/checkov-action' }, 9 | { type: 'docker', name: 'bridgecrew/checkov' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/electron.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'electron', 5 | name: 'Electron', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'npm', name: 'electron' }, 9 | { type: 'githubAction', name: 'samuelmeuli/action-electron-builder' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/esbuild.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'esbuild', 5 | name: 'Esbuild', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'esbuild' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/express.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'express', 5 | name: 'Express', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'express' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/fastify.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'fastify', 5 | name: 'Fastify', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'npm', name: 'fastify' }, 9 | { type: 'npm', name: '@opentelemetry/instrumentation-fastify' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/flyway.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'flyway', 5 | name: 'Flyway', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'docker', name: 'flyway/flyway' }, 9 | { type: 'githubAction', name: 'red-gate/flyway-hub-migration-test' }, 10 | { type: 'githubAction', name: 'joshuaavalon/flyway-action' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/tool/goacmelego.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'goacmelego', 5 | name: 'Lego', 6 | type: 'tool', 7 | files: ['.lego'], 8 | dependencies: [ 9 | { type: 'docker', name: 'goacme/lego' }, 10 | { type: 'golang', name: 'github.com/go-acme/lego/v4/cmd/lego' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/tool/koa.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'koa', 5 | name: 'Koa', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'npm', name: 'koa' }, 9 | { type: 'npm', name: '@opentelemetry/instrumentation-koa' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/mailhog.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mailhog', 5 | name: 'Mailhog', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'golang', name: 'github.com/mailhog/MailHog' }, 9 | { type: 'docker', name: 'mailhog/mailhog' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/nxjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'nxjs', 5 | name: 'NX', 6 | type: 'tool', 7 | files: ['nx.json'], 8 | dependencies: [{ type: 'npm', name: 'nx' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/tool/puppeteer.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'puppeteer', 5 | name: 'Puppeteer', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'npm', name: 'puppeteer' }, 9 | { type: 'npm', name: 'puppeteer-core' }, 10 | { type: 'npm', name: '@puppeteer/browser' }, 11 | { type: 'docker', name: 'itisfoundation/puppeteer' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/tool/pytorch.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'pytorch', 5 | name: 'Pytorch', 6 | type: 'tool', 7 | dependencies: [{ type: 'python', name: 'pytorch' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/reactEmail.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'reactemail', 5 | name: 'React Email', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'react-email' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/rollup.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'rollup', 5 | name: 'Rollup', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'rollup' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/socketio.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'socketio', 5 | name: 'Socket.io', 6 | type: 'tool', 7 | dependencies: [ 8 | { type: 'npm', name: 'socket.io' }, 9 | { type: 'python', name: 'python-socketio' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/tool/turborepo.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'turborepo', 5 | name: 'Turborepo', 6 | type: 'tool', 7 | files: ['turbo.json'], 8 | dependencies: [{ type: 'npm', name: 'turbo' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/tool/twig.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'twigphp', 5 | name: 'Twig', 6 | type: 'tool', 7 | dependencies: [{ type: 'php', name: 'twig/twig' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/vite.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vite', 5 | name: 'Vite', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'vite' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/tool/webpack.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'webpack', 5 | name: 'Webpack', 6 | type: 'tool', 7 | dependencies: [{ type: 'npm', name: 'webpack' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui/bootstrap.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'bootstrap', 5 | name: 'Bootstrap', 6 | type: 'ui', 7 | dependencies: [{ type: 'npm', name: 'bootstrap' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui/d3js.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'd3js', 5 | name: 'D3.js', 6 | type: 'ui', 7 | dependencies: [ 8 | { type: 'npm', name: 'd3' }, 9 | { type: 'npm', name: 'd3-shape' }, 10 | { type: 'npm', name: '@types/d3' }, 11 | { type: 'npm', name: '@types/d3-shape' }, 12 | ], 13 | }); 14 | -------------------------------------------------------------------------------- /src/rules/ui/index.ts: -------------------------------------------------------------------------------- 1 | import './bootstrap.js'; 2 | import './d3js.js'; 3 | import './radixui.js'; 4 | import './tailwind.js'; 5 | import './tiptap.js'; 6 | -------------------------------------------------------------------------------- /src/rules/ui/radixui.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'radixui', 5 | name: 'Radix UI', 6 | type: 'ui', 7 | dependencies: [ 8 | { type: 'npm', name: /^@radix-ui\//, example: '@radix-ui/react-label' }, 9 | { type: 'npm', name: 'radix-ui' }, 10 | ], 11 | }); 12 | -------------------------------------------------------------------------------- /src/rules/ui/tailwind.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tailwind', 5 | name: 'Tailwind', 6 | type: 'ui', 7 | files: ['tailwind.config.js'], 8 | dependencies: [{ type: 'npm', name: 'tailwindcss' }], 9 | }); 10 | -------------------------------------------------------------------------------- /src/rules/ui/tiptap.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'tiptap', 5 | name: 'Tiptap', 6 | type: 'ui', 7 | dependencies: [{ type: 'npm', name: /^@tiptap\//, example: '@tiptap/react' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/alpinejs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'alpinejs', 5 | name: 'Alpine.js', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'alpinejs' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/angular.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'angular', 5 | name: 'Angular', 6 | type: 'ui_framework', 7 | files: ['angular.json'], 8 | dependencies: [ 9 | { type: 'npm', name: 'angular' }, 10 | { type: 'npm', name: /^@angular\//, example: '@angular/forms' }, 11 | ], 12 | }); 13 | -------------------------------------------------------------------------------- /src/rules/ui_framework/htmx.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'htmx', 5 | name: 'HTMX', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'htmx.org' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/index.ts: -------------------------------------------------------------------------------- 1 | import './alpinejs.js'; 2 | import './angular.js'; 3 | import './htmx.js'; 4 | import './infernojs.js'; 5 | import './litjs.js'; 6 | import './mithriljs.js'; 7 | import './preactjs.js'; 8 | import './qwikjs.js'; 9 | import './react.js'; 10 | import './solidjs.js'; 11 | import './stenciljs.js'; 12 | import './sveltejs.js'; 13 | import './vue.js'; 14 | -------------------------------------------------------------------------------- /src/rules/ui_framework/infernojs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'infernojs', 5 | name: 'Inferno', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'inferno' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/litjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'litjs', 5 | name: 'Lit', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'lit' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/mithriljs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'mithriljs', 5 | name: 'Mithril', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'mithril' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/preactjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'preactjs', 5 | name: 'Preact', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'preact' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/qwikjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'qwikjs', 5 | name: 'Qwik', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'builder.io/qwik' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/react.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'react', 5 | name: 'React', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'react' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/solidjs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'solidjs', 5 | name: 'Solid js', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'solid-js' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/stenciljs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'stenciljs', 5 | name: 'Stencil', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: '@stencil/core' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/rules/ui_framework/sveltejs.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'sveltejs', 5 | name: 'Svelte', 6 | type: 'ui_framework', 7 | files: ['svelte.config.js'], 8 | dependencies: [ 9 | { type: 'npm', name: 'svelte' }, 10 | { 11 | type: 'npm', 12 | name: /^@svelte\//, 13 | example: '@sveltejs/vite-plugin-svelte', 14 | }, 15 | ], 16 | }); 17 | -------------------------------------------------------------------------------- /src/rules/ui_framework/vue.ts: -------------------------------------------------------------------------------- 1 | import { register } from '../../register.js'; 2 | 3 | register({ 4 | tech: 'vue', 5 | name: 'Vue.js', 6 | type: 'ui_framework', 7 | dependencies: [{ type: 'npm', name: 'vue' }], 8 | }); 9 | -------------------------------------------------------------------------------- /src/tests/helpers.ts: -------------------------------------------------------------------------------- 1 | import type { AnalyserJson } from '../types/index.js'; 2 | 3 | export function cleanNestedSnapshot(pl: AnalyserJson): AnalyserJson { 4 | pl.id = ''; 5 | pl.inComponent = ''; 6 | 7 | for (const child of pl.childs) cleanNestedSnapshot(child); 8 | for (const edge of pl.edges) edge.target = ''; 9 | 10 | return pl; 11 | } 12 | 13 | export function cleanPath(paths: string[], root: string): string[] { 14 | return paths.map((path) => path.replace(root, '')); 15 | } 16 | -------------------------------------------------------------------------------- /src/types/utils.ts: -------------------------------------------------------------------------------- 1 | export type Modify = Omit & TR; 2 | 3 | export type MaybePromise = Promise | T; 4 | -------------------------------------------------------------------------------- /tests/__fixtures__/.env.example: -------------------------------------------------------------------------------- 1 | BEEHIIV_API_KEY=test 2 | -------------------------------------------------------------------------------- /tests/__fixtures__/.github/workflows/invalid.yml: -------------------------------------------------------------------------------- 1 | {{{{raw}}}} 2 | name: Audit 3 | {{{{/raw}}}} 4 | -------------------------------------------------------------------------------- /tests/__fixtures__/.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | name: Main 2 | on: 3 | push: 4 | branches: [ main ] 5 | pull_request: 6 | types: [opened, synchronize] 7 | 8 | jobs: 9 | ci: 10 | container: node:18.17.0 11 | 12 | steps: 13 | - name: Check out repository code 14 | uses: actions/checkout@v3 15 | 16 | - name: Install Node 17 | uses: actions/setup-node@v3 18 | 19 | - name: Coverage 20 | uses: codecov/codecov-action@v3 21 | -------------------------------------------------------------------------------- /tests/__fixtures__/deno/deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2", 3 | "remote": { 4 | "https://deno.land/x/postgres@v0.17.0/mod.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tests/__fixtures__/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # docker-compose.yml 2 | version: '3' 3 | services: 4 | db: 5 | container_name: db 6 | image: postgres:14.5-alpine 7 | ports: 8 | - '26432:5432' 9 | environment: 10 | - POSTGRES_PASSWORD=hello 11 | 12 | redis: 13 | container_name: redis 14 | image: redis:7.0.4-alpine 15 | ports: 16 | - '36379:6379' 17 | 18 | unknown: 19 | container_name: unknown 20 | image: unknown:7.17.5 21 | ports: 22 | - '1234:1234' 23 | -------------------------------------------------------------------------------- /tests/__fixtures__/golang/cmd/server/main.go: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/specfy/stack-analyser/8f71a7a9737983f8f0a91e87463d77669a583965/tests/__fixtures__/golang/cmd/server/main.go -------------------------------------------------------------------------------- /tests/__fixtures__/golang/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/specfy/specfy 2 | 3 | go 1.20 4 | 5 | require ( 6 | github.com/google/uuid v1.3.0 7 | ) 8 | -------------------------------------------------------------------------------- /tests/__fixtures__/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fake", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "license": "ISC", 6 | "workspaces": [ 7 | "pkgs/app", 8 | "pkgs/api" 9 | ], 10 | "devDependencies": { 11 | "@typescript-eslint/eslint-plugin": "5.57.1", 12 | "@typescript-eslint/parser": "5.57.1", 13 | "eslint": "8.39.0", 14 | "prettier": "2.8.7", 15 | "typescript": "4.9.5" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/__fixtures__/pkgs/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@fake/api", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "license": "AGPL-3.0-only", 6 | "devDependencies": { 7 | "dd-trace": "1.0.1", 8 | "fastify": "4.17.0", 9 | "prisma": "4.13.0", 10 | "typescript": "5.0.4" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /tests/__fixtures__/pkgs/app/.vercel/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/specfy/stack-analyser/8f71a7a9737983f8f0a91e87463d77669a583965/tests/__fixtures__/pkgs/app/.vercel/.gitkeep -------------------------------------------------------------------------------- /tests/__fixtures__/pkgs/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@fake/app", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "license": "GPL-2.0-only", 6 | "devDependencies": { 7 | "@fake/api": "1.0.0", 8 | "react": "4.17.0", 9 | "typescript": "5.0.4", 10 | "vite": "4.3.3" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /tests/__fixtures__/pkgs/app/src/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/specfy/stack-analyser/8f71a7a9737983f8f0a91e87463d77669a583965/tests/__fixtures__/pkgs/app/src/index.html -------------------------------------------------------------------------------- /tests/__fixtures__/pkgs/app/src/index.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/specfy/stack-analyser/8f71a7a9737983f8f0a91e87463d77669a583965/tests/__fixtures__/pkgs/app/src/index.scss -------------------------------------------------------------------------------- /tests/__fixtures__/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | gem "rails", "6.1.7.4" 6 | 7 | gem "puma", "6.3.0", require: false 8 | -------------------------------------------------------------------------------- /tests/__fixtures__/rust/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-server" 3 | version = "1.0.0" 4 | license = "MIT" 5 | description = "Foobar" 6 | 7 | [dependencies] 8 | dotenv = "0.15.0" 9 | -------------------------------------------------------------------------------- /tests/__fixtures__/terraform/.terraform.lock.hcl: -------------------------------------------------------------------------------- 1 | provider "registry.terraform.io/hashicorp/google" { 2 | version = "4.61.0" 3 | constraints = "4.61.0" 4 | hashes = [ 5 | "h1:/Vz7xZfuNh2XR/tihF41QVbDPfvXimm3LQ9fFy/CB/s=", 6 | ] 7 | } 8 | 9 | provider "registry.terraform.io/vercel/vercel" { 10 | version = "4.61.0" 11 | constraints = "4.61.0" 12 | hashes = [ 13 | "h1:/Vz7xZfuNh2XR/tihF41QVbDPfvXimm3LQ9fFy/CB/s=", 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.lint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "src/", 5 | "vitest.config.ts" 6 | ] 7 | } 8 | --------------------------------------------------------------------------------