getDependency - greydragon888/real-router GitHub Wiki

getDependenciesApi().get

1. Overview

  • What it does: Returns a dependency by name. Throws ReferenceError if the dependency is not found.
  • When to use:
    • For retrieving services, API clients, analytics and other dependencies
    • When the dependency is required and an error on absence is desirable

2. Signature

import { createRouter } from "@real-router/core";
import { getDependenciesApi } from "@real-router/core/api";

const router = createRouter<Dependencies>(routes, options, dependencies);
const depsApi = getDependenciesApi(router);

depsApi.get<K extends keyof Dependencies>(key: K): Dependencies[K]

Usage Examples

import { createRouter } from "@real-router/core";
import { getDependenciesApi } from "@real-router/core/api";

interface AppDependencies {
  api: ApiClient;
  analytics: Analytics;
  store: Store;
}

const router = createRouter<AppDependencies>(
  routes,
  {},
  {
    api: new ApiClient(),
    analytics: new Analytics(),
    store: new Store(),
  },
);

const depsApi = getDependenciesApi(router);

// Get dependency — type-safe
const api = depsApi.get("api"); // Type: ApiClient
const analytics = depsApi.get("analytics"); // Type: Analytics

3. Parameters

key (required)

  • Type: K extends keyof Dependencies
  • Purpose: Name of the dependency to retrieve
  • Constraint: Must be a string

4. Return Value

  • Type: Dependencies[K] -- exact dependency type inferred from the key
  • Success: The dependency value (live reference, not a copy)
  • Failure: Never returns -- throws ReferenceError

5. Possible Errors

Condition Error Type Message
key not a string TypeError [router.getDependency]: dependency name must be a string, got {type}
Dependency missing ReferenceError [router.getDependency]: dependency "{name}" not found

Error Examples

// TypeError: not a string
// @ts-expect-error
depsApi.get(123);
// TypeError: [router.getDependency]: dependency name must be a string, got number

// ReferenceError: not found
depsApi.get("nonexistent");
// ReferenceError: [router.getDependency]: dependency "nonexistent" not found

6. Related Methods

Method When to use
getDependenciesApi().set Set a dependency
getDependenciesApi().has Check existence (without error)
getDependenciesApi().getAll Get all dependencies (shallow copy)
getDependenciesApi().remove Remove a dependency
getDependenciesApi().reset Clear all dependencies

Comparison with has

const depsApi = getDependenciesApi(router);

// get — throws error if missing
try {
  const service = depsApi.get("maybeNotExist");
} catch (e) {
  // Handle ReferenceError
}

// has — safe check first
if (depsApi.has("maybeNotExist")) {
  const service = depsApi.get("maybeNotExist");
}

7. Behavior

From Tests

import { createRouter } from "@real-router/core";
import { getDependenciesApi } from "@real-router/core/api";

interface Deps {
  foo?: number;
  bar?: string;
}

const router = createRouter<Deps>([], {}, { foo: 1 });
const depsApi = getDependenciesApi(router);

// Returns existing dependency value
expect(depsApi.get("foo")).toBe(1);

// Throws ReferenceError for missing dependency
expect(() => depsApi.get("bar")).toThrowError(ReferenceError);

Read-Only -- Works After Dispose

get is a read-only operation. It does not check disposed state and continues to work after router.dispose():

router.dispose();
const depsApi = getDependenciesApi(router);

// Read-only methods still work
depsApi.has("foo");
depsApi.getAll();

Note: after dispose(), all dependencies are cleared by the cleanup sequence, so get will throw ReferenceError for any key.

8. Migration from router5

Before (router5) After (real-router)
router.getDependency(name) getDependenciesApi(router).get(name)
// Before (router5)
const api = router.getDependency("apiClient");

// After (real-router)
import { getDependenciesApi } from "@real-router/core/api";

const depsApi = getDependenciesApi(router);
const api = depsApi.get("apiClient");
⚠️ **GitHub.com Fallback** ⚠️