Commit 67b4e34
feat(data-fabric): add folderKey support to entities.getAll and ChoiceSets surface (#504)
* feat(data-fabric): add folderKey support to entities.getAll and ChoiceSets surface
entities.getAll now accepts an optional folderKey to retrieve folder-scoped
entities; the API filters exclusively (tenant scope vs folder scope are
disjoint), confirmed against the live API.
ChoiceSets methods all accept folderKey and forward it as the
X-UIPATH-FolderKey header. Critically, insertValueById and updateValueById
hard-fail on folder-scoped choice sets without the header — and their
internal name resolver (resolveChoiceSetName) now scopes its getAll lookup
by the same folderKey so the path stops throwing NotFoundError before the
API call.
Adds folder-scoped @example blocks to JSDoc on every Entities method that
already supported folderKey but didn't document it, integration coverage
for the new getAll filter, and a skipped folder-scoped ChoiceSets block
mirroring the existing OAuth-scope-gated value-CRUD pattern.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: address review comments — JSDoc sync, single afterAll, folderKey header tests
- Sync ChoiceSetServiceModel JSDoc with service-class JSDoc on getById,
deleteById, and deleteValuesById (model is the docs source of truth).
- Service-class JSDoc on the same three methods updated with @param options
and folder-scoped @example blocks for parity.
- Consolidate folder-scoped choice-set integration cleanup into the
file-level afterAll (removes the duplicate afterAll inside the
describe.skip block per the rules.md convention).
- Add unit tests asserting X-UIPATH-FolderKey forwarding for every choice-set
method that gained folderKey support (getAll, getById, create, updateById,
deleteById, insertValueById, updateValueById, deleteValuesById) and for
entities.getAll, matching the pattern already used on other Entities methods.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(data-fabric): cross-folder reference support + folder-scoped integration tests
Adds an opt-in `referenceFolderKey` on EntityCreateFieldOptions so callers can
create entities whose RELATIONSHIP / CHOICE_SET fields point at targets in a
different folder (or the tenant SYSTEM scope). The SDK assembles the minimum
payload each API path needs:
- Relationship targets: { id, folderId } — both come straight from caller inputs,
no extra round-trip. Verified against alpha: the relationship endpoint
resolves by folderId.
- Choice-set targets: { id, name, folderId, entityType, entityTypeId } — the
CS endpoint resolves by name, so the SDK does one GET on the target to fetch
it (parallelized across fields). Verified against alpha: bare {id} or
{id, folderId} both 403 with empty target name; {id, name} succeeds.
Tenant marker (DATA_FABRIC_TENANT_FOLDER_ID, all-zeros) is supported as a
referenceFolderKey value — the SDK looks up the target at tenant scope (no
folder header) and emits folderId: '00000000-...'.
Integration tests:
- Folder-scoped record CRUD (insert/get/update/delete + batch variants, plus
queryRecordsById) — runs in CI against DATA_FABRIC_TEST_FOLDER_ENTITY_ID
+ INTEGRATION_TEST_FOLDER_KEY.
- Folder-scoped Choice value CRUD — describe.skip'd alongside the other
schema-write blocks (requires DataFabric.Schema.Write OAuth scope); the
block locates its target CS by name (`aIntegrationTestFolderScoped`)
via getAll({ folderKey }) so it doesn't need a CS-ID env var.
- buildDummyRecord helper now threads folderKey into getChoiceSetValues so
folder-scoped ChoiceSetSingle/Multiple fields get populated correctly.
Unit tests:
- 3 new tests covering the new opt-in path: cross-folder relationship
(no GET, embeds {id, folderId}), tenant-marker CS lookup (no folder header
on the GET), folder-UUID CS lookup (sends X-UIPATH-FolderKey).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* revert: roll tests/.env.integration.example back to template
Reverts the prior commit's accidental check-in of tenant-specific test config
and a personal PAT into the example file. The example should only carry
placeholder values; live config belongs in the gitignored .env.integration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* ci: add DATA_FABRIC_TEST_FOLDER_ENTITY_ID to integration test config
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactor(data-fabric): extract ChoiceSet entityType/Id to module-level constants
Replaces inline 'ChoiceSet' / 1 literals in buildReferenceMeta with the
existing EntityType.ChoiceSet enum and a new ENTITY_TYPE_IDS map.
Pairs the two values that travel together in reference payloads.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(data-fabric): add includeAllFolders option to entities.getAll (#509)
Add an optional `includeAllFolders` flag to `EntityGetAllOptions`. When
true (and no `folderKey` is provided), `getAll` lists tenant-level and
folder-level entities together via the v2 entity endpoint. Existing
behavior is unchanged: no flag lists only tenant entities, and a
`folderKey` always wins — scoping to that single folder and ignoring
`includeAllFolders`.
Documents the additional `OR.Users` scope required for folder-scoped
entity operations and the combined listing.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(data-fabric): rename includeAllFolders to includeAllScopes on entities.getAll
The flag returns BOTH tenant-level and folder-level entities together —
"all folders" was misleading on two counts: it sounded folder-only
(excluding tenant entities), and tenant isn't a "folder." "Scopes" is
the right abstraction since Data Fabric entities have two scopes
(tenant + folder) and the flag toggles "give me everything regardless
of scope."
Renames across types, service implementation, JSDoc, unit + integration
tests, endpoint comment, and oauth-scopes docs.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): inline tenant folder UUID literal in referenceFolderKey JSDoc
DATA_FABRIC_TENANT_FOLDER_ID is an internal endpoint constant not
exported through the public API barrel, so users had no way to resolve
the reference. Inlines the literal '00000000-0000-0000-0000-000000000000'
so the JSDoc is self-contained.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(data-fabric): add includeFolderChoiceSets opt-in + address Sarath PR comments
ChoiceSets:
- Add `includeFolderChoiceSets?: boolean` option to ChoiceSetGetAllOptions
- Default tenant-only via tenant-marker header (no OR.Users required)
- `includeFolderChoiceSets: true` opts into cross-scope (tenant + folder),
matching the `includeAllScopes` pattern on entities
- folderKey continues to scope to a single folder (always wins over the flag)
Entities:
- Keep `includeAllScopes` (per Sarath's merged PR) — default tenant-only via
v1 endpoint; `includeAllScopes: true` uses v2 (requires OR.Users)
- JSDoc rewritten to spell out the canonical 3-mode pattern
Sarath PR comment fixes:
- Remove self-referential `Options for {@link X}` JSDoc on options interfaces
in both choicesets.types.ts and entities.types.ts
- Use DATA_FABRIC_TENANT_FOLDER_ID constant in integration test
- Add OR.Users note for ChoiceSets in oauth-scopes.md
- Restore GET_ALL_V2 endpoint constant alongside v1 GET_ALL
- Unit test coverage for all 3 modes on both services
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(data-fabric): rename entities.getAll option includeAllScopes → includeFolderEntities
Parallels the choicesets-side `includeFolderChoiceSets` naming so both
surfaces use clear, customer-facing flag names. "AllScopes" leaked SDK
internals ("scope" is not customer vocabulary); "include folder entities"
states plainly what the flag adds on top of the tenant default.
Same 3-mode semantics preserved:
- getAll({ includeFolderEntities: false }) → tenant only (default)
- getAll({ includeFolderEntities: true }) → tenant + folders (needs OR.Users)
- getAll({ includeFolderEntities: false, folderKey }) → folder only (folderKey wins)
Rename across: type field, JSDoc on EntityServiceModel + service class,
endpoint comment, unit tests, integration test reference, oauth-scopes.md.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(data-fabric): skip includeFolderEntities CI test that requires OR.Users
The /api/v2/Entity endpoint backing `getAll({ includeFolderEntities: true })`
requires the OR.Users OAuth scope, which the standard integration PAT does
not carry — so the test 403s in CI. Mark the test with `it.skip` and a
comment pointing local devs at how to enable it when running with an
OR.Users-capable token, matching the schema-write `describe.skip` pattern
already established in this file.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(data-fabric): re-enable includeFolderEntities integration test
OR.Users scope is now available on the integration PAT, so the v2 endpoint
backing `getAll({ includeFolderEntities: true })` no longer returns 403.
Reverts the `it.skip` and keeps a one-line comment noting the scope
requirement for future readers.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(data-fabric): address SonarCloud issues on PR #504
- entities.ts:1266 / choicesets.ts:398: flip negated ternaries (S7735)
- entities.ts:166,630 / choicesets.ts:138: drop unnecessary `{} as T`
cast on the `options ?? {}` fallback (S4325)
- choicesets.integration.test.ts:256,466: add post-delete getById +
assertion that the deleted value IDs are no longer present (S2699
BLOCKER — tests must contain at least one assertion)
Verifies the delete actually worked, not just that the call resolved.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): mark folder scope as experimental across Entities
Folder-scoped Data Fabric is still in preview. Surface that everywhere
the SDK exposes it:
- Type-level: add @experimental on EntityFolderScopedOptions.folderKey,
EntityGetAllOptions.includeFolderEntities, and EntityCreateFieldOptions
.referenceFolderKey. TypeDoc renders these as Experimental badges in
the generated reference tables.
- Method-level: add a "> **Experimental:** ..." blockquote to every
Entities method that documents folderKey (getAll, getById,
getAllRecords, getRecordById, queryRecordsById, insertRecordById,
insertRecordsById, updateRecordById, updateRecordsById, updateById,
deleteRecordById, deleteRecordsById, deleteById, uploadAttachment,
downloadAttachment, deleteAttachment, importRecordsById, create).
- Kept JSDoc in sync between entities.models.ts (TypeDoc source of
truth) and entities.ts (service class).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): clarify choicesets.getAll JSDoc per PR review
- "Gets choice sets in the org" → "Gets choice sets in the tenant".
- Default call mode is now shown as `getAll()`, not
`getAll({ includeFolderChoiceSets: false })`.
- Reorder call modes so `folderKey` is presented as the preferred way
to scope to a folder, with `includeFolderChoiceSets` reframed as the
wider tenant + folder option.
Kept the JSDoc in sync between ChoiceSetServiceModel and the
ChoiceSetService class.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): apply same JSDoc clarifications to entities.getAll
Mirror the choicesets.getAll review fixes onto the entities surface:
- "Gets entities in the system" → "Gets entities in the tenant".
- Default call mode is now shown as `getAll()`, not
`getAll({ includeFolderEntities: false })`.
- Reorder call modes so `folderKey` is presented as the preferred way
to scope to a folder, with `includeFolderEntities` reframed as the
wider tenant + folder option.
Kept JSDoc in sync between EntityServiceModel and the EntityService class.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): add @experimental tag to folderKey-bearing methods
Every Entities and ChoiceSets method that accepts a `folderKey` option
now carries the `@experimental` JSDoc tag, so TypeDoc renders an
`Experimental` badge directly under the method signature in the
generated reference docs — alongside the existing blockquote that
calls out `folderKey` specifically as the experimental property.
Choicesets also gains the "folder scope is experimental" blockquote
on each affected method (entities already had it).
Kept JSDoc in sync between the ServiceModel interfaces and the
service-class implementations.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): drop OR.Users OAuth scope mentions from JSDoc
Per PR feedback — remove `OR.Users` references from user-facing JSDoc on
the entities and choicesets `getAll` methods and on the related option
field comments. Internal code comments that explain endpoint-selection
logic stay (they're not rendered in public docs).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): scope experimental marker to folderKey argument only
Method-level `@experimental` tags and `> **Experimental:** ...` blockquotes
removed from every Entities and ChoiceSets method that takes `folderKey`.
The experimental marker now lives only at the argument level:
- Type-level: `@experimental` JSDoc tag on the `folderKey` property
(already in `EntityFolderScopedOptions`) and `includeFolderChoiceSets`
(added here for parity with `includeFolderEntities`). TypeDoc renders
these as `Experimental` badges on the property rows of every linked
options-type page.
- Method-level: each `@param options - ...` line now ends with
`The \`folderKey\` property is **experimental**.` — visible directly
in the rendered parameter table of every folderKey-bearing method.
`updateValueById` (ChoiceSets) previously had no `@param options` line;
added one so the marker reaches that method too.
ServiceModel ↔ service class JSDoc kept in sync per project convention.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): drop OR.Users folder-scope blockquotes from oauth-scopes
Removes the two leftover blockquote notes in docs/oauth-scopes.md that
called out `OR.Users` for folder-scoped Entities and ChoiceSets. The
remaining `OR.Users` rows in that file are unrelated (User Settings
service endpoints).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(data-fabric): address PR review comments
Addresses outstanding Claude bot review feedback on PR #504:
- Drop the `as unknown as ChoiceSetGetResponse` intermediate cast in
`getById`'s `transformFn` — a single `as ChoiceSetGetResponse` is
sufficient when `pascalToCamelCaseKeys()` precedes `transformData()`
in the pipeline (returns `any`).
- Remove the `as any` cast on the `PaginationHelpers.getAll()` return
in `getById` — TypeScript infers the conditional return type
correctly without it.
- Use typed `EntityType.ChoiceSet` + `ENTITY_TYPE_IDS[…]` in
`entities.test.ts` instead of raw `"ChoiceSet"` / `1` literals so
the assertion stays in sync if the enum or type-id mapping changes.
Also fixes a follow-on `entityType: 0` literal that the new enum
import surfaced.
- Fix the double `@track('Choicesets.GetAll')` telemetry from
`resolveChoiceSetName` calling `this.getAll()`: extract an un-tracked
`fetchAllChoiceSets` helper that both `getAll()` and
`resolveChoiceSetName` call directly.
- Extract `EntityFolderScopedOptions` into a new shared
`src/models/data-fabric/data-fabric.types.ts` so `choicesets.types`
no longer imports across service domains from `entities.types`.
`entities.types` re-exports for backward compatibility with the
public barrel.
Also: reword the `folderKey` precedence note from
"folderKey (when provided) always wins over this flag" to
"folderKey is preferred over includeFolder{Entities,ChoiceSets} when
both are set" everywhere it appears (model JSDoc, service JSDoc,
type-level field JSDoc, inline implementation comments).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(data-fabric): tighten ReferenceEntityPayload.entityType + scrub OR.Users from DF source
- `ReferenceEntityPayload.entityType` was typed `string`, losing type
safety and autocomplete. The `EntityType` enum already covers every
valid value, and the only call site (`buildReferenceMeta`) already
passes `EntityType.ChoiceSet`. Narrow to `entityType?: EntityType`.
- Remove the last three `OR.Users` references from Data Fabric source
files (endpoint comment for `GET_ALL_V2`, inline `getAll` comment in
the entity service, inline `fetchAllChoiceSets` comment). The
remaining `OR.Users` mentions in the repo are unrelated SDK auth
examples and the User Settings service rows in oauth-scopes.md.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Sarath1018 <motatisarath@gmail.com>
Co-authored-by: amrit-agarwal-1 <amrit.agarwal@uipath.com>1 parent b8d856c commit 67b4e34
17 files changed
Lines changed: 1188 additions & 181 deletions
File tree
- .github/workflows
- src
- models/data-fabric
- services/data-fabric
- utils/constants/endpoints
- tests
- unit/services/data-fabric
- utils/constants
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
69 | 70 | | |
70 | 71 | | |
71 | 72 | | |
| |||
90 | 91 | | |
91 | 92 | | |
92 | 93 | | |
| 94 | + | |
93 | 95 | | |
94 | 96 | | |
95 | 97 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| 8 | + | |
7 | 9 | | |
8 | 10 | | |
9 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
10 | 14 | | |
11 | 15 | | |
12 | 16 | | |
| |||
28 | 32 | | |
29 | 33 | | |
30 | 34 | | |
31 | | - | |
| 35 | + | |
32 | 36 | | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
33 | 43 | | |
34 | 44 | | |
35 | 45 | | |
36 | 46 | | |
37 | | - | |
38 | | - | |
| 47 | + | |
| 48 | + | |
39 | 49 | | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
| 50 | + | |
| 51 | + | |
46 | 52 | | |
47 | | - | |
48 | | - | |
| 53 | + | |
| 54 | + | |
49 | 55 | | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
| 56 | + | |
| 57 | + | |
55 | 58 | | |
56 | 59 | | |
57 | | - | |
| 60 | + | |
58 | 61 | | |
59 | 62 | | |
60 | 63 | | |
| |||
64 | 67 | | |
65 | 68 | | |
66 | 69 | | |
67 | | - | |
| 70 | + | |
68 | 71 | | |
69 | 72 | | |
70 | 73 | | |
| |||
89 | 92 | | |
90 | 93 | | |
91 | 94 | | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
92 | 98 | | |
93 | 99 | | |
94 | 100 | | |
| |||
106 | 112 | | |
107 | 113 | | |
108 | 114 | | |
109 | | - | |
| 115 | + | |
110 | 116 | | |
111 | 117 | | |
112 | 118 | | |
| |||
131 | 137 | | |
132 | 138 | | |
133 | 139 | | |
134 | | - | |
| 140 | + | |
135 | 141 | | |
136 | 142 | | |
137 | 143 | | |
| |||
153 | 159 | | |
154 | 160 | | |
155 | 161 | | |
| 162 | + | |
156 | 163 | | |
157 | 164 | | |
158 | 165 | | |
| |||
162 | 169 | | |
163 | 170 | | |
164 | 171 | | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
165 | 175 | | |
166 | 176 | | |
167 | 177 | | |
168 | | - | |
| 178 | + | |
169 | 179 | | |
170 | 180 | | |
171 | 181 | | |
172 | 182 | | |
173 | 183 | | |
174 | 184 | | |
175 | | - | |
| 185 | + | |
176 | 186 | | |
177 | 187 | | |
178 | 188 | | |
| |||
185 | 195 | | |
186 | 196 | | |
187 | 197 | | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
188 | 204 | | |
189 | 205 | | |
190 | 206 | | |
| |||
203 | 219 | | |
204 | 220 | | |
205 | 221 | | |
| 222 | + | |
206 | 223 | | |
207 | 224 | | |
208 | 225 | | |
| |||
214 | 231 | | |
215 | 232 | | |
216 | 233 | | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
217 | 239 | | |
218 | 240 | | |
219 | 241 | | |
220 | 242 | | |
221 | 243 | | |
222 | 244 | | |
223 | 245 | | |
| 246 | + | |
224 | 247 | | |
225 | 248 | | |
226 | 249 | | |
227 | 250 | | |
228 | 251 | | |
229 | 252 | | |
230 | 253 | | |
| 254 | + | |
231 | 255 | | |
232 | 256 | | |
233 | 257 | | |
| |||
237 | 261 | | |
238 | 262 | | |
239 | 263 | | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
240 | 267 | | |
241 | 268 | | |
242 | 269 | | |
243 | | - | |
| 270 | + | |
244 | 271 | | |
245 | 272 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
| |||
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
52 | 64 | | |
53 | 65 | | |
54 | 66 | | |
55 | | - | |
| 67 | + | |
56 | 68 | | |
57 | 69 | | |
58 | 70 | | |
59 | 71 | | |
60 | | - | |
| 72 | + | |
61 | 73 | | |
62 | 74 | | |
63 | 75 | | |
64 | 76 | | |
65 | | - | |
66 | | - | |
67 | 77 | | |
68 | 78 | | |
69 | 79 | | |
70 | 80 | | |
71 | 81 | | |
72 | | - | |
| 82 | + | |
73 | 83 | | |
74 | 84 | | |
75 | 85 | | |
76 | 86 | | |
77 | 87 | | |
78 | 88 | | |
| 89 | + | |
| 90 | + | |
79 | 91 | | |
80 | 92 | | |
81 | 93 | | |
82 | 94 | | |
83 | 95 | | |
84 | 96 | | |
85 | | - | |
| 97 | + | |
86 | 98 | | |
87 | 99 | | |
88 | 100 | | |
89 | 101 | | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
90 | 106 | | |
91 | 107 | | |
92 | 108 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
10 | 19 | | |
11 | 20 | | |
12 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
| 24 | + | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
27 | 42 | | |
28 | 43 | | |
29 | 44 | | |
| |||
0 commit comments