@itwin/core-common 5.14.0-dev.9 → 5.15.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/ConcurrentQuery.d.ts +2 -2
- package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
- package/lib/cjs/ConcurrentQuery.js +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/ECSqlReader.d.ts +4 -4
- package/lib/cjs/ECSqlReader.js +4 -4
- package/lib/cjs/ECSqlReader.js.map +1 -1
- package/lib/cjs/ECSqlReaderBase.d.ts +3 -3
- package/lib/cjs/ECSqlReaderBase.js.map +1 -1
- package/lib/cjs/annotation/TextBlock.d.ts.map +1 -1
- package/lib/cjs/annotation/TextBlock.js +7 -4
- package/lib/cjs/annotation/TextBlock.js.map +1 -1
- package/lib/cjs/annotation/TextField.d.ts +76 -11
- package/lib/cjs/annotation/TextField.d.ts.map +1 -1
- package/lib/cjs/annotation/TextField.js.map +1 -1
- package/lib/cjs/internal/annotations/FieldFormatter.d.ts +32 -3
- package/lib/cjs/internal/annotations/FieldFormatter.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/FieldFormatter.js +47 -17
- package/lib/cjs/internal/annotations/FieldFormatter.js.map +1 -1
- package/lib/cjs/internal/cross-package.d.ts +1 -1
- package/lib/cjs/internal/cross-package.d.ts.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/esm/ConcurrentQuery.d.ts +2 -2
- package/lib/esm/ConcurrentQuery.d.ts.map +1 -1
- package/lib/esm/ConcurrentQuery.js +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/ECSqlReader.d.ts +4 -4
- package/lib/esm/ECSqlReader.js +4 -4
- package/lib/esm/ECSqlReader.js.map +1 -1
- package/lib/esm/ECSqlReaderBase.d.ts +3 -3
- package/lib/esm/ECSqlReaderBase.js.map +1 -1
- package/lib/esm/annotation/TextBlock.d.ts.map +1 -1
- package/lib/esm/annotation/TextBlock.js +7 -4
- package/lib/esm/annotation/TextBlock.js.map +1 -1
- package/lib/esm/annotation/TextField.d.ts +76 -11
- package/lib/esm/annotation/TextField.d.ts.map +1 -1
- package/lib/esm/annotation/TextField.js.map +1 -1
- package/lib/esm/internal/annotations/FieldFormatter.d.ts +32 -3
- package/lib/esm/internal/annotations/FieldFormatter.d.ts.map +1 -1
- package/lib/esm/internal/annotations/FieldFormatter.js +47 -17
- package/lib/esm/internal/annotations/FieldFormatter.js.map +1 -1
- package/lib/esm/internal/cross-package.d.ts +1 -1
- package/lib/esm/internal/cross-package.d.ts.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlReader.js","sourceRoot":"","sources":["../../src/ECSqlReader.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,OAAO,EACL,YAAY,EAAsD,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAgB,mBAAmB,EACzI,cAAc,GACtC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAiB,MAAM,mBAAmB,CAAC;AAuBxF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IAgBnB;IAA+E;IAflG,MAAM,CAAU,cAAc,GAAG,EAAE,CAAC;IAEpC,UAAU,GAAU,EAAE,CAAC;IACvB,YAAY,GAAW,CAAC,CAAC;IACzB,aAAa,GAAW,CAAC,CAAC,CAAC;IAC3B,YAAY,GAAW,CAAC,CAAC,CAAC;IAC1B,WAAW,GAAY,KAAK,CAAC;IAC7B,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IACvC,SAAS,GAAY,KAAK,CAAC;IAC3B,MAAM,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5I,QAAQ,GAAiB,IAAI,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAC;IAExE;;OAEG;IACH,YAA2B,SAA6D,EAAkB,KAAa,EAAE,KAAmB,EAAE,OAAsB;QAClK,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QADD,cAAS,GAAT,SAAS,CAAoD;QAAkB,UAAK,GAAL,KAAK,CAAQ;QAErH,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAClC,CAAC;QACD,4DAA4D;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,KAAkB;QACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC;IACD;;OAEG;IACI,KAAK,CAAC,OAAsB;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,WAAW;YAChD,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,uBAAuB,CAAC;QACnE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAClF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAClD,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;gBAChF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,aAAa;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;OAEG;IACa,cAAc;QAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY;YAC7C,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAU,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5C,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,4DAA4D;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC;QACrI,MAAM,OAAO,GAAmB;YAC9B,GAAI,IAAI,CAAC,QAAQ;YACjB,IAAI,EAAE,aAAa,CAAC,KAAK;YACzB,WAAW;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,MAAM;SAClB,CAAC;QACF,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,OAAO,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,OAAO,CAAC;QACrG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,WAAW,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,YAAY,CAAC,OAAuB;QAClD,MAAM,SAAS,GAAG,CAAC,EAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,IAAI,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAC5Q,MAAM,WAAW,GAAG,CAAC,EAAmB,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAClF,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,IAAI,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;QACvC,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,EAAE,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;YAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,WAAW,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,WAAW;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAI;QACf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;YACvC,EAAE,IAAI,CAAC,YAAY,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO;QAClB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI;QACf,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,IAAI,CAAC,OAAO;aACpB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,CAAC,OAAO;aACpB,CAAC;QACJ,CAAC;IACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\nimport {\r\n DbQueryError, DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, DbResponseStatus, DbValueFormat, QueryBinder, QueryOptions, QueryOptionsBuilder,\r\n QueryPropertyMetaData, QueryRowFormat,\r\n} from \"./ConcurrentQuery\";\r\nimport { ECSqlReaderBase, PropertyMetaDataMap, QueryRowProxy } from \"./ECSqlReaderBase\";\r\n\r\n/**\r\n * Performance-related statistics for [[ECSqlReader]].\r\n * @public\r\n */\r\nexport interface QueryStats {\r\n /** Time spent running the query; not including time spent queued. Time is in microseconds */\r\n backendCpuTime: number;\r\n /** Total time it took the backend to run the query. Time is in milliseconds. */\r\n backendTotalTime: number;\r\n /** Estimated memory used for the query. */\r\n backendMemUsed: number;\r\n /** Total number of rows returned by the backend. */\r\n backendRowsReturned: number;\r\n /** The total round trip time from the client's perspective. Time is in milliseconds. */\r\n totalTime: number;\r\n /** The number of retries attempted to execute the query. */\r\n retryCount: number;\r\n /** Total time in millisecond to prepare ECSQL or grabing it from cache and binding parameters */\r\n prepareTime: number;\r\n}\r\n\r\n/**\r\n * Execute ECSQL statements and read the results.\r\n *\r\n * The query results are returned one row at a time. The format of the row is dictated by the\r\n * [[QueryOptions.rowFormat]] specified in the `options` parameter of the constructed ECSqlReader object. Defaults to\r\n * [[QueryRowFormat.UseECSqlPropertyIndexes]] when no `rowFormat` is defined.\r\n *\r\n * There are three primary ways to interact with and read the results:\r\n * - Stream them using ECSqlReader as an asynchronous iterator.\r\n * - Iterator over them manually using [[ECSqlReader.step]].\r\n * - Capture all of the results at once in an array using [[QueryRowProxy.toArray]].\r\n *\r\n * @see\r\n * - [ECSQL Overview]($docs/learning/backend/ExecutingECSQL)\r\n * - [ECSQL Row Formats]($docs/learning/ECSQLRowFormat) for more details on how rows are formatted.\r\n * - [ECSQL Code Examples]($docs/learning/ECSQLCodeExamples#iterating-over-query-results) for examples of each\r\n * of the above ways of interacting with ECSqlReader.\r\n *\r\n * @note When iterating over the results, the current row will be a [[QueryRowProxy]] object. To get the row as a basic\r\n * JavaScript object, call [[QueryRowProxy.toRow]] on it.\r\n * @public\r\n */\r\nexport class ECSqlReader extends ECSqlReaderBase implements AsyncIterableIterator<QueryRowProxy> {\r\n private static readonly _maxRetryCount = 10;\r\n\r\n private _localRows: any[] = [];\r\n private _localOffset: number = 0;\r\n private _globalOffset: number = -1;\r\n private _globalCount: number = -1;\r\n private _globalDone: boolean = false;\r\n private _param = new QueryBinder().serialize();\r\n private _lockArgs: boolean = false;\r\n private _stats = { backendCpuTime: 0, backendTotalTime: 0, backendMemUsed: 0, backendRowsReturned: 0, totalTime: 0, retryCount: 0, prepareTime: 0 };\r\n private _options: QueryOptions = new QueryOptionsBuilder().getOptions();\r\n\r\n /**\r\n * @internal\r\n */\r\n public constructor(private _executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, public readonly query: string, param?: QueryBinder, options?: QueryOptions) {\r\n super(options?.rowFormat);\r\n if (query.trim().length === 0) {\r\n throw new Error(\"expecting non-empty ecsql statement\");\r\n }\r\n if (param) {\r\n this._param = param.serialize();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n this.reset(options);\r\n }\r\n\r\n /**\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Will not be removed until 2027-02-18. Should not be used. Will be made private in a future release.\r\n */\r\n public setParams(param: QueryBinder) {\r\n if (this._lockArgs) {\r\n throw new Error(\"call resetBindings() before setting or changing parameters\");\r\n }\r\n this._param = param.serialize();\r\n }\r\n /**\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Will not be removed until 2027-02-18. Should not be used. Will be made private in a future release.\r\n */\r\n public reset(options?: QueryOptions) {\r\n if (options) {\r\n this._options = options;\r\n }\r\n this._props = new PropertyMetaDataMap([]);\r\n this._localRows = [];\r\n this._globalDone = false;\r\n this._globalOffset = 0;\r\n this._globalCount = -1;\r\n if (typeof this._options.rowFormat === \"undefined\")\r\n this._options.rowFormat = QueryRowFormat.UseECSqlPropertyIndexes;\r\n this._rowFormat = this._options.rowFormat;\r\n if (this._options.limit) {\r\n if (typeof this._options.limit.offset === \"number\" && this._options.limit.offset > 0)\r\n this._globalOffset = this._options.limit.offset;\r\n if (typeof this._options.limit.count === \"number\" && this._options.limit.count > 0)\r\n this._globalCount = this._options.limit.count;\r\n }\r\n this._done = false;\r\n }\r\n\r\n /**\r\n * Clear all bindings.\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Will not be removed until 2027-02-18. Should not be used. Will be made private in a future release.\r\n */\r\n public resetBindings() {\r\n this._param = new QueryBinder().serialize();\r\n this._lockArgs = false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override getRowInternal(): any[] {\r\n if (this._localRows.length <= this._localOffset)\r\n throw new Error(\"no current row\");\r\n return this._localRows[this._localOffset] as any[];\r\n }\r\n\r\n /**\r\n * Get performance-related statistics for the current query.\r\n */\r\n public get stats(): QueryStats {\r\n return this._stats;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n private async readRows(): Promise<any[]> {\r\n if (this._globalDone) {\r\n return [];\r\n }\r\n this._lockArgs = true;\r\n this._globalOffset += this._localRows.length;\r\n this._globalCount -= this._localRows.length;\r\n if (this._globalCount === 0) {\r\n return [];\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const valueFormat = this._options.rowFormat === QueryRowFormat.UseJsPropertyNames ? DbValueFormat.JsNames : DbValueFormat.ECSqlNames;\r\n const request: DbQueryRequest = {\r\n ... this._options,\r\n kind: DbRequestKind.ECSql,\r\n valueFormat,\r\n query: this.query,\r\n args: this._param,\r\n };\r\n request.includeMetaData = this._props.length > 0 ? false : true;\r\n request.limit = { offset: this._globalOffset, count: this._globalCount < 1 ? -1 : this._globalCount };\r\n const resp = await this.runWithRetry(request);\r\n this._globalDone = resp.status === DbResponseStatus.Done || resp.status === DbResponseStatus.NotOpen;\r\n if (this._props.length === 0 && resp.meta.length > 0) {\r\n this._props = new PropertyMetaDataMap(resp.meta);\r\n }\r\n for (const row of resp.data) {\r\n ECSqlReader.replaceBase64WithUint8Array(row);\r\n }\r\n return resp.data;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected async runWithRetry(request: DbQueryRequest) {\r\n const needRetry = (rs: DbQueryResponse) => (rs.status === DbResponseStatus.Partial || rs.status === DbResponseStatus.QueueFull || rs.status === DbResponseStatus.Timeout || rs.status === DbResponseStatus.ShuttingDown) && (rs.data === undefined || rs.data.length === 0);\r\n const updateStats = (rs: DbQueryResponse) => {\r\n this._stats.backendCpuTime += rs.stats.cpuTime;\r\n this._stats.backendTotalTime += rs.stats.totalTime;\r\n this._stats.backendMemUsed += rs.stats.memUsed;\r\n this._stats.prepareTime += rs.stats.prepareTime;\r\n this._stats.backendRowsReturned += (rs.data === undefined) ? 0 : rs.data.length;\r\n };\r\n const execQuery = async (req: DbQueryRequest) => {\r\n const startTime = Date.now();\r\n const rs = await this._executor.execute(req);\r\n this.stats.totalTime += (Date.now() - startTime);\r\n return rs;\r\n };\r\n let retry = ECSqlReader._maxRetryCount;\r\n let resp = await execQuery(request);\r\n DbQueryError.throwIfError(resp, request);\r\n while (--retry > 0 && needRetry(resp)) {\r\n resp = await execQuery(request);\r\n this._stats.retryCount += 1;\r\n if (needRetry(resp)) {\r\n updateStats(resp);\r\n }\r\n }\r\n if (retry === 0 && needRetry(resp)) {\r\n throw new Error(\"query too long to execute or server is too busy\");\r\n }\r\n updateStats(resp);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Get the metadata for each column in the query result.\r\n *\r\n * @returns An array of [[QueryPropertyMetaData]].\r\n */\r\n public async getMetaData(): Promise<QueryPropertyMetaData[]> {\r\n if (this._props.length === 0) {\r\n await this.fetchRows();\r\n }\r\n return this._props.properties;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n private async fetchRows() {\r\n this._localOffset = -1;\r\n this._localRows = await this.readRows();\r\n if (this._localRows.length === 0) {\r\n this._done = true;\r\n }\r\n }\r\n\r\n /**\r\n * Step to the next row of the query result.\r\n *\r\n * @returns `true` if a row can be read from `current`.<br/>\r\n * `false` if there are no more rows; i.e., all rows have been stepped through already.\r\n */\r\n public async step(): Promise<boolean> {\r\n if (this._done) {\r\n return false;\r\n }\r\n const cachedRows = this._localRows.length;\r\n if (this._localOffset < cachedRows - 1) {\r\n ++this._localOffset;\r\n } else {\r\n await this.fetchRows();\r\n this._localOffset = 0;\r\n return !this._done;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Get all remaining rows from the query result.\r\n *\r\n * @returns An array of all remaining rows from the query result.\r\n */\r\n public async toArray(): Promise<any[]> {\r\n const rows = [];\r\n while (await this.step()) {\r\n rows.push(this.formatCurrentRow());\r\n }\r\n return rows;\r\n }\r\n\r\n /**\r\n * Accessor for using ECSqlReader as an asynchronous iterator.\r\n *\r\n * @returns An asynchronous iterator over the rows returned by the executed ECSQL query.\r\n */\r\n public [Symbol.asyncIterator](): AsyncIterableIterator<QueryRowProxy> {\r\n return this;\r\n }\r\n\r\n /**\r\n * Calls step when called as an iterator.\r\n *\r\n * Returns the row alongside a `done` boolean to indicate if there are any more rows for an iterator to step to.\r\n *\r\n * @returns An object with the keys: `value` which contains the row and `done` which contains a boolean.\r\n */\r\n public async next(): Promise<IteratorResult<QueryRowProxy, any>> {\r\n if (await this.step()) {\r\n return {\r\n done: false,\r\n value: this.current,\r\n };\r\n } else {\r\n return {\r\n done: true,\r\n value: this.current,\r\n };\r\n }\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"ECSqlReader.js","sourceRoot":"","sources":["../../src/ECSqlReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\nimport {\r\n DbQueryError, DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, DbResponseStatus, DbValueFormat, QueryBinder, QueryOptions, QueryOptionsBuilder,\r\n QueryPropertyMetaData, QueryRowFormat,\r\n} from \"./ConcurrentQuery\";\r\nimport { ECSqlReaderBase, PropertyMetaDataMap, QueryRowProxy } from \"./ECSqlReaderBase\";\r\n\r\n/**\r\n * Performance-related statistics for [[ECSqlReader]].\r\n * @public\r\n */\r\nexport interface QueryStats {\r\n /** Time spent running the query; not including time spent queued. Time is in microseconds */\r\n backendCpuTime: number;\r\n /** Total time it took the backend to run the query. Time is in milliseconds. */\r\n backendTotalTime: number;\r\n /** Estimated memory used for the query. */\r\n backendMemUsed: number;\r\n /** Total number of rows returned by the backend. */\r\n backendRowsReturned: number;\r\n /** The total round trip time from the client's perspective. Time is in milliseconds. */\r\n totalTime: number;\r\n /** The number of retries attempted to execute the query. */\r\n retryCount: number;\r\n /** Total time in millisecond to prepare ECSQL or grabing it from cache and binding parameters */\r\n prepareTime: number;\r\n}\r\n\r\n/**\r\n * Execute ECSQL statements and read the results.\r\n *\r\n * The query results are returned one row at a time. The format of the row is dictated by the\r\n * [[QueryOptions.rowFormat]] specified in the `options` parameter of the constructed ECSqlReader object. Defaults to\r\n * [[QueryRowFormat.UseECSqlPropertyIndexes]] when no `rowFormat` is defined.\r\n *\r\n * There are three primary ways to interact with and read the results:\r\n * - Stream them using ECSqlReader as an asynchronous iterator.\r\n * - Iterator over them manually using [[ECSqlReader.step]].\r\n * - Capture all of the results at once in an array using [[ECSqlReader.toArray]].\r\n *\r\n * @see\r\n * - [ECSQL Overview]($docs/learning/backend/ExecutingECSQL)\r\n * - [ECSQL Row Formats]($docs/learning/ECSQLRowFormat) for more details on how rows are formatted.\r\n * - [ECSQL Code Examples]($docs/learning/ECSQLCodeExamples#iterating-over-query-results) for examples of each\r\n * of the above ways of interacting with ECSqlReader.\r\n *\r\n * @note When iterating over the results, the current row will be a [[QueryRowProxy]] object. To get the row as a basic\r\n * JavaScript object, call [[QueryRowProxy.toRow]] on it.\r\n * @public\r\n */\r\nexport class ECSqlReader extends ECSqlReaderBase implements AsyncIterableIterator<QueryRowProxy> {\r\n private static readonly _maxRetryCount = 10;\r\n\r\n private _localRows: any[] = [];\r\n private _localOffset: number = 0;\r\n private _globalOffset: number = -1;\r\n private _globalCount: number = -1;\r\n private _globalDone: boolean = false;\r\n private _param = new QueryBinder().serialize();\r\n private _lockArgs: boolean = false;\r\n private _stats = { backendCpuTime: 0, backendTotalTime: 0, backendMemUsed: 0, backendRowsReturned: 0, totalTime: 0, retryCount: 0, prepareTime: 0 };\r\n private _options: QueryOptions = new QueryOptionsBuilder().getOptions();\r\n\r\n /**\r\n * @internal\r\n */\r\n public constructor(private _executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, public readonly query: string, param?: QueryBinder, options?: QueryOptions) {\r\n super(options?.rowFormat);\r\n if (query.trim().length === 0) {\r\n throw new Error(\"expecting non-empty ecsql statement\");\r\n }\r\n if (param) {\r\n this._param = param.serialize();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n this.reset(options);\r\n }\r\n\r\n /**\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Should not be used. Will be made private in a future release.\r\n */\r\n public setParams(param: QueryBinder) {\r\n if (this._lockArgs) {\r\n throw new Error(\"call resetBindings() before setting or changing parameters\");\r\n }\r\n this._param = param.serialize();\r\n }\r\n /**\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Should not be used. Will be made private in a future release.\r\n */\r\n public reset(options?: QueryOptions) {\r\n if (options) {\r\n this._options = options;\r\n }\r\n this._props = new PropertyMetaDataMap([]);\r\n this._localRows = [];\r\n this._globalDone = false;\r\n this._globalOffset = 0;\r\n this._globalCount = -1;\r\n if (typeof this._options.rowFormat === \"undefined\")\r\n this._options.rowFormat = QueryRowFormat.UseECSqlPropertyIndexes;\r\n this._rowFormat = this._options.rowFormat;\r\n if (this._options.limit) {\r\n if (typeof this._options.limit.offset === \"number\" && this._options.limit.offset > 0)\r\n this._globalOffset = this._options.limit.offset;\r\n if (typeof this._options.limit.count === \"number\" && this._options.limit.count > 0)\r\n this._globalCount = this._options.limit.count;\r\n }\r\n this._done = false;\r\n }\r\n\r\n /**\r\n * Clear all bindings.\r\n * @deprecated in 5.6 - will not be removed until after 2027-04-02. Should not be used. Will be made private in a future release.\r\n */\r\n public resetBindings() {\r\n this._param = new QueryBinder().serialize();\r\n this._lockArgs = false;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override getRowInternal(): any[] {\r\n if (this._localRows.length <= this._localOffset)\r\n throw new Error(\"no current row\");\r\n return this._localRows[this._localOffset] as any[];\r\n }\r\n\r\n /**\r\n * Get performance-related statistics for the current query.\r\n */\r\n public get stats(): QueryStats {\r\n return this._stats;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n private async readRows(): Promise<any[]> {\r\n if (this._globalDone) {\r\n return [];\r\n }\r\n this._lockArgs = true;\r\n this._globalOffset += this._localRows.length;\r\n this._globalCount -= this._localRows.length;\r\n if (this._globalCount === 0) {\r\n return [];\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const valueFormat = this._options.rowFormat === QueryRowFormat.UseJsPropertyNames ? DbValueFormat.JsNames : DbValueFormat.ECSqlNames;\r\n const request: DbQueryRequest = {\r\n ... this._options,\r\n kind: DbRequestKind.ECSql,\r\n valueFormat,\r\n query: this.query,\r\n args: this._param,\r\n };\r\n request.includeMetaData = this._props.length > 0 ? false : true;\r\n request.limit = { offset: this._globalOffset, count: this._globalCount < 1 ? -1 : this._globalCount };\r\n const resp = await this.runWithRetry(request);\r\n this._globalDone = resp.status === DbResponseStatus.Done || resp.status === DbResponseStatus.NotOpen;\r\n if (this._props.length === 0 && resp.meta.length > 0) {\r\n this._props = new PropertyMetaDataMap(resp.meta);\r\n }\r\n for (const row of resp.data) {\r\n ECSqlReader.replaceBase64WithUint8Array(row);\r\n }\r\n return resp.data;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected async runWithRetry(request: DbQueryRequest) {\r\n const needRetry = (rs: DbQueryResponse) => (rs.status === DbResponseStatus.Partial || rs.status === DbResponseStatus.QueueFull || rs.status === DbResponseStatus.Timeout || rs.status === DbResponseStatus.ShuttingDown) && (rs.data === undefined || rs.data.length === 0);\r\n const updateStats = (rs: DbQueryResponse) => {\r\n this._stats.backendCpuTime += rs.stats.cpuTime;\r\n this._stats.backendTotalTime += rs.stats.totalTime;\r\n this._stats.backendMemUsed += rs.stats.memUsed;\r\n this._stats.prepareTime += rs.stats.prepareTime;\r\n this._stats.backendRowsReturned += (rs.data === undefined) ? 0 : rs.data.length;\r\n };\r\n const execQuery = async (req: DbQueryRequest) => {\r\n const startTime = Date.now();\r\n const rs = await this._executor.execute(req);\r\n this.stats.totalTime += (Date.now() - startTime);\r\n return rs;\r\n };\r\n let retry = ECSqlReader._maxRetryCount;\r\n let resp = await execQuery(request);\r\n DbQueryError.throwIfError(resp, request);\r\n while (--retry > 0 && needRetry(resp)) {\r\n resp = await execQuery(request);\r\n this._stats.retryCount += 1;\r\n if (needRetry(resp)) {\r\n updateStats(resp);\r\n }\r\n }\r\n if (retry === 0 && needRetry(resp)) {\r\n throw new Error(\"query too long to execute or server is too busy\");\r\n }\r\n updateStats(resp);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Get the metadata for each column in the query result.\r\n *\r\n * @returns An array of [[QueryPropertyMetaData]].\r\n */\r\n public async getMetaData(): Promise<QueryPropertyMetaData[]> {\r\n if (this._props.length === 0) {\r\n await this.fetchRows();\r\n }\r\n return this._props.properties;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n private async fetchRows() {\r\n this._localOffset = -1;\r\n this._localRows = await this.readRows();\r\n if (this._localRows.length === 0) {\r\n this._done = true;\r\n }\r\n }\r\n\r\n /**\r\n * Step to the next row of the query result.\r\n *\r\n * @returns `true` if a row can be read from `current`.<br/>\r\n * `false` if there are no more rows; i.e., all rows have been stepped through already.\r\n */\r\n public async step(): Promise<boolean> {\r\n if (this._done) {\r\n return false;\r\n }\r\n const cachedRows = this._localRows.length;\r\n if (this._localOffset < cachedRows - 1) {\r\n ++this._localOffset;\r\n } else {\r\n await this.fetchRows();\r\n this._localOffset = 0;\r\n return !this._done;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Get all remaining rows from the query result.\r\n *\r\n * @returns An array of all remaining rows from the query result.\r\n */\r\n public async toArray(): Promise<any[]> {\r\n const rows = [];\r\n while (await this.step()) {\r\n rows.push(this.formatCurrentRow());\r\n }\r\n return rows;\r\n }\r\n\r\n /**\r\n * Accessor for using ECSqlReader as an asynchronous iterator.\r\n *\r\n * @returns An asynchronous iterator over the rows returned by the executed ECSQL query.\r\n */\r\n public [Symbol.asyncIterator](): AsyncIterableIterator<QueryRowProxy> {\r\n return this;\r\n }\r\n\r\n /**\r\n * Calls step when called as an iterator.\r\n *\r\n * Returns the row alongside a `done` boolean to indicate if there are any more rows for an iterator to step to.\r\n *\r\n * @returns An object with the keys: `value` which contains the row and `done` which contains a boolean.\r\n */\r\n public async next(): Promise<IteratorResult<QueryRowProxy, any>> {\r\n if (await this.step()) {\r\n return {\r\n done: false,\r\n value: this.current,\r\n };\r\n } else {\r\n return {\r\n done: true,\r\n value: this.current,\r\n };\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -29,10 +29,10 @@ export interface QueryRowProxy {
|
|
|
29
29
|
*/
|
|
30
30
|
toRow(): any;
|
|
31
31
|
/**
|
|
32
|
-
* Get
|
|
33
|
-
*
|
|
32
|
+
* Get the current row's raw values as an array in SELECT-column order.
|
|
33
|
+
* To collect all remaining rows, use [[ECSqlReader.toArray]] instead.
|
|
34
34
|
*
|
|
35
|
-
* @returns
|
|
35
|
+
* @returns The current row's values.
|
|
36
36
|
*/
|
|
37
37
|
toArray(): QueryValueType[];
|
|
38
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlReaderBase.js","sourceRoot":"","sources":["../../src/ECSqlReaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\nimport { QueryPropertyMetaData, QueryRowFormat } from \"./ConcurrentQuery\";\r\n\r\n/** @public */\r\nexport class PropertyMetaDataMap implements Iterable<QueryPropertyMetaData> {\r\n private _byPropName = new Map<string, number>();\r\n private _byJsonName = new Map<string, number>();\r\n private _byNoCase = new Map<string, number>();\r\n\r\n public constructor(public readonly properties: QueryPropertyMetaData[]) {\r\n for (const property of this.properties) {\r\n property.extendType = property.extendedType !== undefined ? property.extendedType : \"\"; // eslint-disable-line @typescript-eslint/no-deprecated\r\n property.extendedType = property.extendedType === \"\" ? undefined : property.extendedType;\r\n this._byPropName.set(property.name, property.index);\r\n this._byJsonName.set(property.jsonName, property.index);\r\n this._byNoCase.set(property.name.toLowerCase(), property.index);\r\n this._byNoCase.set(property.jsonName.toLowerCase(), property.index);\r\n }\r\n }\r\n\r\n public get length(): number {\r\n return this.properties.length;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<QueryPropertyMetaData, any, undefined> {\r\n return this.properties[Symbol.iterator]();\r\n }\r\n\r\n public findByName(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byPropName.get(name);\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n\r\n public findByJsonName(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byJsonName.get(name);\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n\r\n public findByNoCase(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byNoCase.get(name.toLowerCase());\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * The format for rows returned by [[ECSqlReader]].\r\n * @public\r\n */\r\nexport type QueryValueType = any;\r\n\r\n/**\r\n * Methods and ways of accessing values from rows returned by [[ECSqlReader]].\r\n * @public\r\n */\r\nexport interface QueryRowProxy {\r\n /**\r\n * Get the current row as a JavaScript `object`.\r\n *\r\n * @returns The current row as a JavaScript `object`.\r\n */\r\n toRow(): any;\r\n\r\n /**\r\n * Get all remaining rows from the query result.\r\n * If called on the current row ([[ECSqlReader.current]]), only that row is returned.\r\n *\r\n * @returns All remaining rows from the query result.\r\n */\r\n toArray(): QueryValueType[];\r\n\r\n /**\r\n * Get the metadata for each column in the query result.\r\n *\r\n * @returns The metadata for each column in the query result.\r\n */\r\n getMetaData(): QueryPropertyMetaData[];\r\n\r\n /**\r\n * Access a property using its name.\r\n *\r\n * @returns The value from the row whose key (ECSQL column name) is `propertyName`.\r\n *\r\n * @example\r\n * The following lines will all return the same result:\r\n * ```ts\r\n * reader.current.ECInstanceId;\r\n * reader.current.ecinstanceid;\r\n * reader.current.[\"ECInstanceId\"];\r\n * ```\r\n */\r\n [propertyName: string]: QueryValueType;\r\n\r\n /**\r\n * Access a property using its index.\r\n * The index is relative to the order of the columns returned by the query that produced the row.\r\n *\r\n * @returns The value from the column at `propertyIndex`.\r\n *\r\n * @example reader.current[0]\r\n */\r\n [propertyIndex: number]: QueryValueType;\r\n}\r\n\r\n/**\r\n * Abstract base class providing shared row-proxy access, row formatting, and\r\n * Base64-to-Uint8Array conversion logic for both the asynchronous [[ECSqlReader]]\r\n * and the synchronous ECSqlSyncReader.\r\n *\r\n * Subclasses must implement [[getRowInternal]] to supply the current row data.\r\n * @public\r\n */\r\nexport abstract class ECSqlReaderBase {\r\n /** @internal */\r\n protected _done: boolean = false;\r\n /** @internal */\r\n protected _props = new PropertyMetaDataMap([]);\r\n /** @internal */\r\n protected _rowFormat: QueryRowFormat;\r\n\r\n private _rowProxy = new Proxy<ECSqlReaderBase>(this, {\r\n get: (target: ECSqlReaderBase, key: string | symbol) => {\r\n if (typeof key === \"string\") {\r\n const idx = Number.parseInt(key, 10);\r\n if (!Number.isNaN(idx)) {\r\n return target.getRowInternal()[idx];\r\n }\r\n const prop = target._props.findByNoCase(key);\r\n if (prop) {\r\n return target.getRowInternal()[prop.index];\r\n }\r\n if (key === \"getMetaData\") {\r\n return () => target._props.properties;\r\n }\r\n if (key === \"toRow\") {\r\n return () => target.formatCurrentRow(true);\r\n }\r\n if (key === \"toArray\") {\r\n return () => target.getRowInternal();\r\n }\r\n }\r\n return undefined;\r\n },\r\n has: (target: ECSqlReaderBase, p: string | symbol) => {\r\n return !target._props.findByNoCase(p as string);\r\n },\r\n ownKeys: (target: ECSqlReaderBase) => {\r\n const keys = [];\r\n for (const prop of target._props) {\r\n keys.push(prop.name);\r\n }\r\n return keys;\r\n },\r\n });\r\n\r\n /**\r\n * @internal\r\n */\r\n protected constructor(rowFormat?: QueryRowFormat) {\r\n this._rowFormat = rowFormat ?? QueryRowFormat.UseECSqlPropertyIndexes;\r\n }\r\n\r\n /**\r\n * Get the current row from the query result. The current row is the one most recently stepped-to\r\n * (by step() or during iteration).\r\n *\r\n * Each value from the row can be accessed by index or by name.\r\n *\r\n * @see\r\n * - [[QueryRowFormat]]\r\n * - [ECSQL Row Formats]($docs/learning/ECSQLRowFormat)\r\n *\r\n * @note The current row is a [[QueryRowProxy]] object. To get the row as a basic JavaScript object, call\r\n * [[QueryRowProxy.toRow]] on it.\r\n *\r\n * @return The current row as a [[QueryRowProxy]].\r\n */\r\n public get current(): QueryRowProxy {\r\n return this._rowProxy as any;\r\n }\r\n\r\n /**\r\n * Returns if there are more rows available.\r\n *\r\n * @returns `true` if all rows have been stepped through already.<br/>\r\n * `false` if there are any yet unaccessed rows.\r\n */\r\n public get done(): boolean {\r\n return this._done;\r\n }\r\n\r\n /**\r\n * Returns the raw current row data array. Subclasses implement this to return\r\n * from their specific storage mechanism.\r\n * @internal\r\n */\r\n protected abstract getRowInternal(): any[];\r\n\r\n /**\r\n * Converts Base64-encoded strings in a row object into Uint8Arrays in-place.\r\n * @internal\r\n */\r\n protected static replaceBase64WithUint8Array(row: any): void {\r\n for (const key of Object.keys(row)) {\r\n const val = row[key];\r\n if (typeof val === \"string\") {\r\n if (Base64EncodedString.hasPrefix(val)) {\r\n row[key] = Base64EncodedString.toUint8Array(val);\r\n }\r\n } else if (typeof val === \"object\" && val !== null) {\r\n this.replaceBase64WithUint8Array(val);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Format the current row as a JavaScript object or array depending on the row format.\r\n * @internal\r\n */\r\n protected formatCurrentRow(onlyReturnObject: boolean = false): any[] | object {\r\n if (!onlyReturnObject && this._rowFormat === QueryRowFormat.UseECSqlPropertyIndexes) {\r\n return this.getRowInternal();\r\n }\r\n const formattedRow = {};\r\n for (const prop of this._props) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const propName = this._rowFormat === QueryRowFormat.UseJsPropertyNames ? prop.jsonName : prop.name;\r\n const val = this.getRowInternal()[prop.index];\r\n if (typeof val !== \"undefined\" && val !== null) {\r\n Object.defineProperty(formattedRow, propName, {\r\n value: val,\r\n enumerable: true,\r\n });\r\n }\r\n }\r\n return formattedRow;\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"ECSqlReaderBase.js","sourceRoot":"","sources":["../../src/ECSqlReaderBase.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\nimport { QueryPropertyMetaData, QueryRowFormat } from \"./ConcurrentQuery\";\r\n\r\n/** @public */\r\nexport class PropertyMetaDataMap implements Iterable<QueryPropertyMetaData> {\r\n private _byPropName = new Map<string, number>();\r\n private _byJsonName = new Map<string, number>();\r\n private _byNoCase = new Map<string, number>();\r\n\r\n public constructor(public readonly properties: QueryPropertyMetaData[]) {\r\n for (const property of this.properties) {\r\n property.extendType = property.extendedType !== undefined ? property.extendedType : \"\"; // eslint-disable-line @typescript-eslint/no-deprecated\r\n property.extendedType = property.extendedType === \"\" ? undefined : property.extendedType;\r\n this._byPropName.set(property.name, property.index);\r\n this._byJsonName.set(property.jsonName, property.index);\r\n this._byNoCase.set(property.name.toLowerCase(), property.index);\r\n this._byNoCase.set(property.jsonName.toLowerCase(), property.index);\r\n }\r\n }\r\n\r\n public get length(): number {\r\n return this.properties.length;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<QueryPropertyMetaData, any, undefined> {\r\n return this.properties[Symbol.iterator]();\r\n }\r\n\r\n public findByName(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byPropName.get(name);\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n\r\n public findByJsonName(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byJsonName.get(name);\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n\r\n public findByNoCase(name: string): QueryPropertyMetaData | undefined {\r\n const index = this._byNoCase.get(name.toLowerCase());\r\n if (typeof index === \"number\") {\r\n return this.properties[index];\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * The format for rows returned by [[ECSqlReader]].\r\n * @public\r\n */\r\nexport type QueryValueType = any;\r\n\r\n/**\r\n * Methods and ways of accessing values from rows returned by [[ECSqlReader]].\r\n * @public\r\n */\r\nexport interface QueryRowProxy {\r\n /**\r\n * Get the current row as a JavaScript `object`.\r\n *\r\n * @returns The current row as a JavaScript `object`.\r\n */\r\n toRow(): any;\r\n\r\n /**\r\n * Get the current row's raw values as an array in SELECT-column order.\r\n * To collect all remaining rows, use [[ECSqlReader.toArray]] instead.\r\n *\r\n * @returns The current row's values.\r\n */\r\n toArray(): QueryValueType[];\r\n\r\n /**\r\n * Get the metadata for each column in the query result.\r\n *\r\n * @returns The metadata for each column in the query result.\r\n */\r\n getMetaData(): QueryPropertyMetaData[];\r\n\r\n /**\r\n * Access a property using its name.\r\n *\r\n * @returns The value from the row whose key (ECSQL column name) is `propertyName`.\r\n *\r\n * @example\r\n * The following lines will all return the same result:\r\n * ```ts\r\n * reader.current.ECInstanceId;\r\n * reader.current.ecinstanceid;\r\n * reader.current.[\"ECInstanceId\"];\r\n * ```\r\n */\r\n [propertyName: string]: QueryValueType;\r\n\r\n /**\r\n * Access a property using its index.\r\n * The index is relative to the order of the columns returned by the query that produced the row.\r\n *\r\n * @returns The value from the column at `propertyIndex`.\r\n *\r\n * @example reader.current[0]\r\n */\r\n [propertyIndex: number]: QueryValueType;\r\n}\r\n\r\n/**\r\n * Abstract base class providing shared row-proxy access, row formatting, and\r\n * Base64-to-Uint8Array conversion logic for both the asynchronous [[ECSqlReader]]\r\n * and the synchronous ECSqlSyncReader.\r\n *\r\n * Subclasses must implement [[getRowInternal]] to supply the current row data.\r\n * @public\r\n */\r\nexport abstract class ECSqlReaderBase {\r\n /** @internal */\r\n protected _done: boolean = false;\r\n /** @internal */\r\n protected _props = new PropertyMetaDataMap([]);\r\n /** @internal */\r\n protected _rowFormat: QueryRowFormat;\r\n\r\n private _rowProxy = new Proxy<ECSqlReaderBase>(this, {\r\n get: (target: ECSqlReaderBase, key: string | symbol) => {\r\n if (typeof key === \"string\") {\r\n const idx = Number.parseInt(key, 10);\r\n if (!Number.isNaN(idx)) {\r\n return target.getRowInternal()[idx];\r\n }\r\n const prop = target._props.findByNoCase(key);\r\n if (prop) {\r\n return target.getRowInternal()[prop.index];\r\n }\r\n if (key === \"getMetaData\") {\r\n return () => target._props.properties;\r\n }\r\n if (key === \"toRow\") {\r\n return () => target.formatCurrentRow(true);\r\n }\r\n if (key === \"toArray\") {\r\n return () => target.getRowInternal();\r\n }\r\n }\r\n return undefined;\r\n },\r\n has: (target: ECSqlReaderBase, p: string | symbol) => {\r\n return !target._props.findByNoCase(p as string);\r\n },\r\n ownKeys: (target: ECSqlReaderBase) => {\r\n const keys = [];\r\n for (const prop of target._props) {\r\n keys.push(prop.name);\r\n }\r\n return keys;\r\n },\r\n });\r\n\r\n /**\r\n * @internal\r\n */\r\n protected constructor(rowFormat?: QueryRowFormat) {\r\n this._rowFormat = rowFormat ?? QueryRowFormat.UseECSqlPropertyIndexes;\r\n }\r\n\r\n /**\r\n * Get the current row from the query result. The current row is the one most recently stepped-to\r\n * (by step() or during iteration).\r\n *\r\n * Each value from the row can be accessed by index or by name.\r\n *\r\n * @see\r\n * - [[QueryRowFormat]]\r\n * - [ECSQL Row Formats]($docs/learning/ECSQLRowFormat)\r\n *\r\n * @note The current row is a [[QueryRowProxy]] object. To get the row as a basic JavaScript object, call\r\n * [[QueryRowProxy.toRow]] on it.\r\n *\r\n * @return The current row as a [[QueryRowProxy]].\r\n */\r\n public get current(): QueryRowProxy {\r\n return this._rowProxy as any;\r\n }\r\n\r\n /**\r\n * Returns if there are more rows available.\r\n *\r\n * @returns `true` if all rows have been stepped through already.<br/>\r\n * `false` if there are any yet unaccessed rows.\r\n */\r\n public get done(): boolean {\r\n return this._done;\r\n }\r\n\r\n /**\r\n * Returns the raw current row data array. Subclasses implement this to return\r\n * from their specific storage mechanism.\r\n * @internal\r\n */\r\n protected abstract getRowInternal(): any[];\r\n\r\n /**\r\n * Converts Base64-encoded strings in a row object into Uint8Arrays in-place.\r\n * @internal\r\n */\r\n protected static replaceBase64WithUint8Array(row: any): void {\r\n for (const key of Object.keys(row)) {\r\n const val = row[key];\r\n if (typeof val === \"string\") {\r\n if (Base64EncodedString.hasPrefix(val)) {\r\n row[key] = Base64EncodedString.toUint8Array(val);\r\n }\r\n } else if (typeof val === \"object\" && val !== null) {\r\n this.replaceBase64WithUint8Array(val);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Format the current row as a JavaScript object or array depending on the row format.\r\n * @internal\r\n */\r\n protected formatCurrentRow(onlyReturnObject: boolean = false): any[] | object {\r\n if (!onlyReturnObject && this._rowFormat === QueryRowFormat.UseECSqlPropertyIndexes) {\r\n return this.getRowInternal();\r\n }\r\n const formattedRow = {};\r\n for (const prop of this._props) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const propName = this._rowFormat === QueryRowFormat.UseJsPropertyNames ? prop.jsonName : prop.name;\r\n const val = this.getRowInternal()[prop.index];\r\n if (typeof val !== \"undefined\" && val !== null) {\r\n Object.defineProperty(formattedRow, propName, {\r\n value: val,\r\n enumerable: true,\r\n });\r\n }\r\n }\r\n return formattedRow;\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextBlock.d.ts","sourceRoot":"","sources":["../../../src/annotation/TextBlock.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TextBlock.d.ts","sourceRoot":"","sources":["../../../src/annotation/TextBlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -237,6 +237,11 @@ export class TabRun extends TextBlockComponent {
|
|
|
237
237
|
return other instanceof TabRun && super.equals(other);
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
|
+
function accessorsEqual(a, b) {
|
|
241
|
+
const lhs = a ?? [];
|
|
242
|
+
const rhs = b ?? [];
|
|
243
|
+
return lhs.length === rhs.length && lhs.every((value, index) => value === rhs[index]);
|
|
244
|
+
}
|
|
240
245
|
/** A [[Run]] that displays the formatted value of a property of some [Element]($backend).
|
|
241
246
|
* When a [[TextBlock]] containing a [[FieldRun]] is written into the iModel as an [ITextAnnotation]($backend) element,
|
|
242
247
|
* a dependency is established between the two elements via the [ElementDrivesTextAnnotation]($backend) relationship such that
|
|
@@ -326,12 +331,10 @@ export class FieldRun extends TextBlockComponent {
|
|
|
326
331
|
if (this.propertyPath.propertyName !== other.propertyPath.propertyName) {
|
|
327
332
|
return false;
|
|
328
333
|
}
|
|
329
|
-
|
|
330
|
-
const otherAccessors = other.propertyPath.accessors ?? [];
|
|
331
|
-
if (thisAccessors.length !== otherAccessors.length) {
|
|
334
|
+
if (!accessorsEqual(this.propertyPath.accessors, other.propertyPath.accessors)) {
|
|
332
335
|
return false;
|
|
333
336
|
}
|
|
334
|
-
if (!
|
|
337
|
+
if (!accessorsEqual(this.propertyPath.jsonAccessors, other.propertyPath.jsonAccessors)) {
|
|
335
338
|
return false;
|
|
336
339
|
}
|
|
337
340
|
if (this.formatOptions && other.formatOptions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextBlock.js","sourceRoot":"","sources":["../../../src/annotation/TextBlock.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAc,oBAAoB,EAAE,iBAAiB,EAA0B,MAAM,aAAa,CAAC;AA0D1G,SAAS,mBAAmB,CAAC,SAAuC,EAAE,OAA+B;IACnG,SAAS,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAgB,kBAAkB;IAC9B,eAAe,CAAyB;IAEhD,gBAAgB;IAChB,YAAsB,KAA+B;QACnD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,KAAK,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,cAAc,CAAC,SAAiC;QACzD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,8DAA8D;IACvD,mBAAmB,CAAC,QAAgC;QACzD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,4HAA4H;IAC5H,IAAW,cAAc;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACrD,CAAC;IAWD;;;MAGE;IACF,IAAW,YAAY;QACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACzC,CAAC;IAAA,CAAC;IAEF,yDAAyD;IAClD,MAAM;QACX,OAAO;YACL,cAAc,EAAE,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,uDAAuD;IAChD,MAAM,CAAC,KAAyB;QACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;CACF;AAaD;;;;GAIG;AACH,MAAM,KAAW,GAAG,CAanB;AAbD,WAAiB,GAAG;IAClB;;OAEG;IACH,SAAgB,QAAQ,CAAC,KAAe;QACtC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C,KAAK,UAAU,CAAC,CAAC,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,KAAK,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IARe,YAAQ,WAQvB,CAAA;AACH,CAAC,EAbgB,GAAG,KAAH,GAAG,QAanB;AAyBD;;GAEG;AACH,MAAM,OAAO,OAAQ,SAAQ,kBAAkB;IAC7C,iDAAiD;IACjC,IAAI,GAAG,MAAM,CAAC;IAC9B,6DAA6D;IACtD,OAAO,CAAS;IACvB,+EAA+E;IACxE,aAAa,CAAgB;IAEpC,YAAoB,KAAmB;QACrC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,KAAK,EAAE,aAAa,IAAI,MAAM,CAAC;IACtD,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAkC;QACrD,OAAO,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,kCAAkC;IAClB,SAAS;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,KAAK,YAAY,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzI,CAAC;CACF;AAcD;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,kBAAkB;IACjD,iDAAiD;IACjC,IAAI,GAAG,UAAU,CAAC;IAClC,gCAAgC;IACzB,SAAS,CAAS;IACzB,kCAAkC;IAC3B,WAAW,CAAS;IAE3B,YAAoB,KAAuB;QACzC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC;IAC9C,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAsC;QACzD,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,gJAAgJ;IAChI,SAAS,CAAC,OAAmC;QAC3D,MAAM,GAAG,GAAG,OAAO,EAAE,iBAAiB,IAAI,GAAG,CAAC;QAC9C,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,KAAK,YAAY,WAAW,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7I,CAAC;CACF;AAUD;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,kBAAkB;IAClD,iDAAiD;IACjC,IAAI,GAAG,WAAW,CAAC;IAEnC,YAAoB,KAAwB;QAC1C,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,WAAW;SAClB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAuC;QAC1D,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,8DAA8D;IAC9C,SAAS,CAAC,OAAmC;QAC3D,OAAO,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;IACnC,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAUD;;;GAGG;AACH,MAAM,OAAO,MAAO,SAAQ,kBAAkB;IAC5C,iDAAiD;IACjC,IAAI,GAAG,KAAK,CAAC;IAEb,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC;IACJ,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAiC;QACpD,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;;;KAIC;IACe,SAAS,CAAC,OAAmC;QAC3D,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,KAAK,YAAY,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF;AAuBD;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAS,SAAQ,kBAAkB;IAC9C,6EAA6E;IACtE,MAAM,CAAC,uBAAuB,GAAG,MAAM,CAAC;IAE/C,iDAAiD;IACjC,IAAI,GAAG,OAAO,CAAC;IAC/B,uFAAuF;IAChF,YAAY,CAAoB;IACvC,wEAAwE;IACjE,YAAY,CAAoB;IACvC;;OAEG;IACI,aAAa,CAAsB;IAClC,cAAc,CAAS;IAE/B,0DAA0D;IAC1D,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,uEAAuE;IAChE,gBAAgB,CAAC,OAA2B;QACjD,IAAI,CAAC,cAAc,GAAG,OAAO,IAAI,QAAQ,CAAC,uBAAuB,CAAC;IACpE,CAAC;IAED,YAAoB,KAAoB;QACtC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEb,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,uBAAuB,CAAC;QAC9E,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAA;QACtC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED,sDAAsD;IAC/C,MAAM,CAAC,MAAM,CAAC,KAAkC;QACrD,OAAO,IAAI,QAAQ,CAAC;YAClB,GAAG,KAAK;YACR,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;YACvC,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;YACjD,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC;YACnD,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvC,MAAM;QACpB,MAAM,IAAI,GAAkB;YAC1B,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;YACtC,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;SACjD,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,uBAAuB,EAAE,CAAC;YAC5D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2CAA2C;IAC3B,KAAK;QACnB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,+DAA+D;IAC/C,SAAS;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,uDAAuD;IACvC,MAAM,CAAC,KAAyB;QAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,CAAC,SAAS;YAC5D,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,CAAC,SAAS;YAC5D,IAAI,CAAC,YAAY,CAAC,UAAU,KAAK,KAAK,CAAC,YAAY,CAAC,UAAU,EAC9D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC;QACxD,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC;QAE1D,IAAI,aAAa,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAC9C,kEAAkE;YAClE,6FAA6F;YAC7F,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/E,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;;AAUH;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,kBAAkB;IAC/B,IAAI,GAAG,WAAW,CAAC;IACnB,QAAQ,CAAoB;IAE5C,YAAoB,KAAsB;QACxC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEb,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjE,IAAI,EAAE,CAAC;IACV,CAAC;IAED,uDAAuD;IAChD,MAAM,CAAC,MAAM,CAAC,KAAoC;QACvD,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEe,mBAAmB,CAAC,OAA+B;QACjE,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,4HAA4H;IAC5G,SAAS,CAAC,OAAmC,EAAE,OAAmC;QAChG,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,cAAc,IAAI,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAChM,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,CAAC,KAAK,YAAY,SAAS,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;CACF;AAUD;;;GAGG;AACH,MAAM,OAAO,IAAK,SAAQ,kBAAkB;IAC1B,IAAI,GAAG,MAAM,CAAC;IACd,QAAQ,CAAc;IAEtC,YAAsB,KAAiB;QACrC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEb,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,kDAAkD;IAC3C,MAAM,CAAC,MAAM,CAAC,KAA+B;QAClD,OAAO,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEe,mBAAmB,CAAC,OAA+B;QACjE,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAoB,OAAO;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,2HAA2H;IAC3G,SAAS,CAAC,OAAmC,EAAE,OAAmC;QAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,iBAAiB,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACrH,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5F,OAAO,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,EAAE,eAAe,IAAI,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7D,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,OAAO,CAAC,KAAK,YAAY,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF;AAcD;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,kBAAkB;IAC/B,QAAQ,CAAc;IAEtC;;;OAGG;IACI,KAAK,CAAS;IAErB,YAAoB,KAAqB;QACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IAEe,mBAAmB,CAAC,OAA+B;QACjE,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEe,MAAM;QACpB,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,wDAAwD;IACjD,MAAM,CAAC,MAAM,CAAC,KAAoC;QACvD,OAAO,IAAI,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,mEAAmE;IACnE,IAAoB,OAAO;QACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;IAEe,KAAK;QACnB,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,qMAAqM;IAC9L,SAAS,CAAC,OAAmC;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IACnG,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,KAAsB,EAAE,YAAY,GAAG,KAAK;QACjE,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,CAAC;QAC7E,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,GAAQ;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACpF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAEe,MAAM,CAAC,KAAyB;QAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAQD;;;;;;;GAOG;AACH,MAAM,SAAS,CAAC,CAAC,0BAA0B,CAAC,MAAoC;IAC9E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACxD,KAAK,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,GAAW;IAC3D,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,KAAK,SAAS,CAAC;QACf,KAAK,oBAAoB,CAAC,MAAM;YAC9B,YAAY,GAAG,GAAG,GAAG,EAAE,CAAC;YACxB,MAAM;QACR,KAAK,oBAAoB,CAAC,MAAM;YAC9B,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,oBAAoB,CAAC,YAAY;YACpC,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM;QACR;YACE,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,MAAM;IACV,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzG,OAAO,GAAG,YAAY,GAAG,UAAU,EAAE,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,MAAM,GACV,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GACX,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1E,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Annotation\r\n */\r\n\r\nimport { ListMarker, ListMarkerEnumerator, TextStyleSettings, TextStyleSettingsProps } from \"./TextStyle\";\r\nimport { FieldFormatOptions, FieldPropertyHost, FieldPropertyPath } from \"./TextField\";\r\n\r\n/** Options supplied to [[TextBlockComponent.clearStyleOverrides]] to control how the style overrides are cleared on the component and its child components.\r\n * @beta\r\n */\r\nexport interface ClearTextStyleOptions {\r\n /** Controls whether the styleOverrides of any child components are retained.\r\n * By default, all overrides are cleared.\r\n */\r\n preserveChildrenOverrides?: boolean;\r\n}\r\n\r\n/** The JSON representation of a [[TextBlockComponent]].\r\n * @beta\r\n */\r\nexport interface TextBlockComponentProps {\r\n /** Deviations from the base [[TextStyleSettings]] defined by the [AnnotationTextStyle]($backend) applied to this component.\r\n * This permits you to, e.g., create a [[TextBlock]] using \"Arial\" font and override one of its [[TextRun]]s to use \"Comic Sans\" instead.\r\n */\r\n styleOverrides?: TextStyleSettingsProps;\r\n}\r\n\r\n/** Options supplied to [[TextBlockComponent.stringify]] to control how the content is formatted.\r\n * @beta\r\n */\r\nexport interface TextBlockStringifyOptions {\r\n /** A string to insert in between each [[Paragraph]].\r\n * Default: \" \" - a single space.\r\n */\r\n paragraphBreak?: string;\r\n /** A string to insert for each [[LineBreakRun]].\r\n * Default: \" \" - a single space.\r\n */\r\n lineBreak?: string;\r\n /** A string to insert between the numerator and denominator of each [[FractionRun]].\r\n * Default: \"/\"\r\n */\r\n fractionSeparator?: string;\r\n /** The number of spaces to use for tabs. If not provided, tabs will be represented by a tab character: \"\\t\".\r\n * Default: \"undefined\" - use \"\\t\".\r\n */\r\n tabsAsSpaces?: number;\r\n /** A string to insert in between the list marker and the list item.\r\n * Default: \" \" - a single space.\r\n */\r\n listMarkerBreak?: string;\r\n}\r\n\r\n/**\r\n * Context information that may be useful when converting a [[TextBlock]] to a string.\r\n * @beta\r\n */\r\nexport interface TextBlockStringifyContext {\r\n /** The current depth of the text block in the document structure. */\r\n depth: number;\r\n}\r\n\r\nfunction clearStyleOverrides(component: StructuralTextBlockComponent, options?: ClearTextStyleOptions): void {\r\n component.styleOverrides = {};\r\n if (!options?.preserveChildrenOverrides) {\r\n for (const child of component.children) {\r\n child.clearStyleOverrides(options);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Abstract representation of any of the building blocks that make up a [[TextBlock]] document - namely [[Run]]s and [[StructuralTextBlockComponent]]s.\r\n * The [[TextBlock]] can specify an [AnnotationTextStyle]($backend) that formats its contents.\r\n * Each component can specify an optional [[styleOverrides]] to customize that formatting.\r\n * @beta\r\n */\r\nexport abstract class TextBlockComponent {\r\n private _styleOverrides: TextStyleSettingsProps;\r\n\r\n /** @internal */\r\n protected constructor(props?: TextBlockComponentProps) {\r\n this._styleOverrides = structuredClone(props?.styleOverrides ?? {});\r\n }\r\n\r\n /** Deviations in individual properties of the [[TextStyleSettings]] in the [AnnotationTextStyle]($backend).\r\n * For example, if the style uses the \"Arial\" font, you can override that by settings `styleOverrides.font.name` to \"Comic Sans\".\r\n * @see [[clearStyleOverrides]] to reset this to an empty object.\r\n */\r\n public get styleOverrides(): TextStyleSettingsProps {\r\n return this._styleOverrides;\r\n }\r\n\r\n public set styleOverrides(overrides: TextStyleSettingsProps) {\r\n this._styleOverrides = structuredClone(overrides);\r\n }\r\n\r\n /** Reset any [[styleOverrides]] applied to this component. */\r\n public clearStyleOverrides(_options?: ClearTextStyleOptions): void {\r\n this.styleOverrides = {};\r\n }\r\n\r\n /** Returns true if [[styleOverrides]] specifies any deviations from the [[TextBlock]]'s [AnnotationTextStyle]($backend). */\r\n public get overridesStyle(): boolean {\r\n return Object.keys(this.styleOverrides).length > 0;\r\n }\r\n\r\n /** Create a deep copy of this component. */\r\n public abstract clone(): TextBlockComponent;\r\n\r\n /** Compute a string representation of the contents of this component and all of its sub-components. */\r\n public abstract stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string;\r\n\r\n /** Returns true if this component has no content or children. */\r\n public abstract get isEmpty(): boolean;\r\n\r\n /**\r\n * Returns true if the string representation of this component consists only of whitespace characters.\r\n * Useful for checking if the component is visually empty (producing no graphics) or contains only spaces, tabs, or line breaks.\r\n */\r\n public get isWhitespace(): boolean {\r\n return /^\\s*$/g.test(this.stringify());\r\n };\r\n\r\n /** Convert this component to its JSON representation. */\r\n public toJSON(): TextBlockComponentProps {\r\n return {\r\n styleOverrides: structuredClone(this.styleOverrides),\r\n };\r\n }\r\n\r\n /** Returns true if `this` is equivalent to `other`. */\r\n public equals(other: TextBlockComponent): boolean {\r\n const mySettings = TextStyleSettings.fromJSON(this.styleOverrides);\r\n const otherSettings = TextStyleSettings.fromJSON(other.styleOverrides);\r\n return mySettings.equals(otherSettings);\r\n }\r\n}\r\n\r\n/** [[TextBlockComponent]]s contained within a [[Paragraph]].\r\n * @beta\r\n */\r\nexport type Run = TextRun | FractionRun | TabRun | LineBreakRun | FieldRun;\r\n\r\n/** The JSON representation of a [[Run]].\r\n * Use the `type` field to discriminate between the different kinds of runs.\r\n * @beta\r\n */\r\nexport type RunProps = TextRunProps | FractionRunProps | TabRunProps | LineBreakRunProps | FieldRunProps;\r\n\r\n/** A sequence of characters within a [[Paragraph]] that share a single style. Runs are the leaf nodes of a [[TextBlock]] document. When laid out for display, a single run may span\r\n * multiple lines, but it will never contain different styling.\r\n * Use the `type` field to discriminate between the different kinds of runs.\r\n * @beta\r\n */\r\nexport namespace Run { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** Create a run from its JSON representation.\r\n * @see [[TextRun.create]], [[FractionRun.create]], [[FieldRun.create]], [[TabRun.create]], and [[LineBreakRun.create]] to create a run directly.\r\n */\r\n export function fromJSON(props: RunProps): Run {\r\n switch (props.type) {\r\n case \"field\": return FieldRun.create(props);\r\n case \"fraction\": return FractionRun.create(props);\r\n case \"linebreak\": return LineBreakRun.create(props);\r\n case \"tab\": return TabRun.create(props);\r\n case \"text\": return TextRun.create(props);\r\n }\r\n }\r\n}\r\n\r\n/** Describes whether the characters of a [[TextRun]] should be displayed normally, in subscript, or in superscript.\r\n * [[TextStyleSettings.superScriptScale]], [[TextStyleSettings.subScriptScale]], [[TextStyleSettings.superScriptOffsetFactor]], and [[TextStyleSettings.subScriptOffsetFactor]]\r\n * affect how the content is rendered.\r\n * @beta\r\n */\r\nexport type BaselineShift = \"subscript\" | \"superscript\" | \"none\";\r\n\r\n/** JSON representation of a [[TextRun]].\r\n * @beta\r\n */\r\nexport interface TextRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"text\";\r\n /** The characters displayed by the run.\r\n * Default: an empty string.\r\n */\r\n content?: string;\r\n /** Whether to display [[content]] as a subscript, superscript, or normally.\r\n * Default: \"none\"\r\n */\r\n baselineShift?: BaselineShift;\r\n}\r\n\r\n/** The most common type of [[Run]], containing a sequence of characters to be displayed using a single style.\r\n * @beta\r\n */\r\nexport class TextRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"text\";\r\n /** The sequence of characters to be displayed by the run. */\r\n public content: string;\r\n /** Whether to display [[content]] as a subscript, superscript, or normally. */\r\n public baselineShift: BaselineShift;\r\n\r\n private constructor(props: TextRunProps) {\r\n super(props);\r\n this.content = props?.content ?? \"\";\r\n this.baselineShift = props?.baselineShift ?? \"none\";\r\n }\r\n\r\n public override clone(): TextRun {\r\n return new TextRun(this.toJSON());\r\n }\r\n\r\n public override toJSON(): TextRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"text\",\r\n content: this.content,\r\n baselineShift: this.baselineShift,\r\n };\r\n }\r\n\r\n public static create(props?: Omit<TextRunProps, \"type\">): TextRun {\r\n return new TextRun({ ...props, type: \"text\" });\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Simply returns [[content]]. */\r\n public override stringify(): string {\r\n return this.content;\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof TextRun && this.content === other.content && this.baselineShift === other.baselineShift && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[FractionRun]].\r\n * @beta\r\n */\r\nexport interface FractionRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"fraction\";\r\n /** The text displayed before or above the fraction separator, depending on [[TextStyleSettings.stackedFractionType]]. Default: an empty string. */\r\n numerator?: string;\r\n /** The text displayed after or below the fraction separator, depending on [[TextStyleSettings.stackedFractionType]]. Default: an empty string. */\r\n denominator?: string;\r\n}\r\n\r\n/** A [[Run]] containing a numeric ratio to be displayed as a numerator and denominator separated by a horizontal or diagonal bar.\r\n * @note The [[numerator]] and [[denominator]] are stored as strings. They are not technically required to contain a numeric representation.\r\n * @beta\r\n */\r\nexport class FractionRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"fraction\";\r\n /** The fraction's numerator. */\r\n public numerator: string;\r\n /** The fraction's denominator. */\r\n public denominator: string;\r\n\r\n private constructor(props: FractionRunProps) {\r\n super(props);\r\n this.numerator = props?.numerator ?? \"\";\r\n this.denominator = props?.denominator ?? \"\";\r\n }\r\n\r\n public override toJSON(): FractionRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"fraction\",\r\n numerator: this.numerator,\r\n denominator: this.denominator,\r\n };\r\n }\r\n\r\n public override clone(): FractionRun {\r\n return new FractionRun(this.toJSON());\r\n }\r\n\r\n public static create(props?: Omit<FractionRunProps, \"type\">): FractionRun {\r\n return new FractionRun({ ...props, type: \"fraction\" });\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Formats the fraction as a string with the [[numerator]] and [[denominator]] separated by [[TextBlockStringifyOptions.fractionSeparator]]. */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n const sep = options?.fractionSeparator ?? \"/\";\r\n return `${this.numerator}${sep}${this.denominator}`;\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof FractionRun && this.numerator === other.numerator && this.denominator === other.denominator && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[LineBreakRun]].\r\n * @beta\r\n */\r\nexport interface LineBreakRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"linebreak\";\r\n}\r\n\r\n/** A [[Run]] that represents the end of a line of text within a [[Paragraph]]. It contains no content of its own - it simply causes subsequent content to display on a new line.\r\n * @beta\r\n */\r\nexport class LineBreakRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"linebreak\";\r\n\r\n private constructor(props: LineBreakRunProps) {\r\n super(props);\r\n }\r\n\r\n public override toJSON(): LineBreakRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"linebreak\",\r\n };\r\n }\r\n\r\n public static create(props?: Omit<LineBreakRunProps, \"type\">) {\r\n return new LineBreakRun({ ...props, type: \"linebreak\" });\r\n }\r\n\r\n public override clone(): LineBreakRun {\r\n return new LineBreakRun(this.toJSON());\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Simply returns [[TextBlockStringifyOptions.lineBreak]]. */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n return options?.lineBreak ?? \" \";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof LineBreakRun && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TabRun]].\r\n * @beta\r\n */\r\nexport interface TabRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"tab\";\r\n}\r\n\r\n/** A [[TabRun]] is used to shift the next tab stop.\r\n * @note Only left-justified tabs are supported at this tab.\r\n * @beta\r\n */\r\nexport class TabRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"tab\";\r\n\r\n public override toJSON(): TabRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"tab\",\r\n };\r\n }\r\n\r\n public override clone(): TabRun {\r\n return new TabRun(this.toJSON());\r\n }\r\n\r\n public static create(props?: Omit<TabRunProps, \"type\">): TabRun {\r\n return new TabRun(props);\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /**\r\n * Converts a [[TabRun]] to its string representation.\r\n * If the `tabsAsSpaces` option is provided, returns a string of spaces of the specified length.\r\n * Otherwise, returns a tab character (\"\\t\").\r\n */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n if (options?.tabsAsSpaces) {\r\n return \" \".repeat(options.tabsAsSpaces);\r\n }\r\n\r\n return \"\\t\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof TabRun && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[FieldRun]].\r\n * @beta\r\n */\r\nexport interface FieldRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"field\";\r\n /** The element and BIS class containing the property described by [[propertyPath]]. */\r\n propertyHost: FieldPropertyHost;\r\n /** Describes how to obtain the property value from [[propertyHost]]. */\r\n propertyPath: FieldPropertyPath;\r\n /** Specifies how to format the property value obtained from [[propertyPath]] into a string to be stored in [[cachedContent]].\r\n * The specific options used depend upon the field's [[propertyType]].\r\n */\r\n formatOptions?: FieldFormatOptions;\r\n /** The field's most recently evaluated display string.\r\n * @note It is unnecessary to specify this when creating a field as part of an element like a [[TextAnnotation2d]], because\r\n * all of the element's fields will be re-evaluated when inserting or updating the element in the iModel.\r\n */\r\n cachedContent?: string;\r\n}\r\n\r\n/** A [[Run]] that displays the formatted value of a property of some [Element]($backend).\r\n * When a [[TextBlock]] containing a [[FieldRun]] is written into the iModel as an [ITextAnnotation]($backend) element,\r\n * a dependency is established between the two elements via the [ElementDrivesTextAnnotation]($backend) relationship such that\r\n * whenever the source element specified by [[propertyHost]] is modified or the `ITextAnnotation` element is inserted or updated in the iModel,\r\n * the field(s) in the `ITextAnnotation` element are automatically\r\n * recalculated, causing their [[cachedContent]] to update. If the field's display string cannot be evaluated (for example, because the specified element or\r\n * property does not exist), then its cached content is set to [[FieldRun.invalidContentIndicator]].\r\n * A [[FieldRun]] displays its [[cachedContent]] in the same way that [[TextRun]]s display their `content`, including word wrapping where appropriate.\r\n * @beta\r\n */\r\nexport class FieldRun extends TextBlockComponent {\r\n /** Display string used to signal an error in computing the field's value. */\r\n public static invalidContentIndicator = \"####\";\r\n\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"field\";\r\n /** The element and BIS class containing the property described by [[propertyPath]]. */\r\n public propertyHost: FieldPropertyHost;\r\n /** Describes how to obtain the property value from [[propertyHost]]. */\r\n public propertyPath: FieldPropertyPath;\r\n /** Specifies how to format the property value obtained from [[propertyPath]] into a string to be stored in [[cachedContent]].\r\n * The specific options used depend upon the [[FieldPropertyType]].\r\n */\r\n public formatOptions?: FieldFormatOptions;\r\n private _cachedContent: string;\r\n\r\n /** The field's most recently evaluated display string. */\r\n public get cachedContent(): string {\r\n return this._cachedContent;\r\n }\r\n\r\n /** @internal Used by core-backend when re-evaluating field content. */\r\n public setCachedContent(content: string | undefined): void {\r\n this._cachedContent = content ?? FieldRun.invalidContentIndicator;\r\n }\r\n\r\n private constructor(props: FieldRunProps) {\r\n super(props);\r\n\r\n this._cachedContent = props.cachedContent ?? FieldRun.invalidContentIndicator;\r\n this.propertyHost = props.propertyHost\r\n this.propertyPath = props.propertyPath;\r\n this.formatOptions = props.formatOptions;\r\n }\r\n\r\n /** Create a FieldRun from its JSON representation. */\r\n public static create(props: Omit<FieldRunProps, \"type\">): FieldRun {\r\n return new FieldRun({\r\n ...props,\r\n propertyHost: { ...props.propertyHost },\r\n propertyPath: structuredClone(props.propertyPath),\r\n formatOptions: structuredClone(props.formatOptions),\r\n type: \"field\",\r\n });\r\n }\r\n\r\n /** Convert the FieldRun to its JSON representation. */\r\n public override toJSON(): FieldRunProps {\r\n const json: FieldRunProps = {\r\n ...super.toJSON(),\r\n type: \"field\",\r\n propertyHost: { ...this.propertyHost },\r\n propertyPath: structuredClone(this.propertyPath),\r\n };\r\n\r\n if (this.cachedContent !== FieldRun.invalidContentIndicator) {\r\n json.cachedContent = this.cachedContent;\r\n }\r\n\r\n if (this.formatOptions) {\r\n json.formatOptions = structuredClone(this.formatOptions);\r\n }\r\n\r\n return json;\r\n }\r\n\r\n /** Create a deep copy of this FieldRun. */\r\n public override clone(): FieldRun {\r\n return new FieldRun(this.toJSON());\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Convert this FieldRun to a simple string representation. */\r\n public override stringify(): string {\r\n return this.cachedContent;\r\n }\r\n\r\n /** Returns true if `this` is equivalent to `other`. */\r\n public override equals(other: TextBlockComponent): boolean {\r\n if (!(other instanceof FieldRun) || !super.equals(other)) {\r\n return false;\r\n }\r\n\r\n if (\r\n this.propertyHost.elementId !== other.propertyHost.elementId ||\r\n this.propertyHost.className !== other.propertyHost.className ||\r\n this.propertyHost.schemaName !== other.propertyHost.schemaName\r\n ) {\r\n return false;\r\n }\r\n\r\n if (this.propertyPath.propertyName !== other.propertyPath.propertyName) {\r\n return false;\r\n }\r\n\r\n const thisAccessors = this.propertyPath.accessors ?? [];\r\n const otherAccessors = other.propertyPath.accessors ?? [];\r\n\r\n if (thisAccessors.length !== otherAccessors.length) {\r\n return false;\r\n }\r\n\r\n if (!thisAccessors.every((value, index) => value === otherAccessors[index])) {\r\n return false;\r\n }\r\n\r\n if (this.formatOptions && other.formatOptions) {\r\n // We anticipate new formatting options being added in the future.\r\n // So to account for properties we don't know about, just compare the string representations.\r\n if (JSON.stringify(this.formatOptions) !== JSON.stringify(other.formatOptions)) {\r\n return false;\r\n }\r\n } else if (this.formatOptions || other.formatOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** JSON representation of a [[Paragraph]].\r\n * @beta\r\n */\r\nexport interface ParagraphProps extends TextBlockComponentProps {\r\n children?: Array<ListProps | RunProps>;\r\n}\r\n\r\n/** A collection of [[Run]]s and [[List]]s. Paragraphs can be appended to [[List]]s and [[TextBlock]]s.\r\n * Each paragraph is laid out on a separate line. If included in a [[List]], the paragraph will be treated as a list item.\r\n * @beta\r\n */\r\nexport class Paragraph extends TextBlockComponent {\r\n public readonly type = \"paragraph\";\r\n public readonly children: Array<List | Run>;\r\n\r\n private constructor(props?: ParagraphProps) {\r\n super(props);\r\n\r\n this.children = props?.children?.map((child) =>\r\n child.type === \"list\" ? List.create(child) : Run.fromJSON(child)\r\n ) ?? [];\r\n }\r\n\r\n /** Create a paragraph from its JSON representation. */\r\n public static create(props?: Omit<ParagraphProps, \"type\">): Paragraph {\r\n return new Paragraph(props);\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override get isEmpty() {\r\n return this.children.length === 0;\r\n }\r\n\r\n public override clone(): Paragraph {\r\n return new Paragraph(this.toJSON());\r\n }\r\n\r\n public override toJSON(): ParagraphProps {\r\n return {\r\n ...super.toJSON(),\r\n children: this.children.map((child) => child.toJSON()),\r\n };\r\n }\r\n\r\n /** Compute a string representation of this paragraph by concatenating the string representations of all of its children. */\r\n public override stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string {\r\n return this.children.map((x, index) => (index > 0 && x.type === \"list\") ? `${options?.paragraphBreak ?? \" \"}${x.stringify(options, context)}` : x.stringify(options, context)).join(\"\") ?? \"\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return (other instanceof Paragraph) && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[List]].\r\n * @beta\r\n */\r\nexport interface ListProps extends TextBlockComponentProps {\r\n readonly type: \"list\";\r\n children?: ParagraphProps[];\r\n}\r\n\r\n/** A collection of list items ([[Paragraph]]s). Lists can be appended to [[Paragraph]]s.\r\n * Lists will be laid out on a new line. Each item in a list is laid out on a separate line.\r\n * @beta\r\n */\r\nexport class List extends TextBlockComponent {\r\n public readonly type = \"list\";\r\n public readonly children: Paragraph[];\r\n\r\n protected constructor(props?: ListProps) {\r\n super(props);\r\n\r\n this.children = props?.children?.map((child) => Paragraph.create(child)) ?? [];\r\n }\r\n\r\n /** Create a list from its JSON representation. */\r\n public static create(props?: Omit<ListProps, \"type\">): List {\r\n return new List({ ...props, type: \"list\" });\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override get isEmpty() {\r\n return this.children.length === 0;\r\n }\r\n\r\n public override clone(): List {\r\n return new List(this.toJSON());\r\n }\r\n\r\n public override toJSON(): ListProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"list\",\r\n children: this.children.map((run) => run.toJSON()),\r\n };\r\n }\r\n\r\n /** Compute a string representation of this list by concatenating the string representations of all of its [[children]]. */\r\n public override stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string {\r\n const children = this.children.map((x, index) => {\r\n const depth = context?.depth ?? 0;\r\n const marker = getMarkerText(this.styleOverrides.listMarker ?? TextStyleSettings.defaultProps.listMarker, index + 1);\r\n const tab = (options?.tabsAsSpaces ? \" \".repeat(options.tabsAsSpaces) : \"\\t\").repeat(depth);\r\n return `${tab}${marker}${options?.listMarkerBreak ?? \" \"}${x.stringify(options, { depth: depth + 1 })}`;\r\n });\r\n return children.join(options?.paragraphBreak ?? \" \") ?? \"\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return (other instanceof List) && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TextBlock]].\r\n * @beta\r\n */\r\nexport interface TextBlockProps extends TextBlockComponentProps {\r\n /** The width of the document in meters. Lines that would exceed this width are instead wrapped around to the next line if possible.\r\n * A value less than or equal to zero indicates no wrapping is to be applied.\r\n * Default: 0\r\n */\r\n width?: number;\r\n children?: ParagraphProps[];\r\n}\r\n\r\n/** Represents a formatted text document consisting of a series of [[Paragraph]]s, each laid out on a separate line and containing their own content.\r\n * No word-wrapping is applied to the document unless a [[width]] greater than zero is specified.\r\n * @see [[TextAnnotation]] to position a text block as an annotation in 2d or 3d space.\r\n * @beta\r\n */\r\nexport class TextBlock extends TextBlockComponent {\r\n public readonly children: Paragraph[];\r\n\r\n /** The width of the document in meters. Lines that would exceed this width are instead wrapped around to the next line if possible.\r\n * A value less than or equal to zero indicates no wrapping is to be applied.\r\n * Default: 0\r\n */\r\n public width: number;\r\n\r\n private constructor(props: TextBlockProps) {\r\n super(props);\r\n this.width = props.width ?? 0;\r\n\r\n this.children = props?.children?.map((para) => Paragraph.create(para)) ?? [];\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override toJSON(): TextBlockProps {\r\n return {\r\n ...super.toJSON(),\r\n width: this.width,\r\n children: this.children.map((x) => x.toJSON()),\r\n };\r\n }\r\n\r\n /** Create a text block from its JSON representation. */\r\n public static create(props?: Omit<TextBlockProps, \"type\">): TextBlock {\r\n return new TextBlock(props ?? {});\r\n }\r\n\r\n /** Returns true if every paragraph in this text block is empty. */\r\n public override get isEmpty(): boolean {\r\n return !this.children || this.children.every((child) => child.isEmpty);\r\n }\r\n\r\n public override clone(): TextBlock {\r\n return new TextBlock(this.toJSON());\r\n }\r\n\r\n /** Compute a string representation of the document's contents by concatenating the string representations of each of its [[children]], separated by [[TextBlockStringifyOptions.paragraphBreak]]. */\r\n public stringify(options?: TextBlockStringifyOptions): string {\r\n return this.children.map((x) => x.stringify(options)).join(options?.paragraphBreak ?? \" \") || \"\";\r\n }\r\n\r\n /** Add and return a new paragraph.\r\n * By default, the paragraph will be created with no [[styleOverrides]], so that it inherits the style of this block.\r\n * @param seedFromLast If true and [[children]] is not empty, the new paragraph will inherit the style overrides of the last child in this block.\r\n * @note Be sure you pass in [[ParagraphProps]] and not [[Paragraph]] or style overrides will be ignored.\r\n */\r\n public appendParagraph(props?: ParagraphProps, seedFromLast = false): Paragraph {\r\n const seed = seedFromLast ? this.children[this.children.length - 1] : undefined;\r\n const styleOverrides = { ...seed?.styleOverrides, ...props?.styleOverrides };\r\n const paragraph = Paragraph.create({ ...props, styleOverrides });\r\n this.children.push(paragraph);\r\n return paragraph;\r\n }\r\n\r\n /** Append a run to the last [[Paragraph]] in this block.\r\n * If the block contains no [[children]], a new [[Paragraph]] will first be created using [[appendParagraph]].\r\n */\r\n public appendRun(run: Run): void {\r\n const paragraph = this.children[this.children.length - 1] ?? this.appendParagraph();\r\n paragraph.children.push(run);\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n if (!(other instanceof TextBlock)) {\r\n return false;\r\n }\r\n\r\n if (!super.equals(other)) {\r\n return false;\r\n }\r\n\r\n if (this.width !== other.width) {\r\n return false;\r\n }\r\n\r\n if (this.children && other.children) {\r\n if (this.children.length !== other.children.length) {\r\n return false;\r\n }\r\n\r\n return this.children.every((child, index) => other.children && child.equals(other.children[index]));\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * A union of all the [[TextBlockComponent]]s that can contain other components.\r\n * @beta\r\n */\r\nexport type StructuralTextBlockComponent = List | Paragraph | TextBlock;\r\n\r\n/**\r\n * Recursively traverses a [[StructuralTextBlockComponent]] tree, yielding each child component along with its parent container.\r\n * This generator enables depth-first iteration over all components in a text block structure, including paragraphs, lists, and runs.\r\n *\r\n * @param parent The root container whose children should be traversed.\r\n * @returns An IterableIterator yielding objects with the child component and its parent container.\r\n * @beta\r\n */\r\nexport function* traverseTextBlockComponent(parent: StructuralTextBlockComponent): IterableIterator<{ parent: StructuralTextBlockComponent, child: List | Paragraph | Run }> {\r\n for (const child of parent.children) {\r\n yield { parent, child };\r\n if (child.type === \"list\" || child.type === \"paragraph\") {\r\n yield* traverseTextBlockComponent(child);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns the formatted marker text for a list item based on the marker type and item number.\r\n * Supports ordered and unordered list markers, including alphabetic, Roman numeral, and numeric formats.\r\n * @param marker The type of list marker to use.\r\n * @param num The item number in the list.\r\n * @returns The formatted marker string for the list item.\r\n * @beta\r\n */\r\nexport function getMarkerText(marker: ListMarker, num: number): string {\r\n let markerString = \"\";\r\n\r\n switch (marker.enumerator) {\r\n case undefined:\r\n case ListMarkerEnumerator.Number:\r\n markerString = `${num}`;\r\n break;\r\n case ListMarkerEnumerator.Letter:\r\n markerString = integerToAlpha(num);\r\n break;\r\n case ListMarkerEnumerator.RomanNumeral:\r\n markerString = integerToRoman(num);\r\n break;\r\n default:\r\n markerString = marker.enumerator;\r\n break;\r\n }\r\n\r\n if (marker.case) {\r\n markerString = marker.case === \"upper\" ? markerString.toUpperCase() : markerString.toLowerCase();\r\n }\r\n\r\n const terminator = marker.terminator === \"period\" ? \".\" : marker.terminator === \"parenthesis\" ? \")\" : \"\";\r\n\r\n return `${markerString}${terminator}`;\r\n}\r\n\r\n/**\r\n * Converts an integer to its Roman numeral representation.\r\n * Supports numbers from 1 and above.\r\n * @param num The integer to convert.\r\n * @returns The Roman numeral string.\r\n */\r\nfunction integerToRoman(num: number): string {\r\n const values =\r\n [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\r\n const symbols =\r\n ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];\r\n let roman = '';\r\n for (let i = 0; i < values.length; i++) {\r\n while (num >= values[i]) {\r\n roman += symbols[i];\r\n num -= values[i];\r\n }\r\n }\r\n\r\n return roman;\r\n}\r\n\r\n/**\r\n * Converts an integer to its alphabetic representation (A-Z, AA-ZZ, etc.).\r\n * Used for ordered list markers with alphabetic styles.\r\n * @param num The integer to convert (1-based).\r\n * @returns The alphabetic string for the given number.\r\n */\r\nfunction integerToAlpha(num: number): string {\r\n const letterOffset = (num - 1) % 26;\r\n const letter = String.fromCharCode(65 + letterOffset);\r\n const depth = Math.ceil(num / 26);\r\n return letter.repeat(depth);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"TextBlock.js","sourceRoot":"","sources":["../../../src/annotation/TextBlock.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Annotation\r\n */\r\n\r\nimport { ListMarker, ListMarkerEnumerator, TextStyleSettings, TextStyleSettingsProps } from \"./TextStyle\";\r\nimport { FieldFormatOptions, FieldPropertyHost, FieldPropertyPath } from \"./TextField\";\r\n\r\n/** Options supplied to [[TextBlockComponent.clearStyleOverrides]] to control how the style overrides are cleared on the component and its child components.\r\n * @beta\r\n */\r\nexport interface ClearTextStyleOptions {\r\n /** Controls whether the styleOverrides of any child components are retained.\r\n * By default, all overrides are cleared.\r\n */\r\n preserveChildrenOverrides?: boolean;\r\n}\r\n\r\n/** The JSON representation of a [[TextBlockComponent]].\r\n * @beta\r\n */\r\nexport interface TextBlockComponentProps {\r\n /** Deviations from the base [[TextStyleSettings]] defined by the [AnnotationTextStyle]($backend) applied to this component.\r\n * This permits you to, e.g., create a [[TextBlock]] using \"Arial\" font and override one of its [[TextRun]]s to use \"Comic Sans\" instead.\r\n */\r\n styleOverrides?: TextStyleSettingsProps;\r\n}\r\n\r\n/** Options supplied to [[TextBlockComponent.stringify]] to control how the content is formatted.\r\n * @beta\r\n */\r\nexport interface TextBlockStringifyOptions {\r\n /** A string to insert in between each [[Paragraph]].\r\n * Default: \" \" - a single space.\r\n */\r\n paragraphBreak?: string;\r\n /** A string to insert for each [[LineBreakRun]].\r\n * Default: \" \" - a single space.\r\n */\r\n lineBreak?: string;\r\n /** A string to insert between the numerator and denominator of each [[FractionRun]].\r\n * Default: \"/\"\r\n */\r\n fractionSeparator?: string;\r\n /** The number of spaces to use for tabs. If not provided, tabs will be represented by a tab character: \"\\t\".\r\n * Default: \"undefined\" - use \"\\t\".\r\n */\r\n tabsAsSpaces?: number;\r\n /** A string to insert in between the list marker and the list item.\r\n * Default: \" \" - a single space.\r\n */\r\n listMarkerBreak?: string;\r\n}\r\n\r\n/**\r\n * Context information that may be useful when converting a [[TextBlock]] to a string.\r\n * @beta\r\n */\r\nexport interface TextBlockStringifyContext {\r\n /** The current depth of the text block in the document structure. */\r\n depth: number;\r\n}\r\n\r\nfunction clearStyleOverrides(component: StructuralTextBlockComponent, options?: ClearTextStyleOptions): void {\r\n component.styleOverrides = {};\r\n if (!options?.preserveChildrenOverrides) {\r\n for (const child of component.children) {\r\n child.clearStyleOverrides(options);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Abstract representation of any of the building blocks that make up a [[TextBlock]] document - namely [[Run]]s and [[StructuralTextBlockComponent]]s.\r\n * The [[TextBlock]] can specify an [AnnotationTextStyle]($backend) that formats its contents.\r\n * Each component can specify an optional [[styleOverrides]] to customize that formatting.\r\n * @beta\r\n */\r\nexport abstract class TextBlockComponent {\r\n private _styleOverrides: TextStyleSettingsProps;\r\n\r\n /** @internal */\r\n protected constructor(props?: TextBlockComponentProps) {\r\n this._styleOverrides = structuredClone(props?.styleOverrides ?? {});\r\n }\r\n\r\n /** Deviations in individual properties of the [[TextStyleSettings]] in the [AnnotationTextStyle]($backend).\r\n * For example, if the style uses the \"Arial\" font, you can override that by settings `styleOverrides.font.name` to \"Comic Sans\".\r\n * @see [[clearStyleOverrides]] to reset this to an empty object.\r\n */\r\n public get styleOverrides(): TextStyleSettingsProps {\r\n return this._styleOverrides;\r\n }\r\n\r\n public set styleOverrides(overrides: TextStyleSettingsProps) {\r\n this._styleOverrides = structuredClone(overrides);\r\n }\r\n\r\n /** Reset any [[styleOverrides]] applied to this component. */\r\n public clearStyleOverrides(_options?: ClearTextStyleOptions): void {\r\n this.styleOverrides = {};\r\n }\r\n\r\n /** Returns true if [[styleOverrides]] specifies any deviations from the [[TextBlock]]'s [AnnotationTextStyle]($backend). */\r\n public get overridesStyle(): boolean {\r\n return Object.keys(this.styleOverrides).length > 0;\r\n }\r\n\r\n /** Create a deep copy of this component. */\r\n public abstract clone(): TextBlockComponent;\r\n\r\n /** Compute a string representation of the contents of this component and all of its sub-components. */\r\n public abstract stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string;\r\n\r\n /** Returns true if this component has no content or children. */\r\n public abstract get isEmpty(): boolean;\r\n\r\n /**\r\n * Returns true if the string representation of this component consists only of whitespace characters.\r\n * Useful for checking if the component is visually empty (producing no graphics) or contains only spaces, tabs, or line breaks.\r\n */\r\n public get isWhitespace(): boolean {\r\n return /^\\s*$/g.test(this.stringify());\r\n };\r\n\r\n /** Convert this component to its JSON representation. */\r\n public toJSON(): TextBlockComponentProps {\r\n return {\r\n styleOverrides: structuredClone(this.styleOverrides),\r\n };\r\n }\r\n\r\n /** Returns true if `this` is equivalent to `other`. */\r\n public equals(other: TextBlockComponent): boolean {\r\n const mySettings = TextStyleSettings.fromJSON(this.styleOverrides);\r\n const otherSettings = TextStyleSettings.fromJSON(other.styleOverrides);\r\n return mySettings.equals(otherSettings);\r\n }\r\n}\r\n\r\n/** [[TextBlockComponent]]s contained within a [[Paragraph]].\r\n * @beta\r\n */\r\nexport type Run = TextRun | FractionRun | TabRun | LineBreakRun | FieldRun;\r\n\r\n/** The JSON representation of a [[Run]].\r\n * Use the `type` field to discriminate between the different kinds of runs.\r\n * @beta\r\n */\r\nexport type RunProps = TextRunProps | FractionRunProps | TabRunProps | LineBreakRunProps | FieldRunProps;\r\n\r\n/** A sequence of characters within a [[Paragraph]] that share a single style. Runs are the leaf nodes of a [[TextBlock]] document. When laid out for display, a single run may span\r\n * multiple lines, but it will never contain different styling.\r\n * Use the `type` field to discriminate between the different kinds of runs.\r\n * @beta\r\n */\r\nexport namespace Run { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** Create a run from its JSON representation.\r\n * @see [[TextRun.create]], [[FractionRun.create]], [[FieldRun.create]], [[TabRun.create]], and [[LineBreakRun.create]] to create a run directly.\r\n */\r\n export function fromJSON(props: RunProps): Run {\r\n switch (props.type) {\r\n case \"field\": return FieldRun.create(props);\r\n case \"fraction\": return FractionRun.create(props);\r\n case \"linebreak\": return LineBreakRun.create(props);\r\n case \"tab\": return TabRun.create(props);\r\n case \"text\": return TextRun.create(props);\r\n }\r\n }\r\n}\r\n\r\n/** Describes whether the characters of a [[TextRun]] should be displayed normally, in subscript, or in superscript.\r\n * [[TextStyleSettings.superScriptScale]], [[TextStyleSettings.subScriptScale]], [[TextStyleSettings.superScriptOffsetFactor]], and [[TextStyleSettings.subScriptOffsetFactor]]\r\n * affect how the content is rendered.\r\n * @beta\r\n */\r\nexport type BaselineShift = \"subscript\" | \"superscript\" | \"none\";\r\n\r\n/** JSON representation of a [[TextRun]].\r\n * @beta\r\n */\r\nexport interface TextRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"text\";\r\n /** The characters displayed by the run.\r\n * Default: an empty string.\r\n */\r\n content?: string;\r\n /** Whether to display [[content]] as a subscript, superscript, or normally.\r\n * Default: \"none\"\r\n */\r\n baselineShift?: BaselineShift;\r\n}\r\n\r\n/** The most common type of [[Run]], containing a sequence of characters to be displayed using a single style.\r\n * @beta\r\n */\r\nexport class TextRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"text\";\r\n /** The sequence of characters to be displayed by the run. */\r\n public content: string;\r\n /** Whether to display [[content]] as a subscript, superscript, or normally. */\r\n public baselineShift: BaselineShift;\r\n\r\n private constructor(props: TextRunProps) {\r\n super(props);\r\n this.content = props?.content ?? \"\";\r\n this.baselineShift = props?.baselineShift ?? \"none\";\r\n }\r\n\r\n public override clone(): TextRun {\r\n return new TextRun(this.toJSON());\r\n }\r\n\r\n public override toJSON(): TextRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"text\",\r\n content: this.content,\r\n baselineShift: this.baselineShift,\r\n };\r\n }\r\n\r\n public static create(props?: Omit<TextRunProps, \"type\">): TextRun {\r\n return new TextRun({ ...props, type: \"text\" });\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Simply returns [[content]]. */\r\n public override stringify(): string {\r\n return this.content;\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof TextRun && this.content === other.content && this.baselineShift === other.baselineShift && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[FractionRun]].\r\n * @beta\r\n */\r\nexport interface FractionRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"fraction\";\r\n /** The text displayed before or above the fraction separator, depending on [[TextStyleSettings.stackedFractionType]]. Default: an empty string. */\r\n numerator?: string;\r\n /** The text displayed after or below the fraction separator, depending on [[TextStyleSettings.stackedFractionType]]. Default: an empty string. */\r\n denominator?: string;\r\n}\r\n\r\n/** A [[Run]] containing a numeric ratio to be displayed as a numerator and denominator separated by a horizontal or diagonal bar.\r\n * @note The [[numerator]] and [[denominator]] are stored as strings. They are not technically required to contain a numeric representation.\r\n * @beta\r\n */\r\nexport class FractionRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"fraction\";\r\n /** The fraction's numerator. */\r\n public numerator: string;\r\n /** The fraction's denominator. */\r\n public denominator: string;\r\n\r\n private constructor(props: FractionRunProps) {\r\n super(props);\r\n this.numerator = props?.numerator ?? \"\";\r\n this.denominator = props?.denominator ?? \"\";\r\n }\r\n\r\n public override toJSON(): FractionRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"fraction\",\r\n numerator: this.numerator,\r\n denominator: this.denominator,\r\n };\r\n }\r\n\r\n public override clone(): FractionRun {\r\n return new FractionRun(this.toJSON());\r\n }\r\n\r\n public static create(props?: Omit<FractionRunProps, \"type\">): FractionRun {\r\n return new FractionRun({ ...props, type: \"fraction\" });\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Formats the fraction as a string with the [[numerator]] and [[denominator]] separated by [[TextBlockStringifyOptions.fractionSeparator]]. */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n const sep = options?.fractionSeparator ?? \"/\";\r\n return `${this.numerator}${sep}${this.denominator}`;\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof FractionRun && this.numerator === other.numerator && this.denominator === other.denominator && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[LineBreakRun]].\r\n * @beta\r\n */\r\nexport interface LineBreakRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"linebreak\";\r\n}\r\n\r\n/** A [[Run]] that represents the end of a line of text within a [[Paragraph]]. It contains no content of its own - it simply causes subsequent content to display on a new line.\r\n * @beta\r\n */\r\nexport class LineBreakRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"linebreak\";\r\n\r\n private constructor(props: LineBreakRunProps) {\r\n super(props);\r\n }\r\n\r\n public override toJSON(): LineBreakRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"linebreak\",\r\n };\r\n }\r\n\r\n public static create(props?: Omit<LineBreakRunProps, \"type\">) {\r\n return new LineBreakRun({ ...props, type: \"linebreak\" });\r\n }\r\n\r\n public override clone(): LineBreakRun {\r\n return new LineBreakRun(this.toJSON());\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Simply returns [[TextBlockStringifyOptions.lineBreak]]. */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n return options?.lineBreak ?? \" \";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof LineBreakRun && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TabRun]].\r\n * @beta\r\n */\r\nexport interface TabRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"tab\";\r\n}\r\n\r\n/** A [[TabRun]] is used to shift the next tab stop.\r\n * @note Only left-justified tabs are supported at this tab.\r\n * @beta\r\n */\r\nexport class TabRun extends TextBlockComponent {\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"tab\";\r\n\r\n public override toJSON(): TabRunProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"tab\",\r\n };\r\n }\r\n\r\n public override clone(): TabRun {\r\n return new TabRun(this.toJSON());\r\n }\r\n\r\n public static create(props?: Omit<TabRunProps, \"type\">): TabRun {\r\n return new TabRun(props);\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /**\r\n * Converts a [[TabRun]] to its string representation.\r\n * If the `tabsAsSpaces` option is provided, returns a string of spaces of the specified length.\r\n * Otherwise, returns a tab character (\"\\t\").\r\n */\r\n public override stringify(options?: TextBlockStringifyOptions): string {\r\n if (options?.tabsAsSpaces) {\r\n return \" \".repeat(options.tabsAsSpaces);\r\n }\r\n\r\n return \"\\t\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return other instanceof TabRun && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[FieldRun]].\r\n * @beta\r\n */\r\nexport interface FieldRunProps extends TextBlockComponentProps {\r\n /** Discriminator field for the [[RunProps]] union. */\r\n readonly type: \"field\";\r\n /** The element and BIS class containing the property described by [[propertyPath]]. */\r\n propertyHost: FieldPropertyHost;\r\n /** Describes how to obtain the property value from [[propertyHost]]. */\r\n propertyPath: FieldPropertyPath;\r\n /** Specifies how to format the property value obtained from [[propertyPath]] into a string to be stored in [[cachedContent]].\r\n * The specific options used depend upon the field's [[propertyType]].\r\n */\r\n formatOptions?: FieldFormatOptions;\r\n /** The field's most recently evaluated display string.\r\n * @note It is unnecessary to specify this when creating a field as part of an element like a [[TextAnnotation2d]], because\r\n * all of the element's fields will be re-evaluated when inserting or updating the element in the iModel.\r\n */\r\n cachedContent?: string;\r\n}\r\n\r\nfunction accessorsEqual(a: ReadonlyArray<string | number> | undefined, b: ReadonlyArray<string | number> | undefined): boolean {\r\n const lhs = a ?? [];\r\n const rhs = b ?? [];\r\n return lhs.length === rhs.length && lhs.every((value, index) => value === rhs[index]);\r\n}\r\n\r\n/** A [[Run]] that displays the formatted value of a property of some [Element]($backend).\r\n * When a [[TextBlock]] containing a [[FieldRun]] is written into the iModel as an [ITextAnnotation]($backend) element,\r\n * a dependency is established between the two elements via the [ElementDrivesTextAnnotation]($backend) relationship such that\r\n * whenever the source element specified by [[propertyHost]] is modified or the `ITextAnnotation` element is inserted or updated in the iModel,\r\n * the field(s) in the `ITextAnnotation` element are automatically\r\n * recalculated, causing their [[cachedContent]] to update. If the field's display string cannot be evaluated (for example, because the specified element or\r\n * property does not exist), then its cached content is set to [[FieldRun.invalidContentIndicator]].\r\n * A [[FieldRun]] displays its [[cachedContent]] in the same way that [[TextRun]]s display their `content`, including word wrapping where appropriate.\r\n * @beta\r\n */\r\nexport class FieldRun extends TextBlockComponent {\r\n /** Display string used to signal an error in computing the field's value. */\r\n public static invalidContentIndicator = \"####\";\r\n\r\n /** Discriminator field for the [[Run]] union. */\r\n public readonly type = \"field\";\r\n /** The element and BIS class containing the property described by [[propertyPath]]. */\r\n public propertyHost: FieldPropertyHost;\r\n /** Describes how to obtain the property value from [[propertyHost]]. */\r\n public propertyPath: FieldPropertyPath;\r\n /** Specifies how to format the property value obtained from [[propertyPath]] into a string to be stored in [[cachedContent]].\r\n * The specific options used depend upon the [[FieldPropertyType]].\r\n */\r\n public formatOptions?: FieldFormatOptions;\r\n private _cachedContent: string;\r\n\r\n /** The field's most recently evaluated display string. */\r\n public get cachedContent(): string {\r\n return this._cachedContent;\r\n }\r\n\r\n /** @internal Used by core-backend when re-evaluating field content. */\r\n public setCachedContent(content: string | undefined): void {\r\n this._cachedContent = content ?? FieldRun.invalidContentIndicator;\r\n }\r\n\r\n private constructor(props: FieldRunProps) {\r\n super(props);\r\n\r\n this._cachedContent = props.cachedContent ?? FieldRun.invalidContentIndicator;\r\n this.propertyHost = props.propertyHost\r\n this.propertyPath = props.propertyPath;\r\n this.formatOptions = props.formatOptions;\r\n }\r\n\r\n /** Create a FieldRun from its JSON representation. */\r\n public static create(props: Omit<FieldRunProps, \"type\">): FieldRun {\r\n return new FieldRun({\r\n ...props,\r\n propertyHost: { ...props.propertyHost },\r\n propertyPath: structuredClone(props.propertyPath),\r\n formatOptions: structuredClone(props.formatOptions),\r\n type: \"field\",\r\n });\r\n }\r\n\r\n /** Convert the FieldRun to its JSON representation. */\r\n public override toJSON(): FieldRunProps {\r\n const json: FieldRunProps = {\r\n ...super.toJSON(),\r\n type: \"field\",\r\n propertyHost: { ...this.propertyHost },\r\n propertyPath: structuredClone(this.propertyPath),\r\n };\r\n\r\n if (this.cachedContent !== FieldRun.invalidContentIndicator) {\r\n json.cachedContent = this.cachedContent;\r\n }\r\n\r\n if (this.formatOptions) {\r\n json.formatOptions = structuredClone(this.formatOptions);\r\n }\r\n\r\n return json;\r\n }\r\n\r\n /** Create a deep copy of this FieldRun. */\r\n public override clone(): FieldRun {\r\n return new FieldRun(this.toJSON());\r\n }\r\n\r\n public override get isEmpty(): boolean {\r\n return this.stringify().length === 0;\r\n }\r\n\r\n /** Convert this FieldRun to a simple string representation. */\r\n public override stringify(): string {\r\n return this.cachedContent;\r\n }\r\n\r\n /** Returns true if `this` is equivalent to `other`. */\r\n public override equals(other: TextBlockComponent): boolean {\r\n if (!(other instanceof FieldRun) || !super.equals(other)) {\r\n return false;\r\n }\r\n\r\n if (\r\n this.propertyHost.elementId !== other.propertyHost.elementId ||\r\n this.propertyHost.className !== other.propertyHost.className ||\r\n this.propertyHost.schemaName !== other.propertyHost.schemaName\r\n ) {\r\n return false;\r\n }\r\n\r\n if (this.propertyPath.propertyName !== other.propertyPath.propertyName) {\r\n return false;\r\n }\r\n\r\n if (!accessorsEqual(this.propertyPath.accessors, other.propertyPath.accessors)) {\r\n return false;\r\n }\r\n\r\n if (!accessorsEqual(this.propertyPath.jsonAccessors, other.propertyPath.jsonAccessors)) {\r\n return false;\r\n }\r\n\r\n if (this.formatOptions && other.formatOptions) {\r\n // We anticipate new formatting options being added in the future.\r\n // So to account for properties we don't know about, just compare the string representations.\r\n if (JSON.stringify(this.formatOptions) !== JSON.stringify(other.formatOptions)) {\r\n return false;\r\n }\r\n } else if (this.formatOptions || other.formatOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** JSON representation of a [[Paragraph]].\r\n * @beta\r\n */\r\nexport interface ParagraphProps extends TextBlockComponentProps {\r\n children?: Array<ListProps | RunProps>;\r\n}\r\n\r\n/** A collection of [[Run]]s and [[List]]s. Paragraphs can be appended to [[List]]s and [[TextBlock]]s.\r\n * Each paragraph is laid out on a separate line. If included in a [[List]], the paragraph will be treated as a list item.\r\n * @beta\r\n */\r\nexport class Paragraph extends TextBlockComponent {\r\n public readonly type = \"paragraph\";\r\n public readonly children: Array<List | Run>;\r\n\r\n private constructor(props?: ParagraphProps) {\r\n super(props);\r\n\r\n this.children = props?.children?.map((child) =>\r\n child.type === \"list\" ? List.create(child) : Run.fromJSON(child)\r\n ) ?? [];\r\n }\r\n\r\n /** Create a paragraph from its JSON representation. */\r\n public static create(props?: Omit<ParagraphProps, \"type\">): Paragraph {\r\n return new Paragraph(props);\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override get isEmpty() {\r\n return this.children.length === 0;\r\n }\r\n\r\n public override clone(): Paragraph {\r\n return new Paragraph(this.toJSON());\r\n }\r\n\r\n public override toJSON(): ParagraphProps {\r\n return {\r\n ...super.toJSON(),\r\n children: this.children.map((child) => child.toJSON()),\r\n };\r\n }\r\n\r\n /** Compute a string representation of this paragraph by concatenating the string representations of all of its children. */\r\n public override stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string {\r\n return this.children.map((x, index) => (index > 0 && x.type === \"list\") ? `${options?.paragraphBreak ?? \" \"}${x.stringify(options, context)}` : x.stringify(options, context)).join(\"\") ?? \"\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return (other instanceof Paragraph) && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[List]].\r\n * @beta\r\n */\r\nexport interface ListProps extends TextBlockComponentProps {\r\n readonly type: \"list\";\r\n children?: ParagraphProps[];\r\n}\r\n\r\n/** A collection of list items ([[Paragraph]]s). Lists can be appended to [[Paragraph]]s.\r\n * Lists will be laid out on a new line. Each item in a list is laid out on a separate line.\r\n * @beta\r\n */\r\nexport class List extends TextBlockComponent {\r\n public readonly type = \"list\";\r\n public readonly children: Paragraph[];\r\n\r\n protected constructor(props?: ListProps) {\r\n super(props);\r\n\r\n this.children = props?.children?.map((child) => Paragraph.create(child)) ?? [];\r\n }\r\n\r\n /** Create a list from its JSON representation. */\r\n public static create(props?: Omit<ListProps, \"type\">): List {\r\n return new List({ ...props, type: \"list\" });\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override get isEmpty() {\r\n return this.children.length === 0;\r\n }\r\n\r\n public override clone(): List {\r\n return new List(this.toJSON());\r\n }\r\n\r\n public override toJSON(): ListProps {\r\n return {\r\n ...super.toJSON(),\r\n type: \"list\",\r\n children: this.children.map((run) => run.toJSON()),\r\n };\r\n }\r\n\r\n /** Compute a string representation of this list by concatenating the string representations of all of its [[children]]. */\r\n public override stringify(options?: TextBlockStringifyOptions, context?: TextBlockStringifyContext): string {\r\n const children = this.children.map((x, index) => {\r\n const depth = context?.depth ?? 0;\r\n const marker = getMarkerText(this.styleOverrides.listMarker ?? TextStyleSettings.defaultProps.listMarker, index + 1);\r\n const tab = (options?.tabsAsSpaces ? \" \".repeat(options.tabsAsSpaces) : \"\\t\").repeat(depth);\r\n return `${tab}${marker}${options?.listMarkerBreak ?? \" \"}${x.stringify(options, { depth: depth + 1 })}`;\r\n });\r\n return children.join(options?.paragraphBreak ?? \" \") ?? \"\";\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n return (other instanceof List) && super.equals(other);\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TextBlock]].\r\n * @beta\r\n */\r\nexport interface TextBlockProps extends TextBlockComponentProps {\r\n /** The width of the document in meters. Lines that would exceed this width are instead wrapped around to the next line if possible.\r\n * A value less than or equal to zero indicates no wrapping is to be applied.\r\n * Default: 0\r\n */\r\n width?: number;\r\n children?: ParagraphProps[];\r\n}\r\n\r\n/** Represents a formatted text document consisting of a series of [[Paragraph]]s, each laid out on a separate line and containing their own content.\r\n * No word-wrapping is applied to the document unless a [[width]] greater than zero is specified.\r\n * @see [[TextAnnotation]] to position a text block as an annotation in 2d or 3d space.\r\n * @beta\r\n */\r\nexport class TextBlock extends TextBlockComponent {\r\n public readonly children: Paragraph[];\r\n\r\n /** The width of the document in meters. Lines that would exceed this width are instead wrapped around to the next line if possible.\r\n * A value less than or equal to zero indicates no wrapping is to be applied.\r\n * Default: 0\r\n */\r\n public width: number;\r\n\r\n private constructor(props: TextBlockProps) {\r\n super(props);\r\n this.width = props.width ?? 0;\r\n\r\n this.children = props?.children?.map((para) => Paragraph.create(para)) ?? [];\r\n }\r\n\r\n public override clearStyleOverrides(options?: ClearTextStyleOptions): void {\r\n clearStyleOverrides(this, options);\r\n }\r\n\r\n public override toJSON(): TextBlockProps {\r\n return {\r\n ...super.toJSON(),\r\n width: this.width,\r\n children: this.children.map((x) => x.toJSON()),\r\n };\r\n }\r\n\r\n /** Create a text block from its JSON representation. */\r\n public static create(props?: Omit<TextBlockProps, \"type\">): TextBlock {\r\n return new TextBlock(props ?? {});\r\n }\r\n\r\n /** Returns true if every paragraph in this text block is empty. */\r\n public override get isEmpty(): boolean {\r\n return !this.children || this.children.every((child) => child.isEmpty);\r\n }\r\n\r\n public override clone(): TextBlock {\r\n return new TextBlock(this.toJSON());\r\n }\r\n\r\n /** Compute a string representation of the document's contents by concatenating the string representations of each of its [[children]], separated by [[TextBlockStringifyOptions.paragraphBreak]]. */\r\n public stringify(options?: TextBlockStringifyOptions): string {\r\n return this.children.map((x) => x.stringify(options)).join(options?.paragraphBreak ?? \" \") || \"\";\r\n }\r\n\r\n /** Add and return a new paragraph.\r\n * By default, the paragraph will be created with no [[styleOverrides]], so that it inherits the style of this block.\r\n * @param seedFromLast If true and [[children]] is not empty, the new paragraph will inherit the style overrides of the last child in this block.\r\n * @note Be sure you pass in [[ParagraphProps]] and not [[Paragraph]] or style overrides will be ignored.\r\n */\r\n public appendParagraph(props?: ParagraphProps, seedFromLast = false): Paragraph {\r\n const seed = seedFromLast ? this.children[this.children.length - 1] : undefined;\r\n const styleOverrides = { ...seed?.styleOverrides, ...props?.styleOverrides };\r\n const paragraph = Paragraph.create({ ...props, styleOverrides });\r\n this.children.push(paragraph);\r\n return paragraph;\r\n }\r\n\r\n /** Append a run to the last [[Paragraph]] in this block.\r\n * If the block contains no [[children]], a new [[Paragraph]] will first be created using [[appendParagraph]].\r\n */\r\n public appendRun(run: Run): void {\r\n const paragraph = this.children[this.children.length - 1] ?? this.appendParagraph();\r\n paragraph.children.push(run);\r\n }\r\n\r\n public override equals(other: TextBlockComponent): boolean {\r\n if (!(other instanceof TextBlock)) {\r\n return false;\r\n }\r\n\r\n if (!super.equals(other)) {\r\n return false;\r\n }\r\n\r\n if (this.width !== other.width) {\r\n return false;\r\n }\r\n\r\n if (this.children && other.children) {\r\n if (this.children.length !== other.children.length) {\r\n return false;\r\n }\r\n\r\n return this.children.every((child, index) => other.children && child.equals(other.children[index]));\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * A union of all the [[TextBlockComponent]]s that can contain other components.\r\n * @beta\r\n */\r\nexport type StructuralTextBlockComponent = List | Paragraph | TextBlock;\r\n\r\n/**\r\n * Recursively traverses a [[StructuralTextBlockComponent]] tree, yielding each child component along with its parent container.\r\n * This generator enables depth-first iteration over all components in a text block structure, including paragraphs, lists, and runs.\r\n *\r\n * @param parent The root container whose children should be traversed.\r\n * @returns An IterableIterator yielding objects with the child component and its parent container.\r\n * @beta\r\n */\r\nexport function* traverseTextBlockComponent(parent: StructuralTextBlockComponent): IterableIterator<{ parent: StructuralTextBlockComponent, child: List | Paragraph | Run }> {\r\n for (const child of parent.children) {\r\n yield { parent, child };\r\n if (child.type === \"list\" || child.type === \"paragraph\") {\r\n yield* traverseTextBlockComponent(child);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Returns the formatted marker text for a list item based on the marker type and item number.\r\n * Supports ordered and unordered list markers, including alphabetic, Roman numeral, and numeric formats.\r\n * @param marker The type of list marker to use.\r\n * @param num The item number in the list.\r\n * @returns The formatted marker string for the list item.\r\n * @beta\r\n */\r\nexport function getMarkerText(marker: ListMarker, num: number): string {\r\n let markerString = \"\";\r\n\r\n switch (marker.enumerator) {\r\n case undefined:\r\n case ListMarkerEnumerator.Number:\r\n markerString = `${num}`;\r\n break;\r\n case ListMarkerEnumerator.Letter:\r\n markerString = integerToAlpha(num);\r\n break;\r\n case ListMarkerEnumerator.RomanNumeral:\r\n markerString = integerToRoman(num);\r\n break;\r\n default:\r\n markerString = marker.enumerator;\r\n break;\r\n }\r\n\r\n if (marker.case) {\r\n markerString = marker.case === \"upper\" ? markerString.toUpperCase() : markerString.toLowerCase();\r\n }\r\n\r\n const terminator = marker.terminator === \"period\" ? \".\" : marker.terminator === \"parenthesis\" ? \")\" : \"\";\r\n\r\n return `${markerString}${terminator}`;\r\n}\r\n\r\n/**\r\n * Converts an integer to its Roman numeral representation.\r\n * Supports numbers from 1 and above.\r\n * @param num The integer to convert.\r\n * @returns The Roman numeral string.\r\n */\r\nfunction integerToRoman(num: number): string {\r\n const values =\r\n [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\r\n const symbols =\r\n ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];\r\n let roman = '';\r\n for (let i = 0; i < values.length; i++) {\r\n while (num >= values[i]) {\r\n roman += symbols[i];\r\n num -= values[i];\r\n }\r\n }\r\n\r\n return roman;\r\n}\r\n\r\n/**\r\n * Converts an integer to its alphabetic representation (A-Z, AA-ZZ, etc.).\r\n * Used for ordered list markers with alphabetic styles.\r\n * @param num The integer to convert (1-based).\r\n * @returns The alphabetic string for the given number.\r\n */\r\nfunction integerToAlpha(num: number): string {\r\n const letterOffset = (num - 1) % 26;\r\n const letter = String.fromCharCode(65 + letterOffset);\r\n const depth = Math.ceil(num / 26);\r\n return letter.repeat(depth);\r\n}\r\n"]}
|