Tech Module

The tech module provides comprehensive technology stack detection for JavaScript/TypeScript projects. It identifies frontend frameworks, backend frameworks, build tools, testing frameworks, type systems, linting tools, and legacy frameworks.

Capabilities

Detect All Technologies

Run all detectors at once for a complete technology stack analysis.

import { detectAll } from '@hyperfrontend/project-scope'

const detections = detectAll('./my-project')

// Frontend frameworks (React, Vue, Angular, Svelte, etc.)
for (const fw of detections.frontendFrameworks) {
  console.log(`${fw.name} v${fw.version} (${fw.confidence}% confidence)`)
  if (fw.metaFrameworks) {
    console.log(
      '  Meta-frameworks:',
      fw.metaFrameworks.map((m) => m.name)
    )
  }
}

// Backend frameworks (Express, NestJS, Fastify, etc.)
console.log(
  'Backend:',
  detections.backendFrameworks.map((f) => f.name)
)

// Build tools (Webpack, Vite, esbuild, etc.)
console.log(
  'Build tools:',
  detections.buildTools.map((t) => t.name)
)

// Testing frameworks (Jest, Vitest, Cypress, etc.)
console.log(
  'Testing:',
  detections.testingFrameworks.map((t) => `${t.name} (${t.type})`)
)

// Type system (TypeScript, Flow)
console.log(
  'Types:',
  detections.typeSystem.map((t) => t.name)
)

// Linting (ESLint, Prettier, Biome)
console.log(
  'Linting:',
  detections.linting.map((t) => t.name)
)

// Legacy frameworks (jQuery, AngularJS, Backbone)
console.log(
  'Legacy:',
  detections.legacyFrameworks.map((t) => t.name)
)

Frontend Framework Detection

import { frameworkDetectors, reactDetector, vueDetector } from '@hyperfrontend/project-scope'

// Use individual detectors
const react = reactDetector('./my-app')
if (react) {
  console.log('React detected:', react.version)
  console.log('Meta-frameworks:', react.metaFrameworks) // Next.js, Gatsby, Remix
}

// All frontend detectors
for (const detector of frameworkDetectors) {
  const result = detector.detect('./my-app')
  if (result) {
    console.log(`${detector.name}: ${result.confidence}%`)
  }
}

Supported Frontend Frameworks

Framework Meta-frameworks Detection Sources
React Next.js, Gatsby, Remix react, react-dom packages
Vue Nuxt vue package, .vue files
Angular @angular/core package
Svelte SvelteKit svelte package, .svelte files
Solid solid-js package
Qwik @builder.io/qwik package
Astro astro package

Backend Framework Detection

import { backendDetectors } from '@hyperfrontend/project-scope'

const detections = backendDetectors.map((d) => d.detect('./my-api')).filter(Boolean)

for (const detection of detections) {
  console.log(`${detection.name} (${detection.type})`) // 'Express (http-server)'
}

Supported Backend Frameworks

Framework Type Detection Sources
Express http-server express package
NestJS framework @nestjs/core package
Fastify http-server fastify package
Koa http-server koa package
Hono http-server hono package

Build Tool Detection

import { buildToolDetectors } from '@hyperfrontend/project-scope'

for (const detector of buildToolDetectors) {
  const result = detector.detect('./my-project')
  if (result) {
    console.log(`${result.name}: ${result.configPath}`)
  }
}

Supported Build Tools

Tool Detection Sources
Webpack webpack package, webpack.config.* files
Vite vite package, vite.config.* files
esbuild esbuild package
Rollup rollup package, rollup.config.* files
Parcel parcel package
SWC @swc/core package
Babel @babel/core package, babel.config.* files

Testing Framework Detection

import { testingDetectors } from '@hyperfrontend/project-scope'

const tests = testingDetectors.map((d) => d.detect('./my-project')).filter(Boolean)

for (const test of tests) {
  console.log(`${test.name} (${test.type})`) // 'Jest (unit)', 'Cypress (e2e)'
}

Supported Testing Frameworks

Framework Type Detection Sources
Jest unit jest package, jest.config.* files
Vitest unit vitest package, vitest.config.* files
Mocha unit mocha package
Cypress e2e cypress package, cypress/ directory
Playwright e2e @playwright/test package

Monorepo Tool Detection

import { monorepoDetectors } from '@hyperfrontend/project-scope'

for (const detector of monorepoDetectors) {
  const result = detector.detect('./')
  if (result) {
    console.log(`Monorepo: ${result.name}`)
  }
}

Supported Monorepo Tools

Tool Detection Sources
NX nx.json, @nx/workspace package
Turborepo turbo.json, turbo package
Lerna lerna.json, lerna package
Rush rush.json
PNPM Workspaces pnpm-workspace.yaml

Detection Result Structure

All detections follow a common structure:

interface BaseDetection {
  /** Unique identifier (lowercase) */
  id: string
  /** Human-readable name */
  name: string
  /** Detected version (from package.json) */
  version?: string
  /** Confidence score 0-100 */
  confidence: number
  /** How the detection was made */
  detectedFrom: DetectionSource[]
}

interface DetectionSource {
  type: 'package.json' | 'config-file' | 'directory' | 'file-pattern'
  field?: string // For package.json
  path?: string // For files
}

Caching

Detection results are cached for 60 seconds:

// Use cached results (default)
const result1 = detectAll('./my-project')

// Force fresh detection
const result2 = detectAll('./my-project', { skipCache: true })

Confidence Scoring

Confidence scores reflect detection reliability:

Range Meaning
90-100 Very high confidence (explicit package + config)
70-89 High confidence (package dependency present)
50-69 Medium confidence (config file or patterns)
30-49 Low confidence (indirect signals)
0-29 Very low confidence (heuristics only)