UNPKG

ngx-json-treeview

Version:

Display object data in an expandable JSON tree view.

1 lines 45.1 kB
{"version":3,"file":"ngx-json-treeview.mjs","sources":["../../../projects/ngx-json-treeview/src/lib/handlers.ts","../../../projects/ngx-json-treeview/src/lib/directives/stop-click-propagation.directive.ts","../../../projects/ngx-json-treeview/src/lib/services/id-generator.ts","../../../projects/ngx-json-treeview/src/lib/util.ts","../../../projects/ngx-json-treeview/src/lib/ngx-json-treeview/ngx-json-treeview.component.ts","../../../projects/ngx-json-treeview/src/lib/ngx-json-treeview/ngx-json-treeview.component.html","../../../projects/ngx-json-treeview/src/lib/ngx-json-treeview/testing/ngx-json-treeview.harness.ts","../../../projects/ngx-json-treeview/src/public-api.ts","../../../projects/ngx-json-treeview/src/ngx-json-treeview.ts"],"sourcesContent":["import { ValueClickHandler } from './types';\n\n/**\n * A handler that checks if a segment's value is a string that looks like an\n * HTTP/HTTPS link. If it is, it opens the link in a new tab.\n */\nexport const followLinkHandler: ValueClickHandler = {\n canHandle: (segment) => {\n if (typeof segment.value === 'string' && segment.value.startsWith('http')) {\n try {\n const url = new URL(segment.value); // Validate the URL.\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch (e) {\n // Invalid URL.\n }\n }\n return false;\n },\n handler: (segment) => {\n window.open(segment.value, '_blank', 'noopener,noreferrer');\n },\n};\n\n/**\n * A collection of built-in value click handlers.\n * This array can be used to easily apply all default handlers.\n */\nexport const VALUE_CLICK_HANDLERS: readonly ValueClickHandler[] = [\n followLinkHandler,\n];\n\n/**\n * A namespace for individual value click handlers.\n * This allows for easy discovery and individual import of handlers.\n */\nexport const ValueClickHandlers = {\n followLinkHandler,\n};\n","import { Directive, input } from '@angular/core';\n\n@Directive({\n selector: '[ngxJtStopClickPropagation]',\n standalone: true,\n host: {\n '(click)': 'onClick($event)',\n },\n})\nexport class StopClickPropagationDirective {\n readonly enabled = input<boolean>(true, {\n alias: 'ngxJtStopClickPropagation',\n });\n\n protected onClick(event: Event): void {\n if (this.enabled()) {\n event.stopPropagation();\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Interface for a service that generates unique IDs.\n * @docs-private\n */\nexport interface IdGenerator {\n next(): string;\n}\n\n/**\n * Default implementation of `IdGenerator` for client-side applications.\n * This implementation is not safe for server-side rendering, as the counter\n * is shared across all requests.\n */\nclass DefaultIdGenerator implements IdGenerator {\n private nextId = 0;\n\n next(): string {\n return `ngx-json-treeview-${this.nextId++}`;\n }\n}\n\n/**\n * Injection token for the `IdGenerator` service.\n *\n * For server-side rendering, it's crucial to provide this token at a request level\n * to ensure that IDs are unique per request. Failure to do so will result in\n * ID mismatches between the server-rendered HTML and the client-side application,\n * breaking hydration.\n *\n * Example for server-side provider in `server.ts` or equivalent:\n *\n * ```typescript\n * // In your server-side providers:\n * { provide: ID_GENERATOR, useClass: ServerIdGenerator }\n * ```\n */\nexport const ID_GENERATOR = new InjectionToken<IdGenerator>('ID_GENERATOR', {\n providedIn: 'root',\n factory: () => new DefaultIdGenerator(),\n});\n","/**\n * Generates a preview string representation of an object.\n *\n * @param obj The object to preview.\n * @param limit The maximum length of the preview string. Defaults to 200.\n * @param stringsLimit The maximum length of a string to display before\n * truncating. Defaults to 10.\n * @returns A preview string representation of the object.\n */\nexport function previewString(obj: any, limit = 200, stringsLimit = 10) {\n let result = '';\n\n if (obj === null) {\n result += 'null';\n } else if (obj === undefined) {\n result += 'undefined';\n } else if (typeof obj === 'string') {\n if (obj.length > stringsLimit) {\n result += `\"${obj.substring(0, stringsLimit)}…\"`;\n } else {\n result += `\"${obj}\"`;\n }\n } else if (typeof obj === 'boolean') {\n result += `${obj ? 'true' : 'false'}`;\n } else if (typeof obj === 'number') {\n result += `${obj}`;\n } else if (typeof obj === 'object') {\n if (obj instanceof Date) {\n result += `\"${obj.toISOString()}\"`;\n } else if (Array.isArray(obj)) {\n result += `Array[${obj.length}] [`;\n for (const key in obj) {\n if (result.length >= limit) {\n break;\n }\n result += previewString(obj[key], limit - result.length);\n result += ',';\n }\n if (result.endsWith(',')) {\n result = result.slice(0, -1);\n }\n result += ']';\n } else {\n result += 'Object {';\n for (const key in obj) {\n if (result.length >= limit) {\n break;\n }\n if (obj[key] !== undefined) {\n result += `\"${key}\":`;\n result += previewString(obj[key], limit - result.length);\n result += ',';\n }\n }\n if (result.endsWith(',')) {\n result = result.slice(0, -1);\n }\n result += '}';\n }\n } else if (typeof obj === 'function') {\n result += 'Function';\n }\n\n if (result.length >= limit) {\n return result.substring(0, limit) + '…';\n }\n\n return result;\n}\n\n/**\n * Decycles a JavaScript object by replacing circular references with `$ref`\n * properties. This is useful for serializing objects that contain circular\n * references, preventing infinite loops.\n *\n * Original: https://github.com/douglascrockford/JSON-js/blob/master/cycle.js\n *\n * @param object The object to decycle.\n * @returns A decycled version of the object.\n */\nexport function decycle(object: any): any {\n const objects = new WeakMap();\n return (function derez(value, path) {\n let old_path;\n let nu: any;\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !(value instanceof Boolean) &&\n !(value instanceof Date) &&\n !(value instanceof Number) &&\n !(value instanceof RegExp) &&\n !(value instanceof String)\n ) {\n old_path = objects.get(value);\n if (old_path !== undefined) {\n return { $ref: old_path };\n }\n objects.set(value, path);\n\n if (Array.isArray(value)) {\n nu = [];\n value.forEach(function (element, i) {\n nu[i] = derez(element, path + '[' + i + ']');\n });\n } else {\n nu = {};\n Object.keys(value).forEach(function (name) {\n nu[name] = derez(\n value[name],\n path + '[' + JSON.stringify(name) + ']'\n );\n });\n }\n return nu;\n }\n return value;\n })(object, '$');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { StopClickPropagationDirective } from '../directives/stop-click-propagation.directive';\nimport { VALUE_CLICK_HANDLERS } from '../handlers';\nimport { ID_GENERATOR } from '../services/id-generator';\nimport { IsClickableValueFn, Segment, ValueClickHandler } from '../types';\nimport { decycle, previewString } from '../util';\n\n/**\n * Renders JSON data in an expandable and collapsible tree structure.\n * Allows users to navigate complex data hierarchies visually.\n */\n@Component({\n selector: 'ngx-json-treeview',\n imports: [StopClickPropagationDirective],\n templateUrl: './ngx-json-treeview.component.html',\n styleUrls: ['./ngx-json-treeview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxJsonTreeviewComponent {\n /**\n * The JSON object or array to display in the tree view.\n * @required\n */\n readonly json = input.required<any>();\n\n /**\n * Controls the default expansion state for all expandable segments\n * i.e. objects and arrays.\n * - If `true`, nodes are expanded down to the specified `depth`.\n * - If `false`, all nodes start collapsed.\n * @default true\n */\n readonly expanded = input<boolean>(true);\n\n /**\n * Determines the maximum nesting level automatically expanded when `expanded`\n * is `true`.\n * - `-1`: Infinite depth (all levels expanded).\n * - `0`: Only the root node is expanded (if applicable).\n * - `n`: Root and nodes down to `n` levels are expanded.\n * @default -1\n */\n readonly depth = input<number>(-1);\n\n /**\n * If `true`, values are clickable when there is a corresponding handler\n * in the `valueClickHandlers` array that can process it.\n *\n * This allows for use cases such as:\n * - Following hyperlinks.\n * - Copying a value to the clipboard.\n * - Triggering custom actions based on the value's content or type.\n * @default false\n */\n readonly enableClickableValues = input<boolean>(false);\n\n /**\n * A flag to control whether click events on nodes propagate up the DOM tree.\n *\n * By default, click events are stopped from propagating. This is useful when\n * the tree view is embedded within other clickable elements to avoid\n * unintended side effects.\n *\n * Set to `false` to allow events to propagate.\n *\n * @default true\n */\n readonly stopClickPropagation = input<boolean>(true);\n\n /**\n * @deprecated Use `valueClickHandlers` instead. This input will be removed\n * in a future version.\n *\n * A function that determines if a specific value node should be considered\n * clickable. This provides more granular control than the global\n * `enableClickableValues` flag.\n *\n * The function receives the `Segment` object and should return `true` if the\n * value is clickable, `false` otherwise. This check is only performed if\n * `enableClickableValues` is also `true`.\n *\n * @param segment - The segment being evaluated.\n * @returns `true` if the segment's value should be clickable, `false`\n * otherwise.\n */\n readonly isClickableValue = input<IsClickableValueFn>();\n\n /**\n * @deprecated Use `valueClickHandlers` instead. This output will be removed\n * in a future version.\n *\n * If `enableClickableValues` is set to `true`, emits a `Segment` object when\n * a value node is clicked. The emitted `Segment` contains details about the\n * clicked node (key, value, type, path, etc.).\n */\n readonly onValueClick = output<Segment>();\n\n /**\n * An array of handler functions to be executed when a value node is clicked.\n * Only the first handler in the array for which `isClickable` returns `true`\n * will be executed.\n *\n * If `enableClickableValues` is set to true, but `valueClickHandlers` is\n * omitted, the built-in `VALUE_CLICK_HANDLERS` will be used as the default.\n */\n readonly valueClickHandlers = input<ValueClickHandler[]>();\n\n /**\n * *Internal* input representing the parent segment in the tree hierarchy.\n * Primrily used for calculating paths.\n * @internal\n */\n protected readonly _parent = input<Segment>();\n\n /**\n * *Internal* input representing the current nesting depth. Used in\n * conjunction with the `depth` input to control expansion.\n * @internal\n */\n protected readonly _currentDepth = input<number>(0);\n\n private internalValueClickHandlers = computed<ValueClickHandler[]>(() => {\n const handlers: ValueClickHandler[] = [];\n const legacyIsClickableFn = this.isClickableValue();\n\n if (legacyIsClickableFn) {\n handlers.push({\n canHandle: legacyIsClickableFn,\n handler: (segment) => this.onValueClick.emit(segment),\n });\n }\n\n handlers.push(...(this.valueClickHandlers() ?? VALUE_CLICK_HANDLERS));\n return handlers;\n });\n\n private readonly rootType = computed<string>(() => {\n if (this.json() === null) {\n return 'null';\n } else if (Array.isArray(this.json())) {\n return 'array';\n } else return typeof this.json();\n });\n\n protected readonly segments = computed<Segment[]>(() => {\n const json = decycle(this.json());\n if (typeof json === 'object' && json != null) {\n return Object.keys(json).map((key) => this.parseKeyValue(key, json[key]));\n }\n return [];\n });\n\n private readonly isExpanded = computed<boolean>(\n () =>\n this.expanded() &&\n !(this.depth() > -1 && this._currentDepth() >= this.depth())\n );\n\n protected readonly openingBrace = computed<string>(() => {\n if (this.rootType() === 'array') {\n return '[';\n } else return '{';\n });\n\n protected readonly closingBrace = computed<string>(() => {\n if (this.rootType() === 'array') {\n return ']';\n } else return '}';\n });\n\n protected readonly asString = computed<string>(() =>\n JSON.stringify(this.json(), null, 2).trim()\n );\n\n protected readonly primitiveSegmentClass = computed<string>(() => {\n const type = this.rootType();\n if (['object', 'array'].includes(type)) {\n return 'punctuation';\n }\n return 'segment-type-' + type;\n });\n\n private readonly primitiveSegment = computed<Segment | null>(() => {\n if (this.segments().length > 0) return null;\n return {\n key: '',\n value: this.json(),\n type: this.rootType(),\n description: this.asString(),\n expanded: false,\n path: this._parent()?.path ?? '',\n };\n });\n\n protected readonly isClickablePrimitive = computed<boolean>(() => {\n const segment = this.primitiveSegment();\n return !!segment && this.isClickable(segment);\n });\n\n protected readonly isArrayElement = computed<boolean>(\n () => this.rootType() === 'array'\n );\n\n /**\n * Tracks the expansion state of individual segments. Ensures user-toggled\n * states persist even when the underlying data or segments are re-generated.\n */\n private readonly expandedSegments = signal<Map<string, boolean>>(new Map());\n\n private readonly idGenerator = inject(ID_GENERATOR);\n protected readonly id = this.idGenerator.next();\n\n constructor() {\n effect(() => {\n this.depth();\n this.expanded();\n this.expandedSegments.set(new Map());\n });\n }\n\n protected isExpandable(segment: Segment) {\n return (\n (segment.type === 'object' && Object.keys(segment.value).length > 0) ||\n (segment.type === 'array' && segment.value.length > 0)\n );\n }\n\n protected isEmpty(segment: Segment) {\n return (\n (segment.type === 'object' && Object.keys(segment.value).length === 0) ||\n (segment.type === 'array' && segment.value.length === 0)\n );\n }\n\n protected isClickable(segment: Segment): boolean {\n if (!this.enableClickableValues()) {\n return false;\n }\n\n return this.internalValueClickHandlers().some((handler) => {\n try {\n return handler.canHandle(segment);\n } catch (e) {\n return false;\n }\n });\n }\n\n protected toggle(segment: Segment) {\n if (this.isExpandable(segment)) {\n this.expandedSegments.update((map) => {\n const newMap = new Map(map);\n newMap.set(segment.path, !segment.expanded);\n return newMap;\n });\n }\n }\n\n protected onPrimitiveClick(event?: MouseEvent): void {\n const segment = this.primitiveSegment();\n if (segment) {\n this.onValueClickHandler(segment, event);\n }\n }\n\n protected onValueClickHandler(segment: Segment, event?: MouseEvent) {\n for (const handler of this.internalValueClickHandlers()) {\n try {\n if (handler.canHandle(segment)) {\n try {\n handler.handler(segment, event);\n } catch (e) {\n console.error('Error executing click handler:', e);\n }\n return; // Stop after the first handler is executed.\n }\n } catch (e) {\n // in case of any error, continue to the next handler\n }\n }\n }\n\n protected openingBraceForSegment(segment: Segment) {\n if (segment.type === 'array') {\n return '[';\n } else if (segment.type === 'object') {\n return '{';\n }\n\n return undefined;\n }\n\n protected closingBraceForSegment(segment: Segment) {\n if (segment.type === 'array') {\n return ']';\n } else if (segment.type === 'object') {\n return '}';\n }\n\n return undefined;\n }\n\n private getPath(key: string): string {\n const parent = this._parent();\n let path: string;\n\n if (parent) {\n if (parent.type === 'array') {\n path = `${parent.path}[${key}]`;\n } else {\n path = `${parent.path}.${key}`;\n }\n } else {\n path = key;\n }\n\n return path;\n }\n\n private parseKeyValue(key: any, value: any): Segment {\n const path = this.getPath(key);\n const segment: Segment = {\n parent: this._parent(),\n path,\n key: key,\n value: value,\n type: undefined,\n description: '' + value,\n expanded: this.expandedSegments().get(path) ?? this.isExpanded(),\n };\n\n switch (typeof segment.value) {\n case 'number':\n segment.type = 'number';\n break;\n case 'boolean':\n segment.type = 'boolean';\n break;\n case 'function':\n segment.type = 'function';\n break;\n case 'string':\n segment.type = 'string';\n segment.description = JSON.stringify(segment.value);\n break;\n case 'undefined':\n segment.type = 'undefined';\n segment.description = 'undefined';\n break;\n case 'object':\n if (segment.value === null) {\n segment.type = 'null';\n segment.description = 'null';\n } else if (Array.isArray(segment.value)) {\n segment.type = 'array';\n segment.description = previewString(segment.value);\n } else if (segment.value instanceof Date) {\n segment.type = 'date';\n segment.description = `\"${segment.value.toISOString()}\"`;\n } else {\n segment.type = 'object';\n segment.description = previewString(segment.value);\n }\n break;\n default:\n console.error('Unknown type parsing json key/value.');\n }\n\n return segment;\n }\n}\n","<section\n class=\"ngx-json-treeview\"\n [attr.role]=\"_currentDepth() === 0 ? 'tree' : null\">\n @if (segments().length === 0) {\n <div [class]=\"primitiveSegmentClass()\">\n <button\n type=\"button\"\n class=\"segment-primitive\"\n [class.clickable]=\"isClickablePrimitive()\"\n (click)=\"onPrimitiveClick($event)\"\n [ngxJtStopClickPropagation]=\"stopClickPropagation()\"\n [disabled]=\"!isClickablePrimitive()\">\n {{ asString() }}\n </button>\n </div>\n } @else {\n @if (_currentDepth() === 0) {\n <span class=\"punctuation\">{{ openingBrace() }}</span>\n }\n @for (\n segment of segments();\n track segment.key;\n let i = $index;\n let len = $count\n ) {\n @let needsComma = i < len - 1;\n @let expandable = isExpandable(segment);\n @let empty = isEmpty(segment);\n @let openingBrace = openingBraceForSegment(segment);\n @let closingBrace = closingBraceForSegment(segment);\n @let clickableValue = isClickable(segment);\n @let nodeId = id + '-node-label-' + _currentDepth() + '-' + i;\n\n <div\n [class]=\"'segment segment-type-' + segment.type\"\n role=\"treeitem\"\n [attr.aria-expanded]=\"expandable ? segment.expanded : undefined\"\n [attr.aria-level]=\"_currentDepth() + 1\"\n [attr.aria-setsize]=\"len\"\n [attr.aria-posinset]=\"i + 1\"\n [attr.aria-labelledby]=\"nodeId\">\n <div class=\"segment-main\">\n <button\n [id]=\"nodeId\"\n type=\"button\"\n [class.expandable]=\"expandable\"\n [class.expanded]=\"segment.expanded\"\n (click)=\"toggle(segment)\"\n [ngxJtStopClickPropagation]=\"stopClickPropagation()\"\n [disabled]=\"!expandable\">\n @if (expandable) {\n <div class=\"toggler\"></div>\n }\n @if (isArrayElement()) {\n <span class=\"segment-label\">{{ segment.key }}</span>\n } @else {\n <span class=\"segment-key\">{{ `\"${segment.key}\"` }}</span>\n }\n </button>\n <span\n [class.segment-label]=\"isArrayElement()\"\n [class.punctuation]=\"!isArrayElement()\"\n >:\n </span>\n @if (empty) {\n <span class=\"punctuation\"\n >{{ openingBrace }}{{ closingBrace\n }}{{ needsComma ? ',' : '' }}</span\n >\n } @else if (!expandable || !segment.expanded) {\n <button\n type=\"button\"\n [class.segment-label]=\"expandable\"\n [class.segment-value]=\"!expandable\"\n [class.clickable]=\"clickableValue\"\n (click)=\"onValueClickHandler(segment, $event)\"\n [ngxJtStopClickPropagation]=\"stopClickPropagation()\"\n [disabled]=\"!clickableValue\">\n {{ segment.description }}\n </button>\n <span class=\"punctuation\">{{ needsComma ? ',' : '' }}</span>\n } @else {\n <span class=\"punctuation\">\n {{ openingBrace }}\n </span>\n }\n </div>\n @if (expandable && segment.expanded) {\n <div class=\"children\" role=\"group\">\n <ngx-json-treeview\n [json]=\"segment.value\"\n [expanded]=\"expanded()\"\n [depth]=\"depth()\"\n [enableClickableValues]=\"enableClickableValues()\"\n [valueClickHandlers]=\"valueClickHandlers()\"\n [isClickableValue]=\"isClickableValue()\"\n [stopClickPropagation]=\"stopClickPropagation()\"\n (onValueClick)=\"onValueClickHandler($event)\"\n [_parent]=\"segment\"\n [_currentDepth]=\"_currentDepth() + 1\" />\n <span class=\"punctuation\">\n {{ closingBrace }}{{ needsComma ? ',' : '' }}\n </span>\n </div>\n }\n </div>\n }\n @if (_currentDepth() === 0) {\n <span class=\"punctuation\">{{ closingBrace() }}</span>\n }\n }\n</section>\n","import {\n BaseHarnessFilters,\n ComponentHarness,\n HarnessPredicate,\n} from '@angular/cdk/testing';\n\nexport interface NgxJsonTreeviewNodeHarnessFilters extends BaseHarnessFilters {\n key?: string | RegExp;\n value?: string | RegExp;\n type?: string | RegExp;\n expanded?: boolean;\n}\n\nexport class NgxJsonTreeviewNodeHarness extends ComponentHarness {\n static hostSelector = '.segment';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `NgxJsonTreeviewNodeHarness` that meets certain criteria.\n * @param options Options for filtering which node instances are considered a\n * match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(\n options: NgxJsonTreeviewNodeHarnessFilters = {}\n ): HarnessPredicate<NgxJsonTreeviewNodeHarness> {\n return new HarnessPredicate(NgxJsonTreeviewNodeHarness, options)\n .addOption('key', options.key, (harness, key) =>\n HarnessPredicate.stringMatches(harness.getKey(), key)\n )\n .addOption('value', options.value, (harness, value) =>\n HarnessPredicate.stringMatches(harness.getValue(), value)\n )\n .addOption('type', options.type, (harness, type) =>\n HarnessPredicate.stringMatches(harness.getType(), type)\n )\n .addOption('expanded', options.expanded, async (harness, expanded) => {\n const isExpanded = await harness.isExpanded();\n return isExpanded === expanded;\n });\n }\n\n protected toggleButton = this.locatorFor('.segment-main > button');\n protected keyElement = this.locatorForOptional(\n '.segment-main > button .segment-key, .segment-main > button .segment-label'\n );\n protected valueElement = this.locatorForOptional(\n '.segment-main > .segment-value, .segment-main > button.segment-label'\n );\n\n /** Gets the key of the node. */\n async getKey(): Promise<string> {\n const keyEl = await this.keyElement();\n const text = keyEl ? await keyEl.text() : '';\n let trimmedText = text.trim();\n // Remove quotes if present (for objects)\n if (trimmedText.startsWith('\"') && trimmedText.endsWith('\"')) {\n trimmedText = trimmedText.slice(1, -1);\n }\n return trimmedText;\n }\n\n /** Gets the value description of the node. */\n async getValue(): Promise<string> {\n const valueEl = await this.valueElement();\n if (!valueEl) {\n return '';\n }\n const text = await valueEl.text();\n return text.trim();\n }\n\n /** Gets the type of the node. */\n async getType(): Promise<string | null> {\n const host = await this.host();\n const classes = await host.getAttribute('class');\n if (!classes) {\n return null;\n }\n const match = classes.match(/segment-type-([a-zA-Z]+)/);\n return match ? match[1] : null;\n }\n\n /** Whether the node is expanded. */\n async isExpanded(): Promise<boolean> {\n const button = await this.toggleButton();\n const classes = await button.getAttribute('class');\n return classes?.includes('expanded') ?? false;\n }\n\n /** Whether the node is expandable. */\n async isExpandable(): Promise<boolean> {\n const button = await this.toggleButton();\n const classes = await button.getAttribute('class');\n return classes?.includes('expandable') ?? false;\n }\n\n /** Expands the node if it is collapsed. */\n async expand(): Promise<void> {\n if ((await this.isExpandable()) && !(await this.isExpanded())) {\n await this.toggle();\n }\n }\n\n /** Collapses the node if it is expanded. */\n async collapse(): Promise<void> {\n if ((await this.isExpandable()) && (await this.isExpanded())) {\n await this.toggle();\n }\n }\n\n /** Toggles the node. */\n async toggle(): Promise<void> {\n const button = await this.toggleButton();\n await button.click();\n }\n\n /** Gets the child treeview harness, if expanded. */\n async getChildTree(): Promise<NgxJsonTreeviewHarness | null> {\n const isExpanded = await this.isExpanded();\n if (!isExpanded) {\n return null;\n }\n return this.locatorForOptional(NgxJsonTreeviewHarness)();\n }\n}\n\nexport class NgxJsonTreeviewHarness extends ComponentHarness {\n static hostSelector = 'ngx-json-treeview';\n\n /**\n * Gets a list of nodes in this tree view level.\n * Note: This does not return nested nodes of children.\n */\n async getNodes(\n filter: NgxJsonTreeviewNodeHarnessFilters = {}\n ): Promise<NgxJsonTreeviewNodeHarness[]> {\n return this.locatorForAll(NgxJsonTreeviewNodeHarness.with(filter))();\n }\n\n /** Gets a single node that matches the filter. */\n async getNode(\n filter: NgxJsonTreeviewNodeHarnessFilters\n ): Promise<NgxJsonTreeviewNodeHarness> {\n return this.locatorFor(NgxJsonTreeviewNodeHarness.with(filter))();\n }\n}\n","/*\n * Public API Surface of ngx-json-treeview\n */\n\nexport {\n VALUE_CLICK_HANDLERS,\n ValueClickHandlers,\n followLinkHandler,\n} from './lib/handlers';\nexport * from './lib/ngx-json-treeview/ngx-json-treeview.component';\nexport * from './lib/ngx-json-treeview/testing/ngx-json-treeview.harness';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}