@devcraft-ts/diadem 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/auto-discovery-5IV22D5D.cjs +73 -0
- package/dist/auto-discovery-5IV22D5D.cjs.map +1 -0
- package/dist/auto-discovery-RPCKK3PB.js +68 -0
- package/dist/auto-discovery-RPCKK3PB.js.map +1 -0
- package/dist/chunk-72YY5X6T.cjs +683 -0
- package/dist/chunk-72YY5X6T.cjs.map +1 -0
- package/dist/chunk-FHQRDO5C.cjs +187 -0
- package/dist/chunk-FHQRDO5C.cjs.map +1 -0
- package/dist/chunk-RTX6B4YY.js +681 -0
- package/dist/chunk-RTX6B4YY.js.map +1 -0
- package/dist/chunk-W7NA3ZZF.js +169 -0
- package/dist/chunk-W7NA3ZZF.js.map +1 -0
- package/dist/cli.cjs +821 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.js +815 -0
- package/dist/cli.js.map +1 -0
- package/dist/container-C1FFn9_4.d.cts +249 -0
- package/dist/container-C1FFn9_4.d.ts +249 -0
- package/dist/index.cjs +145 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +304 -0
- package/dist/index.d.ts +304 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/setup/index.cjs +87 -0
- package/dist/setup/index.cjs.map +1 -0
- package/dist/setup/index.d.cts +81 -0
- package/dist/setup/index.d.ts +81 -0
- package/dist/setup/index.js +75 -0
- package/dist/setup/index.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DiademContainer } from '../chunk-RTX6B4YY.js';
|
|
2
|
+
import { getLogger } from '../chunk-W7NA3ZZF.js';
|
|
3
|
+
|
|
4
|
+
// src/setup/setup.ts
|
|
5
|
+
async function setupDependencies(container, environment) {
|
|
6
|
+
await container.autoRegisterDiscovered(environment);
|
|
7
|
+
container.setReady();
|
|
8
|
+
}
|
|
9
|
+
async function setupTestDependencies(container, mockDependencies, environment) {
|
|
10
|
+
if (mockDependencies) {
|
|
11
|
+
mockDependencies.forEach((implementation, token) => {
|
|
12
|
+
container.register(token, implementation);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
await container.autoRegisterDiscovered(environment);
|
|
16
|
+
container.setReady();
|
|
17
|
+
}
|
|
18
|
+
async function setupDevelopmentDependencies(container) {
|
|
19
|
+
await container.autoRegisterDiscovered("development");
|
|
20
|
+
if (process.env.NODE_ENV === "development") {
|
|
21
|
+
const diagnostics = container.getDiagnostics();
|
|
22
|
+
getLogger().info("DI Container Auto-Registration Diagnostics:", diagnostics);
|
|
23
|
+
const stats = container.getDiagnostics();
|
|
24
|
+
getLogger().info(
|
|
25
|
+
`Registered ${stats.dependencies + stats.singletons + stats.factories + stats.asyncFactories} services automatically`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
container.setReady();
|
|
29
|
+
}
|
|
30
|
+
async function setupProductionDependencies(container) {
|
|
31
|
+
await container.autoRegisterDiscovered("production");
|
|
32
|
+
container.setReady();
|
|
33
|
+
}
|
|
34
|
+
async function createAutoConfiguredContainer(environment, customSetup) {
|
|
35
|
+
const container = new DiademContainer();
|
|
36
|
+
if (customSetup) {
|
|
37
|
+
await customSetup(container);
|
|
38
|
+
}
|
|
39
|
+
await container.autoRegisterDiscovered(environment);
|
|
40
|
+
container.setReady();
|
|
41
|
+
return container;
|
|
42
|
+
}
|
|
43
|
+
function validateAutoRegistration(container, expectedServices = []) {
|
|
44
|
+
const diagnostics = container.getDiagnostics();
|
|
45
|
+
const totalRegistered = diagnostics.dependencies + diagnostics.singletons + diagnostics.factories + diagnostics.asyncFactories;
|
|
46
|
+
const registeredTokens = container.getRegisteredTokens();
|
|
47
|
+
const registeredNames = registeredTokens.map((token) => token.name);
|
|
48
|
+
const missingServices = expectedServices.filter(
|
|
49
|
+
(serviceName) => !registeredNames.some((name) => name.includes(serviceName))
|
|
50
|
+
);
|
|
51
|
+
return {
|
|
52
|
+
isValid: missingServices.length === 0,
|
|
53
|
+
missingServices,
|
|
54
|
+
registeredCount: totalRegistered
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
var setupDependenciesAuto = setupDependencies;
|
|
58
|
+
var setupTestDependenciesAuto = setupTestDependencies;
|
|
59
|
+
var setupDevelopmentDependenciesAuto = setupDevelopmentDependencies;
|
|
60
|
+
var setupProductionDependenciesAuto = setupProductionDependencies;
|
|
61
|
+
|
|
62
|
+
// src/setup/index.ts
|
|
63
|
+
function logSetupInfo(container) {
|
|
64
|
+
const diagnostics = container.getDiagnostics();
|
|
65
|
+
const total = diagnostics.dependencies + diagnostics.singletons + diagnostics.factories + diagnostics.asyncFactories;
|
|
66
|
+
getLogger().info("Diadem container setup", {
|
|
67
|
+
...diagnostics,
|
|
68
|
+
total,
|
|
69
|
+
tokens: container.getRegisteredTokens().map((token) => token.name)
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { createAutoConfiguredContainer, logSetupInfo, setupDependencies, setupDependenciesAuto, setupDevelopmentDependencies, setupDevelopmentDependenciesAuto, setupProductionDependencies, setupProductionDependenciesAuto, setupTestDependencies, setupTestDependenciesAuto, validateAutoRegistration };
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/setup/setup.ts","../../src/setup/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { Constructor } from '../core/container'\nimport { DiademContainer } from '../core/container'\nimport { getLogger } from '../core/logger'\n\n/**\n * Auto-registration based dependency setup that uses decorated classes.\n * This replaces the manual setup functions with automatic discovery and registration.\n *\n * @param container The DI container instance to configure\n * @param environment Optional environment filter for environment-specific services\n */\nexport async function setupDependencies(\n container: DiademContainer,\n environment?: string\n): Promise<void> {\n // Auto-register all decorated services using manifest-based discovery\n await container.autoRegisterDiscovered(environment)\n\n // Mark container as ready for use\n container.setReady()\n}\n\n/**\n * Auto-registration setup for testing environments.\n * Allows for custom dependency mocking while using auto-registration for the rest.\n *\n * @param container The DI container instance to configure\n * @param mockDependencies Optional map of tokens to mock implementations\n * @param environment Optional environment filter\n */\nexport async function setupTestDependencies(\n container: DiademContainer,\n mockDependencies?: Map<Constructor<unknown>, unknown>,\n environment?: string\n): Promise<void> {\n // Register mock dependencies first (they take precedence)\n if (mockDependencies) {\n mockDependencies.forEach((implementation, token) => {\n container.register(token, implementation)\n })\n }\n\n // Auto-register remaining services using manifest-based discovery\n await container.autoRegisterDiscovered(environment)\n\n container.setReady()\n}\n\n/**\n * Auto-registration setup for development environment with debugging.\n *\n * @param container The DI container instance to configure\n */\nexport async function setupDevelopmentDependencies(\n container: DiademContainer\n): Promise<void> {\n // Auto-register all services for development using manifest-based discovery\n await container.autoRegisterDiscovered('development')\n\n // Log diagnostics in development\n if (process.env.NODE_ENV === 'development') {\n const diagnostics = container.getDiagnostics()\n getLogger().info('DI Container Auto-Registration Diagnostics:', diagnostics)\n\n // Log discovered services\n const stats = container.getDiagnostics()\n getLogger().info(\n `Registered ${stats.dependencies + stats.singletons + stats.factories + stats.asyncFactories} services automatically`\n )\n }\n\n container.setReady()\n}\n\n/**\n * Auto-registration setup for production environment.\n *\n * @param container The DI container instance to configure\n */\nexport async function setupProductionDependencies(\n container: DiademContainer\n): Promise<void> {\n // Auto-register all services for production using manifest-based discovery\n await container.autoRegisterDiscovered('production')\n\n container.setReady()\n}\n\n/**\n * Create a fully configured container using auto-registration.\n * This is the recommended way to create containers with the new decorator system.\n *\n * @param environment The environment to configure for ('development', 'production', 'test', etc.)\n * @param customSetup Optional custom setup function that runs before auto-registration\n * @returns A fully configured and ready container\n */\nexport async function createAutoConfiguredContainer(\n environment: string,\n customSetup?: (container: DiademContainer) => Promise<void>\n): Promise<DiademContainer> {\n const container = new DiademContainer()\n\n // Run custom setup first if provided\n if (customSetup) {\n await customSetup(container)\n }\n\n // Auto-register core services using manifest-based discovery\n await container.autoRegisterDiscovered(environment)\n container.setReady()\n\n return container\n}\n\n/**\n * Validate that the expected services are registered after auto-registration.\n * Useful for debugging and asserting setup in application bootstrap code.\n *\n * @param container The container to validate\n * @param expectedServices Class names the application expects to be registered.\n * Each is matched as a substring against registered token names. Defaults to\n * an empty list (validation passes), since the set of services is\n * application-specific.\n * @returns Object with validation results\n */\nexport function validateAutoRegistration(\n container: DiademContainer,\n expectedServices: string[] = []\n): {\n isValid: boolean\n missingServices: string[]\n registeredCount: number\n} {\n const diagnostics = container.getDiagnostics()\n const totalRegistered =\n diagnostics.dependencies +\n diagnostics.singletons +\n diagnostics.factories +\n diagnostics.asyncFactories\n\n const registeredTokens = container.getRegisteredTokens()\n const registeredNames = registeredTokens.map((token) => token.name)\n\n const missingServices = expectedServices.filter(\n (serviceName) => !registeredNames.some((name) => name.includes(serviceName))\n )\n\n return {\n isValid: missingServices.length === 0,\n missingServices,\n registeredCount: totalRegistered\n }\n}\n\n// Backward compatibility aliases (keep the Auto suffix for existing code)\nexport const setupDependenciesAuto = setupDependencies\nexport const setupTestDependenciesAuto = setupTestDependencies\nexport const setupDevelopmentDependenciesAuto = setupDevelopmentDependencies\nexport const setupProductionDependenciesAuto = setupProductionDependencies\n","/**\n * Setup helpers — environment-aware container factories and validation.\n *\n * @example\n * ```ts\n * import { createAutoConfiguredContainer } from 'diadem/setup'\n *\n * const container = await createAutoConfiguredContainer(process.env.NODE_ENV)\n * const service = container.resolve(IMyService)\n * ```\n */\n\nimport type { DiademContainer } from '../core/container'\nimport { getLogger } from '../core/logger'\n\nexport {\n createAutoConfiguredContainer,\n setupDependencies,\n setupDependenciesAuto,\n setupDevelopmentDependencies,\n setupDevelopmentDependenciesAuto,\n setupProductionDependencies,\n setupProductionDependenciesAuto,\n setupTestDependencies,\n setupTestDependenciesAuto,\n validateAutoRegistration\n} from './setup'\n\n/**\n * Log a one-line summary of a container's registrations through the active\n * logger (silent unless a logger is configured). Intended for development\n * bootstrap diagnostics.\n */\nexport function logSetupInfo(container: DiademContainer): void {\n const diagnostics = container.getDiagnostics()\n const total =\n diagnostics.dependencies +\n diagnostics.singletons +\n diagnostics.factories +\n diagnostics.asyncFactories\n\n getLogger().info('Diadem container setup', {\n ...diagnostics,\n total,\n tokens: container.getRegisteredTokens().map((token) => token.name)\n })\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@devcraft-ts/diadem",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build-time, manifest-driven dependency injection for TypeScript. SSR-safe, framework-agnostic, zero runtime reflection.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dependency-injection",
|
|
7
|
+
"di",
|
|
8
|
+
"ioc",
|
|
9
|
+
"container",
|
|
10
|
+
"typescript",
|
|
11
|
+
"decorators",
|
|
12
|
+
"build-time",
|
|
13
|
+
"autowiring",
|
|
14
|
+
"manifest",
|
|
15
|
+
"ssr"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "astralstriker",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/astralstriker/diadem.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/astralstriker/diadem#readme",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/astralstriker/diadem/issues"
|
|
26
|
+
},
|
|
27
|
+
"type": "module",
|
|
28
|
+
"sideEffects": false,
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js",
|
|
33
|
+
"require": "./dist/index.cjs"
|
|
34
|
+
},
|
|
35
|
+
"./setup": {
|
|
36
|
+
"types": "./dist/setup/index.d.ts",
|
|
37
|
+
"import": "./dist/setup/index.js",
|
|
38
|
+
"require": "./dist/setup/index.cjs"
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
"main": "./dist/index.cjs",
|
|
43
|
+
"module": "./dist/index.js",
|
|
44
|
+
"types": "./dist/index.d.ts",
|
|
45
|
+
"bin": {
|
|
46
|
+
"diadem": "./dist/cli.js"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md",
|
|
51
|
+
"CHANGELOG.md",
|
|
52
|
+
"LICENSE"
|
|
53
|
+
],
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"typescript": ">=5.0.0"
|
|
56
|
+
},
|
|
57
|
+
"peerDependenciesMeta": {
|
|
58
|
+
"typescript": {
|
|
59
|
+
"optional": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsup",
|
|
64
|
+
"dev": "tsup --watch",
|
|
65
|
+
"typecheck": "tsc --noEmit",
|
|
66
|
+
"lint": "eslint src",
|
|
67
|
+
"test": "vitest run",
|
|
68
|
+
"test:watch": "vitest",
|
|
69
|
+
"clean": "rm -rf dist",
|
|
70
|
+
"changeset": "changeset",
|
|
71
|
+
"version": "changeset version",
|
|
72
|
+
"release": "changeset publish",
|
|
73
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
74
|
+
},
|
|
75
|
+
"devDependencies": {
|
|
76
|
+
"@changesets/cli": "^2.31.0",
|
|
77
|
+
"@eslint/js": "^10.0.1",
|
|
78
|
+
"@types/node": "^22.10.0",
|
|
79
|
+
"eslint": "^10.4.1",
|
|
80
|
+
"globals": "^17.6.0",
|
|
81
|
+
"tsup": "^8.3.5",
|
|
82
|
+
"typescript": "^5.7.2",
|
|
83
|
+
"typescript-eslint": "^8.60.1",
|
|
84
|
+
"vitest": "^2.1.8"
|
|
85
|
+
},
|
|
86
|
+
"engines": {
|
|
87
|
+
"node": ">=18"
|
|
88
|
+
},
|
|
89
|
+
"publishConfig": {
|
|
90
|
+
"access": "public"
|
|
91
|
+
}
|
|
92
|
+
}
|