@sdcorejs/angular 21.2.0 → 21.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdcorejs-angular-components-api-contract-builder.mjs","sources":["../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.model.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.configuration.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.expression.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.schema.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.serializer.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.validation.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract.samples.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-diagnostic-list.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-node-summary.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-source-editor.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-node-drawer.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-node-editor.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-node-editor.component.html","../../../projects/sdcorejs-angular/components/api-contract-builder/src/components/api-contract-record-editor.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract-builder.component.ts","../../../projects/sdcorejs-angular/components/api-contract-builder/src/api-contract-builder.component.html","../../../projects/sdcorejs-angular/components/api-contract-builder/sdcorejs-angular-components-api-contract-builder.ts"],"sourcesContent":["import type { SdTemporalValueTransform } from '@sdcorejs/angular/forms/models';\n\n/**\n * Data-type vocabulary of an API contract.\n *\n * Deliberately NOT reusing `SdQueryBuilderFieldType`: that union describes *filterable* fields in a\n * query UI, this one describes the *shape of transported data*. They drift for different reasons.\n *\n * `date` / `datetime` are **logical** types — in the persisted JSON they are transported as strings,\n * never as a JavaScript `Date`.\n */\nexport type SdApiContractDataType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'object' | 'array';\n\n/** Every type that carries a single value (no `properties`, no `items`). */\nexport type SdApiContractScalarDataType = Exclude<SdApiContractDataType, 'object' | 'array'>;\n\n/** Types that may appear as a temporal node and therefore accept `transform`. */\nexport type SdApiContractTemporalDataType = Extract<SdApiContractDataType, 'date' | 'datetime'>;\n\nexport const SD_API_CONTRACT_DATA_TYPES: readonly SdApiContractDataType[] = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'object',\n 'array',\n];\n\nexport const SD_API_CONTRACT_SCALAR_DATA_TYPES: readonly SdApiContractScalarDataType[] = [\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n];\n\nexport function sdIsApiContractDataType(value: unknown): value is SdApiContractDataType {\n return typeof value === 'string' && (SD_API_CONTRACT_DATA_TYPES as readonly string[]).includes(value);\n}\n\nexport function sdIsApiContractScalarDataType(value: unknown): value is SdApiContractScalarDataType {\n return typeof value === 'string' && (SD_API_CONTRACT_SCALAR_DATA_TYPES as readonly string[]).includes(value);\n}\n\nexport function sdIsApiContractTemporalDataType(value: unknown): value is SdApiContractTemporalDataType {\n return value === 'date' || value === 'datetime';\n}\n\n/**\n * Anything a static literal may be. Mirrors what `JSON.parse` can produce, so a contract always\n * round-trips through `JSON.stringify` without losing information.\n */\nexport type SdApiContractJsonValue =\n | string\n | number\n | boolean\n | null\n | SdApiContractJsonValue[]\n | { [key: string]: SdApiContractJsonValue };\n\n/**\n * Shared by every node in every layer.\n *\n * `required` is a **tri-state** and lives next to `type` (never a `required: string[]` array on the\n * parent object, the way JSON Schema does it): `undefined` = not declared, `true` = mandatory,\n * `false` = explicitly optional. The serializer omits `undefined` and keeps `false`.\n */\nexport interface SdApiContractNodeBase {\n required?: boolean;\n label?: string;\n description?: string;\n}\n\n/**\n * The two mutually exclusive ways a mapped node receives a value.\n *\n * - `source` — a template referencing `${input.*}` / `${env.*}` / `${res.*}`.\n * - `value` — a static JSON literal.\n *\n * A node carrying both is invalid (`mapping.source-and-value`).\n */\nexport interface SdApiContractMapping {\n source?: string;\n value?: SdApiContractJsonValue;\n}\n\n// ---------------------------------------------------------------------------\n// Frontend schema nodes — `input.schema`\n// ---------------------------------------------------------------------------\n\nexport interface SdApiContractFeScalarNode extends SdApiContractNodeBase {\n type: SdApiContractScalarDataType;\n /** Only meaningful on `date` / `datetime`; reused verbatim from the temporal form controls. */\n transform?: SdTemporalValueTransform;\n}\n\nexport interface SdApiContractFeObjectNode extends SdApiContractNodeBase {\n type: 'object';\n properties: Record<string, SdApiContractFeSchemaNode>;\n}\n\nexport interface SdApiContractFeArrayNode extends SdApiContractNodeBase {\n type: 'array';\n items: SdApiContractFeSchemaNode;\n}\n\n/** A pure declaration — no `source` / `value`, because `input` is what the caller hands in. */\nexport type SdApiContractFeSchemaNode = SdApiContractFeScalarNode | SdApiContractFeObjectNode | SdApiContractFeArrayNode;\n\n// ---------------------------------------------------------------------------\n// REST declaration nodes — `res.headers`, `res.body`\n// ---------------------------------------------------------------------------\n\nexport interface SdApiContractRestScalarNode extends SdApiContractNodeBase {\n type: SdApiContractScalarDataType;\n}\n\nexport interface SdApiContractRestObjectNode extends SdApiContractNodeBase {\n type: 'object';\n properties: Record<string, SdApiContractRestNode>;\n}\n\nexport interface SdApiContractRestArrayNode extends SdApiContractNodeBase {\n type: 'array';\n items: SdApiContractRestNode;\n}\n\n/** Describes what the backend returns. Never carries a mapping — nothing maps *into* a response. */\nexport type SdApiContractRestNode = SdApiContractRestScalarNode | SdApiContractRestObjectNode | SdApiContractRestArrayNode;\n\n// ---------------------------------------------------------------------------\n// Mapped REST nodes — `req.path`, `req.query`, `req.headers`, `req.body`\n// ---------------------------------------------------------------------------\n\nexport interface SdApiContractMappedRestScalarNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: SdApiContractScalarDataType;\n}\n\nexport interface SdApiContractMappedRestObjectNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: 'object';\n /** Omitted when the whole object is mapped through `source` / `value`. */\n properties?: Record<string, SdApiContractMappedRestNode>;\n}\n\nexport interface SdApiContractMappedRestArrayNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: 'array';\n /** Describes the element type. Per-item projection is intentionally out of scope. */\n items: SdApiContractMappedRestNode;\n}\n\nexport type SdApiContractMappedRestNode =\n | SdApiContractMappedRestScalarNode\n | SdApiContractMappedRestObjectNode\n | SdApiContractMappedRestArrayNode;\n\n// ---------------------------------------------------------------------------\n// Mapped frontend nodes — `output.schema`\n// ---------------------------------------------------------------------------\n\nexport interface SdApiContractMappedFeScalarNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: SdApiContractScalarDataType;\n transform?: SdTemporalValueTransform;\n}\n\nexport interface SdApiContractMappedFeObjectNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: 'object';\n properties?: Record<string, SdApiContractMappedFeSchemaNode>;\n}\n\nexport interface SdApiContractMappedFeArrayNode extends SdApiContractNodeBase, SdApiContractMapping {\n type: 'array';\n items: SdApiContractMappedFeSchemaNode;\n}\n\nexport type SdApiContractMappedFeSchemaNode =\n | SdApiContractMappedFeScalarNode\n | SdApiContractMappedFeObjectNode\n | SdApiContractMappedFeArrayNode;\n\n/** Structural union of every node shape, for utilities that traverse any layer. */\nexport type SdApiContractAnyNode =\n | SdApiContractFeSchemaNode\n | SdApiContractRestNode\n | SdApiContractMappedRestNode\n | SdApiContractMappedFeSchemaNode;\n\n// ---------------------------------------------------------------------------\n// Request / response\n// ---------------------------------------------------------------------------\n\nexport type SdApiContractHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\nexport const SD_API_CONTRACT_HTTP_METHODS: readonly SdApiContractHttpMethod[] = [\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'HEAD',\n 'OPTIONS',\n];\n\nexport function sdIsApiContractHttpMethod(value: unknown): value is SdApiContractHttpMethod {\n return typeof value === 'string' && (SD_API_CONTRACT_HTTP_METHODS as readonly string[]).includes(value);\n}\n\n/**\n * The real HTTP request. No `.schema` wrapper on purpose — `req` *is* REST, so it exposes REST\n * structure directly, while `input` / `output` are frontend contracts and keep their `.schema`.\n */\nexport interface SdApiContractRequest {\n method: SdApiContractHttpMethod;\n /** May interpolate `${env.*}` and carry REST placeholders such as `{id}`. */\n url: string;\n path?: Record<string, SdApiContractMappedRestNode>;\n query?: Record<string, SdApiContractMappedRestNode>;\n headers?: Record<string, SdApiContractMappedRestNode>;\n body?: SdApiContractMappedRestNode;\n}\n\nexport interface SdApiContractResponse {\n /** One success status, or several. Each must be an integer in `100..599`. */\n status: number | number[];\n headers?: Record<string, SdApiContractRestNode>;\n body?: SdApiContractRestNode;\n}\n\n// ---------------------------------------------------------------------------\n// Contract\n// ---------------------------------------------------------------------------\n\n/** The only `contractVersion` this release understands. */\nexport const SD_API_CONTRACT_VERSION = 1;\n\nexport interface SdApiContract {\n contractVersion: 1;\n code: string;\n name: string;\n description?: string;\n input: { schema: SdApiContractFeSchemaNode };\n req: SdApiContractRequest;\n res: SdApiContractResponse;\n output: { schema: SdApiContractMappedFeSchemaNode };\n}\n\n// ---------------------------------------------------------------------------\n// Diagnostics\n// ---------------------------------------------------------------------------\n\nexport type SdApiContractDiagnosticSeverity = 'error' | 'warning';\n\nexport interface SdApiContractDiagnostic {\n /** Stable machine-readable identifier, e.g. `mapping.env.unknown`. Safe to switch on. */\n code: string;\n severity: SdApiContractDiagnosticSeverity;\n /** Structural path into the contract, e.g. `req.body.properties.x`. Never localized. */\n path: string;\n /** Human-readable, English. The UI localizes by `code` when it wants a translated string. */\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Expression contexts\n// ---------------------------------------------------------------------------\n\n/** Roots an expression may address. `output` is never a root — nothing reads from the output. */\nexport type SdApiContractExpressionRoot = 'input' | 'env' | 'res';\n\nexport const SD_API_CONTRACT_EXPRESSION_ROOTS: readonly SdApiContractExpressionRoot[] = ['input', 'env', 'res'];\n\n/**\n * Where a mapping lives, which decides the roots it may read.\n *\n * - `request` (`req.url` / `path` / `query` / `headers` / `body`) → `input`, `env`.\n * - `output` (`output.schema`) → `res`, `input`, `env`.\n */\nexport type SdApiContractMappingContext = 'request' | 'output';\n\nexport const SD_API_CONTRACT_ALLOWED_ROOTS: Readonly<Record<SdApiContractMappingContext, readonly SdApiContractExpressionRoot[]>> = {\n request: ['input', 'env'],\n output: ['res', 'input', 'env'],\n};\n","import { InjectionToken, makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\nimport type { SdApiContractScalarDataType } from './api-contract.model';\n\n/**\n * Declaration of one global variable a contract may reference as `${env.<key>}`.\n *\n * Definition only — **never a value**. The builder is a design-time tool: it must be able to\n * autocomplete and validate `${env.token}` without the token itself ever entering the app, the\n * component, or the persisted JSON.\n */\nexport interface SdApiContractEnvironmentVariable {\n /** Composite env variables are not supported — a global is always a single scalar. */\n type: SdApiContractScalarDataType;\n label?: string;\n description?: string;\n /**\n * Marks a secret (token, api key). The UI badges it and never previews a value — there is no\n * value to preview, so this is purely an authoring signal.\n */\n sensitive?: boolean;\n}\n\nexport interface SdApiContractConfiguration {\n env: Record<string, SdApiContractEnvironmentVariable>;\n}\n\n/** What the builder falls back to when the host application provides no configuration. */\nexport const SD_API_CONTRACT_EMPTY_CONFIGURATION: SdApiContractConfiguration = Object.freeze({ env: Object.freeze({}) });\n\nexport const SD_API_CONTRACT_CONFIGURATION = new InjectionToken<SdApiContractConfiguration>('sd-api-contract.configuration');\n\n/**\n * Registers the env catalog available to every `<sd-api-contract-builder>` in the injector.\n *\n * ```ts\n * provideSdApiContract({\n * env: {\n * baseUrl: { type: 'string', label: 'Backend base URL' },\n * token: { type: 'string', label: 'Access token', sensitive: true },\n * },\n * });\n * ```\n */\nexport function provideSdApiContract(configuration: SdApiContractConfiguration): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: SD_API_CONTRACT_CONFIGURATION, useValue: configuration }]);\n}\n\n/** Normalizes an optionally-injected configuration into one that is always safe to read. */\nexport function resolveSdApiContractConfiguration(\n configuration: SdApiContractConfiguration | null | undefined\n): SdApiContractConfiguration {\n if (!configuration || typeof configuration !== 'object' || !configuration.env || typeof configuration.env !== 'object') {\n return SD_API_CONTRACT_EMPTY_CONFIGURATION;\n }\n return configuration;\n}\n","import { SD_API_CONTRACT_EXPRESSION_ROOTS, type SdApiContractExpressionRoot } from './api-contract.model';\n\n/**\n * How a `source` string relates to the expression grammar.\n *\n * - `literal` — no `${…}` at all.\n * - `exact` — the whole string is one expression, so the referenced value keeps its own type.\n * - `interpolated` — expressions embedded in surrounding text, so the result is always a string.\n */\nexport type SdApiContractTemplateKind = 'literal' | 'exact' | 'interpolated';\n\nexport type SdApiContractTemplateErrorCode =\n | 'template.unterminated'\n | 'template.nested'\n | 'template.empty'\n | 'template.invalid-path'\n | 'template.unknown-root'\n | 'template.forbidden-segment';\n\nexport interface SdApiContractTemplateError {\n code: SdApiContractTemplateErrorCode;\n message: string;\n /** Offset of the `${` that opened the offending expression. */\n index: number;\n raw: string;\n}\n\nexport interface SdApiContractExpressionReference {\n root: SdApiContractExpressionRoot;\n /** Segments *after* the root. `${input.customer.id}` → `['customer', 'id']`. */\n path: readonly string[];\n /** The inner text, e.g. `input.customer.id`. */\n expression: string;\n /** The full match including delimiters, e.g. `${input.customer.id}`. */\n raw: string;\n start: number;\n end: number;\n}\n\nexport interface SdApiContractTemplate {\n kind: SdApiContractTemplateKind;\n valid: boolean;\n references: readonly SdApiContractExpressionReference[];\n errors: readonly SdApiContractTemplateError[];\n}\n\nconst OPEN = '${';\nconst CLOSE = '}';\n\n// why: chỉ chấp nhận identifier thuần. Mọi thứ khác — `a[0]`, `a.toUpperCase()`, `1 + 1`, `a ? b : c`\n// — trượt regex này và bị từ chối NGAY tại parser, nên không có nhánh nào có thể chạy JavaScript.\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n// why: ba tên này là đường vào prototype chain. Chặn ở parser (không phải ở resolver) để mọi\n// consumer của reference — validator, autocomplete, executor tương lai — đều được bảo vệ như nhau.\nconst FORBIDDEN_SEGMENTS: ReadonlySet<string> = new Set(['__proto__', 'prototype', 'constructor']);\n\ninterface Span {\n open: number;\n close: number;\n raw: string;\n reference: SdApiContractExpressionReference | null;\n}\n\nfunction isKnownRoot(value: string): value is SdApiContractExpressionRoot {\n return (SD_API_CONTRACT_EXPRESSION_ROOTS as readonly string[]).includes(value);\n}\n\n/**\n * Parses a `source` / URL template into references and errors.\n *\n * Pure string scanning — no `eval`, no `new Function`, no expression evaluation of any kind. The\n * grammar accepts exactly `${<root>.<identifier>(.<identifier>)*}` and nothing else.\n */\nexport function parseSdApiContractTemplate(source: unknown): SdApiContractTemplate {\n if (typeof source !== 'string') {\n return { kind: 'literal', valid: true, references: [], errors: [] };\n }\n\n const spans: Span[] = [];\n const errors: SdApiContractTemplateError[] = [];\n let cursor = 0;\n\n while (cursor <= source.length) {\n const open = source.indexOf(OPEN, cursor);\n if (open < 0) break;\n\n const close = source.indexOf(CLOSE, open + OPEN.length);\n if (close < 0) {\n const raw = source.slice(open);\n spans.push({ open, close: source.length - 1, raw, reference: null });\n errors.push({ code: 'template.unterminated', message: `Expression \"${raw}\" is missing its closing \"}\".`, index: open, raw });\n break;\n }\n\n const raw = source.slice(open, close + 1);\n const inner = source.slice(open + OPEN.length, close);\n const error = validateInner(inner, raw, open);\n\n if (error) {\n errors.push(error);\n spans.push({ open, close, raw, reference: null });\n } else {\n const segments = inner.split('.');\n spans.push({\n open,\n close,\n raw,\n reference: {\n root: segments[0] as SdApiContractExpressionRoot,\n path: segments.slice(1),\n expression: inner,\n raw,\n start: open,\n end: close + 1,\n },\n });\n }\n\n cursor = close + 1;\n }\n\n return {\n kind: resolveKind(source, spans),\n valid: errors.length === 0,\n references: spans.map(span => span.reference).filter((reference): reference is SdApiContractExpressionReference => reference !== null),\n errors,\n };\n}\n\n/** The well-formed references of a template. Malformed expressions are dropped, not thrown. */\nexport function extractSdApiContractReferences(source: unknown): readonly SdApiContractExpressionReference[] {\n return parseSdApiContractTemplate(source).references;\n}\n\nfunction validateInner(inner: string, raw: string, index: number): SdApiContractTemplateError | null {\n if (inner.includes(OPEN)) {\n return { code: 'template.nested', message: `Expression \"${raw}\" nests another \"\\${\".`, index, raw };\n }\n if (inner.trim() === '') {\n return { code: 'template.empty', message: 'Expression \"${}\" declares no path.', index, raw };\n }\n\n const segments = inner.split('.');\n // why: kiểm identifier TRƯỚC root — `${input[\"a\"]}` phải báo là path sai, không phải root lạ.\n if (segments.some(segment => !IDENTIFIER.test(segment))) {\n return {\n code: 'template.invalid-path',\n message: `Expression \"${raw}\" is not a plain dotted path of identifiers.`,\n index,\n raw,\n };\n }\n if (segments.length < 2) {\n return {\n code: 'template.invalid-path',\n message: `Expression \"${raw}\" needs a root and at least one segment, e.g. \"\\${env.baseUrl}\".`,\n index,\n raw,\n };\n }\n if (!isKnownRoot(segments[0])) {\n return {\n code: 'template.unknown-root',\n message: `Unknown expression root \"${segments[0]}\" — expected one of ${SD_API_CONTRACT_EXPRESSION_ROOTS.join(', ')}.`,\n index,\n raw,\n };\n }\n const forbidden = segments.slice(1).find(segment => FORBIDDEN_SEGMENTS.has(segment));\n if (forbidden) {\n return { code: 'template.forbidden-segment', message: `Segment \"${forbidden}\" is not addressable.`, index, raw };\n }\n if (segments[0] === 'env' && segments.length !== 2) {\n return {\n code: 'template.invalid-path',\n message: `Environment references address a single key, e.g. \"\\${env.baseUrl}\" — got \"${raw}\".`,\n index,\n raw,\n };\n }\n\n return null;\n}\n\nfunction resolveKind(source: string, spans: readonly Span[]): SdApiContractTemplateKind {\n if (spans.length === 0) return 'literal';\n const only = spans[0];\n const isWholeString = spans.length === 1 && only.reference !== null && only.open === 0 && only.close === source.length - 1;\n return isWholeString ? 'exact' : 'interpolated';\n}\n","import type { SdTemporalValueTransform } from '@sdcorejs/angular/forms/models';\nimport {\n sdIsApiContractTemporalDataType,\n type SdApiContractDataType,\n type SdApiContractExpressionRoot,\n type SdApiContractJsonValue,\n type SdApiContractResponse,\n} from './api-contract.model';\n\n/**\n * Structural view of a node from any layer (`input.schema`, `req.*`, `res.*`, `output.schema`).\n *\n * The traversal utilities are deliberately layer-agnostic: the four public node unions differ only\n * in which members they *allow*, and every one of them is structurally assignable to this shape.\n * Whether a member is legal where it appears is the validator's job, not the traversal's.\n */\nexport interface SdApiContractStructuralNode {\n type: SdApiContractDataType;\n required?: boolean;\n label?: string;\n description?: string;\n transform?: SdTemporalValueTransform;\n source?: string;\n value?: SdApiContractJsonValue;\n properties?: Record<string, SdApiContractStructuralNode>;\n items?: SdApiContractStructuralNode;\n}\n\n/** A node narrowed to the object shape, so `properties` is safe to read. */\nexport interface SdApiContractObjectShape extends SdApiContractStructuralNode {\n type: 'object';\n properties: Record<string, SdApiContractStructuralNode>;\n}\n\n/**\n * Structural pointer into a node tree: alternating `'properties', <key>` and `'items'` segments.\n * The same shape the diagnostics use, so a diagnostic path can drive navigation in the UI.\n */\nexport type SdApiContractNodePointer = readonly string[];\n\n/**\n * One addressable field discovered by traversal.\n *\n * **Path convention:** dot-joined property names. Array items are *flattened under the array's own\n * path* (`items.id`, and for a root array simply `id`), which is what a dropdown / table consumer\n * wants. Set `arrays: 'stop'` to instead get exactly the set of paths an `${…}` expression can\n * address — expressions never index into an array.\n */\nexport interface SdApiContractSchemaField {\n path: string;\n segments: readonly string[];\n type: SdApiContractDataType;\n required?: boolean;\n label?: string;\n description?: string;\n /** `true` when traversal did not descend any further from this field. */\n leaf: boolean;\n /** `true` when the field was reached by descending through an array's `items`. */\n arrayItem: boolean;\n}\n\nexport interface SdApiContractFieldListOptions {\n /** `'flatten'` (default) descends into array items; `'stop'` treats an array as a leaf. */\n arrays?: 'flatten' | 'stop';\n /** Dotted prefix prepended to every emitted path, e.g. `'body'`. */\n basePath?: string;\n}\n\nexport interface SdApiContractResolvedReference {\n type: SdApiContractDataType;\n required?: boolean;\n label?: string;\n description?: string;\n /** `null` for synthetic references such as `res.status`, which have no declared node. */\n node: SdApiContractStructuralNode | null;\n}\n\nexport interface SdApiContractUrlPlaceholders {\n /** Unique placeholder names, in first-appearance order. */\n names: readonly string[];\n duplicates: readonly string[];\n /** Raw fragments that look like a placeholder but are not one, e.g. `{}` or `{first name}`. */\n malformed: readonly string[];\n}\n\n// why: `in` và truy cập trực tiếp đều đi qua prototype chain — `properties['constructor']` trả về\n// hàm dựng của Object chứ không phải undefined. Mọi lần đọc key động trong file này phải qua đây.\nfunction hasOwn(record: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nconst PLACEHOLDER_NAME = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n// ---------------------------------------------------------------------------\n// Traversal\n// ---------------------------------------------------------------------------\n\n/** Flattens a node tree into addressable fields. See `SdApiContractSchemaField` for the convention. */\nexport function listSdApiContractSchemaFields(\n node: SdApiContractStructuralNode,\n options?: SdApiContractFieldListOptions\n): readonly SdApiContractSchemaField[] {\n const flatten = (options?.arrays ?? 'flatten') === 'flatten';\n const base = options?.basePath ? options.basePath.split('.') : [];\n const fields: SdApiContractSchemaField[] = [];\n\n const descendsInto = (candidate: SdApiContractStructuralNode): boolean => {\n if (candidate.type === 'object') return true;\n if (candidate.type !== 'array' || !flatten) return false;\n const items = candidate.items;\n return !!items && (items.type === 'object' || items.type === 'array');\n };\n\n const walk = (current: SdApiContractStructuralNode, segments: readonly string[], arrayItem: boolean): void => {\n if (current.type === 'object') {\n const properties = current.properties;\n if (!properties) return;\n for (const key of Object.keys(properties)) {\n const child = properties[key];\n if (!child) continue;\n const childSegments = [...segments, key];\n fields.push({\n path: childSegments.join('.'),\n segments: childSegments,\n type: child.type,\n required: child.required,\n label: child.label,\n description: child.description,\n leaf: !descendsInto(child),\n arrayItem,\n });\n walk(child, childSegments, arrayItem);\n }\n return;\n }\n if (current.type === 'array' && flatten && current.items) {\n walk(current.items, segments, true);\n }\n };\n\n walk(node, base, false);\n return fields;\n}\n\n/** Every `${res.…}` path the output layer may address, in a stable order. */\nexport function listSdApiContractResponseFields(response: SdApiContractResponse): readonly SdApiContractSchemaField[] {\n const fields: SdApiContractSchemaField[] = [\n { path: 'status', segments: ['status'], type: 'number', required: true, leaf: true, arrayItem: false },\n ];\n\n const headers = response.headers;\n if (headers) {\n for (const key of Object.keys(headers)) {\n const node = headers[key];\n if (!node) continue;\n fields.push({\n path: `headers.${key}`,\n segments: ['headers', key],\n type: node.type,\n required: node.required,\n label: node.label,\n description: node.description,\n leaf: true,\n arrayItem: false,\n });\n }\n }\n\n const body = response.body;\n if (body) {\n fields.push({\n path: 'body',\n segments: ['body'],\n type: body.type,\n required: body.required,\n label: body.label,\n description: body.description,\n leaf: body.type !== 'object',\n arrayItem: false,\n });\n fields.push(...listSdApiContractSchemaFields(body, { arrays: 'stop', basePath: 'body' }));\n }\n\n return fields;\n}\n\n/**\n * Resolves a *logical* reference path (`customer.id`) against a schema.\n *\n * Arrays are terminal: `${res.body.items}` addresses the whole array, `${res.body.items.id}` does\n * not exist because there is no element to address. Per-item projection is out of scope.\n */\nexport function resolveSdApiContractSchemaPath(\n root: SdApiContractStructuralNode,\n path: readonly string[]\n): SdApiContractStructuralNode | null {\n let current: SdApiContractStructuralNode | undefined = root;\n for (const segment of path) {\n if (!current || current.type !== 'object') return null;\n const properties: Record<string, SdApiContractStructuralNode> | undefined = current.properties;\n if (!properties || !hasOwn(properties, segment)) return null;\n current = properties[segment];\n }\n return current ?? null;\n}\n\n/** Resolves `status` / `headers.<name>` / `body.<path>` against a response declaration. */\nexport function resolveSdApiContractResponsePath(\n response: SdApiContractResponse,\n path: readonly string[]\n): SdApiContractResolvedReference | null {\n if (path.length === 0) return null;\n const [section, ...rest] = path;\n\n if (section === 'status') {\n return rest.length === 0 ? { type: 'number', required: true, node: null } : null;\n }\n\n if (section === 'headers') {\n const headers = response.headers;\n if (rest.length !== 1 || !headers || !hasOwn(headers, rest[0])) return null;\n return describe(headers[rest[0]]);\n }\n\n if (section === 'body') {\n const body = response.body;\n if (!body) return null;\n const node = resolveSdApiContractSchemaPath(body, rest);\n return node ? describe(node) : null;\n }\n\n return null;\n}\n\nfunction describe(node: SdApiContractStructuralNode): SdApiContractResolvedReference {\n return { type: node.type, required: node.required, label: node.label, description: node.description, node };\n}\n\n// ---------------------------------------------------------------------------\n// Immutable structural editing\n// ---------------------------------------------------------------------------\n\n/** Reads the node a structural pointer addresses, or `null` when the pointer does not resolve. */\nexport function getSdApiContractNodeAt(\n root: SdApiContractStructuralNode,\n pointer: SdApiContractNodePointer\n): SdApiContractStructuralNode | null {\n let current: SdApiContractStructuralNode | undefined = root;\n for (let index = 0; index < pointer.length; index += 1) {\n if (!current) return null;\n const segment = pointer[index];\n if (segment === 'properties') {\n const key = pointer[index + 1];\n const properties: Record<string, SdApiContractStructuralNode> | undefined = current.properties;\n if (key === undefined || !properties || !hasOwn(properties, key)) return null;\n current = properties[key];\n index += 1;\n } else if (segment === 'items') {\n current = current.items;\n } else {\n return null;\n }\n }\n return current ?? null;\n}\n\n/** Replaces the node a pointer addresses, rebuilding only the spine. Never mutates `root`. */\nexport function setSdApiContractNodeAt<T extends SdApiContractStructuralNode>(\n root: T,\n pointer: SdApiContractNodePointer,\n node: SdApiContractStructuralNode\n): T {\n return replaceAt(root, pointer, 0, node) as T;\n}\n\nfunction replaceAt(\n current: SdApiContractStructuralNode,\n pointer: SdApiContractNodePointer,\n index: number,\n next: SdApiContractStructuralNode\n): SdApiContractStructuralNode {\n if (index >= pointer.length) return next;\n\n const segment = pointer[index];\n if (segment === 'properties') {\n const key = pointer[index + 1];\n const properties = current.properties;\n // why: pointer trỏ vào chỗ không tồn tại thì trả nguyên object cũ — im lặng bỏ qua an toàn hơn\n // là dựng ra nhánh rỗng mà người dùng không hề khai báo.\n if (key === undefined || !properties || !hasOwn(properties, key)) return current;\n return { ...current, properties: { ...properties, [key]: replaceAt(properties[key], pointer, index + 2, next) } };\n }\n\n if (segment === 'items') {\n if (!current.items) return current;\n return { ...current, items: replaceAt(current.items, pointer, index + 1, next) };\n }\n\n return current;\n}\n\n/** Appends a property. A key that already exists is left untouched — the caller must dedupe first. */\nexport function addSdApiContractProperty(\n node: SdApiContractStructuralNode,\n key: string,\n child: SdApiContractStructuralNode\n): SdApiContractObjectShape {\n const properties = node.properties ?? {};\n if (!key || hasOwn(properties, key)) return asObjectShape(node, properties);\n return { ...node, type: 'object', properties: { ...properties, [key]: child } };\n}\n\n/** Renames a property **in place in the key order**, so the JSON diff stays readable. */\nexport function renameSdApiContractProperty(node: SdApiContractStructuralNode, from: string, to: string): SdApiContractObjectShape {\n const properties = node.properties;\n if (!properties || !hasOwn(properties, from) || !to || from === to || hasOwn(properties, to)) {\n return node as SdApiContractObjectShape;\n }\n const next: Record<string, SdApiContractStructuralNode> = {};\n for (const key of Object.keys(properties)) next[key === from ? to : key] = properties[key];\n return { ...node, type: 'object', properties: next };\n}\n\nexport function removeSdApiContractProperty(node: SdApiContractStructuralNode, key: string): SdApiContractObjectShape {\n const properties = node.properties;\n if (!properties || !hasOwn(properties, key)) return node as SdApiContractObjectShape;\n const next: Record<string, SdApiContractStructuralNode> = {};\n for (const existing of Object.keys(properties)) {\n if (existing !== key) next[existing] = properties[existing];\n }\n return { ...node, type: 'object', properties: next };\n}\n\nfunction asObjectShape(\n node: SdApiContractStructuralNode,\n properties: Record<string, SdApiContractStructuralNode>\n): SdApiContractObjectShape {\n return node.type === 'object' && node.properties ? (node as SdApiContractObjectShape) : { ...node, type: 'object', properties };\n}\n\n/** A minimal well-formed node of the given type. */\nexport function createSdApiContractNode(type: SdApiContractDataType): SdApiContractStructuralNode {\n if (type === 'object') return { type: 'object', properties: {} };\n if (type === 'array') return { type: 'array', items: { type: 'string' } };\n return { type };\n}\n\n/**\n * Retypes a node, dropping the members the new type cannot carry.\n *\n * Returns the same reference when the type is unchanged, so an idempotent UI write never produces a\n * spurious `modelChange`.\n */\nexport function changeSdApiContractNodeType(node: SdApiContractStructuralNode, type: SdApiContractDataType): SdApiContractStructuralNode {\n if (node.type === type) return node;\n\n const next: SdApiContractStructuralNode = { type };\n if (node.required !== undefined) next.required = node.required;\n if (node.label !== undefined) next.label = node.label;\n if (node.description !== undefined) next.description = node.description;\n if (node.source !== undefined) next.source = node.source;\n if (node.value !== undefined) next.value = node.value;\n if (node.transform !== undefined && sdIsApiContractTemporalDataType(type)) next.transform = node.transform;\n if (type === 'object') next.properties = {};\n if (type === 'array') next.items = { type: 'string' };\n return next;\n}\n\n/** Deep copy of a node subtree. Used when a response subtree is adopted as the output schema. */\nexport function cloneSdApiContractNode<T extends SdApiContractStructuralNode>(node: T): T {\n return deepClone(node);\n}\n\n/**\n * Deep copy of a whole contract.\n *\n * The builder clones on the way in so the object a parent owns is never reachable from an edit, and\n * a consumer can do the same before handing a contract to anything that might mutate it.\n */\nexport function cloneSdApiContract<T>(contract: T): T {\n return deepClone(contract);\n}\n\n/** Deep copy of any JSON-shaped value. Own enumerable keys only, so nothing inherited leaks in. */\nfunction deepClone<T>(value: T): T {\n if (Array.isArray(value)) return value.map(item => deepClone(item)) as unknown as T;\n if (value && typeof value === 'object') {\n const source = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(source)) out[key] = deepClone(source[key]);\n return out as T;\n }\n return value;\n}\n\n// ---------------------------------------------------------------------------\n// Record helpers (`req.path` / `req.query` / `req.headers` / `res.headers`)\n// ---------------------------------------------------------------------------\n\nexport function sdApiContractRecordSet<T>(record: Record<string, T> | undefined, key: string, value: T): Record<string, T> {\n return { ...(record ?? {}), [key]: value };\n}\n\nexport function sdApiContractRecordRemove<T>(record: Record<string, T>, key: string): Record<string, T> {\n if (!hasOwn(record, key)) return record;\n const next: Record<string, T> = {};\n for (const existing of Object.keys(record)) {\n if (existing !== key) next[existing] = record[existing];\n }\n return next;\n}\n\n/** Renames a key in place. A collision or an empty target is a no-op — the caller reports it. */\nexport function sdApiContractRecordRename<T>(record: Record<string, T>, from: string, to: string): Record<string, T> {\n if (!hasOwn(record, from) || !to || from === to || hasOwn(record, to)) return record;\n const next: Record<string, T> = {};\n for (const key of Object.keys(record)) next[key === from ? to : key] = record[key];\n return next;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\n/** Builds the canonical expression text — the inverse of `parseSdApiContractTemplate`. */\nexport function formatSdApiContractExpression(root: SdApiContractExpressionRoot, path: readonly string[]): string {\n return `\\${${[root, ...path].join('.')}}`;\n}\n\n/** Joins a diagnostic base path with a structural pointer, e.g. `req.body` + `properties.x`. */\nexport function formatSdApiContractPointer(base: string, pointer: SdApiContractNodePointer): string {\n return pointer.length === 0 ? base : `${base}.${pointer.join('.')}`;\n}\n\n/**\n * Reads REST placeholders out of a URL template.\n *\n * `${…}` interpolation is masked out first, so `${env.baseUrl}` is never mistaken for a `{…}`\n * path placeholder.\n */\nexport function parseSdApiContractUrlPlaceholders(url: string): SdApiContractUrlPlaceholders {\n if (typeof url !== 'string') return { names: [], duplicates: [], malformed: [] };\n\n const masked = url.replace(/\\$\\{[^}]*\\}/g, match => ' '.repeat(match.length));\n const names: string[] = [];\n const seen = new Set<string>();\n const duplicates: string[] = [];\n const malformed: string[] = [];\n let cursor = 0;\n\n while (cursor < masked.length) {\n const open = masked.indexOf('{', cursor);\n if (open < 0) break;\n const close = masked.indexOf('}', open + 1);\n if (close < 0) {\n malformed.push(url.slice(open));\n break;\n }\n const inner = masked.slice(open + 1, close);\n if (!PLACEHOLDER_NAME.test(inner)) {\n malformed.push(url.slice(open, close + 1));\n } else if (seen.has(inner)) {\n if (!duplicates.includes(inner)) duplicates.push(inner);\n } else {\n seen.add(inner);\n names.push(inner);\n }\n cursor = close + 1;\n }\n\n return { names, duplicates, malformed };\n}\n","import type { SdApiContract } from './api-contract.model';\n\n/**\n * Deterministic JSON for an API contract.\n *\n * Three guarantees the persisted file depends on:\n *\n * 1. **System keys are ordered**, so two authors editing the same contract produce the same bytes\n * and a `git diff` shows the semantic change instead of a reshuffle.\n * 2. **User-declared keys keep their order** (`properties`, `query`, `headers`, …) — that order is\n * authored information, and sorting it would churn every diff.\n * 3. **Only contract vocabulary survives.** The builder's transient UI state (expansion, selection,\n * internal ids) is dropped by construction: the serializer copies a fixed key whitelist rather\n * than the object it was handed, so a new piece of UI state can never leak into the file.\n *\n * `undefined` members are omitted; declared `false`, `0`, `null` and `\"\"` are kept.\n */\nexport function serializeSdApiContract(contract: SdApiContract | null | undefined): string {\n return JSON.stringify(normalizeContract(contract), null, 2);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction put(target: Record<string, unknown>, key: string, value: unknown): void {\n if (value !== undefined) target[key] = value;\n}\n\nfunction normalizeContract(contract: unknown): unknown {\n if (!isRecord(contract)) return null;\n\n const out: Record<string, unknown> = {};\n put(out, 'contractVersion', contract['contractVersion']);\n put(out, 'code', contract['code']);\n put(out, 'name', contract['name']);\n put(out, 'description', contract['description']);\n put(out, 'input', normalizeSchemaHolder(contract['input']));\n put(out, 'req', normalizeRequest(contract['req']));\n put(out, 'res', normalizeResponse(contract['res']));\n put(out, 'output', normalizeSchemaHolder(contract['output']));\n return out;\n}\n\nfunction normalizeSchemaHolder(holder: unknown): Record<string, unknown> | undefined {\n if (!isRecord(holder)) return undefined;\n const out: Record<string, unknown> = {};\n put(out, 'schema', normalizeNode(holder['schema']));\n return out;\n}\n\nfunction normalizeRequest(request: unknown): Record<string, unknown> | undefined {\n if (!isRecord(request)) return undefined;\n const out: Record<string, unknown> = {};\n put(out, 'method', request['method']);\n put(out, 'url', request['url']);\n put(out, 'path', normalizeNodeRecord(request['path']));\n put(out, 'query', normalizeNodeRecord(request['query']));\n put(out, 'headers', normalizeNodeRecord(request['headers']));\n put(out, 'body', normalizeNode(request['body']));\n return out;\n}\n\nfunction normalizeResponse(response: unknown): Record<string, unknown> | undefined {\n if (!isRecord(response)) return undefined;\n const out: Record<string, unknown> = {};\n put(out, 'status', Array.isArray(response['status']) ? [...(response['status'] as unknown[])] : response['status']);\n put(out, 'headers', normalizeNodeRecord(response['headers']));\n put(out, 'body', normalizeNode(response['body']));\n return out;\n}\n\nfunction normalizeNode(node: unknown): Record<string, unknown> | undefined {\n if (!isRecord(node)) return undefined;\n\n const out: Record<string, unknown> = {};\n put(out, 'type', node['type']);\n put(out, 'required', node['required']);\n put(out, 'label', node['label']);\n put(out, 'description', node['description']);\n put(out, 'transform', node['transform']);\n put(out, 'source', node['source']);\n put(out, 'value', normalizeJsonValue(node['value']));\n put(out, 'properties', normalizeNodeRecord(node['properties']));\n put(out, 'items', normalizeNode(node['items']));\n return out;\n}\n\nfunction normalizeNodeRecord(record: unknown): Record<string, unknown> | undefined {\n if (!isRecord(record)) return undefined;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(record)) {\n const node = normalizeNode(record[key]);\n if (node !== undefined) out[key] = node;\n }\n return out;\n}\n\n// why: static literal là dữ liệu tự do của người dùng — copy nguyên hình dạng (giữ null, 0, '',\n// thứ tự key) thay vì lọc theo whitelist như node.\nfunction normalizeJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(item => normalizeJsonValue(item));\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n const normalized = normalizeJsonValue(value[key]);\n if (normalized !== undefined) out[key] = normalized;\n }\n return out;\n }\n return value;\n}\n","import { sdIsTemporalValueTransform } from '@sdcorejs/angular/forms/models';\nimport {\n resolveSdApiContractConfiguration,\n type SdApiContractConfiguration,\n type SdApiContractEnvironmentVariable,\n} from './api-contract.configuration';\nimport { parseSdApiContractTemplate, type SdApiContractExpressionReference } from './api-contract.expression';\nimport {\n sdIsApiContractDataType,\n sdIsApiContractHttpMethod,\n sdIsApiContractScalarDataType,\n sdIsApiContractTemporalDataType,\n SD_API_CONTRACT_ALLOWED_ROOTS,\n SD_API_CONTRACT_VERSION,\n type SdApiContractDataType,\n type SdApiContractDiagnostic,\n type SdApiContractDiagnosticSeverity,\n type SdApiContractMappingContext,\n} from './api-contract.model';\nimport {\n parseSdApiContractUrlPlaceholders,\n resolveSdApiContractResponsePath,\n resolveSdApiContractSchemaPath,\n type SdApiContractResolvedReference,\n type SdApiContractStructuralNode,\n} from './api-contract.schema';\n\n/**\n * Validates a contract against the grammar, the schema rules, the REST rules and the injected env\n * catalog.\n *\n * Pure and UI-free: it takes `unknown` because an externally supplied contract may be malformed,\n * and it **never repairs anything** — a silent fix would hide the very mistake the author needs to\n * see. Diagnostics come back in a fixed traversal order (metadata → `input` → `req` → `res` →\n * `output`, declaration order within each), so the same contract always yields the same list.\n */\nexport function validateSdApiContract(contract: unknown, configuration?: SdApiContractConfiguration): SdApiContractDiagnostic[] {\n const diagnostics: SdApiContractDiagnostic[] = [];\n\n if (!isRecord(contract)) {\n return [{ code: 'contract.invalid', severity: 'error', path: '', message: 'A contract must be an object.' }];\n }\n\n const env = resolveSdApiContractConfiguration(configuration).env;\n const inputSchema = readSchema(contract['input']);\n const response = isRecord(contract['res']) ? contract['res'] : null;\n\n const push = (code: string, severity: SdApiContractDiagnosticSeverity, path: string, message: string): void => {\n diagnostics.push({ code, severity, path, message });\n };\n\n // -------------------------------------------------------------------------\n // Reference resolution\n // -------------------------------------------------------------------------\n\n const resolveReference = (reference: SdApiContractExpressionReference): SdApiContractResolvedReference | null => {\n if (reference.root === 'env') {\n const key = reference.path[0];\n if (!key || !hasOwn(env, key)) return null;\n const variable: SdApiContractEnvironmentVariable = env[key];\n return { type: variable.type, required: true, label: variable.label, description: variable.description, node: null };\n }\n if (reference.root === 'input') {\n if (!inputSchema) return null;\n const node = resolveSdApiContractSchemaPath(inputSchema, reference.path);\n return node ? { type: node.type, required: node.required, label: node.label, description: node.description, node } : null;\n }\n if (!response) return null;\n return resolveSdApiContractResponsePath(response as never, reference.path);\n };\n\n /** Checks roots and existence for every reference. Returns `false` when a root was rejected. */\n const checkReferences = (\n references: readonly SdApiContractExpressionReference[],\n path: string,\n context: SdApiContractMappingContext\n ): boolean => {\n const allowed = SD_API_CONTRACT_ALLOWED_ROOTS[context];\n let rootsOk = true;\n\n for (const reference of references) {\n if (!allowed.includes(reference.root)) {\n rootsOk = false;\n push(\n 'mapping.root.forbidden',\n 'error',\n path,\n `\"${reference.raw}\" is not readable here — this position accepts ${allowed.map(root => `\\${${root}.…}`).join(', ')}.`\n );\n continue;\n }\n if (resolveReference(reference)) continue;\n if (reference.root === 'env') {\n push(\n 'mapping.env.unknown',\n 'error',\n path,\n `Environment variable \"${reference.path.join('.')}\" is not declared in the injected configuration.`\n );\n } else {\n push('mapping.reference.missing', 'error', path, `\"${reference.raw}\" does not resolve to a declared field.`);\n }\n }\n\n return rootsOk;\n };\n\n // -------------------------------------------------------------------------\n // Node structure — shared by every layer\n // -------------------------------------------------------------------------\n\n const validateStructure = (\n node: Record<string, unknown>,\n path: string,\n allowTransform: boolean,\n requireContainerMembers: boolean\n ): boolean => {\n const type = node['type'];\n if (!sdIsApiContractDataType(type)) {\n push('schema.type.invalid', 'error', path, `\"${String(type)}\" is not a supported data type.`);\n return false;\n }\n\n if (type === 'object' && requireContainerMembers && !isRecord(node['properties'])) {\n push('schema.object.properties.missing', 'error', path, 'An object node must declare \"properties\".');\n }\n if (type === 'array' && !isRecord(node['items'])) {\n push('schema.array.items.missing', 'error', path, 'An array node must declare \"items\".');\n }\n if (sdIsApiContractScalarDataType(type)) {\n if (node['properties'] !== undefined)\n push('schema.scalar.properties.forbidden', 'error', path, `A \"${type}\" node cannot declare \"properties\".`);\n if (node['items'] !== undefined) push('schema.scalar.items.forbidden', 'error', path, `A \"${type}\" node cannot declare \"items\".`);\n }\n\n const required = node['required'];\n if (required !== undefined && typeof required !== 'boolean') {\n push('schema.required.invalid', 'error', path, '\"required\" must be true, false, or omitted.');\n }\n\n const transform = node['transform'];\n if (transform !== undefined) {\n if (!allowTransform || !sdIsApiContractTemporalDataType(type)) {\n push(\n 'schema.transform.invalid',\n 'error',\n path,\n '\"transform\" is only valid on a date or datetime node in input.schema / output.schema.'\n );\n } else if (!sdIsTemporalValueTransform(transform)) {\n push('schema.transform.unknown', 'error', path, `\"${String(transform)}\" is not a known temporal transform.`);\n }\n }\n\n return true;\n };\n\n const checkDuplicateKeysIgnoringCase = (record: Record<string, unknown>, basePath: string): void => {\n const seen = new Map<string, string>();\n for (const key of Object.keys(record)) {\n const normalized = key.trim().toLowerCase();\n if (!normalized) continue;\n const previous = seen.get(normalized);\n if (previous !== undefined) {\n push(\n 'schema.property.key.duplicate',\n 'error',\n `${basePath}.${key}`,\n `\"${key}\" collides with \"${previous}\" — header names are case-insensitive.`\n );\n } else {\n seen.set(normalized, key);\n }\n }\n };\n\n // -------------------------------------------------------------------------\n // Declaration layers — `input.schema`, `res.headers`, `res.body`\n // -------------------------------------------------------------------------\n\n const validateDeclaration = (node: unknown, path: string, allowTransform: boolean): void => {\n if (!isRecord(node)) return;\n if (!validateStructure(node, path, allowTransform, true)) return;\n\n if (node['source'] !== undefined || node['value'] !== undefined) {\n push('schema.mapping.forbidden', 'error', path, 'A declaration cannot carry \"source\" or \"value\" — nothing maps into it.');\n }\n\n const type = node['type'];\n const properties = node['properties'];\n if (type === 'object' && isRecord(properties)) {\n for (const key of Object.keys(properties)) {\n const childPath = `${path}.properties.${key}`;\n if (!key.trim()) push('schema.property.key.empty', 'error', childPath, 'A property name cannot be empty.');\n validateDeclaration(properties[key], childPath, allowTransform);\n }\n }\n if (type === 'array' && isRecord(node['items'])) {\n validateDeclaration(node['items'], `${path}.items`, allowTransform);\n }\n };\n\n // -------------------------------------------------------------------------\n // Mapped layers — `req.*`, `output.schema`\n // -------------------------------------------------------------------------\n\n const validateStaticValue = (value: unknown, type: SdApiContractDataType, path: string): void => {\n if (value === null) return;\n const ok =\n type === 'string' || type === 'date' || type === 'datetime'\n ? typeof value === 'string'\n : type === 'number'\n ? typeof value === 'number' && Number.isFinite(value)\n : type === 'boolean'\n ? typeof value === 'boolean'\n : type === 'object'\n ? isRecord(value)\n : Array.isArray(value);\n if (!ok) push('mapping.value.type-mismatch', 'error', path, `The static value does not fit the declared type \"${type}\".`);\n };\n\n const validateSource = (\n node: Record<string, unknown>,\n type: SdApiContractDataType,\n path: string,\n context: SdApiContractMappingContext\n ): void => {\n const source = node['source'];\n if (typeof source !== 'string') {\n push('mapping.template.invalid', 'error', path, '\"source\" must be a string template.');\n return;\n }\n\n const template = parseSdApiContractTemplate(source);\n if (!template.valid) {\n push('mapping.template.invalid', 'error', path, template.errors[0].message);\n return;\n }\n\n if (!checkReferences(template.references, path, context)) return;\n\n if (template.kind === 'exact') {\n const resolved = resolveReference(template.references[0]);\n if (!resolved) return;\n if (!isTypeCompatible(resolved.type, type)) {\n push('mapping.type.mismatch', 'error', path, `\"${source}\" resolves to \"${resolved.type}\", which cannot fill a \"${type}\" node.`);\n }\n if (context === 'output' && node['required'] === true && resolved.required !== true) {\n push(\n 'mapping.required.optional-source',\n 'warning',\n path,\n `A required output field is fed by \"${source}\", which is not declared required.`\n );\n }\n return;\n }\n\n // why: literal + interpolated đều cho ra string. `req.url` không đi qua đây nên vẫn nội suy tự do.\n if (type !== 'string') {\n push('mapping.interpolation.forbidden', 'error', path, `String interpolation can only fill a \"string\" node, not \"${type}\".`);\n }\n };\n\n const validateMapped = (\n node: unknown,\n path: string,\n context: SdApiContractMappingContext,\n covered: boolean,\n allowTransform: boolean\n ): void => {\n if (!isRecord(node)) return;\n\n const hasSource = node['source'] !== undefined;\n const hasValue = node['value'] !== undefined;\n const wholeNodeMapped = hasSource || hasValue;\n\n if (!validateStructure(node, path, allowTransform, !wholeNodeMapped)) return;\n const type = node['type'] as SdApiContractDataType;\n\n if (hasSource && hasValue) {\n push('mapping.source-and-value', 'error', path, '\"source\" and \"value\" are mutually exclusive.');\n }\n\n const properties = node['properties'];\n const childCount = type === 'object' && isRecord(properties) ? Object.keys(properties).length : 0;\n if (wholeNodeMapped && childCount > 0) {\n push('mapping.object.conflict', 'error', path, 'An object mapped as a whole cannot also map its properties.');\n }\n\n if (hasSource) validateSource(node, type, path, context);\n else if (hasValue) validateStaticValue(node['value'], type, path);\n else if (!covered && (type !== 'object' || childCount === 0)) {\n push('mapping.node.unmapped', 'warning', path, 'This node receives no value — declare a \"source\" or a static \"value\".');\n }\n\n const childCovered = covered || wholeNodeMapped;\n if (type === 'object' && isRecord(properties)) {\n for (const key of Object.keys(properties)) {\n const childPath = `${path}.properties.${key}`;\n if (!key.trim()) push('schema.property.key.empty', 'error', childPath, 'A property name cannot be empty.');\n validateMapped(properties[key], childPath, context, childCovered, allowTransform);\n }\n }\n if (type === 'array' && isRecord(node['items'])) {\n validateMapped(node['items'], `${path}.items`, context, childCovered, allowTransform);\n }\n };\n\n // -------------------------------------------------------------------------\n // 1. Contract metadata\n // -------------------------------------------------------------------------\n\n if (contract['contractVersion'] !== SD_API_CONTRACT_VERSION) {\n push('contract.version.invalid', 'error', 'contractVersion', `\"contractVersion\" must be ${SD_API_CONTRACT_VERSION}.`);\n }\n if (!isFilledString(contract['code'])) push('contract.code.empty', 'error', 'code', 'A contract needs a non-empty \"code\".');\n if (!isFilledString(contract['name'])) push('contract.name.empty', 'error', 'name', 'A contract needs a non-empty \"name\".');\n\n // -------------------------------------------------------------------------\n // 2. input.schema\n // -------------------------------------------------------------------------\n\n if (!inputSchema) push('schema.missing', 'error', 'input.schema', '\"input.schema\" is missing.');\n else validateDeclaration(inputSchema, 'input.schema', true);\n\n // -------------------------------------------------------------------------\n // 3. req\n // -------------------------------------------------------------------------\n\n const request = isRecord(contract['req']) ? contract['req'] : null;\n if (!request) {\n push('req.method.invalid', 'error', 'req.method', 'The request is missing.');\n push('req.url.empty', 'error', 'req.url', 'The request is missing.');\n } else {\n const method = request['method'];\n if (!sdIsApiContractHttpMethod(method)) {\n push('req.method.invalid', 'error', 'req.method', `\"${String(method)}\" is not a supported HTTP method.`);\n }\n\n const url = request['url'];\n const placeholders = isFilledString(url) ? parseSdApiContractUrlPlaceholders(url) : { names: [], duplicates: [], malformed: [] };\n if (!isFilledString(url)) {\n push('req.url.empty', 'error', 'req.url', 'A request needs a non-empty \"url\".');\n } else {\n const template = parseSdApiContractTemplate(url);\n if (!template.valid) push('req.url.template.invalid', 'error', 'req.url', template.errors[0].message);\n else checkReferences(template.references, 'req.url', 'request');\n\n for (const fragment of placeholders.malformed) {\n push('req.url.placeholder.malformed', 'error', 'req.url', `\"${fragment}\" is not a valid path placeholder.`);\n }\n for (const name of placeholders.duplicates) {\n push('req.url.placeholder.duplicate', 'error', 'req.url', `Path placeholder \"{${name}}\" appears more than once.`);\n }\n }\n\n const pathRecord = isRecord(request['path']) ? request['path'] : null;\n const declaredPathKeys = pathRecord ? Object.keys(pathRecord) : [];\n for (const name of placeholders.names) {\n if (!declaredPathKeys.includes(name)) {\n push('req.path.missing', 'error', `req.path.${name}`, `The url declares \"{${name}}\" but \"req.path\" has no entry for it.`);\n }\n }\n for (const key of declaredPathKeys) {\n if (!placeholders.names.includes(key)) {\n push('req.path.unused', 'error', `req.path.${key}`, `\"req.path.${key}\" has no matching \"{${key}}\" in the url.`);\n }\n }\n\n if (pathRecord) {\n for (const key of declaredPathKeys) {\n const entryPath = `req.path.${key}`;\n const entry = pathRecord[key];\n if (!key.trim()) push('schema.property.key.empty', 'error', entryPath, 'A path parameter name cannot be empty.');\n if (isRecord(entry)) {\n if (entry['required'] !== true) {\n push('req.path.required', 'error', entryPath, 'A path parameter is part of the url and must be declared \"required\": true.');\n }\n if (entry['type'] !== undefined && !sdIsApiContractScalarDataType(entry['type'])) {\n push('req.path.type.invalid', 'error', entryPath, 'A path parameter must be a scalar.');\n }\n }\n validateMapped(entry, entryPath, 'request', false, false);\n }\n }\n\n const queryRecord = isRecord(request['query']) ? request['query'] : null;\n if (queryRecord) {\n for (const key of Object.keys(queryRecord)) {\n const entryPath = `req.query.${key}`;\n const entry = queryRecord[key];\n if (!key.trim()) push('schema.property.key.empty', 'error', entryPath, 'A query parameter name cannot be empty.');\n if (isRecord(entry) && entry['type'] !== undefined && !sdIsApiContractScalarDataType(entry['type']) && entry['type'] !== 'array') {\n push('req.query.type.invalid', 'error', entryPath, 'A query parameter must be a scalar or an array of scalars.');\n }\n validateMapped(entry, entryPath, 'request', false, false);\n }\n }\n\n const headerRecord = isRecord(request['headers']) ? request['headers'] : null;\n if (headerRecord) {\n checkDuplicateKeysIgnoringCase(headerRecord, 'req.headers');\n for (const key of Object.keys(headerRecord)) {\n const entryPath = `req.headers.${key}`;\n const entry = headerRecord[key];\n if (!key.trim()) push('req.header.name.empty', 'error', entryPath, 'A header name cannot be empty.');\n if (isRecord(entry) && entry['type'] !== undefined && !sdIsApiContractScalarDataType(entry['type'])) {\n push('req.header.type.invalid', 'error', entryPath, 'A header must be a scalar.');\n }\n validateMapped(entry, entryPath, 'request', false, false);\n }\n }\n\n if (request['body'] !== undefined) {\n if (method === 'GET' || method === 'HEAD') {\n push('req.body.unexpected', 'warning', 'req.body', `A ${method} request with a body is ignored by many clients and proxies.`);\n }\n validateMapped(request['body'], 'req.body', 'request', false, false);\n }\n }\n\n // -------------------------------------------------------------------------\n // 4. res\n // -------------------------------------------------------------------------\n\n if (!response) {\n push('res.status.invalid', 'error', 'res.status', 'The response declaration is missing.');\n } else {\n const rawStatus = response['status'];\n const statuses = Array.isArray(rawStatus) ? (rawStatus as unknown[]) : [rawStatus];\n if (Array.isArray(rawStatus) && rawStatus.length === 0) {\n push('res.status.empty', 'error', 'res.status', 'Declare at least one success status.');\n }\n const seenStatus = new Set<number>();\n for (const status of statuses) {\n if (typeof status !== 'number' || !Number.isInteger(status) || status < 100 || status > 599) {\n push('res.status.invalid', 'error', 'res.status', `\"${String(status)}\" is not an HTTP status code between 100 and 599.`);\n } else if (seenStatus.has(status)) {\n push('res.status.duplicate', 'error', 'res.status', `Status ${status} is declared more than once.`);\n } else {\n seenStatus.add(status);\n }\n }\n\n const responseHeaders = isRecord(response['headers']) ? response['headers'] : null;\n if (responseHeaders) {\n checkDuplicateKeysIgnoringCase(responseHeaders, 'res.headers');\n for (const key of Object.keys(responseHeaders)) {\n const entryPath = `res.headers.${key}`;\n if (!key.trim()) push('req.header.name.empty', 'error', entryPath, 'A header name cannot be empty.');\n validateDeclaration(responseHeaders[key], entryPath, false);\n }\n }\n\n if (response['body'] !== undefined) {\n if (seenStatus.has(204)) {\n push('res.body.unexpected', 'warning', 'res.body', 'HTTP 204 means \"no content\" — a declared body will never arrive.');\n }\n validateDeclaration(response['body'], 'res.body', false);\n }\n }\n\n // -------------------------------------------------------------------------\n // 5. output.schema\n // -------------------------------------------------------------------------\n\n const outputSchema = readSchema(contract['output']);\n if (!outputSchema) push('schema.missing', 'error', 'output.schema', '\"output.schema\" is missing.');\n else validateMapped(outputSchema, 'output.schema', 'output', false, true);\n\n return diagnostics;\n}\n\n/** `true` when a source of `sourceType` may fill a target of `targetType`. */\nfunction isTypeCompatible(sourceType: SdApiContractDataType, targetType: SdApiContractDataType): boolean {\n if (sourceType === targetType) return true;\n // why: date/datetime là kiểu LOGIC, trên dây luôn là string — nên string ↔ temporal đi được cả hai\n // chiều. Mọi cặp khác phải khớp chính xác, vì exact expression giữ nguyên type của nguồn.\n const sourceTemporalish = sdIsApiContractTemporalDataType(sourceType) || sourceType === 'string';\n const targetTemporalish = sdIsApiContractTemporalDataType(targetType) || targetType === 'string';\n return sourceTemporalish && targetTemporalish;\n}\n\nfunction readSchema(holder: unknown): SdApiContractStructuralNode | null {\n if (!isRecord(holder) || !isRecord(holder['schema'])) return null;\n return holder['schema'] as unknown as SdApiContractStructuralNode;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isFilledString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction hasOwn(record: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n","import type { SdApiContractConfiguration } from './api-contract.configuration';\nimport type { SdApiContract } from './api-contract.model';\n\n/**\n * Reference contracts, shared by the docs, the showcase and the test-suite so the canonical example\n * can never drift between them.\n *\n * Each is a **factory**, not a constant: the builder takes a two-way `[(model)]`, and handing two\n * demos the same object would let one seed the other.\n */\n\n/** The env catalog the samples reference. Definitions only — no secret ever has a value here. */\nexport const SD_API_CONTRACT_SAMPLE_ENVIRONMENT: SdApiContractConfiguration = {\n env: {\n baseUrl: { type: 'string', label: 'Backend base URL' },\n token: { type: 'string', label: 'Access token', sensitive: true },\n userId: { type: 'string', label: 'Current user ID' },\n },\n};\n\n/** `GET` list endpoint whose output is a root array — the dropdown / table shape. */\nexport function sdApiContractSearchSample(): SdApiContract {\n return {\n contractVersion: 1,\n code: 'product.search',\n name: 'Search products',\n description: 'Search active products for dropdown or table',\n input: {\n schema: {\n type: 'object',\n properties: {\n keyword: { type: 'string', required: false },\n page: { type: 'number' },\n createdFrom: { type: 'datetime', transform: 'ISOString' },\n },\n },\n },\n req: {\n method: 'GET',\n url: '${env.baseUrl}/products',\n query: {\n keyword: { type: 'string', source: '${input.keyword}' },\n page: { type: 'number', source: '${input.page}' },\n createdFrom: { type: 'datetime', source: '${input.createdFrom}' },\n },\n headers: {\n Authorization: { type: 'string', source: 'Bearer ${env.token}' },\n 'x-user-id': { type: 'string', source: '${env.userId}' },\n },\n },\n res: {\n status: 200,\n headers: { 'x-request-id': { type: 'string', required: false } },\n body: {\n type: 'object',\n properties: {\n items: {\n type: 'array',\n required: true,\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', required: true },\n name: { type: 'string', required: true },\n createdAt: { type: 'datetime' },\n },\n },\n },\n total: { type: 'number', required: true },\n },\n },\n },\n output: {\n schema: {\n type: 'array',\n source: '${res.body.items}',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', required: true },\n name: { type: 'string', required: true },\n createdAt: { type: 'datetime' },\n },\n },\n },\n },\n };\n}\n\n/**\n * `POST` endpoint showing every mapping flavour at once:\n * `input.a → req.body.x`, `input.b → req.body.y`, `input.c → req.body.z`,\n * `env.userId → req.body.u`, and a static literal in `req.body.v`.\n */\nexport function sdApiContractCreateSample(): SdApiContract {\n return {\n contractVersion: 1,\n code: 'order.create',\n name: 'Create order',\n description: 'Maps a frontend payload onto the backend order body',\n input: {\n schema: {\n type: 'object',\n properties: {\n a: { type: 'string', required: true, label: 'Order code' },\n b: { type: 'number', label: 'Quantity' },\n c: { type: 'array', items: { type: 'string' }, label: 'Tags' },\n },\n },\n },\n req: {\n method: 'POST',\n url: '${env.baseUrl}/orders',\n headers: { Authorization: { type: 'string', source: 'Bearer ${env.token}' } },\n body: {\n type: 'object',\n properties: {\n x: { type: 'string', required: true, source: '${input.a}' },\n y: { type: 'number', source: '${input.b}' },\n z: { type: 'array', source: '${input.c}', items: { type: 'string' } },\n u: { type: 'string', source: '${env.userId}' },\n v: { type: 'string', value: 'STATIC VALUE' },\n },\n },\n },\n res: {\n status: [200, 201],\n body: {\n type: 'object',\n properties: {\n id: { type: 'string', required: true },\n createdAt: { type: 'datetime' },\n },\n },\n },\n output: {\n schema: {\n type: 'object',\n properties: {\n id: { type: 'string', required: true, source: '${res.body.id}' },\n createdAt: { type: 'datetime', source: '${res.body.createdAt}' },\n },\n },\n },\n };\n}\n\n/**\n * Deliberately broken contract used to demonstrate the diagnostics: an undeclared env variable, a\n * `{id}` placeholder with no `req.path` entry, a `${input.page}` that does not exist, and an output\n * source pointing at a scalar while the output declares an array.\n */\nexport function sdApiContractInvalidSample(): SdApiContract {\n return {\n contractVersion: 1,\n code: 'product.broken',\n name: 'Broken product search',\n description: 'Every diagnostic class in one contract',\n input: {\n schema: {\n type: 'object',\n properties: { keyword: { type: 'string' } },\n },\n },\n req: {\n method: 'GET',\n url: '${env.baseUrl}/products/{id}',\n query: { page: { type: 'number', source: '${input.page}' } },\n headers: { Authorization: { type: 'string', source: 'Bearer ${env.unknown}' } },\n },\n res: {\n status: 200,\n body: {\n type: 'object',\n properties: {\n items: { type: 'array', required: true, items: { type: 'object', properties: { id: { type: 'string' } } } },\n total: { type: 'number' },\n },\n },\n },\n output: {\n schema: {\n type: 'array',\n source: '${res.body.total}',\n items: { type: 'object', properties: { id: { type: 'string' } } },\n },\n },\n };\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport type { SdApiContractDiagnostic } from '../api-contract.model';\n\n/**\n * Validation summary + the diagnostic list.\n *\n * Severity is never signalled by colour alone: every row carries an icon, the severity word, the\n * stable `code` and the structural `path`, so the list stays readable for a colour-blind reader and\n * usable from a screen reader.\n */\n@Component({\n selector: 'sd-api-contract-diagnostic-list',\n standalone: true,\n imports: [SdIcon, SdTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let _diagnostics = diagnostics();\n @let _errors = errorCount();\n @let _warnings = warningCount();\n @let _autoId = autoId();\n\n <div class=\"sd-acb-diagnostics\" [attr.data-autoId]=\"_autoId\">\n <div class=\"sd-acb-diagnostics__summary\" role=\"status\">\n @if (!_diagnostics.length) {\n <span class=\"sd-acb-diagnostics__badge\" data-severity=\"ok\">\n <sd-icon name=\"check_circle\" size=\"sm\"></sd-icon>\n <span>{{ 'core.component.api-contract-builder.review.valid' | sdTranslate }}</span>\n </span>\n } @else {\n <span class=\"sd-acb-diagnostics__badge\" data-severity=\"error\">\n <sd-icon name=\"error\" size=\"sm\"></sd-icon>\n <span>{{ 'core.component.api-contract-builder.review.errors' | sdTranslate: { count: _errors } }}</span>\n </span>\n <span class=\"sd-acb-diagnostics__badge\" data-severity=\"warning\">\n <sd-icon name=\"warning\" size=\"sm\"></sd-icon>\n <span>{{ 'core.component.api-contract-builder.review.warnings' | sdTranslate: { count: _warnings } }}</span>\n </span>\n }\n </div>\n\n @if (_diagnostics.length) {\n <ul class=\"sd-acb-diagnostics__list\">\n @for (diagnostic of _diagnostics; track diagnostic.code + '|' + diagnostic.path + '|' + $index) {\n <li class=\"sd-acb-diagnostics__item\" [attr.data-severity]=\"diagnostic.severity\" [attr.data-code]=\"diagnostic.code\">\n <button\n type=\"button\"\n class=\"sd-acb-diagnostics__nav\"\n [attr.data-autoId]=\"_autoId ? _autoId + '-goto-' + $index : null\"\n (click)=\"navigate.emit(diagnostic)\">\n <sd-icon [name]=\"diagnostic.severity === 'error' ? 'error' : 'warning'\" size=\"sm\"></sd-icon>\n <span class=\"sd-acb-diagnostics__path\">{{ diagnostic.path || '(contract)' }}</span>\n <span class=\"sd-acb-diagnostics__message\">{{ diagnostic.message }}</span>\n <span class=\"sd-acb-diagnostics__code\">{{ diagnostic.code }}</span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n .sd-acb-diagnostics__summary {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n margin-bottom: 10px;\n }\n .sd-acb-diagnostics__badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 600;\n\n &[data-severity='ok'] {\n color: var(--sd-success, #1c6c3a);\n }\n &[data-severity='error'] {\n color: var(--sd-error, #b3261e);\n }\n &[data-severity='warning'] {\n color: var(--sd-warning, #8a5a00);\n }\n }\n .sd-acb-diagnostics__list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .sd-acb-diagnostics__nav {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 8px;\n width: 100%;\n text-align: left;\n background: none;\n border: 1px solid transparent;\n border-radius: 6px;\n padding: 6px 8px;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n\n &:hover,\n &:focus-visible {\n border-color: var(--sd-border-color, #e6e6e6);\n background: var(--sd-surface-muted, #f3f5f8);\n }\n }\n .sd-acb-diagnostics__item[data-severity='error'] .sd-acb-diagnostics__nav {\n color: var(--sd-error, #b3261e);\n }\n .sd-acb-diagnostics__item[data-severity='warning'] .sd-acb-diagnostics__nav {\n color: var(--sd-warning, #8a5a00);\n }\n .sd-acb-diagnostics__path {\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n font-weight: 600;\n }\n .sd-acb-diagnostics__message {\n color: var(--sd-text, #1f2937);\n }\n .sd-acb-diagnostics__code {\n margin-left: auto;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n color: var(--sd-text-secondary, #6b6b6b);\n }\n `,\n ],\n})\nexport class SdApiContractDiagnosticList {\n diagnostics = input<readonly SdApiContractDiagnostic[]>([]);\n autoId = input<string | null | undefined>();\n\n navigate = output<SdApiContractDiagnostic>();\n\n protected readonly errorCount = computed(() => this.diagnostics().filter(diagnostic => diagnostic.severity === 'error').length);\n protected readonly warningCount = computed(() => this.diagnostics().filter(diagnostic => diagnostic.severity === 'warning').length);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { parseSdApiContractTemplate } from '../api-contract.expression';\nimport type { SdApiContractStructuralNode } from '../api-contract.schema';\n\n/**\n * One collapsed, read-only row for a node in a layer list.\n *\n * The whole point is that it holds NO editable control. Editing a node happens in the drawer, so the\n * list can stay a thing you scan rather than a wall of inputs — and so a node never has two editors\n * writing it at once.\n *\n * The row shows what an author needs to spot a mistake without opening anything: the name, the\n * declared type, whether it is required, and where its value comes from.\n */\n@Component({\n selector: 'sd-api-contract-node-summary',\n standalone: true,\n imports: [SdIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let _autoId = autoId();\n @let _readonly = readonly();\n\n <div\n class=\"sd-acb-row\"\n [class.sd-acb-row--readonly]=\"_readonly\"\n [attr.role]=\"_readonly ? null : 'button'\"\n [attr.tabindex]=\"_readonly ? null : 0\"\n [attr.data-autoid]=\"_autoId || null\"\n (click)=\"requestEdit()\"\n (keydown.enter)=\"requestEdit()\"\n (keydown.space)=\"requestEdit()\">\n <span class=\"sd-acb-row__name\">{{ name() }}</span>\n <span class=\"sd-acb-row__type\">{{ node().type }}</span>\n\n @if (node().required === true) {\n <span class=\"sd-acb-row__required\">{{ requiredLabel }}</span>\n }\n\n <span class=\"sd-acb-row__mapping\" [class.sd-acb-row__mapping--unmapped]=\"unmapped()\">{{ mappingSummary() }}</span>\n\n @if (!_readonly) {\n <button\n type=\"button\"\n class=\"sd-acb-row__remove\"\n [attr.data-autoid]=\"_autoId ? _autoId + '-remove' : null\"\n [attr.aria-label]=\"removeLabel\"\n [title]=\"removeLabel\"\n (click)=\"requestRemove($event)\">\n <sd-icon name=\"delete\" size=\"sm\"></sd-icon>\n </button>\n }\n </div>\n `,\n // why `.sd-acb-row__mapping` đẩy sang phải và tự co: nó là phần dài nhất của hàng và cũng là phần\n // dễ bỏ qua nhất. Comment để ngoài `styles`, không trong CSS: `check:i18n` quét chuỗi tiếng Việt\n // trong template và style.\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n .sd-acb-row {\n display: flex;\n gap: 10px;\n align-items: center;\n padding: 8px 10px;\n border: 1px solid var(--sd-border-color, #e6e6e6);\n border-radius: 6px;\n background: var(--sd-surface, #fff);\n font-size: 13px;\n cursor: pointer;\n }\n .sd-acb-row:hover {\n border-color: var(--sd-primary, #005cbb);\n }\n .sd-acb-row--readonly {\n cursor: default;\n }\n .sd-acb-row--readonly:hover {\n border-color: var(--sd-border-color, #e6e6e6);\n }\n .sd-acb-row__name {\n min-width: 0;\n font-weight: 600;\n overflow-wrap: anywhere;\n }\n .sd-acb-row__type {\n padding: 1px 6px;\n border-radius: 4px;\n background: var(--sd-surface-muted, #f3f5f8);\n color: var(--sd-text-secondary, #6b6b6b);\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 12px;\n }\n .sd-acb-row__required {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--sd-primary, #005cbb) 12%, transparent);\n color: var(--sd-primary, #005cbb);\n font-size: 11px;\n }\n .sd-acb-row__mapping {\n min-width: 0;\n margin-left: auto;\n overflow: hidden;\n color: var(--sd-text-secondary, #6b6b6b);\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n font-size: 12px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .sd-acb-row__mapping--unmapped {\n color: var(--sd-warning, #8a5a00);\n font-style: italic;\n }\n .sd-acb-row__remove {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--sd-error, #b3261e);\n cursor: pointer;\n }\n .sd-acb-row__remove:hover {\n background: color-mix(in srgb, var(--sd-error, #b3261e) 12%, transparent);\n }\n `,\n ],\n})\nexport class SdApiContractNodeSummary {\n readonly #i18n = inject(I18nService);\n\n name = input.required<string>();\n node = input.required<SdApiContractStructuralNode>();\n /** `view` mode and `disabled` both land here: the row becomes text, with no action at all. */\n readonly = input(false, { transform: booleanAttribute });\n autoId = input<string | null | undefined>();\n\n edit = output<void>();\n remove = output<void>();\n\n protected readonly requiredLabel = this.#i18n.t('core.component.api-contract-builder.field.required');\n protected readonly removeLabel = this.#i18n.t('core.component.api-contract-builder.node.remove');\n\n protected readonly unmapped = computed(() => {\n const node = this.node();\n if (node.source !== undefined || node.value !== undefined) return false;\n return !(node.type === 'object' && node.properties);\n });\n\n /**\n * One line describing where the value comes from.\n *\n * why bốn dạng khác nhau: `${input.keyword}` rút về `input.keyword` vì dấu `${}` là cú pháp chứ\n * không phải thông tin; còn template ghép giữ NGUYÊN VĂN vì rút gọn nó sẽ sai. Literal hiện giá trị\n * để thấy ngay, object hiện số trường để biết còn bao nhiêu phải mở ra xem.\n */\n protected readonly mappingSummary = computed(() => {\n const node = this.node();\n\n if (typeof node.source === 'string' && node.source !== '') {\n const parsed = parseSdApiContractTemplate(node.source);\n const reference = parsed.kind === 'exact' ? parsed.references[0] : undefined;\n return `← ${reference ? reference.expression : node.source}`;\n }\n\n if (node.value !== undefined) return `= ${formatLiteral(node.value)}`;\n\n if (node.type === 'object' && node.properties) {\n return this.#i18n.t('core.component.api-contract-builder.summary.field-count', {\n count: Object.keys(node.properties).length,\n });\n }\n\n return this.#i18n.t('core.component.api-contract-builder.summary.unmapped');\n });\n\n protected requestEdit(): void {\n if (this.readonly()) return;\n this.edit.emit();\n }\n\n /**\n * why stopPropagation: nút xoá nằm TRONG hàng có `(click)`, nên không chặn thì bấm xoá cũng mở\n * drawer — người dùng bấm xoá lại thấy form hiện ra.\n */\n protected requestRemove(event: Event): void {\n event.stopPropagation();\n if (this.readonly()) return;\n this.remove.emit();\n }\n}\n\n/** Renders a literal short enough for one row: strings quoted, composites collapsed. */\nfunction formatLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (value === null || typeof value !== 'object') return String(value);\n if (Array.isArray(value)) return `[${value.length}]`;\n return `{${Object.keys(value).length}}`;\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, linkedSignal, output } from '@angular/core';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdCodeEditor } from '@sdcorejs/angular/components/code-editor';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { parseSdApiContractTemplate } from '../api-contract.expression';\nimport type { SdApiContractDataType, SdApiContractJsonValue } from '../api-contract.model';\nimport type { SdApiContractStructuralNode } from '../api-contract.schema';\nimport type { SdApiContractSuggestion } from './api-contract-suggestion.model';\n\n/**\n * How a mapped node receives its value.\n *\n * - `source` — one whole-value reference, picked from a dropdown.\n * - `advanced` — a raw template the dropdown cannot express, e.g. `Bearer ${env.token}`.\n * - `static` — a literal typed in a control that matches the declared type.\n * - `nested` — an object mapped field by field.\n * - `none` — CHƯA GÁN. Không phải một lựa chọn trong picker: picker để trống + `required`, nên node\n * chưa gán là lỗi thấy ngay trên hàng thay vì một giá trị trông như đã chọn.\n */\nexport type SdApiContractValueMode = 'source' | 'advanced' | 'static' | 'nested' | 'none';\n\ninterface SdApiContractOption {\n value: string;\n label: string;\n}\n\n/**\n * Value editor for one mapped node: a mode picker plus one control chosen by the mode.\n *\n * `source` shows a single dropdown of the references the surrounding schemas and the injected env\n * catalog make available — the author never types `${…}` for the common case. `advanced` keeps a raw\n * expression field for what a dropdown cannot express (`Bearer ${env.token}`). `static` renders a\n * control matching the declared type, including a JSON editor for `object` / `array` literals.\n *\n * The JSON editor for a composite literal only writes when the text parses. While it is half-typed it\n * emits the raw string, and that string is dropped — otherwise one keystroke would turn a literal\n * object into a garbage string in the contract.\n */\n@Component({\n selector: 'sd-api-contract-source-editor',\n standalone: true,\n imports: [SdCodeEditor, SdDate, SdDatetime, SdInput, SdInputNumber, SdSelect, SdTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let _node = node();\n @let _disabled = disabled();\n @let _mode = mode();\n @let _autoId = autoId();\n @let _suggestions = sourceOptions();\n\n <div class=\"sd-acb-source\">\n <sd-select\n class=\"sd-acb-source__mode\"\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-mode' : undefined\"\n [label]=\"'core.component.api-contract-builder.mapping.mode' | sdTranslate\"\n [items]=\"modeOptions()\"\n valueField=\"value\"\n displayField=\"label\"\n [required]=\"true\"\n [model]=\"modeValue()\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setMode($event)\"></sd-select>\n\n @if (_mode === 'source') {\n <sd-select\n class=\"sd-acb-source__expression\"\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-source' : undefined\"\n [label]=\"'core.component.api-contract-builder.mapping.source' | sdTranslate\"\n [items]=\"_suggestions\"\n valueField=\"expression\"\n displayField=\"display\"\n [model]=\"_node.source ?? ''\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setSource($event)\"></sd-select>\n } @else if (_mode === 'advanced') {\n <sd-input\n class=\"sd-acb-source__expression\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-advanced' : undefined\"\n [label]=\"'core.component.api-contract-builder.mapping.source' | sdTranslate\"\n [placeholder]=\"advancedPlaceholder\"\n [model]=\"_node.source ?? ''\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setSource($event)\"></sd-input>\n } @else if (_mode === 'static') {\n @let _staticAutoId = _autoId ? _autoId + '-static' : undefined;\n @let _staticLabel = 'core.component.api-contract-builder.mapping.value' | sdTranslate;\n\n @switch (_node.type) {\n @case ('boolean') {\n <sd-select\n class=\"sd-acb-source__static\"\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_staticAutoId\"\n [label]=\"_staticLabel\"\n [items]=\"booleanOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [model]=\"_node.value === true ? 'true' : 'false'\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setStaticBoolean($event)\"></sd-select>\n }\n @case ('number') {\n <sd-input-number\n class=\"sd-acb-source__static\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_staticAutoId\"\n [label]=\"_staticLabel\"\n [model]=\"staticNumber()\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setStaticNumber($event)\"></sd-input-number>\n }\n @case ('date') {\n <sd-date\n class=\"sd-acb-source__static\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_staticAutoId\"\n [label]=\"_staticLabel\"\n [model]=\"staticText()\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setStaticTemporal($event)\"></sd-date>\n }\n @case ('datetime') {\n <sd-datetime\n class=\"sd-acb-source__static\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_staticAutoId\"\n [label]=\"_staticLabel\"\n [model]=\"staticText()\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setStaticTemporal($event)\"></sd-datetime>\n }\n @case ('object') {\n <sd-code-editor\n class=\"sd-acb-source__static sd-acb-source__static--json\"\n language=\"json\"\n maxHeight=\"220px\"\n [model]=\"_node.value\"\n [viewed]=\"_disabled\"\n (modelChange)=\"setStaticJson($event)\"></sd-code-editor>\n }\n @case ('array') {\n <sd-code-editor\n class=\"sd-acb-source__static sd-acb-source__static--json\"\n language=\"json\"\n maxHeight=\"220px\"\n [model]=\"_node.value\"\n [viewed]=\"_disabled\"\n (modelChange)=\"setStaticJson($event)\"></sd-code-editor>\n }\n @default {\n <sd-input\n class=\"sd-acb-source__static\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_staticAutoId\"\n [label]=\"_staticLabel\"\n [model]=\"staticText()\"\n [disabled]=\"_disabled\"\n (sdChange)=\"setStaticScalar($event)\"></sd-input>\n }\n }\n }\n </div>\n `,\n // why các flex-basis dưới đây được nới rộng: hàng này từng phải chen vào một ô ~170px của grid bảy\n // cột. Giờ nó sống trong drawer, chiều rộng không còn khan hiếm — nhãn nổi của mat-form-field đủ\n // chỗ. Comment để ngoài `styles`: `check:i18n` quét chuỗi tiếng Việt trong template và style.\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n .sd-acb-source {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: flex-start;\n }\n .sd-acb-source__mode {\n flex: 0 0 200px;\n min-width: 180px;\n }\n .sd-acb-source__expression,\n .sd-acb-source__static {\n flex: 1 1 260px;\n min-width: 220px;\n }\n .sd-acb-source__static--json {\n flex: 1 1 100%;\n min-width: 0;\n }\n `,\n ],\n})\nexport class SdApiContractSourceEditor {\n readonly #i18n = inject(I18nService);\n\n node = input.required<SdApiContractStructuralNode>();\n suggestions = input<readonly SdApiContractSuggestion[]>([]);\n disabled = input(false, { transform: booleanAttribute });\n autoId = input<string | null | undefined>();\n\n nodeChange = output<SdApiContractStructuralNode>();\n\n protected readonly advancedPlaceholder = 'Bearer ${env.token}';\n\n // why: dựng MỘT lần trong field initializer. `[items]` nhận mảng mới mỗi CD sẽ kích\n // `toObservable(items)` của sd-select → markForCheck → CD mới → treo trình duyệt (bug OOM\n // đã gặp ở query-builder). Ngôn ngữ chỉ đổi kèm reload trang nên dựng một lần là đủ.\n protected readonly booleanOptions: SdApiContractOption[] = [\n { value: 'true', label: this.#i18n.t('core.component.api-contract-builder.boolean.true') },\n { value: 'false', label: this.#i18n.t('core.component.api-contract-builder.boolean.false') },\n ];\n\n readonly #sourceMode: SdApiContractOption = {\n value: 'source',\n label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.source'),\n };\n readonly #advancedMode: SdApiContractOption = {\n value: 'advanced',\n label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.advanced'),\n };\n\n readonly #scalarModes: SdApiContractOption[] = [\n this.#sourceMode,\n { value: 'static', label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.static') },\n this.#advancedMode,\n ];\n\n readonly #objectModes: SdApiContractOption[] = [\n this.#sourceMode,\n { value: 'static', label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.static') },\n this.#advancedMode,\n { value: 'nested', label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.nested') },\n ];\n\n readonly #arrayModes: SdApiContractOption[] = [\n this.#sourceMode,\n { value: 'static', label: this.#i18n.t('core.component.api-contract-builder.mapping.mode.static') },\n this.#advancedMode,\n ];\n\n // why: mode là state của GIAO DIỆN, không nằm trong contract — nó được suy lại từ node mỗi khi cha\n // đẩy giá trị mới. `linkedSignal` (không phải `computed`) vì có đúng một trường hợp phải GHI ĐÈ\n // suy diễn: người dùng đang ở `advanced` và gõ tới lúc chuỗi tình cờ còn đúng một reference sạch.\n // Nếu để suy diễn thắng, ô text đang gõ sẽ biến thành dropdown giữa lúc gõ.\n protected readonly mode = linkedSignal<SdApiContractStructuralNode, SdApiContractValueMode>({\n source: () => this.node(),\n computation: (node, previous) => {\n const derived = deriveMode(node);\n if (previous?.value === 'advanced' && derived === 'source') return 'advanced';\n return derived;\n },\n });\n\n /**\n * Giá trị hiển thị của picker.\n *\n * why: `none` không còn là một option, nên bind nó vào `[model]` sẽ ra một ô trống mà người dùng\n * không hiểu tại sao. Trả `null` để picker rỗng THẬT — cộng `required`, một node chưa gán trở thành\n * lỗi thấy được ngay trên hàng, khớp với diagnostic `mapping.node.unmapped` mà validation đã báo.\n */\n protected readonly modeValue = computed<SdApiContractValueMode | null>(() => {\n const mode = this.mode();\n return mode === 'none' ? null : mode;\n });\n\n protected readonly modeOptions = computed<SdApiContractOption[]>(() => {\n const type = this.node().type;\n if (type === 'object') return this.#objectModes;\n if (type === 'array') return this.#arrayModes;\n return this.#scalarModes;\n });\n\n protected readonly suggestionOptions = computed<SdApiContractSuggestion[]>(() => {\n const type = this.node().type;\n const all = [...this.suggestions()];\n // why: lọc mềm — ưu tiên gợi ý hợp type, nhưng trả toàn bộ khi không cái nào khớp, để template\n // string (`Bearer ${env.token}`) và các cặp type tương thích không bị giấu mất.\n const compatible = all.filter(suggestion => isAssignable(suggestion.type, type));\n return compatible.length > 0 ? compatible : all;\n });\n\n /**\n * Options for the source dropdown.\n *\n * why: một `source` đang lưu có thể trỏ vào trường đã bị xoá hoặc đổi tên — nó KHÔNG còn trong\n * danh sách gợi ý. `sd-select` không tìm thấy value sẽ hiện ô rỗng, và giá trị vẫn nằm trong\n * contract mà người dùng không thấy để sửa. Thêm một option dựng từ chính giá trị đó để nó luôn\n * hiển thị; validation lo phần báo `mapping.reference.missing`.\n */\n protected readonly sourceOptions = computed<SdApiContractSuggestion[]>(() => {\n const options = this.suggestionOptions();\n const current = this.node().source;\n if (typeof current !== 'string' || current === '') return options;\n if (options.some(option => option.expression === current)) return options;\n\n const parsed = parseSdApiContractTemplate(current);\n if (parsed.kind !== 'exact') return options;\n\n const reference = parsed.references[0];\n return [\n ...options,\n {\n expression: current,\n path: reference?.expression ?? current,\n root: reference?.root ?? 'input',\n type: this.node().type,\n display: reference?.expression ?? current,\n },\n ];\n });\n\n protected readonly staticText = computed(() => {\n const value = this.node().value;\n return value === undefined || value === null ? '' : String(value);\n });\n\n protected readonly staticNumber = computed(() => {\n const value = this.node().value;\n return typeof value === 'number' ? value : null;\n });\n\n protected setMode(mode: unknown): void {\n const node = this.node();\n\n // why: đặt mode TRƯỚC khi emit. Node quay lại từ cha sẽ kích `linkedSignal` tính lại, và nó đọc\n // `previous.value` — nếu chưa đặt, carve-out `advanced` sẽ giữ lại mode cũ và chặn việc rời khỏi\n // `advanced` sang `source`.\n if (mode === 'source' || mode === 'advanced') {\n this.mode.set(mode);\n // Rời `advanced` sang `source` thì template ghép không còn diễn đạt được bằng dropdown — xoá để\n // dropdown bắt đầu sạch. Ngược lại, đã có key `source` thì đổi mode không đụng tới model.\n const abandonsTemplate = mode === 'source' && parseSdApiContractTemplate(node.source).kind === 'interpolated';\n if (node.source === undefined || abandonsTemplate) {\n this.nodeChange.emit({ ...withoutMapping(node), source: '' });\n }\n return;\n }\n\n if (mode === 'static') {\n this.mode.set('static');\n this.nodeChange.emit({ ...withoutMapping(node), value: defaultStatic(node.type) });\n return;\n }\n\n this.mode.set(node.type === 'object' ? 'nested' : 'none');\n this.nodeChange.emit(withoutMapping(node));\n }\n\n protected setSource(value: unknown): void {\n this.nodeChange.emit({ ...withoutMapping(this.node()), source: typeof value === 'string' ? value : '' });\n }\n\n protected setStaticScalar(value: unknown): void {\n const node = this.node();\n this.nodeChange.emit({ ...withoutMapping(node), value: value === null || value === undefined ? '' : String(value) });\n }\n\n protected setStaticNumber(value: unknown): void {\n const node = this.node();\n const parsed = typeof value === 'number' ? value : Number(value === null || value === undefined ? '' : String(value).trim());\n this.nodeChange.emit({ ...withoutMapping(node), value: Number.isFinite(parsed) ? parsed : 0 });\n }\n\n /**\n * Stores a `date` / `datetime` literal.\n *\n * why: `<sd-date>` / `<sd-datetime>` có thể bắn ra một `Date`. `String(new Date())` ra\n * `Mon Aug 17 2026 …` — không parse lại được và đổi theo locale của máy tác giả, nên contract sẽ\n * mang một giá trị không portable. Chuẩn hoá về ISO.\n */\n protected setStaticTemporal(value: unknown): void {\n const node = this.node();\n if (value instanceof Date) {\n const iso = Number.isNaN(value.getTime()) ? '' : value.toISOString();\n this.nodeChange.emit({ ...withoutMapping(node), value: iso });\n return;\n }\n this.nodeChange.emit({ ...withoutMapping(node), value: value === null || value === undefined ? '' : String(value) });\n }\n\n /**\n * Stores an `object` / `array` literal from the JSON editor.\n *\n * why: `<sd-code-editor language=\"json\">` bắn ra STRING khi cú pháp còn dở (`{\"a\":`). Ghi chuỗi đó\n * vào contract sẽ biến một literal object thành rác, nên bỏ qua và giữ giá trị hợp lệ cuối cùng —\n * người dùng vẫn thấy nguyên văn mình đang gõ trong editor.\n */\n protected setStaticJson(value: unknown): void {\n if (value === null || typeof value !== 'object') return;\n this.nodeChange.emit({ ...withoutMapping(this.node()), value: value as SdApiContractJsonValue });\n }\n\n protected setStaticBoolean(value: unknown): void {\n this.nodeChange.emit({ ...withoutMapping(this.node()), value: value === 'true' || value === true });\n }\n}\n\n/**\n * Reads the mode out of the node alone — the contract never stores it.\n *\n * An EMPTY `source` means \"Lấy từ nguồn đã chọn, chưa pick\" and stays in `source`; anything the\n * dropdown cannot express (a template with literal text, or text with no reference at all) is\n * `advanced`. A clean single reference stays in `source` even when it resolves to nothing, so a typo\n * is fixed in the friendly picker while validation reports `mapping.reference.missing`.\n */\nfunction deriveMode(node: SdApiContractStructuralNode): SdApiContractValueMode {\n if (node.source !== undefined) {\n if (node.source === '') return 'source';\n return parseSdApiContractTemplate(node.source).kind === 'exact' ? 'source' : 'advanced';\n }\n if (node.value !== undefined) return 'static';\n return node.type === 'object' ? 'nested' : 'none';\n}\n\n/** Rebuilds a node without `source` / `value`, so the key is gone rather than set to `undefined`. */\nfunction withoutMapping(node: SdApiContractStructuralNode): SdApiContractStructuralNode {\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(node)) {\n if (key === 'source' || key === 'value') continue;\n next[key] = (node as unknown as Record<string, unknown>)[key];\n }\n return next as unknown as SdApiContractStructuralNode;\n}\n\nfunction defaultStatic(type: SdApiContractDataType): SdApiContractJsonValue {\n if (type === 'number') return 0;\n if (type === 'boolean') return false;\n if (type === 'object') return {};\n if (type === 'array') return [];\n return '';\n}\n\nfunction isAssignable(sourceType: SdApiContractDataType, targetType: SdApiContractDataType): boolean {\n if (sourceType === targetType) return true;\n const temporalish = (type: SdApiContractDataType): boolean => type === 'string' || type === 'date' || type === 'datetime';\n return temporalish(sourceType) && temporalish(targetType);\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, signal, viewChild } from '@angular/core';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdSideDrawer } from '@sdcorejs/angular/components/side-drawer';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SD_API_CONTRACT_DATA_TYPES, type SdApiContractDataType } from '../api-contract.model';\nimport {\n addSdApiContractProperty,\n changeSdApiContractNodeType,\n cloneSdApiContractNode,\n createSdApiContractNode,\n getSdApiContractNodeAt,\n removeSdApiContractProperty,\n renameSdApiContractProperty,\n setSdApiContractNodeAt,\n type SdApiContractNodePointer,\n type SdApiContractStructuralNode,\n} from '../api-contract.schema';\nimport { SdApiContractNodeSummary } from './api-contract-node-summary.component';\nimport { SdApiContractSourceEditor } from './api-contract-source-editor.component';\nimport type { SdApiContractSuggestion } from './api-contract-suggestion.model';\n\n/** What the drawer hands back when the author closes the books on one node. */\nexport interface SdApiContractNodeCommit {\n name: string;\n node: SdApiContractStructuralNode;\n}\n\n/**\n * A layer list asking for the drawer to be opened.\n *\n * The list does not own the drawer — the builder does, so there is exactly one drawer and one staged\n * draft on the page. The list only says which node the author reached for; the builder knows which\n * section that list was wired into and applies the commit there.\n */\nexport interface SdApiContractNodeEditRequest {\n /** `null` means \"add a new node to this collection\". */\n name: string | null;\n node: SdApiContractStructuralNode | null;\n /** Names already taken at this level, so the drawer can refuse a duplicate. */\n siblingNames: readonly string[];\n /**\n * Where the listed collection sits inside its layer root — `[]` for an object layer, `['items']`\n * for an array layer whose fields belong to the element.\n *\n * why cần: drawer không dùng field này, nhưng builder thì có. Một tầng `array` (vd `output.schema`\n * nhận `${res.body.items}`) khai field ở `items.properties`, còn tầng `object` khai ở `properties`.\n * Danh sách đã biết mình đang đọc chỗ nào, nên nó nói ra thay vì để builder đoán lại.\n */\n pointer?: readonly string[];\n}\n\ninterface SdApiContractOption {\n value: string;\n label: string;\n}\n\n/**\n * Editing surface for exactly one node, staged and committed in one go.\n *\n * The layer lists outside are read-only, so this drawer is the only place a node changes. It holds a\n * DEEP COPY of the node it was seeded from and emits `nodeCommit` once, when the author saves — that\n * is what makes \"Huỷ\" able to actually cancel, and what keeps the tree from changing under the\n * author's cursor on every keystroke.\n *\n * Save is blocked only for the two problems that stop a node from existing at all: no name, or a name\n * a sibling already holds. Everything else — a reference to a field that does not exist yet, a type\n * that will not fit — saves and is reported by `validateSdApiContract`, because inventing rules here\n * would stop an author declaring one end of a mapping before the other exists.\n */\n@Component({\n selector: 'sd-api-contract-node-drawer',\n standalone: true,\n imports: [SdSideDrawer, SdButton, SdInput, SdSelect, SdApiContractNodeSummary, SdApiContractSourceEditor, SdTranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let _autoId = autoId();\n @let _current = current();\n @let _nameError = nameError();\n\n <sd-side-drawer\n #drawer\n width=\"560px\"\n disableBackdropClose\n [title]=\"title()\"\n [autoId]=\"_autoId\"\n [beforeClose]=\"closeGuard\"\n (sdClosed)=\"onClosed()\">\n @if (_current) {\n <div class=\"sd-acb-drawer\">\n @let _breadcrumb = breadcrumb();\n @if (_breadcrumb.length > 1) {\n <nav class=\"sd-acb-drawer__crumbs\" [attr.aria-label]=\"title()\">\n @for (crumb of _breadcrumb; track $index) {\n @if ($index < _breadcrumb.length - 1) {\n <button\n type=\"button\"\n class=\"sd-acb-drawer__crumb\"\n [attr.data-autoid]=\"_autoId ? _autoId + '-crumb-' + $index : null\"\n (click)=\"backTo($index)\">\n {{ crumb }}\n </button>\n <span class=\"sd-acb-drawer__crumb-sep\">›</span>\n } @else {\n <span class=\"sd-acb-drawer__crumb sd-acb-drawer__crumb--current\">{{ crumb }}</span>\n }\n }\n </nav>\n }\n\n <sd-input\n size=\"sm\"\n [autoId]=\"_autoId ? _autoId + '-name' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.name' | sdTranslate\"\n [model]=\"currentName()\"\n [inlineError]=\"_nameError ?? undefined\"\n (sdChange)=\"setName($event)\"></sd-input>\n\n <sd-select\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-type' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.type' | sdTranslate\"\n [items]=\"typeOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [model]=\"_current.type\"\n (sdChange)=\"setType($event)\"></sd-select>\n\n <sd-select\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-required' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.required' | sdTranslate\"\n [items]=\"requiredOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [model]=\"_current.required === true ? 'true' : 'false'\"\n (sdChange)=\"setRequired($event)\"></sd-select>\n\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-label' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.label' | sdTranslate\"\n [model]=\"_current.label ?? ''\"\n (sdChange)=\"setText('label', $event)\"></sd-input>\n\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-description' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.description' | sdTranslate\"\n [model]=\"_current.description ?? ''\"\n (sdChange)=\"setText('description', $event)\"></sd-input>\n\n @if (allowTransform() && (_current.type === 'date' || _current.type === 'datetime')) {\n <sd-select\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-transform' : undefined\"\n [label]=\"'core.component.api-contract-builder.node.transform' | sdTranslate\"\n [items]=\"transformOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [model]=\"_current.transform ?? ''\"\n (sdChange)=\"setTransform($event)\"></sd-select>\n }\n\n @if (layer() === 'mapping') {\n <sd-api-contract-source-editor\n [node]=\"_current\"\n [suggestions]=\"suggestions()\"\n [autoId]=\"_autoId ? _autoId + '-value' : undefined\"\n (nodeChange)=\"applyCurrent($event)\"></sd-api-contract-source-editor>\n }\n\n @if (_current.type === 'object') {\n @let _children = children();\n <div class=\"sd-acb-drawer__children\">\n <h5 class=\"sd-acb-drawer__children-title\">\n {{ 'core.component.api-contract-builder.node.add-property' | sdTranslate }}\n </h5>\n\n @if (!_children.length) {\n <p class=\"sd-acb-drawer__empty\">{{ 'core.component.api-contract-builder.node.empty' | sdTranslate }}</p>\n }\n\n @for (child of _children; track child.key) {\n <sd-api-contract-node-summary\n [name]=\"child.key\"\n [node]=\"child.node\"\n [autoId]=\"_autoId ? _autoId + '-child-' + child.key : undefined\"\n (edit)=\"enter(child.key)\"\n (remove)=\"removeChild(child.key)\"></sd-api-contract-node-summary>\n }\n\n <sd-button\n type=\"light\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-add-child' : undefined\"\n [title]=\"'core.component.api-contract-builder.node.add-property' | sdTranslate\"\n (click)=\"addChild()\"></sd-button>\n </div>\n }\n\n @if (discardPrompt()) {\n <div class=\"sd-acb-drawer__confirm\" role=\"alertdialog\">\n <span>{{ 'core.component.api-contract-builder.drawer.discard-confirm' | sdTranslate }}</span>\n <sd-button\n type=\"text\"\n size=\"sm\"\n color=\"error\"\n [autoId]=\"_autoId ? _autoId + '-discard' : undefined\"\n [title]=\"'core.component.api-contract-builder.confirm.yes' | sdTranslate\"\n (click)=\"confirmDiscard()\"></sd-button>\n <sd-button\n type=\"text\"\n size=\"sm\"\n [autoId]=\"_autoId ? _autoId + '-keep' : undefined\"\n [title]=\"'core.component.api-contract-builder.confirm.no' | sdTranslate\"\n (click)=\"cancelDiscard()\"></sd-button>\n </div>\n }\n </div>\n }\n\n <sd-button\n sdFooterRight\n type=\"text\"\n [autoId]=\"_autoId ? _autoId + '-cancel' : undefined\"\n [title]=\"'core.component.api-contract-builder.drawer.cancel' | sdTranslate\"\n (click)=\"requestCancel()\"></sd-button>\n <sd-button\n sdFooterRight\n type=\"fill\"\n color=\"primary\"\n [autoId]=\"_autoId ? _autoId + '-save' : undefined\"\n [disabled]=\"!canSave()\"\n [title]=\"'core.component.api-contract-builder.drawer.save' | sdTranslate\"\n (click)=\"save()\"></sd-button>\n </sd-side-drawer>\n `,\n styles: [\n `\n .sd-acb-drawer {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n }\n .sd-acb-drawer__crumbs {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n font-size: 12px;\n }\n .sd-acb-drawer__crumb {\n padding: 2px 4px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--sd-primary, #005cbb);\n font: inherit;\n cursor: pointer;\n }\n .sd-acb-drawer__crumb:hover {\n background: color-mix(in srgb, var(--sd-primary, #005cbb) 10%, transparent);\n }\n .sd-acb-drawer__crumb--current {\n color: var(--sd-text, #1a1b1f);\n font-weight: 600;\n cursor: default;\n }\n .sd-acb-drawer__crumb-sep {\n color: var(--sd-text-secondary, #6b6b6b);\n }\n .sd-acb-drawer__children {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-top: 4px;\n border-top: 1px solid var(--sd-border-color, #e6e6e6);\n }\n .sd-acb-drawer__children-title {\n margin: 0;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sd-text-secondary, #6b6b6b);\n }\n .sd-acb-drawer__empty {\n margin: 0;\n font-size: 12px;\n font-style: italic;\n color: var(--sd-text-secondary, #6b6b6b);\n }\n .sd-acb-drawer__confirm {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n padding: 8px 10px;\n border: 1px dashed var(--sd-border-color, #e6e6e6);\n border-radius: 6px;\n background: var(--sd-surface-muted, #f3f5f8);\n font-size: 12px;\n }\n `,\n ],\n})\nexport class SdApiContractNodeDrawer {\n readonly #i18n = inject(I18nService);\n\n /** `mapping` shows the value editor; `schema` is a plain declaration with no mapping. */\n layer = input<'schema' | 'mapping'>('mapping');\n allowTransform = input(false, { transform: booleanAttribute });\n suggestions = input<readonly SdApiContractSuggestion[]>([]);\n autoId = input<string | null | undefined>();\n\n nodeCommit = output<SdApiContractNodeCommit>();\n\n // why không phải ES-private: Angular từ chối `viewChild` trên field `#` (diagnostic 1053).\n protected readonly drawerRef = viewChild.required<SdSideDrawer>('drawer');\n\n // why: seed là mốc so sánh để biết draft có bẩn hay chưa. Không có nó thì \"Huỷ\" phải đoán, và mọi\n // lần mở drawer đều bị coi là đã sửa.\n #seedName = '';\n #seedJson = '';\n\n readonly #draftName = signal('');\n readonly #draft = signal<SdApiContractStructuralNode | null>(null);\n readonly #rootSiblings = signal<readonly string[]>([]);\n readonly #editingName = signal<string | null>(null);\n readonly #discardPrompt = signal(false);\n\n // why pointer chứ không phải \"node hiện tại\": draft luôn là GỐC của subtree, và một lần Lưu commit\n // cả gốc. Giữ node con rời ra sẽ phải ghép lại lúc Save, và ghép sai là mất nhánh.\n readonly #pointer = signal<SdApiContractNodePointer>([]);\n\n // why: tên đang gõ ở CẤP HIỆN TẠI, kể cả khi nó chưa áp được vào draft.\n readonly #typedName = signal('');\n\n protected readonly draftName = this.#draftName.asReadonly();\n protected readonly discardPrompt = this.#discardPrompt.asReadonly();\n\n /** The node the author is looking at right now — the draft root, or a descendant of it. */\n protected readonly current = computed(() => {\n const draft = this.#draft();\n if (!draft) return null;\n return getSdApiContractNodeAt(draft, this.#pointer());\n });\n\n /** Every key on the breadcrumb. The pointer alternates `properties`/key, so keys sit on odd slots. */\n protected readonly breadcrumb = computed(() => {\n const pointer = this.#pointer();\n const keys = pointer.filter((_, index) => index % 2 === 1);\n return [this.#draftName() || this.#i18n.t('core.component.api-contract-builder.drawer.add-title'), ...keys];\n });\n\n /**\n * What the name field shows.\n *\n * why một signal riêng chứ không đọc thẳng từ draft: một tên KHÔNG áp được — rỗng, hoặc trùng\n * sibling — vẫn phải hiện ra để người dùng thấy mình vừa gõ gì và đọc được lý do bị chặn. Đọc\n * thẳng từ draft thì ô input nhảy về tên cũ ngay khi gõ, tức là từ chối im lặng.\n */\n protected readonly currentName = this.#typedName.asReadonly();\n\n protected readonly children = computed(() => {\n const node = this.current();\n const properties = node?.properties;\n if (!properties) return [];\n return Object.keys(properties).map(key => ({ key, node: properties[key] }));\n });\n\n /** Siblings on the level the author is on — the root list, or the parent object's keys. */\n protected readonly siblingNames = computed<readonly string[]>(() => {\n const pointer = this.#pointer();\n if (pointer.length === 0) return this.#rootSiblings();\n\n const draft = this.#draft();\n if (!draft) return [];\n const parent = getSdApiContractNodeAt(draft, pointer.slice(0, -2));\n return parent?.properties ? Object.keys(parent.properties) : [];\n });\n\n protected readonly typeOptions: SdApiContractOption[] = SD_API_CONTRACT_DATA_TYPES.map(type => ({\n value: type,\n label: type,\n }));\n\n protected readonly requiredOptions: SdApiContractOption[] = [\n { value: 'true', label: this.#i18n.t('core.component.api-contract-builder.required.true') },\n { value: 'false', label: this.#i18n.t('core.component.api-contract-builder.required.false') },\n ];\n\n protected readonly transformOptions: SdApiContractOption[] = [\n { value: '', label: this.#i18n.t('core.component.api-contract-builder.transform.none') },\n { value: 'ISOString', label: 'ISOString' },\n { value: 'UTCString', label: 'UTCString' },\n ];\n\n protected readonly title = computed(() =>\n this.#editingName() === null\n ? this.#i18n.t('core.component.api-contract-builder.drawer.add-title')\n : this.#i18n.t('core.component.api-contract-builder.drawer.edit-title')\n );\n\n protected readonly dirty = computed(() => {\n const draft = this.#draft();\n if (!draft) return false;\n return this.#draftName() !== this.#seedName || JSON.stringify(draft) !== this.#seedJson;\n });\n\n protected readonly nameError = computed<string | null>(() => {\n const name = this.currentName().trim();\n if (name === '') return this.#i18n.t('core.component.api-contract-builder.node.name-required');\n\n // why: node đang sửa luôn nằm trong danh sách sibling của chính cấp nó — so với chính nó là tự báo\n // trùng. \"Chính nó\" phải là key THẬT đang lưu, không phải chữ đang gõ: lấy chữ đang gõ thì gõ đúng\n // tên một sibling khác cũng tự loại chính mình và lỗi trùng không bao giờ nổi lên.\n const pointer = this.#pointer();\n const self = pointer.length === 0 ? this.#editingName() : pointer[pointer.length - 1];\n const taken = this.siblingNames().some(sibling => sibling === name && sibling !== self);\n return taken ? this.#i18n.t('core.component.api-contract-builder.node.duplicate-key') : null;\n });\n\n // why chỉ xét lỗi ở GỐC: Lưu commit cả subtree, và tên đang gõ ở cấp sâu đã được `setName` áp vào\n // draft ngay. Nếu chặn theo cấp hiện tại thì đứng ở cấp sâu sẽ không Lưu được gốc hợp lệ.\n protected readonly canSave = computed(() => {\n if (this.#draft() === null) return false;\n if (this.#draftName().trim() === '') return false;\n return this.nameError() === null;\n });\n\n /**\n * `beforeClose` guard for `<sd-side-drawer>`.\n *\n * why an arrow field, not a method: the drawer takes it as an input value, so it must keep `this`\n * without the template having to bind it.\n */\n protected readonly closeGuard = (): boolean => this.guardClose();\n\n // -------------------------------------------------------------------------\n // Public surface the owning builder drives\n // -------------------------------------------------------------------------\n\n openForAdd(siblingNames: readonly string[] = [], type: SdApiContractDataType = 'string'): void {\n this.#seed(null, createSdApiContractNode(type), siblingNames);\n this.drawerRef().open();\n }\n\n openForEdit(name: string, node: SdApiContractStructuralNode, siblingNames: readonly string[] = []): void {\n this.#seed(name, cloneSdApiContractNode(node), siblingNames);\n this.drawerRef().open();\n }\n\n // -------------------------------------------------------------------------\n // Draft edits\n // -------------------------------------------------------------------------\n\n /**\n * Types into the name field.\n *\n * The typed text is ALWAYS kept, then applied to the draft only when it can be. A name that cannot\n * be applied — empty, or already taken by a sibling — stays visible and `nameError()` explains it,\n * which is what blocks Save. Refusing the keystroke instead would leave the field showing one name\n * while the contract holds another.\n */\n protected setName(value: unknown): void {\n const name = typeof value === 'string' ? value : '';\n this.#typedName.set(name);\n\n const pointer = this.#pointer();\n if (pointer.length === 0) {\n // why chỉ ghi khi hợp lệ: `#draftName` là thứ `save()` phát ra. Ghi tên rỗng vào đó rồi chặn ở\n // `canSave` cũng được, nhưng giữ nó luôn hợp lệ thì `save()` không cần tin vào cổng chặn.\n if (name.trim() !== '') this.#draftName.set(name);\n return;\n }\n\n const draft = this.#draft();\n const from = pointer[pointer.length - 1];\n if (!draft || name.trim() === '' || name === from) return;\n\n const parentPointer = pointer.slice(0, -2);\n const parent = getSdApiContractNodeAt(draft, parentPointer);\n if (!parent) return;\n\n const renamed = renameSdApiContractProperty(parent, from, name);\n // why: helper trả về CHÍNH object cũ khi trùng key. Không áp được thì thôi — `#typedName` đã giữ\n // chữ người dùng gõ và `nameError()` đã báo, nên không có gì bị nuốt im lặng.\n if (renamed === parent) return;\n\n this.#draft.set(setSdApiContractNodeAt(draft, parentPointer, renamed));\n // why dời pointer theo: nếu không, pointer vẫn trỏ key CŨ — `current()` trả null và form trắng xoá.\n this.#pointer.set([...parentPointer, 'properties', name]);\n }\n\n protected setType(value: unknown): void {\n const draft = this.#draft();\n if (!draft || typeof value !== 'string') return;\n if (!(SD_API_CONTRACT_DATA_TYPES as readonly string[]).includes(value)) return;\n this.applyCurrent(changeSdApiContractNodeType(draft, value as SdApiContractDataType));\n }\n\n protected setRequired(value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n if (value === 'true') {\n this.applyCurrent({ ...draft, required: true });\n return;\n }\n // why: bỏ hẳn key thay vì ghi `false` — key vắng và `false` nghĩa như nhau với consumer, và JSON\n // gọn hơn. Một `false` do người khác viết tay vẫn được giữ khi nạp vào.\n const next: Record<string, unknown> = { ...draft };\n delete next['required'];\n this.applyCurrent(next as unknown as SdApiContractStructuralNode);\n }\n\n protected setText(key: 'label' | 'description', value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n const text = typeof value === 'string' ? value.trim() : '';\n const next: Record<string, unknown> = { ...draft };\n if (text === '') delete next[key];\n else next[key] = text;\n this.applyCurrent(next as unknown as SdApiContractStructuralNode);\n }\n\n protected setTransform(value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n const next: Record<string, unknown> = { ...draft };\n if (value === 'ISOString' || value === 'UTCString') next['transform'] = value;\n else delete next['transform'];\n this.applyCurrent(next as unknown as SdApiContractStructuralNode);\n }\n\n protected applyCurrent(node: SdApiContractStructuralNode): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#draft.set(setSdApiContractNodeAt(draft, this.#pointer(), node));\n }\n\n protected enter(key: string): void {\n this.#pointer.set([...this.#pointer(), 'properties', key]);\n this.#syncTypedName();\n this.#discardPrompt.set(false);\n }\n\n /** `depth` counts breadcrumb entries, so 0 is the draft root. */\n protected backTo(depth: number): void {\n this.#pointer.set(this.#pointer().slice(0, depth * 2));\n this.#syncTypedName();\n this.#discardPrompt.set(false);\n }\n\n protected addChild(): void {\n const node = this.current();\n const draft = this.#draft();\n if (!node || !draft) return;\n\n const key = uniqueChildKey(node.properties ?? {});\n const next = addSdApiContractProperty(node, key, createSdApiContractNode('string'));\n this.#draft.set(setSdApiContractNodeAt(draft, this.#pointer(), next));\n }\n\n protected removeChild(key: string): void {\n const node = this.current();\n const draft = this.#draft();\n if (!node || !draft) return;\n this.#draft.set(setSdApiContractNodeAt(draft, this.#pointer(), removeSdApiContractProperty(node, key)));\n }\n\n // -------------------------------------------------------------------------\n // Chốt sổ\n // -------------------------------------------------------------------------\n\n protected save(): void {\n const draft = this.#draft();\n if (!draft || !this.canSave()) return;\n\n this.#discardPrompt.set(false);\n this.nodeCommit.emit({ name: this.#draftName().trim(), node: draft });\n // why: forceClose bỏ qua `beforeClose`. Save đã là chủ ý rõ ràng — hỏi lại \"bỏ thay đổi?\" ngay sau\n // khi vừa lưu là vô nghĩa.\n this.#markCommitted();\n this.drawerRef().forceClose();\n }\n\n protected requestCancel(): void {\n void this.drawerRef().requestClose();\n }\n\n protected confirmDiscard(): void {\n this.#discardPrompt.set(false);\n this.#markCommitted();\n this.drawerRef().forceClose();\n }\n\n protected cancelDiscard(): void {\n this.#discardPrompt.set(false);\n }\n\n /**\n * Blocks the close while the draft is dirty and raises an inline prompt instead.\n *\n * why inline chứ không `window.confirm`: một component thư viện không được dựng dialog của browser\n * — nó không style được, không test được, và chặn cả tab.\n */\n protected guardClose(): boolean {\n if (!this.dirty()) return true;\n this.#discardPrompt.set(true);\n return false;\n }\n\n protected onClosed(): void {\n this.#discardPrompt.set(false);\n }\n\n // -------------------------------------------------------------------------\n\n #seed(name: string | null, node: SdApiContractStructuralNode, siblingNames: readonly string[]): void {\n this.#editingName.set(name);\n this.#draftName.set(name ?? '');\n this.#draft.set(node);\n this.#pointer.set([]);\n this.#typedName.set(name ?? '');\n this.#rootSiblings.set([...siblingNames]);\n this.#discardPrompt.set(false);\n this.#seedName = name ?? '';\n this.#seedJson = JSON.stringify(node);\n }\n\n /** Re-points the name field at whatever level the author just moved to. */\n #syncTypedName(): void {\n const pointer = this.#pointer();\n this.#typedName.set(pointer.length === 0 ? this.#draftName() : pointer[pointer.length - 1]);\n }\n\n /** Re-baselines the seed so a closing drawer is never considered dirty any more. */\n #markCommitted(): void {\n const draft = this.#draft();\n this.#seedName = this.#draftName();\n this.#seedJson = draft ? JSON.stringify(draft) : '';\n }\n}\n\n/** First free `truong`, `truong2`, … so adding twice never collides. */\nfunction uniqueChildKey(properties: Record<string, SdApiContractStructuralNode>): string {\n const base = 'truong';\n if (!Object.prototype.hasOwnProperty.call(properties, base)) return base;\n for (let index = 2; ; index += 1) {\n const candidate = `${base}${index}`;\n if (!Object.prototype.hasOwnProperty.call(properties, candidate)) return candidate;\n }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { removeSdApiContractProperty, setSdApiContractNodeAt, type SdApiContractStructuralNode } from '../api-contract.schema';\nimport type { SdApiContractNodeEditRequest } from './api-contract-node-drawer.component';\nimport { SdApiContractNodeSummary } from './api-contract-node-summary.component';\n\ninterface SdApiContractPropertyEntry {\n key: string;\n node: SdApiContractStructuralNode;\n}\n\n/**\n * One schema layer — `input.schema`, `req.body`, `res.body`, `output.schema` — rendered as a flat list\n * of the fields it declares.\n *\n * It used to be a recursive tree of editable seven-column rows. It is now a list you read: adding and\n * editing ask the builder to open its drawer, and only removal is applied straight away. The list is\n * deliberately FLAT — an `object` field shows how many fields it holds and the author drills into it\n * inside the drawer, so a deeply nested node is edited with a drawer's worth of room instead of a\n * 100px cell.\n */\n@Component({\n selector: 'sd-api-contract-node-editor',\n standalone: true,\n imports: [SdButton, SdTranslatePipe, SdApiContractNodeSummary],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './api-contract-node-editor.component.html',\n styleUrl: './api-contract-node-editor.component.scss',\n})\nexport class SdApiContractNodeEditor {\n /** The layer's root node. */\n node = input.required<SdApiContractStructuralNode>();\n /** Diagnostic path of the layer itself, e.g. `input.schema`. */\n basePath = input.required<string>();\n disabled = input(false, { transform: booleanAttribute });\n autoId = input<string | null | undefined>();\n\n nodeChange = output<SdApiContractStructuralNode>();\n editRequest = output<SdApiContractNodeEditRequest>();\n\n /**\n * Which node actually holds the fields.\n *\n * why: một tầng `array` (`output.schema` sau khi nhận `${res.body.items}`) khai field ở `items`, chứ\n * bản thân nó không có `properties`. Đọc thẳng `node.properties` sẽ ra danh sách rỗng và tầng output\n * của contract mẫu thành không sửa được.\n */\n readonly #container = computed<SdApiContractStructuralNode>(() => {\n const node = this.node();\n return node.type === 'array' && node.items ? node.items : node;\n });\n\n /** `['items']` for an array layer, `[]` otherwise — the prefix a commit has to be written under. */\n readonly #containerPointer = computed<readonly string[]>(() => {\n const node = this.node();\n return node.type === 'array' && node.items ? ['items'] : [];\n });\n\n protected readonly entries = computed<SdApiContractPropertyEntry[]>(() => {\n const properties = this.#container().properties;\n if (!properties) return [];\n return Object.keys(properties).map(key => ({ key, node: properties[key] }));\n });\n\n readonly #keys = computed(() => this.entries().map(entry => entry.key));\n\n protected requestAdd(): void {\n this.editRequest.emit({ name: null, node: null, siblingNames: this.#keys(), pointer: this.#containerPointer() });\n }\n\n protected requestEdit(key: string, node: SdApiContractStructuralNode): void {\n this.editRequest.emit({ name: key, node, siblingNames: this.#keys(), pointer: this.#containerPointer() });\n }\n\n protected removeProperty(key: string): void {\n const stripped = removeSdApiContractProperty(this.#container(), key);\n this.nodeChange.emit(setSdApiContractNodeAt(this.node(), this.#containerPointer(), stripped));\n }\n}\n","@let _entries = entries();\n@let _disabled = disabled();\n@let _autoId = autoId();\n\n<div class=\"sd-acb-list\">\n @if (!_entries.length) {\n <p class=\"sd-acb-list__empty\">{{ 'core.component.api-contract-builder.node.empty' | sdTranslate }}</p>\n }\n\n @for (entry of _entries; track entry.key) {\n <sd-api-contract-node-summary\n [name]=\"entry.key\"\n [node]=\"entry.node\"\n [readonly]=\"_disabled\"\n [autoId]=\"_autoId ? _autoId + '-' + entry.key : undefined\"\n (edit)=\"requestEdit(entry.key, entry.node)\"\n (remove)=\"removeProperty(entry.key)\"></sd-api-contract-node-summary>\n }\n\n @if (!_disabled) {\n <sd-button\n class=\"sd-acb-list__add\"\n type=\"light\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-add' : undefined\"\n [title]=\"'core.component.api-contract-builder.node.add-property' | sdTranslate\"\n (click)=\"requestAdd()\"></sd-button>\n }\n</div>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { sdApiContractRecordRemove, type SdApiContractStructuralNode } from '../api-contract.schema';\nimport type { SdApiContractNodeEditRequest } from './api-contract-node-drawer.component';\nimport { SdApiContractNodeSummary } from './api-contract-node-summary.component';\n\ntype SdApiContractNodeRecord = Record<string, SdApiContractStructuralNode>;\n\ninterface SdApiContractRecordEntry {\n key: string;\n node: SdApiContractStructuralNode;\n path: string;\n}\n\n/**\n * One keyed collection of nodes — `req.path` / `req.query` / `req.headers` / `res.headers` — rendered\n * as a list you read, not a list you type into.\n *\n * Every entry is a collapsed row. Adding and editing both ask the builder to open its drawer; only\n * removal is applied straight away, because there is nothing to stage about deleting a row. That is\n * why `add()` emits an edit request rather than an entry: a half-declared field must never reach the\n * contract just because someone clicked the add button and changed their mind.\n */\n@Component({\n selector: 'sd-api-contract-record-editor',\n standalone: true,\n imports: [SdButton, SdTranslatePipe, SdApiContractNodeSummary],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let _entries = entries();\n @let _disabled = disabled();\n @let _autoId = autoId();\n\n <div class=\"sd-acb-record\">\n @if (!_entries.length) {\n <p class=\"sd-acb-record__empty\">{{ emptyLabel() }}</p>\n }\n\n @for (entry of _entries; track entry.key) {\n <sd-api-contract-node-summary\n [name]=\"entry.key\"\n [node]=\"entry.node\"\n [readonly]=\"_disabled\"\n [autoId]=\"_autoId ? _autoId + '-' + entry.key : undefined\"\n (edit)=\"requestEdit(entry)\"\n (remove)=\"remove(entry.key)\"></sd-api-contract-node-summary>\n }\n\n @if (!_disabled) {\n <sd-button\n class=\"sd-acb-record__add\"\n type=\"light\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-add' : undefined\"\n [title]=\"'core.component.api-contract-builder.request.add-entry' | sdTranslate\"\n (click)=\"requestAdd()\"></sd-button>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n .sd-acb-record {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .sd-acb-record__empty {\n margin: 0;\n font-size: 12px;\n font-style: italic;\n color: var(--sd-text-secondary, #6b6b6b);\n }\n .sd-acb-record__add {\n align-self: flex-start;\n }\n `,\n ],\n})\nexport class SdApiContractRecordEditor {\n record = input<SdApiContractNodeRecord | undefined>();\n /** Diagnostic path of the collection itself, e.g. `req.query`. */\n basePath = input.required<string>();\n disabled = input(false, { transform: booleanAttribute });\n emptyLabel = input<string>('');\n autoId = input<string | null | undefined>();\n\n recordChange = output<SdApiContractNodeRecord>();\n editRequest = output<SdApiContractNodeEditRequest>();\n\n protected readonly entries = computed<SdApiContractRecordEntry[]>(() => {\n const record = this.record();\n if (!record) return [];\n const base = this.basePath();\n return Object.keys(record).map(key => ({ key, node: record[key], path: `${base}.${key}` }));\n });\n\n readonly #keys = computed(() => this.entries().map(entry => entry.key));\n\n protected requestAdd(): void {\n this.editRequest.emit({ name: null, node: null, siblingNames: this.#keys() });\n }\n\n protected requestEdit(entry: SdApiContractRecordEntry): void {\n this.editRequest.emit({ name: entry.key, node: entry.node, siblingNames: this.#keys() });\n }\n\n protected remove(key: string): void {\n const record = this.record();\n if (!record) return;\n this.recordChange.emit(sdApiContractRecordRemove(record, key));\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n HostBinding,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdCodeEditor } from '@sdcorejs/angular/components/code-editor';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport {\n resolveSdApiContractConfiguration,\n SD_API_CONTRACT_CONFIGURATION,\n type SdApiContractConfiguration,\n} from './api-contract.configuration';\nimport {\n SD_API_CONTRACT_DATA_TYPES,\n SD_API_CONTRACT_HTTP_METHODS,\n SD_API_CONTRACT_SCALAR_DATA_TYPES,\n SD_API_CONTRACT_VERSION,\n type SdApiContract,\n type SdApiContractDataType,\n type SdApiContractDiagnostic,\n type SdApiContractFeSchemaNode,\n type SdApiContractHttpMethod,\n type SdApiContractMappedFeSchemaNode,\n type SdApiContractMappedRestNode,\n type SdApiContractRestNode,\n} from './api-contract.model';\nimport {\n addSdApiContractProperty,\n cloneSdApiContract,\n cloneSdApiContractNode,\n createSdApiContractNode,\n formatSdApiContractExpression,\n getSdApiContractNodeAt,\n listSdApiContractResponseFields,\n listSdApiContractSchemaFields,\n renameSdApiContractProperty,\n resolveSdApiContractResponsePath,\n sdApiContractRecordRename,\n sdApiContractRecordSet,\n setSdApiContractNodeAt,\n type SdApiContractSchemaField,\n type SdApiContractStructuralNode,\n} from './api-contract.schema';\nimport { serializeSdApiContract } from './api-contract.serializer';\nimport { validateSdApiContract } from './api-contract.validation';\nimport { SdApiContractDiagnosticList } from './components/api-contract-diagnostic-list.component';\nimport {\n SdApiContractNodeDrawer,\n type SdApiContractNodeCommit,\n type SdApiContractNodeEditRequest,\n} from './components/api-contract-node-drawer.component';\nimport { SdApiContractNodeEditor } from './components/api-contract-node-editor.component';\nimport { SdApiContractRecordEditor } from './components/api-contract-record-editor.component';\nimport type { SdApiContractSuggestion } from './components/api-contract-suggestion.model';\n\ninterface SdApiContractOption {\n value: string;\n label: string;\n}\n\ninterface SdApiContractStep {\n index: number;\n key: string;\n label: string;\n}\n\ntype SdApiContractNodeRecord = Record<string, SdApiContractStructuralNode>;\n\n/** Every place a node can live. The builder needs it to route a commit back to its owner. */\ntype SdApiContractDrawerSection =\n | 'input.schema'\n | 'req.path'\n | 'req.query'\n | 'req.headers'\n | 'req.body'\n | 'res.headers'\n | 'res.body'\n | 'output.schema';\n\ninterface SdApiContractDrawerTarget {\n section: SdApiContractDrawerSection;\n request: SdApiContractNodeEditRequest;\n}\n\nconst STEP_GENERAL = 0;\nconst STEP_INPUT = 1;\nconst STEP_REQUEST = 2;\nconst STEP_RESPONSE = 3;\nconst STEP_OUTPUT = 4;\nconst STEP_REVIEW = 5;\n\n/**\n * Visual builder for an `SdApiContract`.\n *\n * The component is a **design-time** tool: it never performs a request, never resolves an\n * expression and never holds a secret. It edits, validates and serializes the contract; executing\n * it is a separate concern for a future `form-builder` / `form-render` integration.\n *\n * @example\n * ```html\n * <sd-api-contract-builder [(model)]=\"contract\" autoId=\"product-search\"></sd-api-contract-builder>\n * ```\n */\n@Component({\n selector: 'sd-api-contract-builder',\n standalone: true,\n imports: [\n SdButton,\n SdCodeEditor,\n SdIcon,\n SdInput,\n SdSelect,\n SdTranslatePipe,\n SdApiContractDiagnosticList,\n SdApiContractNodeEditor,\n SdApiContractNodeDrawer,\n SdApiContractRecordEditor,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './api-contract-builder.component.html',\n styleUrl: './api-contract-builder.component.scss',\n})\nexport class SdApiContractBuilder {\n readonly #i18n = inject(I18nService);\n readonly #configuration: SdApiContractConfiguration = resolveSdApiContractConfiguration(\n inject(SD_API_CONTRACT_CONFIGURATION, { optional: true })\n );\n\n model = model<SdApiContract | null>(null);\n mode = input<'edit' | 'view'>('edit');\n disabled = input(false, { transform: booleanAttribute });\n autoId = input<string | null | undefined>();\n\n /** Fires whenever the diagnostics change, including once for the initially seeded contract. */\n diagnosticsChange = output<readonly SdApiContractDiagnostic[]>();\n /** Fires only when validity flips, so a consumer can gate a Save button without debouncing. */\n validChange = output<boolean>();\n\n // why: bản nháp nội bộ là BẢN SAO SÂU của model cha. Component không bao giờ ghi vào object cha —\n // mọi thao tác dựng contract mới rồi mới `model.set`.\n readonly #draft = signal<SdApiContract | null>(null);\n // why: mốc so sánh để phân biệt \"cha đưa giá trị mới vào\" với \"chính ta vừa bắn ra\" — thiếu nó,\n // effect seed sẽ clone lại contract ta vừa emit và tạo vòng lặp phản hồi.\n #lastEmitted: SdApiContract | null = null;\n #lastValid: boolean | null = null;\n\n protected readonly activeStep = signal(STEP_GENERAL);\n protected readonly contractVersion = SD_API_CONTRACT_VERSION;\n protected readonly responseFieldToken = signal<string | null>(null);\n protected readonly urlPlaceholder = '${env.baseUrl}/products/{id}';\n\n protected readonly draft = this.#draft.asReadonly();\n protected readonly readonly = computed(() => this.disabled() || this.mode() === 'view');\n protected readonly isView = computed(() => this.mode() === 'view');\n\n protected readonly steps: SdApiContractStep[] = [\n { index: STEP_GENERAL, key: 'general', label: this.#i18n.t('core.component.api-contract-builder.step.general') },\n { index: STEP_INPUT, key: 'input', label: this.#i18n.t('core.component.api-contract-builder.step.input') },\n { index: STEP_REQUEST, key: 'request', label: this.#i18n.t('core.component.api-contract-builder.step.request') },\n { index: STEP_RESPONSE, key: 'response', label: this.#i18n.t('core.component.api-contract-builder.step.response') },\n { index: STEP_OUTPUT, key: 'output', label: this.#i18n.t('core.component.api-contract-builder.step.output') },\n { index: STEP_REVIEW, key: 'review', label: this.#i18n.t('core.component.api-contract-builder.step.review') },\n ];\n\n protected readonly methodOptions: SdApiContractOption[] = SD_API_CONTRACT_HTTP_METHODS.map(method => ({ value: method, label: method }));\n protected readonly allTypes: readonly SdApiContractDataType[] = SD_API_CONTRACT_DATA_TYPES;\n protected readonly scalarTypes: readonly SdApiContractDataType[] = SD_API_CONTRACT_SCALAR_DATA_TYPES;\n protected readonly queryTypes: readonly SdApiContractDataType[] = [...SD_API_CONTRACT_SCALAR_DATA_TYPES, 'array'];\n\n readonly #envSuggestions: SdApiContractSuggestion[] = Object.keys(this.#configuration.env).map(key => {\n const variable = this.#configuration.env[key];\n const sensitiveMark = variable.sensitive ? ` · ${this.#i18n.t('core.component.api-contract-builder.mapping.sensitive')}` : '';\n return {\n expression: formatSdApiContractExpression('env', [key]),\n path: `env.${key}`,\n root: 'env' as const,\n type: variable.type,\n display: `env.${key} — ${variable.type}${sensitiveMark}`,\n };\n });\n\n // why: builder sở hữu ĐÚNG MỘT drawer, nên phải tự nhớ danh sách nào vừa yêu cầu mở nó. Không có\n // mốc này thì `applyNodeCommit` không biết ghi kết quả vào `req.query` hay `res.headers`.\n readonly #drawerTarget = signal<SdApiContractDrawerTarget | null>(null);\n\n protected readonly nodeDrawer = viewChild<SdApiContractNodeDrawer>('nodeDrawer');\n\n protected readonly drawerLayer = computed<'schema' | 'mapping'>(() =>\n this.#drawerTarget()?.section === 'input.schema' ? 'schema' : 'mapping'\n );\n\n // why chỉ input/output schema: `transform` là thuộc tính của schema frontend. `req`/`res` mô tả HTTP,\n // ở đó một giá trị thời gian đã là chuỗi trên đường truyền rồi.\n protected readonly drawerAllowsTransform = computed(() => {\n const section = this.#drawerTarget()?.section;\n return section === 'input.schema' || section === 'output.schema';\n });\n\n protected readonly drawerSuggestions = computed<readonly SdApiContractSuggestion[]>(() => {\n const section = this.#drawerTarget()?.section;\n if (section === undefined) return [];\n if (section === 'output.schema') return this.outputSuggestions();\n if (section === 'res.headers' || section === 'res.body') return this.outputSuggestions();\n return this.requestSuggestions();\n });\n\n // why: JSON dán vào có thể chưa parse được (đang gõ dở, thiếu ngoặc). Lỗi đó KHÔNG đến từ\n // `validateSdApiContract` — nó chưa bao giờ thấy contract — nên phải mang riêng rồi trộn vào\n // danh sách chẩn đoán, để người dán thấy lý do thay vì thấy contract im lặng không đổi.\n readonly #pasteError = signal<SdApiContractDiagnostic | null>(null);\n\n protected readonly diagnostics = computed<readonly SdApiContractDiagnostic[]>(() => {\n const draft = this.#draft();\n const base = draft ? validateSdApiContract(draft, this.#configuration) : [];\n const pasteError = this.#pasteError();\n return pasteError ? [pasteError, ...base] : base;\n });\n\n protected readonly json = computed(() => serializeSdApiContract(this.#draft()));\n\n // why: contract từ ngoài có thể thiếu hẳn một tầng. Mọi computed đọc draft phải chịu được điều đó —\n // builder có nhiệm vụ HIỂN THỊ contract sai kèm chẩn đoán, không được nổ và cũng không được tự vá.\n readonly #inputSuggestions = computed<SdApiContractSuggestion[]>(() => {\n const schema = this.#draft()?.input?.schema;\n if (!schema) return [];\n return listSdApiContractSchemaFields(schema as unknown as SdApiContractStructuralNode, { arrays: 'stop' }).map(field => ({\n expression: formatSdApiContractExpression('input', field.segments),\n path: `input.${field.path}`,\n root: 'input' as const,\n type: field.type,\n display: `input.${field.path} — ${field.type}${field.label ? ` (${field.label})` : ''}`,\n }));\n });\n\n readonly #responseSuggestions = computed<SdApiContractSuggestion[]>(() => {\n const response = this.#draft()?.res;\n if (!response) return [];\n return listSdApiContractResponseFields(response).map(field => ({\n expression: formatSdApiContractExpression('res', field.segments),\n path: `res.${field.path}`,\n root: 'res' as const,\n type: field.type,\n display: `res.${field.path} — ${field.type}`,\n }));\n });\n\n protected readonly requestSuggestions = computed<SdApiContractSuggestion[]>(() => [...this.#inputSuggestions(), ...this.#envSuggestions]);\n\n protected readonly outputSuggestions = computed<SdApiContractSuggestion[]>(() => [\n ...this.#responseSuggestions(),\n ...this.#inputSuggestions(),\n ...this.#envSuggestions,\n ]);\n\n /** Response paths offered by the \"use a response field as the output\" action. */\n protected readonly responseFieldOptions = computed<SdApiContractOption[]>(() => {\n const response = this.#draft()?.res;\n if (!response) return [];\n return listSdApiContractResponseFields(response).map(field => ({ value: field.path, label: `${field.path} — ${field.type}` }));\n });\n\n /** Leaf fields a dropdown / table consumer will see once this contract runs. */\n protected readonly outputFields = computed<SdApiContractSchemaField[]>(() => {\n const schema = this.#draft()?.output?.schema;\n if (!schema) return [];\n return listSdApiContractSchemaFields(schema as unknown as SdApiContractStructuralNode).filter(field => field.leaf);\n });\n\n protected readonly statusText = computed(() => {\n const status = this.#draft()?.res?.status;\n if (status === undefined) return '';\n return Array.isArray(status) ? status.join(', ') : String(status);\n });\n\n @HostBinding('attr.data-autoId') get autoIdAttr(): string | null {\n return this.autoId() ?? null;\n }\n\n constructor() {\n effect(() => {\n const external = this.model();\n untracked(() => {\n if (external === this.#lastEmitted) return;\n // why: clone sâu — cha giữ nguyên object của mình, mọi chỉnh sửa chỉ chạm bản nháp.\n // Contract sai cấu trúc vẫn được nạp nguyên trạng để hiển thị + chẩn đoán, KHÔNG tự sửa.\n this.#draft.set(external ? cloneSdApiContract(external) : null);\n });\n });\n\n effect(() => {\n const diagnostics = this.diagnostics();\n untracked(() => {\n this.diagnosticsChange.emit(diagnostics);\n const valid = !diagnostics.some(diagnostic => diagnostic.severity === 'error');\n if (valid !== this.#lastValid) {\n this.#lastValid = valid;\n this.validChange.emit(valid);\n }\n });\n });\n }\n\n // -------------------------------------------------------------------------\n // Navigation\n // -------------------------------------------------------------------------\n\n protected goToStep(index: number): void {\n this.activeStep.set(index);\n }\n\n protected goToDiagnostic(diagnostic: SdApiContractDiagnostic): void {\n this.activeStep.set(stepForPath(diagnostic.path));\n }\n\n // -------------------------------------------------------------------------\n // Contract-level edits\n // -------------------------------------------------------------------------\n\n protected createContract(): void {\n this.#commit({\n contractVersion: SD_API_CONTRACT_VERSION,\n code: '',\n name: '',\n input: { schema: { type: 'object', properties: {} } },\n req: { method: 'GET', url: '' },\n res: { status: 200 },\n output: { schema: { type: 'object', properties: {} } },\n });\n }\n\n protected setText(key: 'code' | 'name' | 'description', value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n const text = typeof value === 'string' ? value : '';\n if (key === 'description' && !text) {\n const { description: _dropped, ...rest } = draft;\n this.#commit(rest as SdApiContract);\n return;\n }\n this.#commit({ ...draft, [key]: text });\n }\n\n protected setInputSchema(node: SdApiContractStructuralNode): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, input: { schema: node as unknown as SdApiContractFeSchemaNode } });\n }\n\n protected setMethod(value: unknown): void {\n const draft = this.#draft();\n if (!draft || typeof value !== 'string') return;\n this.#commit({ ...draft, req: { ...draft.req, method: value as SdApiContractHttpMethod } });\n }\n\n protected setUrl(value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, req: { ...draft.req, url: typeof value === 'string' ? value : '' } });\n }\n\n // -------------------------------------------------------------------------\n // Drawer\n // -------------------------------------------------------------------------\n\n /**\n * Opens the one drawer for whichever list asked.\n *\n * why gác `readonly` ở đây nữa: hàng thu gọn đã tự chặn khi read-only, nhưng builder là nơi duy nhất\n * biết `mode`/`disabled` thật. Hai lớp gác rẻ hơn một đường mở drawer lọt trong chế độ xem.\n */\n protected openNodeDrawer(section: SdApiContractDrawerSection, request: SdApiContractNodeEditRequest): void {\n if (this.readonly()) return;\n\n this.#drawerTarget.set({ section, request });\n const drawer = this.nodeDrawer();\n if (!drawer) return;\n\n if (request.name === null || request.node === null) drawer.openForAdd(request.siblingNames);\n else drawer.openForEdit(request.name, request.node, request.siblingNames);\n }\n\n /**\n * Writes a committed node back where it came from — one `modelChange`, at Save time.\n *\n * A rename goes through `sdApiContractRecordRename` first so the entry keeps its position in the\n * JSON instead of jumping to the end. The drawer has already refused a duplicate name, so the\n * rename cannot collide by the time it reaches here.\n */\n protected applyNodeCommit(commit: SdApiContractNodeCommit): void {\n const target = this.#drawerTarget();\n const draft = this.#draft();\n this.#drawerTarget.set(null);\n if (!target || !draft) return;\n\n const previous = target.request.name;\n const pointer = target.request.pointer ?? [];\n\n switch (target.section) {\n case 'req.path':\n case 'req.query':\n case 'req.headers': {\n const key = target.section.slice('req.'.length) as 'path' | 'query' | 'headers';\n const record = (draft.req?.[key] ?? {}) as unknown as SdApiContractNodeRecord;\n this.setRequestRecord(key, commitIntoRecord(record, previous, commit));\n return;\n }\n case 'res.headers': {\n const record = (draft.res?.headers ?? {}) as unknown as SdApiContractNodeRecord;\n this.setResponseHeaders(commitIntoRecord(record, previous, commit));\n return;\n }\n case 'input.schema': {\n const root = draft.input?.schema as unknown as SdApiContractStructuralNode | undefined;\n if (!root) return;\n this.setInputSchema(commitIntoProperties(root, pointer, previous, commit));\n return;\n }\n case 'req.body': {\n const root = draft.req?.body as unknown as SdApiContractStructuralNode | undefined;\n if (!root) return;\n this.setRequestBody(commitIntoProperties(root, pointer, previous, commit));\n return;\n }\n case 'res.body': {\n const root = draft.res?.body as unknown as SdApiContractStructuralNode | undefined;\n if (!root) return;\n this.setResponseBody(commitIntoProperties(root, pointer, previous, commit));\n return;\n }\n case 'output.schema': {\n const root = draft.output?.schema as unknown as SdApiContractStructuralNode | undefined;\n if (!root) return;\n this.setOutputSchema(commitIntoProperties(root, pointer, previous, commit));\n return;\n }\n default:\n return;\n }\n }\n\n protected setRequestRecord(section: 'path' | 'query' | 'headers', record: SdApiContractNodeRecord): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, req: { ...draft.req, [section]: record as unknown as Record<string, SdApiContractMappedRestNode> } });\n }\n\n protected setRequestBody(node: SdApiContractStructuralNode): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, req: { ...draft.req, body: node as unknown as SdApiContractMappedRestNode } });\n }\n\n protected addRequestBody(): void {\n this.setRequestBody(createSdApiContractNode('object'));\n }\n\n protected removeRequestBody(): void {\n const draft = this.#draft();\n if (!draft) return;\n const { body: _dropped, ...req } = draft.req;\n this.#commit({ ...draft, req });\n }\n\n protected setStatus(value: unknown): void {\n const draft = this.#draft();\n if (!draft) return;\n const parts = String(value ?? '')\n .split(',')\n .map(part => part.trim())\n .filter(part => part.length > 0)\n .map(part => Number(part));\n // why: KHÔNG bỏ giá trị không phải số — validator phải báo `res.status.invalid` cho người dùng\n // thấy, im lặng nuốt đi là \"âm thầm sửa contract sai\".\n const status = parts.length === 1 ? parts[0] : parts;\n this.#commit({ ...draft, res: { ...draft.res, status } });\n }\n\n protected setResponseHeaders(record: SdApiContractNodeRecord): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, res: { ...draft.res, headers: record as unknown as Record<string, SdApiContractRestNode> } });\n }\n\n protected setResponseBody(node: SdApiContractStructuralNode): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, res: { ...draft.res, body: node as unknown as SdApiContractRestNode } });\n }\n\n protected addResponseBody(): void {\n this.setResponseBody(createSdApiContractNode('object'));\n }\n\n protected removeResponseBody(): void {\n const draft = this.#draft();\n if (!draft) return;\n const { body: _dropped, ...res } = draft.res;\n this.#commit({ ...draft, res });\n }\n\n protected setOutputSchema(node: SdApiContractStructuralNode): void {\n const draft = this.#draft();\n if (!draft) return;\n this.#commit({ ...draft, output: { schema: node as unknown as SdApiContractMappedFeSchemaNode } });\n }\n\n /**\n * Adopts a response subtree as the output schema.\n *\n * The subtree is **deep-copied**, never referenced: editing the output afterwards must not reach\n * back into the response declaration. An array or scalar target takes a whole-node `source`; an\n * object target keeps its shape and each branch gets its own `source`, because an object with both\n * a whole-node source and child mappings is invalid by design.\n */\n protected useResponseFieldAsOutput(value: unknown): void {\n const draft = this.#draft();\n if (!draft || typeof value !== 'string' || !value) return;\n const segments = value.split('.');\n const resolved = resolveSdApiContractResponsePath(draft.res, segments);\n this.responseFieldToken.set(null);\n if (!resolved) return;\n\n const schema = resolved.node\n ? adoptResponseNode(resolved.node, segments)\n : ({ type: resolved.type, source: formatSdApiContractExpression('res', segments) } as SdApiContractStructuralNode);\n this.setOutputSchema(schema);\n }\n\n /**\n * Adopts a contract pasted into the review editor.\n *\n * `<sd-code-editor language=\"json\">` emits the PARSED value when the text is valid JSON and the\n * raw STRING while it is still half-typed. A string therefore means \"not parseable yet\": keep the\n * current draft and report it, because replacing a contract with a fragment of text would destroy\n * the author's work on a keystroke.\n *\n * A parseable object is adopted VERBATIM — no field is added, removed or repaired. Whatever is\n * wrong with it surfaces through `validateSdApiContract`, which is the whole point of pasting.\n */\n protected applyPastedJson(value: unknown): void {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n this.#pasteError.set({\n code: 'contract.invalid',\n severity: 'error',\n path: '',\n message: 'The pasted text is not valid JSON. The contract was left unchanged.',\n });\n return;\n }\n\n this.#pasteError.set(null);\n this.#commit(cloneSdApiContract(value as SdApiContract));\n }\n\n #commit(next: SdApiContract): void {\n this.#lastEmitted = next;\n this.#draft.set(next);\n this.model.set(next);\n }\n}\n\n/**\n * Places a committed node back under a schema root's `properties`.\n *\n * why phân biệt add với overwrite: `addSdApiContractProperty` CỐ Ý không ghi đè key đã tồn tại (nó bảo\n * caller phải tự dedupe). Sửa một field đang có thì phải đi qua `setSdApiContractNodeAt`, nếu không\n * mọi lần Lưu trên field cũ sẽ im lặng không có tác dụng.\n */\nfunction commitIntoProperties(\n root: SdApiContractStructuralNode,\n pointer: readonly string[],\n previous: string | null,\n commit: SdApiContractNodeCommit\n): SdApiContractStructuralNode {\n // why đi qua pointer: danh sách nói cho ta biết nó đang đọc `properties` hay `items.properties`.\n // Ghi thẳng vào root sẽ tạo ra một nhánh `properties` song song mà tầng `array` không bao giờ đọc.\n const container = getSdApiContractNodeAt(root, pointer);\n if (!container) return root;\n\n let next = container;\n if (previous !== null && previous !== commit.name) {\n next = renameSdApiContractProperty(next, previous, commit.name);\n }\n\n const exists = next.properties && Object.prototype.hasOwnProperty.call(next.properties, commit.name);\n next = exists\n ? setSdApiContractNodeAt(next, ['properties', commit.name], commit.node)\n : addSdApiContractProperty(next, commit.name, commit.node);\n\n return setSdApiContractNodeAt(root, pointer, next);\n}\n\n/** Places a committed node back into a keyed record, keeping the author's key order. */\nfunction commitIntoRecord(\n record: SdApiContractNodeRecord,\n previous: string | null,\n commit: SdApiContractNodeCommit\n): SdApiContractNodeRecord {\n if (previous !== null && previous !== commit.name) {\n const renamed = sdApiContractRecordRename(record, previous, commit.name);\n return sdApiContractRecordSet(renamed, commit.name, commit.node);\n }\n return sdApiContractRecordSet(record, commit.name, commit.node);\n}\n\n/** Recursively rebuilds a response subtree as a mapped output subtree. */\nfunction adoptResponseNode(node: SdApiContractStructuralNode, segments: readonly string[]): SdApiContractStructuralNode {\n if (node.type === 'object' && node.properties) {\n const properties: Record<string, SdApiContractStructuralNode> = {};\n for (const key of Object.keys(node.properties)) {\n properties[key] = adoptResponseNode(node.properties[key], [...segments, key]);\n }\n const next: SdApiContractStructuralNode = { type: 'object', properties };\n if (node.required !== undefined) next.required = node.required;\n if (node.label !== undefined) next.label = node.label;\n if (node.description !== undefined) next.description = node.description;\n return next;\n }\n return { ...cloneSdApiContractNode(node), source: formatSdApiContractExpression('res', segments) };\n}\n\nfunction stepForPath(path: string): number {\n if (path.startsWith('input.')) return STEP_INPUT;\n if (path.startsWith('req')) return STEP_REQUEST;\n if (path.startsWith('res')) return STEP_RESPONSE;\n if (path.startsWith('output')) return STEP_OUTPUT;\n return STEP_GENERAL;\n}\n","@let _draft = draft();\n@let _readonly = readonly();\n@let _autoId = autoId();\n@let _diagnostics = diagnostics();\n@let _activeStep = activeStep();\n@let _requestSuggestions = requestSuggestions();\n@let _responseFieldOptions = responseFieldOptions();\n\n<!-- why: contract từ ngoài có thể thiếu hẳn một tầng. Mọi nhánh đọc `_draft.<section>` đều phải\n gác — builder hiển thị contract sai kèm chẩn đoán chứ không tự vá, và cũng không được nổ. -->\n@if (!_draft) {\n <div class=\"sd-acb__empty\">\n <sd-icon name=\"description\" size=\"lg\"></sd-icon>\n <p>{{ 'core.component.api-contract-builder.empty.contract' | sdTranslate }}</p>\n @if (!_readonly) {\n <sd-button\n type=\"fill\"\n color=\"primary\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-create' : undefined\"\n [title]=\"'core.component.api-contract-builder.create-contract' | sdTranslate\"\n (click)=\"createContract()\"></sd-button>\n }\n </div>\n} @else if (isView()) {\n <section class=\"sd-acb__view\">\n <dl class=\"sd-acb__summary\">\n <dt>{{ 'core.component.api-contract-builder.contract.code' | sdTranslate }}</dt>\n <dd data-field=\"code\">{{ _draft.code }}</dd>\n <dt>{{ 'core.component.api-contract-builder.contract.name' | sdTranslate }}</dt>\n <dd data-field=\"name\">{{ _draft.name }}</dd>\n <dt>{{ 'core.component.api-contract-builder.request.method' | sdTranslate }}</dt>\n <dd data-field=\"method\">{{ _draft.req?.method }}</dd>\n <dt>{{ 'core.component.api-contract-builder.request.url' | sdTranslate }}</dt>\n <dd data-field=\"url\">{{ _draft.req?.url }}</dd>\n </dl>\n\n <sd-api-contract-diagnostic-list\n [diagnostics]=\"_diagnostics\"\n [autoId]=\"_autoId ? _autoId + '-diagnostics' : undefined\"></sd-api-contract-diagnostic-list>\n\n <sd-code-editor language=\"json\" [viewed]=\"true\" maxHeight=\"420px\" [model]=\"json()\"></sd-code-editor>\n </section>\n} @else {\n <nav class=\"sd-acb__steps\" [attr.aria-label]=\"'core.component.api-contract-builder.steps' | sdTranslate\">\n @for (step of steps; track step.index) {\n <button\n type=\"button\"\n class=\"sd-acb__step\"\n [class.sd-acb__step--active]=\"_activeStep === step.index\"\n [attr.aria-current]=\"_activeStep === step.index ? 'step' : null\"\n [attr.data-autoId]=\"_autoId ? _autoId + '-step-' + step.key : null\"\n (click)=\"goToStep(step.index)\">\n <span class=\"sd-acb__step-index\">{{ step.index + 1 }}</span>\n <span class=\"sd-acb__step-label\">{{ step.label }}</span>\n </button>\n }\n </nav>\n\n <div class=\"sd-acb__body\">\n @switch (_activeStep) {\n @case (0) {\n <section class=\"sd-acb__section\" data-step=\"general\">\n <div class=\"sd-acb__grid\">\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-code' : undefined\"\n [label]=\"'core.component.api-contract-builder.contract.code' | sdTranslate\"\n [model]=\"_draft.code\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setText('code', $event)\"></sd-input>\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-name' : undefined\"\n [label]=\"'core.component.api-contract-builder.contract.name' | sdTranslate\"\n [model]=\"_draft.name\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setText('name', $event)\"></sd-input>\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-description' : undefined\"\n [label]=\"'core.component.api-contract-builder.contract.description' | sdTranslate\"\n [model]=\"_draft.description ?? ''\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setText('description', $event)\"></sd-input>\n <sd-input\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-version' : undefined\"\n [label]=\"'core.component.api-contract-builder.contract.version' | sdTranslate\"\n [model]=\"contractVersion\"\n [readonly]=\"true\"\n [disabled]=\"true\"></sd-input>\n </div>\n </section>\n }\n\n @case (1) {\n <section class=\"sd-acb__section\" data-step=\"input\">\n @if (_draft.input?.schema; as _inputSchema) {\n <sd-api-contract-node-editor\n [node]=\"$any(_inputSchema)\"\n basePath=\"input.schema\"\n [disabled]=\"_readonly\"\n [autoId]=\"_autoId ? _autoId + '-input' : undefined\"\n (nodeChange)=\"setInputSchema($event)\"\n (editRequest)=\"openNodeDrawer('input.schema', $event)\"></sd-api-contract-node-editor>\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.section' | sdTranslate }}</p>\n }\n </section>\n }\n\n @case (2) {\n <section class=\"sd-acb__section\" data-step=\"request\">\n @if (_draft.req; as _req) {\n <div class=\"sd-acb__grid\">\n <sd-select\n size=\"sm\"\n hideInlineError\n [clearable]=\"false\"\n [autoId]=\"_autoId ? _autoId + '-method' : undefined\"\n [label]=\"'core.component.api-contract-builder.request.method' | sdTranslate\"\n [items]=\"methodOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [model]=\"_req.method\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setMethod($event)\"></sd-select>\n <sd-input\n class=\"sd-acb__url\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-url' : undefined\"\n [label]=\"'core.component.api-contract-builder.request.url' | sdTranslate\"\n [placeholder]=\"urlPlaceholder\"\n [model]=\"_req.url\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setUrl($event)\"></sd-input>\n </div>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.request.path' | sdTranslate }}</h4>\n <sd-api-contract-record-editor\n [record]=\"$any(_req.path)\"\n basePath=\"req.path\"\n [disabled]=\"_readonly\"\n [emptyLabel]=\"'core.component.api-contract-builder.empty.path' | sdTranslate\"\n [autoId]=\"_autoId ? _autoId + '-path' : undefined\"\n (recordChange)=\"setRequestRecord('path', $event)\"\n (editRequest)=\"openNodeDrawer('req.path', $event)\"></sd-api-contract-record-editor>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.request.query' | sdTranslate }}</h4>\n <sd-api-contract-record-editor\n [record]=\"$any(_req.query)\"\n basePath=\"req.query\"\n [disabled]=\"_readonly\"\n [emptyLabel]=\"'core.component.api-contract-builder.empty.query' | sdTranslate\"\n [autoId]=\"_autoId ? _autoId + '-query' : undefined\"\n (recordChange)=\"setRequestRecord('query', $event)\"\n (editRequest)=\"openNodeDrawer('req.query', $event)\"></sd-api-contract-record-editor>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.request.headers' | sdTranslate }}</h4>\n <sd-api-contract-record-editor\n [record]=\"$any(_req.headers)\"\n basePath=\"req.headers\"\n [disabled]=\"_readonly\"\n [emptyLabel]=\"'core.component.api-contract-builder.empty.headers' | sdTranslate\"\n [autoId]=\"_autoId ? _autoId + '-headers' : undefined\"\n (recordChange)=\"setRequestRecord('headers', $event)\"\n (editRequest)=\"openNodeDrawer('req.headers', $event)\"></sd-api-contract-record-editor>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.request.body' | sdTranslate }}</h4>\n @if (_req.body) {\n <sd-api-contract-node-editor\n [node]=\"$any(_req.body)\"\n basePath=\"req.body\"\n [disabled]=\"_readonly\"\n [autoId]=\"_autoId ? _autoId + '-body' : undefined\"\n (nodeChange)=\"setRequestBody($event)\"\n (editRequest)=\"openNodeDrawer('req.body', $event)\"></sd-api-contract-node-editor>\n @if (!_readonly) {\n <sd-button\n type=\"text\"\n color=\"error\"\n size=\"sm\"\n prefixIcon=\"delete\"\n [autoId]=\"_autoId ? _autoId + '-remove-body' : undefined\"\n [title]=\"'core.component.api-contract-builder.request.remove-body' | sdTranslate\"\n (click)=\"removeRequestBody()\"></sd-button>\n }\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.body' | sdTranslate }}</p>\n @if (!_readonly) {\n <sd-button\n type=\"light\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-add-body' : undefined\"\n [title]=\"'core.component.api-contract-builder.request.add-body' | sdTranslate\"\n (click)=\"addRequestBody()\"></sd-button>\n }\n }\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.section' | sdTranslate }}</p>\n }\n </section>\n }\n\n @case (3) {\n <section class=\"sd-acb__section\" data-step=\"response\">\n @if (_draft.res; as _res) {\n <sd-input\n class=\"sd-acb__status\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-status' : undefined\"\n [label]=\"'core.component.api-contract-builder.response.status' | sdTranslate\"\n [helperText]=\"'core.component.api-contract-builder.response.status-hint' | sdTranslate\"\n [model]=\"statusText()\"\n [disabled]=\"_readonly\"\n (sdChange)=\"setStatus($event)\"></sd-input>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.response.headers' | sdTranslate }}</h4>\n <sd-api-contract-record-editor\n [record]=\"$any(_res.headers)\"\n basePath=\"res.headers\"\n [disabled]=\"_readonly\"\n [emptyLabel]=\"'core.component.api-contract-builder.empty.headers' | sdTranslate\"\n [autoId]=\"_autoId ? _autoId + '-res-headers' : undefined\"\n (recordChange)=\"setResponseHeaders($event)\"\n (editRequest)=\"openNodeDrawer('res.headers', $event)\"></sd-api-contract-record-editor>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.response.body' | sdTranslate }}</h4>\n @if (_res.body) {\n <sd-api-contract-node-editor\n [node]=\"$any(_res.body)\"\n basePath=\"res.body\"\n [disabled]=\"_readonly\"\n [autoId]=\"_autoId ? _autoId + '-res-body' : undefined\"\n (nodeChange)=\"setResponseBody($event)\"\n (editRequest)=\"openNodeDrawer('res.body', $event)\"></sd-api-contract-node-editor>\n @if (!_readonly) {\n <sd-button\n type=\"text\"\n color=\"error\"\n size=\"sm\"\n prefixIcon=\"delete\"\n [autoId]=\"_autoId ? _autoId + '-remove-res-body' : undefined\"\n [title]=\"'core.component.api-contract-builder.response.remove-body' | sdTranslate\"\n (click)=\"removeResponseBody()\"></sd-button>\n }\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.body' | sdTranslate }}</p>\n @if (!_readonly) {\n <sd-button\n type=\"light\"\n size=\"sm\"\n prefixIcon=\"add\"\n [autoId]=\"_autoId ? _autoId + '-add-res-body' : undefined\"\n [title]=\"'core.component.api-contract-builder.response.add-body' | sdTranslate\"\n (click)=\"addResponseBody()\"></sd-button>\n }\n }\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.section' | sdTranslate }}</p>\n }\n </section>\n }\n\n @case (4) {\n <section class=\"sd-acb__section\" data-step=\"output\">\n @if (_draft.output?.schema; as _outputSchema) {\n @if (!_readonly && _responseFieldOptions.length) {\n <sd-select\n class=\"sd-acb__adopt\"\n size=\"sm\"\n hideInlineError\n [autoId]=\"_autoId ? _autoId + '-use-response' : undefined\"\n [label]=\"'core.component.api-contract-builder.output.use-response' | sdTranslate\"\n [items]=\"_responseFieldOptions\"\n valueField=\"value\"\n displayField=\"label\"\n [(model)]=\"responseFieldToken\"\n (sdChange)=\"useResponseFieldAsOutput($event)\"></sd-select>\n }\n\n <sd-api-contract-node-editor\n [node]=\"$any(_outputSchema)\"\n basePath=\"output.schema\"\n [disabled]=\"_readonly\"\n [autoId]=\"_autoId ? _autoId + '-output' : undefined\"\n (nodeChange)=\"setOutputSchema($event)\"\n (editRequest)=\"openNodeDrawer('output.schema', $event)\"></sd-api-contract-node-editor>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.output.fields' | sdTranslate }}</h4>\n @let _outputFields = outputFields();\n @if (_outputFields.length) {\n <ul class=\"sd-acb__fields\" [attr.data-autoId]=\"_autoId ? _autoId + '-output-fields' : null\">\n @for (field of _outputFields; track field.path) {\n <li class=\"sd-acb__field\">\n <code>{{ field.path }}</code>\n <span class=\"sd-acb__field-type\">{{ field.type }}</span>\n @if (field.required === true) {\n <span class=\"sd-acb__field-flag\">{{ 'core.component.api-contract-builder.field.required' | sdTranslate }}</span>\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.output.no-fields' | sdTranslate }}</p>\n }\n } @else {\n <p class=\"sd-acb__empty-text\">{{ 'core.component.api-contract-builder.empty.section' | sdTranslate }}</p>\n }\n </section>\n }\n\n @default {\n <section class=\"sd-acb__section\" data-step=\"review\">\n <sd-api-contract-diagnostic-list\n [diagnostics]=\"_diagnostics\"\n [autoId]=\"_autoId ? _autoId + '-diagnostics' : undefined\"\n (navigate)=\"goToDiagnostic($event)\"></sd-api-contract-diagnostic-list>\n\n <h4 class=\"sd-acb__heading\">{{ 'core.component.api-contract-builder.review.json' | sdTranslate }}</h4>\n <sd-code-editor\n language=\"json\"\n maxHeight=\"480px\"\n [viewed]=\"disabled() || mode() === 'view'\"\n [model]=\"json()\"\n (modelChange)=\"applyPastedJson($event)\"></sd-code-editor>\n </section>\n }\n }\n </div>\n\n <!-- why MỘT instance duy nhất, đặt ngoài @switch: mỗi layer một drawer sẽ là mỗi layer một draft, và\n đổi step giữa lúc đang sửa sẽ destroy drawer cùng với thay đổi chưa lưu. -->\n <sd-api-contract-node-drawer\n #nodeDrawer\n [layer]=\"drawerLayer()\"\n [allowTransform]=\"drawerAllowsTransform()\"\n [suggestions]=\"drawerSuggestions()\"\n [autoId]=\"_autoId ? _autoId + '-node-drawer' : undefined\"\n (nodeCommit)=\"applyNodeCommit($event)\"></sd-api-contract-node-drawer>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["hasOwn","isRecord"],"mappings":"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"}