// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. class AttributeWithCacheKeyImpl { constructor(attribute: Record) { Object.assign(this, attribute); } private key: string; public get cacheKey(): string { if (!this.key) { this.key = Object.getOwnPropertyNames(this) .sort() .map((name) => `${(this as Record)[name]}`) .join(';'); } return this.key; } } export interface AttributeWithCacheKey { readonly cacheKey: string; } export const createAttributeWithCacheKey = >( attribute: T, ): T & AttributeWithCacheKey => new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;