@fulmenhq/tsfulmen 0.4.0 → 0.4.1
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 +25 -0
- package/dist/appidentity/index.js +6 -6
- package/dist/assets/index.d.ts +5 -0
- package/dist/assets/index.js +1 -1
- package/dist/bin/prometheus-cli.js +6 -6
- package/dist/bin/schema-cli.js +2 -2
- package/dist/bin/signals-cli.js +4 -4
- package/dist/{chunk-HIBZ2AY7.js → chunk-24BAF63H.js} +4 -4
- package/dist/{chunk-HIBZ2AY7.js.map → chunk-24BAF63H.js.map} +1 -1
- package/dist/{chunk-BTUS6PZZ.js → chunk-56F2EEAG.js} +33 -7
- package/dist/chunk-56F2EEAG.js.map +1 -0
- package/dist/{chunk-K2FYT43R.js → chunk-7YWACZEJ.js} +4 -4
- package/dist/{chunk-K2FYT43R.js.map → chunk-7YWACZEJ.js.map} +1 -1
- package/dist/{chunk-CW4CSNVF.js → chunk-GOTEQYAD.js} +3 -3
- package/dist/{chunk-CW4CSNVF.js.map → chunk-GOTEQYAD.js.map} +1 -1
- package/dist/{chunk-K7BMFGQP.js → chunk-LMNAUTW7.js} +3 -3
- package/dist/{chunk-K7BMFGQP.js.map → chunk-LMNAUTW7.js.map} +1 -1
- package/dist/{chunk-HS4F3BRR.js → chunk-QGTNV4U2.js} +3 -3
- package/dist/{chunk-HS4F3BRR.js.map → chunk-QGTNV4U2.js.map} +1 -1
- package/dist/{chunk-7SVYOPJ3.js → chunk-SNV5WG5V.js} +9 -9
- package/dist/{chunk-7SVYOPJ3.js.map → chunk-SNV5WG5V.js.map} +1 -1
- package/dist/{chunk-BJDL6JEX.js → chunk-VJIGX7MH.js} +4 -4
- package/dist/{chunk-BJDL6JEX.js.map → chunk-VJIGX7MH.js.map} +1 -1
- package/dist/{chunk-W6TQFTTY.js → chunk-WCCMRVZF.js} +3 -3
- package/dist/{chunk-W6TQFTTY.js.map → chunk-WCCMRVZF.js.map} +1 -1
- package/dist/config/index.js +2 -2
- package/dist/crucible/index.js +2 -2
- package/dist/errors/index.js +3 -3
- package/dist/errors-R7ZODJXS.js +8 -0
- package/dist/{errors-RBJX6ETJ.js.map → errors-R7ZODJXS.js.map} +1 -1
- package/dist/export-EA3RNQNS.js +6 -0
- package/dist/{export-BWRETGYS.js.map → export-EA3RNQNS.js.map} +1 -1
- package/dist/foundry/index.js +5 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/loader-VP2ZIC4O.js +9 -0
- package/dist/{loader-H5K7HSO5.js.map → loader-VP2ZIC4O.js.map} +1 -1
- package/dist/pathfinder/index.js +3 -3
- package/dist/reports/license-inventory.csv +1 -1
- package/dist/schema/index.js +2 -2
- package/dist/signals/index.js +4 -4
- package/dist/telemetry/http/index.js +6 -6
- package/dist/telemetry/index.js +2 -2
- package/dist/telemetry/prometheus/index.js +4 -4
- package/dist/{validator-U4CKD2Y3.js → validator-I3ASDVDB.js} +4 -4
- package/dist/{validator-U4CKD2Y3.js.map → validator-I3ASDVDB.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-BTUS6PZZ.js.map +0 -1
- package/dist/errors-RBJX6ETJ.js +0 -8
- package/dist/export-BWRETGYS.js +0 -6
- package/dist/loader-H5K7HSO5.js +0 -9
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AppIdentityError } from './chunk-
|
|
2
|
-
import { validateDataBySchemaId } from './chunk-
|
|
1
|
+
import { AppIdentityError } from './chunk-WCCMRVZF.js';
|
|
2
|
+
import { validateDataBySchemaId } from './chunk-SNV5WG5V.js';
|
|
3
3
|
import { readFile, access } from 'fs/promises';
|
|
4
4
|
import { parse } from 'yaml';
|
|
5
5
|
import { join, dirname } from 'path';
|
|
@@ -204,5 +204,5 @@ async function loadIdentity(options) {
|
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
export { APP_IDENTITY_DIR, APP_IDENTITY_ENV_VAR, APP_IDENTITY_FILENAME, APP_IDENTITY_SCHEMA_ID, MAX_ANCESTOR_SEARCH_DEPTH, clearEmbeddedIdentity, clearIdentityCache, getCachedIdentity, getEmbeddedIdentity, hasEmbeddedIdentity, loadIdentity, registerEmbeddedIdentity };
|
|
207
|
-
//# sourceMappingURL=chunk-
|
|
208
|
-
//# sourceMappingURL=chunk-
|
|
207
|
+
//# sourceMappingURL=chunk-VJIGX7MH.js.map
|
|
208
|
+
//# sourceMappingURL=chunk-VJIGX7MH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/appidentity/cache.ts","../src/appidentity/constants.ts","../src/appidentity/discovery.ts","../src/appidentity/embedded.ts","../src/appidentity/loader.ts"],"names":["parseYAML","deepFreeze"],"mappings":"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","file":"chunk-BJDL6JEX.js","sourcesContent":["/**\n * Application Identity Cache\n *\n * Process-level caching for identity objects with immutability guarantees\n */\n\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level cache storage\n * null = not cached, Identity = cached value\n */\nlet cachedIdentity: Identity | null = null;\n\n/**\n * Get cached identity if available\n *\n * @returns Cached identity or null if not cached\n */\nexport function getCachedIdentity(): Identity | null {\n return cachedIdentity;\n}\n\n/**\n * Set cached identity\n *\n * Identity object should already be frozen before caching\n *\n * @param identity - Identity to cache (must be frozen)\n */\nexport function setCachedIdentity(identity: Identity): void {\n cachedIdentity = identity;\n}\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport function clearIdentityCache(): void {\n cachedIdentity = null;\n}\n","/**\n * Application Identity Constants\n *\n * Centralized configuration for identity discovery and validation\n */\n\n/**\n * Filename for identity document\n */\nexport const APP_IDENTITY_FILENAME = \"app.yaml\";\n\n/**\n * Directory containing identity file\n */\nexport const APP_IDENTITY_DIR = \".fulmen\";\n\n/**\n * Environment variable for explicit path override\n */\nexport const APP_IDENTITY_ENV_VAR = \"FULMEN_APP_IDENTITY_PATH\";\n\n/**\n * Schema ID for validation\n */\nexport const APP_IDENTITY_SCHEMA_ID = \"config/repository/app-identity/v1.0.0/app-identity\";\n\n/**\n * Maximum depth for ancestor directory search\n * Prevents infinite loops and excessive filesystem traversal\n */\nexport const MAX_ANCESTOR_SEARCH_DEPTH = 20;\n","/**\n * Application Identity Discovery\n *\n * Implements the Crucible discovery precedence algorithm:\n * 1. Explicit path parameter (highest priority)\n * 2. Environment variable override (FULMEN_APP_IDENTITY_PATH)\n * 3. Ancestor search from CWD upward\n */\n\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\n\n/**\n * Discovery result with path and source\n */\nexport interface DiscoveryResult {\n readonly path: string;\n readonly source: \"explicit\" | \"env\" | \"ancestor\" | \"test\";\n}\n\n/**\n * Options for identity discovery\n */\nexport interface DiscoveryOptions {\n /**\n * Explicit path override (highest priority)\n */\n readonly path?: string;\n\n /**\n * Starting directory for ancestor search\n * Defaults to process.cwd()\n */\n readonly startDir?: string;\n}\n\n/**\n * Discover application identity file using Crucible precedence algorithm\n *\n * Discovery order:\n * 1. Explicit path parameter (throws if not found)\n * 2. FULMEN_APP_IDENTITY_PATH env var (throws if set but not found)\n * 3. Ancestor search from startDir (throws if not found after max depth)\n *\n * @param options - Discovery options\n * @returns Discovery result with path and source\n * @throws {AppIdentityError} If identity file not found or inaccessible\n */\nexport async function discoverIdentityPath(\n options?: DiscoveryOptions,\n): Promise<DiscoveryResult | null> {\n // 1. Explicit path parameter (highest priority)\n if (options?.path) {\n const exists = await fileExists(options.path);\n if (!exists) {\n throw AppIdentityError.notFound([options.path]);\n }\n return { path: options.path, source: \"explicit\" };\n }\n\n // 2. Environment variable override\n const envPath = process.env[APP_IDENTITY_ENV_VAR];\n if (envPath) {\n const exists = await fileExists(envPath);\n if (!exists) {\n throw AppIdentityError.envOverrideMissing(envPath);\n }\n return { path: envPath, source: \"env\" };\n }\n\n // 3. Ancestor search from startDir\n const startDir = options?.startDir || process.cwd();\n const result = await searchAncestors(startDir);\n if (result) {\n return { path: result, source: \"ancestor\" };\n }\n\n return null;\n}\n\n/**\n * Search ancestor directories for identity file\n *\n * Walks upward from startDir to filesystem root, looking for .fulmen/app.yaml\n * Stops at MAX_ANCESTOR_SEARCH_DEPTH or filesystem root\n *\n * @param startDir - Directory to start search from\n * @returns Path to identity file if found, null otherwise\n * @throws {AppIdentityError} If max depth reached or filesystem root reached without finding file\n */\nasync function searchAncestors(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const searchedPaths: string[] = [];\n\n for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {\n const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);\n searchedPaths.push(candidatePath);\n\n if (await fileExists(candidatePath)) {\n return candidatePath;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n throw AppIdentityError.notFound(searchedPaths);\n }\n currentDir = parentDir;\n }\n\n // Max depth reached\n throw AppIdentityError.notFound(searchedPaths);\n}\n\n/**\n * Check if a file exists and is accessible\n *\n * @param path - Path to check\n * @returns true if file exists and is readable, false otherwise\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Embedded Identity Registration\n *\n * Provides a mechanism to register embedded identity at application startup\n * for standalone binary/package support. This allows applications to work\n * without requiring .fulmen/app.yaml to be discoverable on the filesystem.\n *\n * Discovery precedence (with embedded fallback):\n * 1. Explicit path parameter\n * 2. FULMEN_APP_IDENTITY_PATH environment variable\n * 3. Ancestor search from CWD\n * 4. Embedded identity fallback (this module)\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, RegisterEmbeddedIdentityOptions } from \"./types.js\";\n\n/**\n * Process-level storage for embedded identity\n * Uses first-wins semantics - once registered, cannot be replaced\n */\nlet embeddedIdentity: Identity | null = null;\nlet isRegistered = false;\n\n/**\n * Deep freeze an object and all its nested properties\n */\nfunction deepFreeze<T>(obj: T): T {\n Object.freeze(obj);\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n return obj;\n}\n\n/**\n * Register embedded identity YAML that serves as fallback when\n * runtime discovery cannot find an external app.yaml.\n *\n * Semantics:\n * - First registration wins (subsequent calls throw error)\n * - Validates against schema on registration (unless `skipValidation`)\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @param options - Optional registration options (see {@link RegisterEmbeddedIdentityOptions})\n * @throws {AppIdentityError} If already registered or validation fails\n *\n * @example\n * ```typescript\n * // From npm package entry point\n * import { registerEmbeddedIdentity } from \"@fulmenhq/tsfulmen/appidentity\";\n * import { readFileSync } from \"node:fs\";\n * import { fileURLToPath } from \"node:url\";\n * import { dirname, join } from \"node:path\";\n *\n * const __filename = fileURLToPath(import.meta.url);\n * const __dirname = dirname(__filename);\n * const embeddedPath = join(__dirname, \"..\", \".fulmen\", \"app.yaml\");\n *\n * try {\n * const yaml = readFileSync(embeddedPath, \"utf-8\");\n * registerEmbeddedIdentity(yaml);\n * } catch {\n * // Embedded identity not available - discovery will use filesystem\n * }\n * ```\n *\n * @example\n * ```typescript\n * // In a `bun --compile` single-file binary, the FS-backed schema registry\n * // is unavailable. Register a build-time-embedded, CI-validated identity\n * // without re-validating against the (absent) schema registry:\n * import embeddedYaml from \"./app-identity.embedded.js\"; // inlined at build\n * registerEmbeddedIdentity(embeddedYaml, { skipValidation: true });\n * ```\n */\nexport async function registerEmbeddedIdentity(\n data: string | Identity,\n options?: RegisterEmbeddedIdentityOptions,\n): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n const skipValidation = options?.skipValidation ?? false;\n let identity: Identity;\n\n if (typeof data === \"string\") {\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(data);\n } catch (error) {\n throw AppIdentityError.embeddedParseFailed(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n identity = data;\n }\n\n // Deep freeze and store\n embeddedIdentity = deepFreeze(structuredClone(identity)) as Identity;\n isRegistered = true;\n}\n\n/**\n * Check if embedded identity has been registered\n *\n * @returns true if registerEmbeddedIdentity() has been called successfully\n */\nexport function hasEmbeddedIdentity(): boolean {\n return isRegistered;\n}\n\n/**\n * Get the registered embedded identity\n *\n * @returns Frozen identity object or null if not registered\n */\nexport function getEmbeddedIdentity(): Identity | null {\n return embeddedIdentity;\n}\n\n/**\n * Clear embedded identity registration\n *\n * WARNING: For testing only. In production, embedded identity should be\n * set once at startup and never cleared.\n */\nexport function clearEmbeddedIdentity(): void {\n embeddedIdentity = null;\n isRegistered = false;\n}\n","/**\n * Application Identity Loader\n *\n * Main loading logic with YAML parsing, schema validation, and caching\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { clearIdentityCache, getCachedIdentity, setCachedIdentity } from \"./cache.js\";\nimport { APP_IDENTITY_ENV_VAR, APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { discoverIdentityPath } from \"./discovery.js\";\nimport { getEmbeddedIdentity } from \"./embedded.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Deep freeze an object and all its nested properties\n *\n * Recursively freezes an object and all nested objects/functions to ensure\n * complete immutability. This prevents accidental mutations of identity data.\n *\n * Note: Uses `any` type assertion (line 28) to access arbitrary properties\n * during recursive traversal. This is necessary because TypeScript's generic\n * constraint system cannot express \"any object with indexable properties\"\n * without losing the return type safety. The `any` is scoped to a single\n * line and protected by runtime guards.\n *\n * @param obj - Object to freeze\n * @returns Frozen object (same type as input)\n */\nfunction deepFreeze<T>(obj: T): T {\n // Freeze the object itself\n Object.freeze(obj);\n\n // Recursively freeze all properties\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access - see function docs\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n\n return obj;\n}\n\n/**\n * Load application identity from .fulmen/app.yaml\n *\n * Discovery order:\n * 1. Test injection (options.identity) - bypasses all discovery and caching\n * 2. Explicit path (options.path)\n * 3. Environment variable (FULMEN_APP_IDENTITY_PATH)\n * 4. Ancestor search from startDir or CWD\n * 5. Embedded identity fallback (if registered via registerEmbeddedIdentity)\n *\n * Results are cached after first successful load unless skipCache is true.\n * Test injections are never cached.\n *\n * @param options - Load options\n * @returns Frozen, immutable identity object\n * @throws {AppIdentityError} If identity not found, invalid, or unreadable\n */\nexport async function loadIdentity(options?: LoadIdentityOptions): Promise<Identity> {\n // Test injection (never caches)\n if (options?.identity) {\n return deepFreeze(structuredClone(options.identity)) as Identity;\n }\n\n // Check cache unless skipCache\n if (!options?.skipCache) {\n const cached = getCachedIdentity();\n if (cached) {\n return cached;\n }\n }\n\n // Discover file - may throw AppIdentityError.notFound or return null\n let discovery: Awaited<ReturnType<typeof discoverIdentityPath>>;\n try {\n discovery = await discoverIdentityPath({\n path: options?.path,\n startDir: options?.startDir,\n });\n } catch (error) {\n // Discovery failed (e.g., reached filesystem root without finding identity)\n // Embedded fallback MUST NOT override explicit path or env override semantics.\n const hasExplicitPath = Boolean(options?.path);\n const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);\n\n if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n }\n\n throw error;\n }\n\n // If discovery returned null (no env var, no explicit path, and ancestor search returned null)\n if (!discovery) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n throw AppIdentityError.notFound([]);\n }\n\n // Read file\n let content: string;\n try {\n content = await readFile(discovery.path, \"utf-8\");\n } catch (error) {\n throw AppIdentityError.readFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(content);\n } catch (error) {\n throw AppIdentityError.parseFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!options?.skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n\n if (!result.valid) {\n throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);\n }\n }\n\n // Deep freeze for immutability\n const identity = deepFreeze(structuredClone(parsed)) as Identity;\n\n // Cache result\n setCachedIdentity(identity);\n\n return identity;\n}\n\n/**\n * Get cached identity without triggering load\n *\n * @returns Cached identity or null if not cached\n */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/appidentity/cache.ts","../src/appidentity/constants.ts","../src/appidentity/discovery.ts","../src/appidentity/embedded.ts","../src/appidentity/loader.ts"],"names":["parseYAML","deepFreeze"],"mappings":"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","file":"chunk-VJIGX7MH.js","sourcesContent":["/**\n * Application Identity Cache\n *\n * Process-level caching for identity objects with immutability guarantees\n */\n\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level cache storage\n * null = not cached, Identity = cached value\n */\nlet cachedIdentity: Identity | null = null;\n\n/**\n * Get cached identity if available\n *\n * @returns Cached identity or null if not cached\n */\nexport function getCachedIdentity(): Identity | null {\n return cachedIdentity;\n}\n\n/**\n * Set cached identity\n *\n * Identity object should already be frozen before caching\n *\n * @param identity - Identity to cache (must be frozen)\n */\nexport function setCachedIdentity(identity: Identity): void {\n cachedIdentity = identity;\n}\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport function clearIdentityCache(): void {\n cachedIdentity = null;\n}\n","/**\n * Application Identity Constants\n *\n * Centralized configuration for identity discovery and validation\n */\n\n/**\n * Filename for identity document\n */\nexport const APP_IDENTITY_FILENAME = \"app.yaml\";\n\n/**\n * Directory containing identity file\n */\nexport const APP_IDENTITY_DIR = \".fulmen\";\n\n/**\n * Environment variable for explicit path override\n */\nexport const APP_IDENTITY_ENV_VAR = \"FULMEN_APP_IDENTITY_PATH\";\n\n/**\n * Schema ID for validation\n */\nexport const APP_IDENTITY_SCHEMA_ID = \"config/repository/app-identity/v1.0.0/app-identity\";\n\n/**\n * Maximum depth for ancestor directory search\n * Prevents infinite loops and excessive filesystem traversal\n */\nexport const MAX_ANCESTOR_SEARCH_DEPTH = 20;\n","/**\n * Application Identity Discovery\n *\n * Implements the Crucible discovery precedence algorithm:\n * 1. Explicit path parameter (highest priority)\n * 2. Environment variable override (FULMEN_APP_IDENTITY_PATH)\n * 3. Ancestor search from CWD upward\n */\n\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\n\n/**\n * Discovery result with path and source\n */\nexport interface DiscoveryResult {\n readonly path: string;\n readonly source: \"explicit\" | \"env\" | \"ancestor\" | \"test\";\n}\n\n/**\n * Options for identity discovery\n */\nexport interface DiscoveryOptions {\n /**\n * Explicit path override (highest priority)\n */\n readonly path?: string;\n\n /**\n * Starting directory for ancestor search\n * Defaults to process.cwd()\n */\n readonly startDir?: string;\n}\n\n/**\n * Discover application identity file using Crucible precedence algorithm\n *\n * Discovery order:\n * 1. Explicit path parameter (throws if not found)\n * 2. FULMEN_APP_IDENTITY_PATH env var (throws if set but not found)\n * 3. Ancestor search from startDir (throws if not found after max depth)\n *\n * @param options - Discovery options\n * @returns Discovery result with path and source\n * @throws {AppIdentityError} If identity file not found or inaccessible\n */\nexport async function discoverIdentityPath(\n options?: DiscoveryOptions,\n): Promise<DiscoveryResult | null> {\n // 1. Explicit path parameter (highest priority)\n if (options?.path) {\n const exists = await fileExists(options.path);\n if (!exists) {\n throw AppIdentityError.notFound([options.path]);\n }\n return { path: options.path, source: \"explicit\" };\n }\n\n // 2. Environment variable override\n const envPath = process.env[APP_IDENTITY_ENV_VAR];\n if (envPath) {\n const exists = await fileExists(envPath);\n if (!exists) {\n throw AppIdentityError.envOverrideMissing(envPath);\n }\n return { path: envPath, source: \"env\" };\n }\n\n // 3. Ancestor search from startDir\n const startDir = options?.startDir || process.cwd();\n const result = await searchAncestors(startDir);\n if (result) {\n return { path: result, source: \"ancestor\" };\n }\n\n return null;\n}\n\n/**\n * Search ancestor directories for identity file\n *\n * Walks upward from startDir to filesystem root, looking for .fulmen/app.yaml\n * Stops at MAX_ANCESTOR_SEARCH_DEPTH or filesystem root\n *\n * @param startDir - Directory to start search from\n * @returns Path to identity file if found, null otherwise\n * @throws {AppIdentityError} If max depth reached or filesystem root reached without finding file\n */\nasync function searchAncestors(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const searchedPaths: string[] = [];\n\n for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {\n const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);\n searchedPaths.push(candidatePath);\n\n if (await fileExists(candidatePath)) {\n return candidatePath;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n throw AppIdentityError.notFound(searchedPaths);\n }\n currentDir = parentDir;\n }\n\n // Max depth reached\n throw AppIdentityError.notFound(searchedPaths);\n}\n\n/**\n * Check if a file exists and is accessible\n *\n * @param path - Path to check\n * @returns true if file exists and is readable, false otherwise\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Embedded Identity Registration\n *\n * Provides a mechanism to register embedded identity at application startup\n * for standalone binary/package support. This allows applications to work\n * without requiring .fulmen/app.yaml to be discoverable on the filesystem.\n *\n * Discovery precedence (with embedded fallback):\n * 1. Explicit path parameter\n * 2. FULMEN_APP_IDENTITY_PATH environment variable\n * 3. Ancestor search from CWD\n * 4. Embedded identity fallback (this module)\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, RegisterEmbeddedIdentityOptions } from \"./types.js\";\n\n/**\n * Process-level storage for embedded identity\n * Uses first-wins semantics - once registered, cannot be replaced\n */\nlet embeddedIdentity: Identity | null = null;\nlet isRegistered = false;\n\n/**\n * Deep freeze an object and all its nested properties\n */\nfunction deepFreeze<T>(obj: T): T {\n Object.freeze(obj);\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n return obj;\n}\n\n/**\n * Register embedded identity YAML that serves as fallback when\n * runtime discovery cannot find an external app.yaml.\n *\n * Semantics:\n * - First registration wins (subsequent calls throw error)\n * - Validates against schema on registration (unless `skipValidation`)\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @param options - Optional registration options (see {@link RegisterEmbeddedIdentityOptions})\n * @throws {AppIdentityError} If already registered or validation fails\n *\n * @example\n * ```typescript\n * // From npm package entry point\n * import { registerEmbeddedIdentity } from \"@fulmenhq/tsfulmen/appidentity\";\n * import { readFileSync } from \"node:fs\";\n * import { fileURLToPath } from \"node:url\";\n * import { dirname, join } from \"node:path\";\n *\n * const __filename = fileURLToPath(import.meta.url);\n * const __dirname = dirname(__filename);\n * const embeddedPath = join(__dirname, \"..\", \".fulmen\", \"app.yaml\");\n *\n * try {\n * const yaml = readFileSync(embeddedPath, \"utf-8\");\n * registerEmbeddedIdentity(yaml);\n * } catch {\n * // Embedded identity not available - discovery will use filesystem\n * }\n * ```\n *\n * @example\n * ```typescript\n * // In a `bun --compile` single-file binary, the FS-backed schema registry\n * // is unavailable. Register a build-time-embedded, CI-validated identity\n * // without re-validating against the (absent) schema registry:\n * import embeddedYaml from \"./app-identity.embedded.js\"; // inlined at build\n * registerEmbeddedIdentity(embeddedYaml, { skipValidation: true });\n * ```\n */\nexport async function registerEmbeddedIdentity(\n data: string | Identity,\n options?: RegisterEmbeddedIdentityOptions,\n): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n const skipValidation = options?.skipValidation ?? false;\n let identity: Identity;\n\n if (typeof data === \"string\") {\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(data);\n } catch (error) {\n throw AppIdentityError.embeddedParseFailed(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n identity = data;\n }\n\n // Deep freeze and store\n embeddedIdentity = deepFreeze(structuredClone(identity)) as Identity;\n isRegistered = true;\n}\n\n/**\n * Check if embedded identity has been registered\n *\n * @returns true if registerEmbeddedIdentity() has been called successfully\n */\nexport function hasEmbeddedIdentity(): boolean {\n return isRegistered;\n}\n\n/**\n * Get the registered embedded identity\n *\n * @returns Frozen identity object or null if not registered\n */\nexport function getEmbeddedIdentity(): Identity | null {\n return embeddedIdentity;\n}\n\n/**\n * Clear embedded identity registration\n *\n * WARNING: For testing only. In production, embedded identity should be\n * set once at startup and never cleared.\n */\nexport function clearEmbeddedIdentity(): void {\n embeddedIdentity = null;\n isRegistered = false;\n}\n","/**\n * Application Identity Loader\n *\n * Main loading logic with YAML parsing, schema validation, and caching\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { clearIdentityCache, getCachedIdentity, setCachedIdentity } from \"./cache.js\";\nimport { APP_IDENTITY_ENV_VAR, APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { discoverIdentityPath } from \"./discovery.js\";\nimport { getEmbeddedIdentity } from \"./embedded.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Deep freeze an object and all its nested properties\n *\n * Recursively freezes an object and all nested objects/functions to ensure\n * complete immutability. This prevents accidental mutations of identity data.\n *\n * Note: Uses `any` type assertion (line 28) to access arbitrary properties\n * during recursive traversal. This is necessary because TypeScript's generic\n * constraint system cannot express \"any object with indexable properties\"\n * without losing the return type safety. The `any` is scoped to a single\n * line and protected by runtime guards.\n *\n * @param obj - Object to freeze\n * @returns Frozen object (same type as input)\n */\nfunction deepFreeze<T>(obj: T): T {\n // Freeze the object itself\n Object.freeze(obj);\n\n // Recursively freeze all properties\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access - see function docs\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n\n return obj;\n}\n\n/**\n * Load application identity from .fulmen/app.yaml\n *\n * Discovery order:\n * 1. Test injection (options.identity) - bypasses all discovery and caching\n * 2. Explicit path (options.path)\n * 3. Environment variable (FULMEN_APP_IDENTITY_PATH)\n * 4. Ancestor search from startDir or CWD\n * 5. Embedded identity fallback (if registered via registerEmbeddedIdentity)\n *\n * Results are cached after first successful load unless skipCache is true.\n * Test injections are never cached.\n *\n * @param options - Load options\n * @returns Frozen, immutable identity object\n * @throws {AppIdentityError} If identity not found, invalid, or unreadable\n */\nexport async function loadIdentity(options?: LoadIdentityOptions): Promise<Identity> {\n // Test injection (never caches)\n if (options?.identity) {\n return deepFreeze(structuredClone(options.identity)) as Identity;\n }\n\n // Check cache unless skipCache\n if (!options?.skipCache) {\n const cached = getCachedIdentity();\n if (cached) {\n return cached;\n }\n }\n\n // Discover file - may throw AppIdentityError.notFound or return null\n let discovery: Awaited<ReturnType<typeof discoverIdentityPath>>;\n try {\n discovery = await discoverIdentityPath({\n path: options?.path,\n startDir: options?.startDir,\n });\n } catch (error) {\n // Discovery failed (e.g., reached filesystem root without finding identity)\n // Embedded fallback MUST NOT override explicit path or env override semantics.\n const hasExplicitPath = Boolean(options?.path);\n const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);\n\n if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n }\n\n throw error;\n }\n\n // If discovery returned null (no env var, no explicit path, and ancestor search returned null)\n if (!discovery) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n throw AppIdentityError.notFound([]);\n }\n\n // Read file\n let content: string;\n try {\n content = await readFile(discovery.path, \"utf-8\");\n } catch (error) {\n throw AppIdentityError.readFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(content);\n } catch (error) {\n throw AppIdentityError.parseFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!options?.skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n\n if (!result.valid) {\n throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);\n }\n }\n\n // Deep freeze for immutability\n const identity = deepFreeze(structuredClone(parsed)) as Identity;\n\n // Cache result\n setCachedIdentity(identity);\n\n return identity;\n}\n\n/**\n * Get cached identity without triggering load\n *\n * @returns Cached identity or null if not cached\n */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FulmenError } from './chunk-
|
|
1
|
+
import { FulmenError } from './chunk-GOTEQYAD.js';
|
|
2
2
|
|
|
3
3
|
// src/appidentity/errors.ts
|
|
4
4
|
var AppIdentityError = class _AppIdentityError extends FulmenError {
|
|
@@ -126,5 +126,5 @@ ${cause.message}`;
|
|
|
126
126
|
};
|
|
127
127
|
|
|
128
128
|
export { AppIdentityError };
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-WCCMRVZF.js.map
|
|
130
|
+
//# sourceMappingURL=chunk-WCCMRVZF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/appidentity/errors.ts"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/appidentity/errors.ts"],"names":[],"mappings":"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","file":"chunk-WCCMRVZF.js","sourcesContent":["/**\n * Application Identity Errors\n *\n * Module-specific error classes for identity operations\n */\n\nimport { FulmenError, type FulmenErrorData } from \"../errors/index.js\";\nimport type { SchemaValidationDiagnostic } from \"../schema/types.js\";\n\n/**\n * Base error class for app identity operations\n */\nexport class AppIdentityError extends FulmenError {\n public readonly identityPath?: string;\n\n constructor(message: string, identityPath?: string, cause?: Error) {\n // Build FulmenErrorData\n let errorData: FulmenErrorData;\n\n if (cause) {\n errorData = FulmenError.fromError(cause, {\n code: \"APP_IDENTITY_ERROR\",\n severity: \"high\",\n context: { identityPath },\n }).data;\n } else {\n errorData = {\n code: \"APP_IDENTITY_ERROR\",\n message,\n severity: \"high\",\n timestamp: new Date().toISOString(),\n context: { identityPath },\n };\n }\n\n super(errorData);\n this.name = \"AppIdentityError\";\n this.identityPath = identityPath;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AppIdentityError);\n }\n }\n\n /**\n * Create error for identity not found\n */\n static notFound(searchedPaths: string[]): AppIdentityError {\n const message = `App identity not found\\nSearched paths:\\n${searchedPaths.map((p) => ` - ${p}`).join(\"\\n\")}`;\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for schema validation failure\n */\n static validationFailed(\n path: string,\n diagnostics: SchemaValidationDiagnostic[],\n ): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = `Invalid app identity: ${path}\\n`;\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n // Include first few diagnostics\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message, path);\n }\n\n /**\n * Create error for environment variable override pointing to missing file\n */\n static envOverrideMissing(envPath: string): AppIdentityError {\n const message = `FULMEN_APP_IDENTITY_PATH points to missing file: ${envPath}\\n`;\n return new AppIdentityError(message, envPath);\n }\n\n /**\n * Create error for YAML parsing failure\n */\n static parseFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to parse identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for file read failure\n */\n static readFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to read identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for embedded identity already registered\n *\n * Uses first-wins semantics - once registered, cannot be replaced\n */\n static alreadyRegistered(): AppIdentityError {\n const message =\n \"Embedded identity already registered. \" +\n \"Registration uses first-wins semantics and cannot be replaced.\";\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for embedded identity YAML parsing failure\n */\n static embeddedParseFailed(cause: Error): AppIdentityError {\n const message = `Failed to parse embedded identity YAML: ${cause.message}`;\n return new AppIdentityError(message, undefined, cause);\n }\n\n /**\n * Create error for embedded identity schema validation failure\n */\n static embeddedValidationFailed(diagnostics: SchemaValidationDiagnostic[]): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = \"Invalid embedded identity\\n\";\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message);\n }\n}\n"]}
|
package/dist/config/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { metrics, compileSchema, validateData } from '../chunk-
|
|
1
|
+
import { metrics, compileSchema, validateData } from '../chunk-SNV5WG5V.js';
|
|
2
2
|
import '../chunk-QCCN6POA.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-56F2EEAG.js';
|
|
4
4
|
import '../chunk-UP2VWCW5.js';
|
|
5
5
|
import { access, mkdir, readFile } from 'fs/promises';
|
|
6
6
|
import { join, isAbsolute, resolve, extname } from 'path';
|
package/dist/crucible/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { suggest } from '../chunk-LWAH2UG7.js';
|
|
2
2
|
import '../chunk-3HISR2XI.js';
|
|
3
3
|
import { parseFrontmatter } from '../chunk-BCO3FUUO.js';
|
|
4
|
-
import { metrics } from '../chunk-
|
|
4
|
+
import { metrics } from '../chunk-SNV5WG5V.js';
|
|
5
5
|
import '../chunk-QCCN6POA.js';
|
|
6
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-56F2EEAG.js';
|
|
7
7
|
import '../chunk-UP2VWCW5.js';
|
|
8
8
|
import { readFile, readdir, stat } from 'fs/promises';
|
|
9
9
|
import { join } from 'path';
|
package/dist/errors/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { FulmenError, LEVEL_TO_SEVERITY, SEVERITY_LEVELS, Severity, VERSION, assertValidErrorData, compareSeverity, extractErrorMessage, extractStackTrace, formatValidationErrors, generateCorrelationId, getDefaultSeverity, getValidationErrors, isCorrelationId, isFulmenError, isFulmenErrorData, isSeverityLevel, isSeverityName, isValidCorrelationId, levelToSeverity, normalizeCorrelationId, serializeError, severityToLevel, validateErrorData } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { FulmenError, LEVEL_TO_SEVERITY, SEVERITY_LEVELS, Severity, VERSION, assertValidErrorData, compareSeverity, extractErrorMessage, extractStackTrace, formatValidationErrors, generateCorrelationId, getDefaultSeverity, getValidationErrors, isCorrelationId, isFulmenError, isFulmenErrorData, isSeverityLevel, isSeverityName, isValidCorrelationId, levelToSeverity, normalizeCorrelationId, serializeError, severityToLevel, validateErrorData } from '../chunk-GOTEQYAD.js';
|
|
2
|
+
import '../chunk-SNV5WG5V.js';
|
|
3
3
|
import '../chunk-QCCN6POA.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-56F2EEAG.js';
|
|
5
5
|
import '../chunk-UP2VWCW5.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { AppIdentityError } from './chunk-WCCMRVZF.js';
|
|
2
|
+
import './chunk-GOTEQYAD.js';
|
|
3
|
+
import './chunk-SNV5WG5V.js';
|
|
4
|
+
import './chunk-QCCN6POA.js';
|
|
5
|
+
import './chunk-56F2EEAG.js';
|
|
6
|
+
import './chunk-UP2VWCW5.js';
|
|
7
|
+
//# sourceMappingURL=errors-R7ZODJXS.js.map
|
|
8
|
+
//# sourceMappingURL=errors-R7ZODJXS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"errors-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"errors-R7ZODJXS.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"export-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"export-EA3RNQNS.js"}
|
package/dist/foundry/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export { ConfigReloadTracker, SignalManager, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getFallbackMetadata, getHttpFallbackGuidance, getWindowTimeRemaining, handleDoubleTap, handleWindowsFallback, isWithinWindow, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap } from '../chunk-
|
|
1
|
+
export { ConfigReloadTracker, SignalManager, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getFallbackMetadata, getHttpFallbackGuidance, getWindowTimeRemaining, handleDoubleTap, handleWindowsFallback, isWithinWindow, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap } from '../chunk-QGTNV4U2.js';
|
|
2
2
|
export { EXIT_CODES_VERSION, SimplifiedMode, exitCodeMetadata, exitCodes, getExitCodeInfo, getPlatform, getPlatformCapabilities, getSimplifiedCodeDescription, getSimplifiedCodes, isPOSIX, isWindows, mapExitCodeToSimplified, supportsSignalExitCodes } from '../chunk-RSLFR4TO.js';
|
|
3
|
-
import { ensureFoundryAssetsRegistered } from '../chunk-
|
|
4
|
-
export { getBehavior, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities as getSignalPlatformCapabilities, getSignalsVersion, getWindowsEvent, isPOSIX as isSignalPOSIX, isWindows as isSignalWindows, listBehaviors, listSignals, supportsSignal, supportsSignalExitCodes as supportsSignalBasedExitCodes } from '../chunk-
|
|
3
|
+
import { ensureFoundryAssetsRegistered } from '../chunk-24BAF63H.js';
|
|
4
|
+
export { getBehavior, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities as getSignalPlatformCapabilities, getSignalsVersion, getWindowsEvent, isPOSIX as isSignalPOSIX, isWindows as isSignalWindows, listBehaviors, listSignals, supportsSignal, supportsSignalExitCodes as supportsSignalBasedExitCodes } from '../chunk-24BAF63H.js';
|
|
5
5
|
import '../chunk-HY6JQOFN.js';
|
|
6
6
|
export { casefold, distance, equalsIgnoreCase, normalize, score, stripAccents, suggest } from '../chunk-LWAH2UG7.js';
|
|
7
7
|
import { FoundryCatalogError } from '../chunk-3HISR2XI.js';
|
|
8
8
|
export { FoundryCatalogError } from '../chunk-3HISR2XI.js';
|
|
9
|
-
import { validateDataBySchemaId } from '../chunk-
|
|
9
|
+
import { validateDataBySchemaId } from '../chunk-SNV5WG5V.js';
|
|
10
10
|
import '../chunk-QCCN6POA.js';
|
|
11
|
-
import { getAssetResolver } from '../chunk-
|
|
11
|
+
import { getAssetResolver } from '../chunk-56F2EEAG.js';
|
|
12
12
|
import '../chunk-UP2VWCW5.js';
|
|
13
13
|
import { parse } from 'yaml';
|
|
14
14
|
import { readFile } from 'fs/promises';
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,6 @@ import './types-DdoeE7F5.js';
|
|
|
12
12
|
* Provides ergonomic access to Crucible SSOT assets and core utilities
|
|
13
13
|
* for TypeScript/Node.js applications in the FulmenHQ ecosystem.
|
|
14
14
|
*/
|
|
15
|
-
declare const VERSION = "0.4.
|
|
15
|
+
declare const VERSION = "0.4.1";
|
|
16
16
|
|
|
17
17
|
export { VERSION };
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
export { ERROR_CODES, FULPACK_VERSION, FulpackOperationError, checkDecompressionBomb, create, createFulpackError, extract, hasPathTraversal, info, isAbsolutePath, scan, validatePath, verify } from './chunk-P3DNOZOG.js';
|
|
2
|
-
export { buildEnvVar, getBinaryName, getConfigIdentifiers, getConfigName, getEnvPrefix, getEnvVar, getTelemetryNamespace, getVendor } from './chunk-
|
|
3
|
-
export { APP_IDENTITY_DIR, APP_IDENTITY_ENV_VAR, APP_IDENTITY_FILENAME, APP_IDENTITY_SCHEMA_ID, MAX_ANCESTOR_SEARCH_DEPTH, clearEmbeddedIdentity, clearIdentityCache, getCachedIdentity, getEmbeddedIdentity, hasEmbeddedIdentity, loadIdentity, registerEmbeddedIdentity } from './chunk-
|
|
4
|
-
export { AppIdentityError } from './chunk-
|
|
2
|
+
export { buildEnvVar, getBinaryName, getConfigIdentifiers, getConfigName, getEnvPrefix, getEnvVar, getTelemetryNamespace, getVendor } from './chunk-LMNAUTW7.js';
|
|
3
|
+
export { APP_IDENTITY_DIR, APP_IDENTITY_ENV_VAR, APP_IDENTITY_FILENAME, APP_IDENTITY_SCHEMA_ID, MAX_ANCESTOR_SEARCH_DEPTH, clearEmbeddedIdentity, clearIdentityCache, getCachedIdentity, getEmbeddedIdentity, hasEmbeddedIdentity, loadIdentity, registerEmbeddedIdentity } from './chunk-VJIGX7MH.js';
|
|
4
|
+
export { AppIdentityError } from './chunk-WCCMRVZF.js';
|
|
5
5
|
export { buildRuntimeInfo } from './chunk-HY6JQOFN.js';
|
|
6
6
|
export { ArchiveFormat, EntryType, Operation } from './chunk-PQ6TKPUN.js';
|
|
7
7
|
export { DocScribeError, DocScribeParseError, DocScribeUnsupportedFormatError, __internal, detectFormat, extractHeaders, extractMetadata, inspectDocument, normalizeInput, parseFrontmatter, splitDocuments, stripFrontmatter } from './chunk-BCO3FUUO.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
8
|
+
import './chunk-GOTEQYAD.js';
|
|
9
|
+
import './chunk-SNV5WG5V.js';
|
|
10
10
|
import './chunk-QCCN6POA.js';
|
|
11
|
-
import './chunk-
|
|
11
|
+
import './chunk-56F2EEAG.js';
|
|
12
12
|
import './chunk-UP2VWCW5.js';
|
|
13
13
|
|
|
14
14
|
// src/index.ts
|
|
15
|
-
var VERSION = "0.4.
|
|
15
|
+
var VERSION = "0.4.1";
|
|
16
16
|
|
|
17
17
|
export { VERSION };
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAOO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * TSFulmen - TypeScript Fulmen Helper Library\n *\n * Provides ergonomic access to Crucible SSOT assets and core utilities\n * for TypeScript/Node.js applications in the FulmenHQ ecosystem.\n */\n\nexport const VERSION = \"0.4.
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAOO,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["/**\n * TSFulmen - TypeScript Fulmen Helper Library\n *\n * Provides ergonomic access to Crucible SSOT assets and core utilities\n * for TypeScript/Node.js applications in the FulmenHQ ecosystem.\n */\n\nexport const VERSION = \"0.4.1\";\n\nexport * from \"./appidentity/index.js\";\nexport * from \"./docscribe/index.js\";\n\n// Core modules will be exported here as they are implemented\n// export * from './config/index.js';\n// export * from './crucible/index.js';\n// export * from './errors/index.js';\n// export * from './logging/index.js';\n// export * from './schema/index.js';\n// export * from './telemetry/index.js';\nexport * from \"./fulpack/index.js\";\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { clearIdentityCache, getCachedIdentity, loadIdentity } from './chunk-VJIGX7MH.js';
|
|
2
|
+
import './chunk-WCCMRVZF.js';
|
|
3
|
+
import './chunk-GOTEQYAD.js';
|
|
4
|
+
import './chunk-SNV5WG5V.js';
|
|
5
|
+
import './chunk-QCCN6POA.js';
|
|
6
|
+
import './chunk-56F2EEAG.js';
|
|
7
|
+
import './chunk-UP2VWCW5.js';
|
|
8
|
+
//# sourceMappingURL=loader-VP2ZIC4O.js.map
|
|
9
|
+
//# sourceMappingURL=loader-VP2ZIC4O.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"loader-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"loader-VP2ZIC4O.js"}
|
package/dist/pathfinder/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createStreamHasher } from '../chunk-WSMVLWLB.js';
|
|
2
2
|
import '../chunk-OHE2AOH4.js';
|
|
3
|
-
import { FulmenError, generateCorrelationId } from '../chunk-
|
|
4
|
-
import { metrics, compileSchemaById, validateDataBySchemaId } from '../chunk-
|
|
3
|
+
import { FulmenError, generateCorrelationId } from '../chunk-GOTEQYAD.js';
|
|
4
|
+
import { metrics, compileSchemaById, validateDataBySchemaId } from '../chunk-SNV5WG5V.js';
|
|
5
5
|
import '../chunk-QCCN6POA.js';
|
|
6
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-56F2EEAG.js';
|
|
7
7
|
import '../chunk-UP2VWCW5.js';
|
|
8
8
|
import { createReadStream, promises } from 'fs';
|
|
9
9
|
import path3, { resolve, dirname, join } from 'path';
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@fastify/forwarded@3.0.1","MIT","https://github.com/fastify/forwarded"
|
|
17
17
|
"@fastify/merge-json-schemas@0.2.1","MIT","https://github.com/fastify/merge-json-schemas"
|
|
18
18
|
"@fastify/proxy-addr@5.1.0","MIT","https://github.com/fastify/proxy-addr"
|
|
19
|
-
"@fulmenhq/tsfulmen@0.4.
|
|
19
|
+
"@fulmenhq/tsfulmen@0.4.1","MIT","https://github.com/fulmenhq/tsfulmen"
|
|
20
20
|
"@isaacs/cliui@8.0.2","ISC","https://github.com/yargs/cliui"
|
|
21
21
|
"@isaacs/fs-minipass@4.0.1","ISC","https://github.com/npm/fs-minipass"
|
|
22
22
|
"@isaacs/string-locale-compare@1.1.0","ISC","https://github.com/isaacs/string-locale-compare"
|
package/dist/schema/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { SchemaRegistry, VERSION2 as VERSION, applyFulmenAjvFormats, clearCache, compareSchemas, compileSchema, compileSchemaById, countDiagnostics, createCLI, createDiagnostic, detectGoneat, exportSchema, formatDiagnostics, formatValidationResult, getCacheSize, getSchema, getSchemaByPath, getSchemaRegistry, groupDiagnosticsBySeverity, hasSchema, isGoneatAvailable, isValidationError, listSchemas, normalizePointer, normalizeSchema, runGoneatValidation, stripProvenance, validateData, validateDataBySchemaId, validateFile, validateFileBySchemaId, validateSchema } from '../chunk-
|
|
1
|
+
export { SchemaRegistry, VERSION2 as VERSION, applyFulmenAjvFormats, clearCache, compareSchemas, compileSchema, compileSchemaById, countDiagnostics, createCLI, createDiagnostic, detectGoneat, exportSchema, formatDiagnostics, formatValidationResult, getCacheSize, getSchema, getSchemaByPath, getSchemaRegistry, groupDiagnosticsBySeverity, hasSchema, isGoneatAvailable, isValidationError, listSchemas, normalizePointer, normalizeSchema, runGoneatValidation, stripProvenance, validateData, validateDataBySchemaId, validateFile, validateFileBySchemaId, validateSchema } from '../chunk-SNV5WG5V.js';
|
|
2
2
|
export { ExportErrorReason, SchemaExportError, SchemaValidationError } from '../chunk-QCCN6POA.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-56F2EEAG.js';
|
|
4
4
|
import '../chunk-UP2VWCW5.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/signals/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { ConfigReloadTracker, SignalManager, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getFallbackMetadata, getHttpFallbackGuidance, getWindowTimeRemaining, handleDoubleTap, handleWindowsFallback, isWithinWindow, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap } from '../chunk-
|
|
2
|
-
export { getBehavior, getPlatform, getPlatformCapabilities, getSignal, getSignalCatalog, getSignalNumber, getSignalsVersion, getWindowsEvent, isPOSIX, isWindows, listBehaviors, listSignals, supportsSignal, supportsSignalExitCodes } from '../chunk-
|
|
1
|
+
export { ConfigReloadTracker, SignalManager, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getFallbackMetadata, getHttpFallbackGuidance, getWindowTimeRemaining, handleDoubleTap, handleWindowsFallback, isWithinWindow, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap } from '../chunk-QGTNV4U2.js';
|
|
2
|
+
export { getBehavior, getPlatform, getPlatformCapabilities, getSignal, getSignalCatalog, getSignalNumber, getSignalsVersion, getWindowsEvent, isPOSIX, isWindows, listBehaviors, listSignals, supportsSignal, supportsSignalExitCodes } from '../chunk-24BAF63H.js';
|
|
3
3
|
import '../chunk-HY6JQOFN.js';
|
|
4
4
|
import '../chunk-3HISR2XI.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-SNV5WG5V.js';
|
|
6
6
|
import '../chunk-QCCN6POA.js';
|
|
7
|
-
import '../chunk-
|
|
7
|
+
import '../chunk-56F2EEAG.js';
|
|
8
8
|
import '../chunk-UP2VWCW5.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import '../../chunk-
|
|
2
|
-
import { getCachedIdentity } from '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
1
|
+
import '../../chunk-LMNAUTW7.js';
|
|
2
|
+
import { getCachedIdentity } from '../../chunk-VJIGX7MH.js';
|
|
3
|
+
import '../../chunk-WCCMRVZF.js';
|
|
4
4
|
import '../../chunk-HY6JQOFN.js';
|
|
5
|
-
import '../../chunk-
|
|
6
|
-
import { metrics } from '../../chunk-
|
|
5
|
+
import '../../chunk-GOTEQYAD.js';
|
|
6
|
+
import { metrics } from '../../chunk-SNV5WG5V.js';
|
|
7
7
|
import '../../chunk-QCCN6POA.js';
|
|
8
|
-
import '../../chunk-
|
|
8
|
+
import '../../chunk-56F2EEAG.js';
|
|
9
9
|
import '../../chunk-UP2VWCW5.js';
|
|
10
10
|
|
|
11
11
|
// src/telemetry/http/route-normalizer.ts
|
package/dist/telemetry/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { Counter, DEFAULT_MS_BUCKETS, Gauge, Histogram, MetricsRegistry, VERSION, assertValidMetricsEvent, formatValidationErrors, getDefaultBuckets, getDefaultUnit, getMetric, getTaxonomy, getValidationErrors, isHistogramSummary, isValidMetricName2 as isValidMetricName, isValidMetricName as isValidMetricNameTaxonomy, isValidMetricUnit, metrics, validateMetricsEvent, validateMetricsEvents } from '../chunk-
|
|
1
|
+
export { Counter, DEFAULT_MS_BUCKETS, Gauge, Histogram, MetricsRegistry, VERSION, assertValidMetricsEvent, formatValidationErrors, getDefaultBuckets, getDefaultUnit, getMetric, getTaxonomy, getValidationErrors, isHistogramSummary, isValidMetricName2 as isValidMetricName, isValidMetricName as isValidMetricNameTaxonomy, isValidMetricUnit, metrics, validateMetricsEvent, validateMetricsEvents } from '../chunk-SNV5WG5V.js';
|
|
2
2
|
import '../chunk-QCCN6POA.js';
|
|
3
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-56F2EEAG.js';
|
|
4
4
|
import '../chunk-UP2VWCW5.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { ADR0007_BUCKETS_MS, ADR0007_BUCKETS_SECONDS, ERROR_HANDLING_METRICS, EXPORTER_LABELS, FOUNDRY_METRICS, FULHASH_METRICS, InvalidLabelNameError, InvalidMetricNameError, MetricRegistrationError, PROMETHEUS_EXPORTER_METRICS, PromClientNotFoundError, PrometheusExporter, PrometheusExporterError, RefreshError, createMetricsHandler, msToSeconds, registerPrometheusShutdown, startMetricsServer, stopMetricsServer } from '../../chunk-
|
|
1
|
+
export { ADR0007_BUCKETS_MS, ADR0007_BUCKETS_SECONDS, ERROR_HANDLING_METRICS, EXPORTER_LABELS, FOUNDRY_METRICS, FULHASH_METRICS, InvalidLabelNameError, InvalidMetricNameError, MetricRegistrationError, PROMETHEUS_EXPORTER_METRICS, PromClientNotFoundError, PrometheusExporter, PrometheusExporterError, RefreshError, createMetricsHandler, msToSeconds, registerPrometheusShutdown, startMetricsServer, stopMetricsServer } from '../../chunk-7YWACZEJ.js';
|
|
2
2
|
import '../../chunk-5HZEJGZ5.js';
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
3
|
+
import '../../chunk-GOTEQYAD.js';
|
|
4
|
+
import '../../chunk-SNV5WG5V.js';
|
|
5
5
|
import '../../chunk-QCCN6POA.js';
|
|
6
|
-
import '../../chunk-
|
|
6
|
+
import '../../chunk-56F2EEAG.js';
|
|
7
7
|
import '../../chunk-UP2VWCW5.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { clearCache, compileSchema, compileSchemaById, getCacheSize, validateData, validateDataBySchemaId, validateFile, validateFileBySchemaId, validateSchema } from './chunk-
|
|
1
|
+
export { clearCache, compileSchema, compileSchemaById, getCacheSize, validateData, validateDataBySchemaId, validateFile, validateFileBySchemaId, validateSchema } from './chunk-SNV5WG5V.js';
|
|
2
2
|
import './chunk-QCCN6POA.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-56F2EEAG.js';
|
|
4
4
|
import './chunk-UP2VWCW5.js';
|
|
5
|
-
//# sourceMappingURL=validator-
|
|
6
|
-
//# sourceMappingURL=validator-
|
|
5
|
+
//# sourceMappingURL=validator-I3ASDVDB.js.map
|
|
6
|
+
//# sourceMappingURL=validator-I3ASDVDB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"validator-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"validator-I3ASDVDB.js"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/assets/errors.ts","../src/assets/paths.ts","../src/assets/embedded-resolver.ts","../src/assets/fs-resolver.ts","../src/assets/resolver.ts"],"names":["join","baseDir"],"mappings":"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","file":"chunk-BTUS6PZZ.js","sourcesContent":["/**\n * Asset resolution - Error handling\n *\n * Custom error classes for SSOT asset resolution (filesystem or embedded).\n */\n\nexport class AssetResolutionError extends Error {\n constructor(\n message: string,\n public readonly assetPath?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"AssetResolutionError\";\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AssetResolutionError);\n }\n }\n\n static notFound(assetPath: string, mode: string): AssetResolutionError {\n return new AssetResolutionError(`Asset not found (${mode} resolver): ${assetPath}`, assetPath);\n }\n\n static readFailed(assetPath: string, code: string): AssetResolutionError {\n // Reference the logical path + error code only; never interpolate a raw FS\n // error message, which can carry the absolute host path (info disclosure).\n return new AssetResolutionError(`Failed to read asset ${assetPath} (${code})`, assetPath);\n }\n\n static baseDirUnavailable(detail: string): AssetResolutionError {\n return new AssetResolutionError(`No SSOT asset base directory available: ${detail}`);\n }\n}\n","/**\n * Asset resolution - Logical path & pattern validation\n *\n * `./assets` is a public export, so logical paths and glob patterns are\n * caller-controlled. These guards prevent path traversal (reading outside the\n * package root via `..`, absolute paths, or non-POSIX separators) and restrict\n * resolution to the SSOT asset namespaces tsfulmen actually ships.\n */\n\nimport { AssetResolutionError } from \"./errors.js\";\n\n/** Top-level directories that make up the SSOT asset namespace. */\nexport const ASSET_NAMESPACES = [\"schemas\", \"config\", \"docs\"] as const;\n\nfunction rejectCommon(value: string, kind: \"path\" | \"pattern\"): string[] {\n if (!value || value.trim() === \"\") {\n throw new AssetResolutionError(`Asset ${kind} must be a non-empty string`);\n }\n if (value.includes(\"\\\\\")) {\n throw new AssetResolutionError(`Asset ${kind} must be POSIX (no backslashes): ${value}`, value);\n }\n if (value.startsWith(\"/\") || /^[A-Za-z]:/.test(value)) {\n throw new AssetResolutionError(`Asset ${kind} must be relative, got absolute: ${value}`, value);\n }\n const segments = value.split(\"/\");\n for (const seg of segments) {\n if (seg === \"\" || seg === \".\" || seg === \"..\") {\n throw new AssetResolutionError(\n `Asset ${kind} must not contain empty, '.' or '..' segments: ${value}`,\n value,\n );\n }\n }\n return segments;\n}\n\nfunction assertNamespace(value: string, segments: string[], kind: \"path\" | \"pattern\"): void {\n const top = segments[0];\n if (!ASSET_NAMESPACES.includes(top as (typeof ASSET_NAMESPACES)[number])) {\n throw new AssetResolutionError(\n `Asset ${kind} must start with one of ${ASSET_NAMESPACES.join(\"/\")}/ : ${value}`,\n value,\n );\n }\n}\n\n/**\n * Validate a logical asset path. Always rejects traversal/absolute/non-POSIX\n * inputs (the security guard). When `enforceNamespace` (the default — used by the\n * package's own asset resolver), also restricts to the SSOT namespaces. Resolvers\n * pointed at a consumer-supplied `baseDir` pass `enforceNamespace: false` since\n * the consumer owns and scopes that tree. Returns the (unchanged) safe path.\n */\nexport function assertSafeLogicalPath(logicalPath: string, enforceNamespace = true): string {\n const segments = rejectCommon(logicalPath, \"path\");\n if (enforceNamespace) {\n assertNamespace(logicalPath, segments, \"path\");\n }\n return logicalPath;\n}\n\n/**\n * Validate a glob pattern. Always rejects `..`/absolute/backslash patterns; glob\n * metacharacters (`*`, `{}`, etc.) are allowed within segments. Namespace\n * restriction is applied only when `enforceNamespace` (see\n * {@link assertSafeLogicalPath}).\n */\nexport function assertSafePattern(pattern: string, enforceNamespace = true): string {\n const segments = rejectCommon(pattern, \"pattern\");\n if (enforceNamespace) {\n assertNamespace(pattern, segments, \"pattern\");\n }\n return pattern;\n}\n","/**\n * Asset resolution - Embedded backend\n *\n * Reads SSOT assets from generated, build-embedded manifests instead of the\n * filesystem, so loads work inside a `bun --compile` single-file binary (no\n * asset tree on disk). T3 codegen emits per-domain {@link EmbeddedAssetManifest}\n * modules and registers them via {@link registerEmbeddedAssets}; this resolver\n * composes whatever has been registered.\n *\n * Until T3 lands, no manifests are registered, so the embedded resolver is\n * empty — `read()` throws a clear \"not found\" and `list()` returns `[]`.\n */\n\nimport picomatch from \"picomatch\";\nimport { AssetResolutionError } from \"./errors.js\";\nimport { assertSafeLogicalPath, assertSafePattern } from \"./paths.js\";\nimport type { AssetProvenance, AssetResolver, EmbeddedAssetManifest } from \"./types.js\";\n\n/** Process-level registry of embedded asset manifests (composed by domain). */\nconst registeredManifests: EmbeddedAssetManifest[] = [];\n\n/**\n * Monotonic counter bumped on every registration change. The resolver factory\n * folds this into its cache key so a cached embedded resolver is never stale\n * after a domain is registered (entarch watch-item).\n */\nlet registrationVersion = 0;\n\n/** Current registration version (see {@link registrationVersion}). */\nexport function getRegistrationVersion(): number {\n return registrationVersion;\n}\n\n/**\n * Register a generated embedded-asset manifest. Idempotent per domain\n * (re-registering a domain replaces it). Called by generated modules.\n */\nexport function registerEmbeddedAssets(manifest: EmbeddedAssetManifest): void {\n const existing = registeredManifests.findIndex((m) => m.domain === manifest.domain);\n if (existing >= 0) {\n registeredManifests[existing] = manifest;\n } else {\n registeredManifests.push(manifest);\n }\n registrationVersion++;\n}\n\n/** Whether a specific domain has been registered. */\nexport function hasEmbeddedDomain(domain: string): boolean {\n return registeredManifests.some((m) => m.domain === domain);\n}\n\n/** Clear all registered manifests. For testing only. */\nexport function clearEmbeddedAssets(): void {\n registeredManifests.length = 0;\n registrationVersion++;\n}\n\n/** Whether any embedded manifests have been registered. */\nexport function hasEmbeddedAssets(): boolean {\n return registeredManifests.length > 0;\n}\n\n/** Flatten registered manifests into a single logical-path -> content map. */\nfunction buildIndex(): Map<string, string> {\n const index = new Map<string, string>();\n for (const manifest of registeredManifests) {\n for (const [logicalPath, content] of Object.entries(manifest.files)) {\n index.set(logicalPath, content);\n }\n }\n return index;\n}\n\nexport class EmbeddedAssetResolver implements AssetResolver {\n readonly mode = \"embedded\" as const;\n\n // Snapshot the index at construction; resolvers are cheap to recreate and the\n // factory rebuilds when mode changes.\n private readonly index: Map<string, string>;\n\n constructor() {\n this.index = buildIndex();\n }\n\n async read(logicalPath: string): Promise<string> {\n const content = this.index.get(assertSafeLogicalPath(logicalPath));\n if (content === undefined) {\n throw AssetResolutionError.notFound(logicalPath, \"embedded\");\n }\n return content;\n }\n\n async list(patterns: string[]): Promise<string[]> {\n if (patterns.length === 0) {\n return [];\n }\n for (const pattern of patterns) {\n assertSafePattern(pattern);\n }\n const isMatch = picomatch(patterns, { dot: false });\n return Array.from(this.index.keys())\n .filter((key) => isMatch(key))\n .sort();\n }\n\n async has(logicalPath: string): Promise<boolean> {\n try {\n return this.index.has(assertSafeLogicalPath(logicalPath));\n } catch {\n return false;\n }\n }\n\n provenance(): AssetProvenance {\n return { mode: \"embedded\", embeddedCount: this.index.size };\n }\n}\n","/**\n * Asset resolution - Filesystem backend\n *\n * Reads SSOT assets from the on-disk `schemas/crucible-ts` / `config/crucible-ts`\n * trees shipped in the npm package. This is the current (pre-v0.4.0) behavior,\n * now centralized behind the {@link AssetResolver} contract.\n */\n\nimport { access, readFile } from \"node:fs/promises\";\nimport { join, sep } from \"node:path\";\nimport glob from \"fast-glob\";\nimport { AssetResolutionError } from \"./errors.js\";\nimport { assertSafeLogicalPath, assertSafePattern } from \"./paths.js\";\nimport type { AssetProvenance, AssetResolver } from \"./types.js\";\n\n/** Normalize a logical path to POSIX separators (logical paths are always POSIX). */\nfunction toPosix(p: string): string {\n return sep === \"/\" ? p : p.split(sep).join(\"/\");\n}\n\nexport class FsAssetResolver implements AssetResolver {\n readonly mode = \"fs\" as const;\n\n /**\n * @param baseDir Directory logical paths resolve against.\n * @param enforceNamespace Restrict to the SSOT namespaces (schemas/config/docs).\n * Default `true` for the package's own asset tree; pass `false` when `baseDir`\n * is a consumer-supplied tree they scope themselves (traversal guards still apply).\n */\n constructor(\n private readonly baseDir: string,\n private readonly enforceNamespace = true,\n ) {}\n\n private resolve(logicalPath: string): string {\n // Validate before joining — prevents `..`/absolute/non-POSIX traversal out of\n // baseDir via the public `./assets` surface.\n return join(this.baseDir, assertSafeLogicalPath(logicalPath, this.enforceNamespace));\n }\n\n async read(logicalPath: string): Promise<string> {\n const absolute = this.resolve(logicalPath);\n try {\n return await readFile(absolute, \"utf-8\");\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") {\n throw AssetResolutionError.notFound(logicalPath, \"fs\");\n }\n // Reference the logical path + error code only — avoid leaking the absolute\n // host path that a raw FS error message (e.g. EACCES) would carry (secrev).\n throw AssetResolutionError.readFailed(logicalPath, err.code ?? \"unknown\");\n }\n }\n\n async list(patterns: string[]): Promise<string[]> {\n if (patterns.length === 0) {\n return [];\n }\n for (const pattern of patterns) {\n assertSafePattern(pattern, this.enforceNamespace);\n }\n // Patterns are package-root-relative; glob with `cwd: baseDir` and return\n // logical (relative, POSIX) paths so callers never see absolute paths.\n const matches = await glob(patterns, {\n cwd: this.baseDir,\n absolute: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n dot: false,\n });\n return matches.map(toPosix).sort();\n }\n\n async has(logicalPath: string): Promise<boolean> {\n let absolute: string;\n try {\n absolute = this.resolve(logicalPath);\n } catch {\n return false; // invalid/traversing path → not present\n }\n try {\n await access(absolute);\n return true;\n } catch {\n return false;\n }\n }\n\n provenance(): AssetProvenance {\n return { mode: \"fs\", baseDir: this.baseDir };\n }\n\n /** The on-disk base directory this resolver reads from. */\n getBaseDir(): string {\n return this.baseDir;\n }\n}\n","/**\n * Asset resolution - Resolver factory & mode selection\n *\n * Chooses between the filesystem and embedded backends. Default is `auto`:\n * prefer the filesystem when the on-disk asset tree is present/readable, else\n * fall back to embedded generated modules (the `bun --compile` case). The mode\n * can be forced with the `TSFULMEN_ASSET_MODE` env var or an explicit option.\n */\n\nimport { accessSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n EmbeddedAssetResolver,\n getRegistrationVersion,\n hasEmbeddedAssets,\n} from \"./embedded-resolver.js\";\nimport { AssetResolutionError } from \"./errors.js\";\nimport { FsAssetResolver } from \"./fs-resolver.js\";\nimport type { AssetMode, AssetResolver } from \"./types.js\";\n\n/**\n * Marker that identifies the package-root asset tree. Used both to locate the\n * base dir by walking upward and to test FS availability for `auto` selection.\n */\nconst ASSET_ROOT_MARKER = join(\"schemas\", \"crucible-ts\");\n\nfunction dirExists(path: string): boolean {\n try {\n accessSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Find the package-root directory that contains the SSOT asset trees by walking\n * upward from this module. Works for both source (`src/assets/`) and bundled\n * (`dist/`) layouts without hard-coded depths — and returns `null` inside a\n * `bun --compile` binary where no such directory exists on disk.\n */\nexport function findAssetBaseDir(): string | null {\n let dir: string;\n try {\n dir = dirname(fileURLToPath(import.meta.url));\n } catch {\n return null;\n }\n\n // Walk up to the filesystem root looking for the asset-root marker.\n let prev = \"\";\n while (dir !== prev) {\n if (dirExists(join(dir, ASSET_ROOT_MARKER))) {\n return dir;\n }\n prev = dir;\n dir = dirname(dir);\n }\n return null;\n}\n\nfunction readModeFromEnv(): AssetMode | undefined {\n const raw = process.env.TSFULMEN_ASSET_MODE?.trim().toLowerCase();\n if (raw === \"fs\" || raw === \"embedded\" || raw === \"auto\") {\n return raw;\n }\n return undefined;\n}\n\nexport interface ResolveAssetsOptions {\n /** Force a mode. Precedence: explicit option > `TSFULMEN_ASSET_MODE` > `auto`. */\n mode?: AssetMode;\n /** Override the FS base dir (e.g. a consumer's own asset tree). Implies `fs`. */\n baseDir?: string;\n}\n\n/**\n * Build an {@link AssetResolver} for the requested (or auto-detected) mode.\n * Stateless — callers that want a cached instance use {@link getAssetResolver}.\n */\nexport function resolveAssets(options: ResolveAssetsOptions = {}): AssetResolver {\n if (options.baseDir) {\n // Consumer-supplied tree: they scope it, so don't impose the SSOT namespace\n // (traversal guards still apply). Used by e.g. a custom schema-registry baseDir.\n return new FsAssetResolver(options.baseDir, false);\n }\n\n const requested: AssetMode = options.mode ?? readModeFromEnv() ?? \"auto\";\n\n if (requested === \"fs\") {\n const baseDir = findAssetBaseDir();\n if (!baseDir) {\n throw AssetResolutionError.baseDirUnavailable(\n \"mode=fs but no on-disk asset tree found (use mode=embedded in a compiled binary)\",\n );\n }\n return new FsAssetResolver(baseDir);\n }\n\n if (requested === \"embedded\") {\n return new EmbeddedAssetResolver();\n }\n\n // auto: prefer FS when the asset tree is present, else embedded.\n const baseDir = findAssetBaseDir();\n if (baseDir) {\n return new FsAssetResolver(baseDir);\n }\n if (hasEmbeddedAssets()) {\n return new EmbeddedAssetResolver();\n }\n throw AssetResolutionError.baseDirUnavailable(\n \"auto: no on-disk asset tree and no embedded assets registered\",\n );\n}\n\nlet cached: AssetResolver | undefined;\nlet cachedKey: string | undefined;\n\n/**\n * Cached resolver keyed on the effective options. Most call sites should use\n * this; pass fresh options (or different env) to rebuild.\n */\nexport function getAssetResolver(options: ResolveAssetsOptions = {}): AssetResolver {\n const key = JSON.stringify({\n mode: options.mode ?? readModeFromEnv() ?? \"auto\",\n baseDir: options.baseDir ?? null,\n // Fold in the registration version so a cached embedded resolver rebuilds\n // after a domain is registered (e.g. via ensureEmbeddedDomain).\n reg: getRegistrationVersion(),\n });\n if (!cached || cachedKey !== key) {\n cached = resolveAssets(options);\n cachedKey = key;\n }\n return cached;\n}\n\n/** Reset the cached resolver. For testing / after registering embedded assets. */\nexport function resetAssetResolver(): void {\n cached = undefined;\n cachedKey = undefined;\n}\n\n// Embedded-asset registration is STATIC PER-SUBPATH (entarch-sanctioned fallback;\n// see planning/tsfulmen/v040-shaping.md §0.7). Each feature subpath statically\n// imports + registers only its own domain manifest, so a foundry/schema/taxonomy\n// consumer's published bundle carries only the assets it uses — and the `./assets`\n// core (this module) references NO generated content, keeping dist/assets/index.js\n// lean. (Dynamic per-domain lazy loading would require global tsup `splitting`,\n// which we deliberately avoid.) Cache stays correct because registerEmbeddedAssets\n// bumps a version that getAssetResolver folds into its cache key.\n"]}
|
package/dist/errors-RBJX6ETJ.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { AppIdentityError } from './chunk-W6TQFTTY.js';
|
|
2
|
-
import './chunk-CW4CSNVF.js';
|
|
3
|
-
import './chunk-7SVYOPJ3.js';
|
|
4
|
-
import './chunk-QCCN6POA.js';
|
|
5
|
-
import './chunk-BTUS6PZZ.js';
|
|
6
|
-
import './chunk-UP2VWCW5.js';
|
|
7
|
-
//# sourceMappingURL=errors-RBJX6ETJ.js.map
|
|
8
|
-
//# sourceMappingURL=errors-RBJX6ETJ.js.map
|
package/dist/export-BWRETGYS.js
DELETED
package/dist/loader-H5K7HSO5.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { clearIdentityCache, getCachedIdentity, loadIdentity } from './chunk-BJDL6JEX.js';
|
|
2
|
-
import './chunk-W6TQFTTY.js';
|
|
3
|
-
import './chunk-CW4CSNVF.js';
|
|
4
|
-
import './chunk-7SVYOPJ3.js';
|
|
5
|
-
import './chunk-QCCN6POA.js';
|
|
6
|
-
import './chunk-BTUS6PZZ.js';
|
|
7
|
-
import './chunk-UP2VWCW5.js';
|
|
8
|
-
//# sourceMappingURL=loader-H5K7HSO5.js.map
|
|
9
|
-
//# sourceMappingURL=loader-H5K7HSO5.js.map
|