@plan2net/typo3-playwright-toolkit 0.26.0 → 0.27.0

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.
Files changed (58) hide show
  1. package/README.md +147 -2
  2. package/dist/backend.d.ts +8 -0
  3. package/dist/backend.d.ts.map +1 -0
  4. package/dist/backend.js +27 -0
  5. package/dist/backend.js.map +1 -0
  6. package/dist/builders/content-builder.d.ts +26 -1
  7. package/dist/builders/content-builder.d.ts.map +1 -1
  8. package/dist/builders/content-builder.js +77 -5
  9. package/dist/builders/content-builder.js.map +1 -1
  10. package/dist/builders/fields.d.ts +5 -0
  11. package/dist/builders/fields.d.ts.map +1 -1
  12. package/dist/builders/fields.js +7 -0
  13. package/dist/builders/fields.js.map +1 -1
  14. package/dist/builders/file-metadata-builder.d.ts +18 -0
  15. package/dist/builders/file-metadata-builder.d.ts.map +1 -0
  16. package/dist/builders/file-metadata-builder.js +54 -0
  17. package/dist/builders/file-metadata-builder.js.map +1 -0
  18. package/dist/builders/page-builder.d.ts +14 -0
  19. package/dist/builders/page-builder.d.ts.map +1 -1
  20. package/dist/builders/page-builder.js +55 -3
  21. package/dist/builders/page-builder.js.map +1 -1
  22. package/dist/builders/relations.d.ts +14 -1
  23. package/dist/builders/relations.d.ts.map +1 -1
  24. package/dist/builders/relations.js +38 -9
  25. package/dist/builders/relations.js.map +1 -1
  26. package/dist/builders/request-context.d.ts +2 -0
  27. package/dist/builders/request-context.d.ts.map +1 -1
  28. package/dist/builders/request-context.js +1 -0
  29. package/dist/builders/request-context.js.map +1 -1
  30. package/dist/contract.d.ts +1 -0
  31. package/dist/contract.d.ts.map +1 -1
  32. package/dist/contract.js +1 -0
  33. package/dist/contract.js.map +1 -1
  34. package/dist/http/off-site-headers.d.ts +8 -2
  35. package/dist/http/off-site-headers.d.ts.map +1 -1
  36. package/dist/http/off-site-headers.js +31 -9
  37. package/dist/http/off-site-headers.js.map +1 -1
  38. package/dist/http/record-commit.d.ts +24 -0
  39. package/dist/http/record-commit.d.ts.map +1 -0
  40. package/dist/http/record-commit.js +34 -0
  41. package/dist/http/record-commit.js.map +1 -0
  42. package/dist/http/record-edit.d.ts +27 -0
  43. package/dist/http/record-edit.d.ts.map +1 -1
  44. package/dist/http/record-edit.js +34 -4
  45. package/dist/http/record-edit.js.map +1 -1
  46. package/dist/index.d.ts +5 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +4 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/media/media-manifest.d.ts +3 -0
  51. package/dist/media/media-manifest.d.ts.map +1 -1
  52. package/dist/media/media-manifest.js +27 -10
  53. package/dist/media/media-manifest.js.map +1 -1
  54. package/dist/scenario.d.ts +14 -1
  55. package/dist/scenario.d.ts.map +1 -1
  56. package/dist/scenario.js +15 -0
  57. package/dist/scenario.js.map +1 -1
  58. package/package.json +1 -1
package/README.md CHANGED
@@ -237,6 +237,19 @@ A test that means to create such a record, say to cover an import, says so:
237
237
  await builders.content().onPage(pageId).ofType('text').withoutFormRules().create()
238
238
  ```
239
239
 
240
+ A test that checks the backend refuses a record, a content type kept out of a column for
241
+ example, saves it with `refusal()` instead of `create()`. It returns TYPO3's reasons, and
242
+ fails when the record was saved after all. Any other failure, such as a lost session,
243
+ passes through as an error, so it cannot pass as a refusal:
244
+
245
+ ```ts
246
+ const reasons = await builders.page().atParentId(1).refusal()
247
+ // in the test: expect(state.reasons).toContainEqual(expect.stringContaining('"title" is required.'))
248
+ ```
249
+
250
+ A record saved with `saveRecord()` fails with a `RecordRefusedError`, whose `reasons`
251
+ hold the same messages.
252
+
240
253
  <picture>
241
254
  <source media="(max-width: 700px)" srcset="https://raw.githubusercontent.com/plan2net/typo3-playwright-toolkit/main/diagrams/scenario-fan-out-narrow.svg">
242
255
  <img width="880" src="https://raw.githubusercontent.com/plan2net/typo3-playwright-toolkit/main/diagrams/scenario-fan-out.svg"
@@ -333,8 +346,10 @@ fails at the line that used it and lists the names that do, which is the reason
333
346
  prefer a name over a number: `42` cannot tell you it used to be a different image.
334
347
 
335
348
  The order you call them in is the order the records get. A child takes `pid` and
336
- `sys_language_uid` from the record above it, so a translation sets the language once,
337
- at the top.
349
+ `sys_language_uid` from the record above it. For a translation, see
350
+ [Translations](#translations).
351
+
352
+ On `update()`, the references you set replace what the column held.
338
353
 
339
354
  Never set `uid_local`, `uid_foreign`, `tablenames`, `fieldname` or `sorting_foreign`:
340
355
  the toolkit writes them, and your own value fails. A wrong `uid_foreign` saves a row
@@ -365,6 +380,90 @@ override getRelations(owner: RelationOwner): RelationOutput {
365
380
  }
366
381
  ```
367
382
 
383
+ ### Translations
384
+
385
+ `translate()` makes a translation the way an editor does in the backend: it sends
386
+ TYPO3's own translate command, so the translation is connected to the record it came
387
+ from, and TYPO3 copies its files and child records. Whatever you set on the builder
388
+ then fills the translation:
389
+
390
+ ```ts
391
+ export const test = defineScenario(async ({ builders }) => {
392
+ const products = await builders.page().withTitle('Products').withSlug('/products')
393
+ .withFileReference('media', 'hero.png')
394
+ .create()
395
+ const gallery = await builders.content().onPage(products.id).ofType('textmedia')
396
+ .configure((element) => element.withHeader('Gallery').withFiles(['hero.png', 'lawn.jpg']))
397
+ .create()
398
+
399
+ const german = await builders.page().translate(products.id, 1)
400
+ .withTitle('Produkte')
401
+ .withSlug('/produkte')
402
+ .create()
403
+ await builders.content().translate(gallery.id, 1, 'textmedia')
404
+ .configure((element) => element.withHeader('Galerie'))
405
+ .withCopiedFileReference('assets', 1, { alternative: 'Rasen' })
406
+ .withFileReference('assets', 'badge.svg')
407
+ .create()
408
+
409
+ return { slug: german.slug }
410
+ })
411
+
412
+ test('shows the German gallery', async ({ page, state }) => {
413
+ await page.goto(`/de${state.slug}`)
414
+
415
+ await expect(page.getByRole('heading', { name: 'Galerie' })).toBeVisible()
416
+ })
417
+ ```
418
+
419
+ The second argument is the language ID of the site. The page builder answers the
420
+ translation's `id` and `slug`; the slug has no language base, so the test puts the
421
+ `/de` in front itself.
422
+
423
+ - **A free copy:** `content().copyTo(id, language)` copies an element into a
424
+ language without connecting it, as the "copy" mode of the page module does. Pages
425
+ have no free mode in TYPO3, so there is no `page().copyTo()`.
426
+ - **Its content type:** name the type as the third argument to reach its setters
427
+ through `configure()`. Without it you have `withField()` and the file setters.
428
+ - **Copied files:** TYPO3 copies each file reference of the original.
429
+ `withCopiedFileReference(column, position, fields)` changes the copy at that
430
+ position, counted from 0. `withFileReference()` adds a reference after the copies;
431
+ the copies stay where they are.
432
+ - **What TYPO3 does by itself:** it hides a translation and puts
433
+ `[Translate to German:]` in front of its texts. The toolkit shows the translation
434
+ unless you set `hidden`; the prefix stays wherever you do not set a value of your
435
+ own.
436
+ - **What the backend refuses:** a field TCA keeps the same in every language
437
+ (`l10n_mode: exclude`, such as a page's `layout`) cannot be set on a translation,
438
+ and the save fails with TYPO3's reason. So does a record that already has a
439
+ translation in that language, a language the site does not have, and a table
440
+ without languages. `refusal()` works here as everywhere.
441
+
442
+ A file's metadata, its alternative text and title, can be translated too:
443
+
444
+ ```ts
445
+ await builders.fileMetadata('badge.svg').translate(1).withField('alternative', 'Abzeichen').create()
446
+ ```
447
+
448
+ Without `translate()`, `fileMetadata()` changes the default language. It takes the
449
+ name of a media fixture; for metadata every test shares, use `translations` in
450
+ `media.json` — see [Media fixtures](../playwright-toolkit/README.md#media-fixtures).
451
+ A file whose metadata `media.json` already translates cannot be translated again in
452
+ that language.
453
+
454
+ For a table without a builder, `translateRecord()` in the setup tools sends the same
455
+ command and answers the new `uid`; fill it with `saveRecord()`:
456
+
457
+ ```ts
458
+ export const test = defineScenario(async ({ translateRecord, saveRecord }) => {
459
+ const { uid } = await translateRecord({ table: 'tx_shop_product', uid: 7, language: 1, mode: 'localize' })
460
+ await saveRecord({ table: 'tx_shop_product', identifier: String(uid), target: uid,
461
+ data: { tx_shop_product: { [uid]: { title: 'Gartenschere', hidden: 0 } } } })
462
+ })
463
+ ```
464
+
465
+ Translations need the extension of the same release, 0.27.0 or newer.
466
+
368
467
  ### One request for several elements
369
468
 
370
469
  Every `create()` is a POST, and every POST boots the backend, builds the form and runs
@@ -403,6 +502,9 @@ await builders.batch(
403
502
  )
404
503
  ```
405
504
 
505
+ A translation cannot join a batch either: TYPO3 makes it with a command of its own,
506
+ so call `create()` on it.
507
+
406
508
  A content type whose children hang off a column of its own needs none of this:
407
509
  `withChildren` already writes them in the same request as their parent. Batching is
408
510
  for elements that sit side by side on a page.
@@ -415,6 +517,21 @@ Every request client carries the test ID for `testingURL`: the `request` that
415
517
  throwaway database the browser does. Requests to any other host get neither toolkit
416
518
  header.
417
519
 
520
+ ### Checking the backend
521
+
522
+ What editors see — the buttons of the rich text editor, the types a column offers, a
523
+ field a form leaves out — is checked on `backendPage`: a page logged into the backend on
524
+ the test's own database, opened only for a test that asks for it. `editRecord` opens a
525
+ record's edit form there and answers the frame it shows in:
526
+
527
+ ```ts
528
+ test('offers no underline in the editor', async ({ backendPage, state }) => {
529
+ const form = await editRecord(backendPage, 'tt_content', state.text)
530
+
531
+ await expect(form.getByRole('button', { name: 'Underline' })).toHaveCount(0)
532
+ })
533
+ ```
534
+
418
535
  ### Site settings for one test
419
536
 
420
537
  A scenario can give its site other settings than `settings.yaml` has, for its own
@@ -451,6 +568,24 @@ prepareContext: async (context) => {
451
568
  },
452
569
  ```
453
570
 
571
+ ### Changing a response in a test
572
+
573
+ The toolkit adds the test ID to every request, so the site uses the test's database.
574
+ A test that changes a page with `page.route()` gets its handler called before the
575
+ toolkit adds the ID. A plain `route.fetch()` in it then reaches the site's normal
576
+ database, where the test's pages do not exist, and you get the 404 page. Use
577
+ `fetchForTest` instead: it adds the test ID, but only for the site under test.
578
+
579
+ ```ts
580
+ test('works without the script', async ({ page, state, testId }) => {
581
+ await page.route(`**${state.slug}`, async (route) => {
582
+ const response = await fetchForTest(route, testId)
583
+ await route.fulfill({ response, body: (await response.text()).replace(/<script\b[\s\S]*?<\/script>/g, '') })
584
+ })
585
+ await page.goto(state.slug)
586
+ })
587
+ ```
588
+
454
589
  ### Reusing a scenario's setup
455
590
 
456
591
  A scenario's setup posts its content through the real backend, which is the slowest
@@ -866,6 +1001,16 @@ and that its hostname is set up as in step 1 of SETUP.md.
866
1001
  right after its caches were emptied, so TYPO3 builds them first. If your site needs
867
1002
  longer than that, set `PW_HEALTH_TIMEOUT_MS`, in milliseconds.
868
1003
 
1004
+ **"No route token for tce_db".** The extension is older than 0.27.0 and hands out no
1005
+ token for the translate command. Update it to the release of this package.
1006
+
1007
+ **"TYPO3 created no translation of …".** The record already has a translation in
1008
+ that language, or the site has no such language. Translate a record once per
1009
+ language, and check the language ID in the site configuration.
1010
+
1011
+ **"No media metadata at …".** `fileMetadata()` reads a file the extension writes
1012
+ from 0.27.0 on. Update it and run `ddev playwright-prepare`.
1013
+
869
1014
  **Settings seem to be ignored.** `defineToolkitConfig` ran too late. It must be the
870
1015
  first thing in `playwright.config.ts`.
871
1016
 
@@ -0,0 +1,8 @@
1
+ import type { Frame, Page } from '@playwright/test';
2
+ /**
3
+ * Opens the backend's edit form of one record on a page from the `backendPage`
4
+ * fixture, and answers the frame that holds it: the backend's content frame, or the
5
+ * page itself where a core shows the form without the frame.
6
+ */
7
+ export declare function editRecord(page: Page, table: string, uid: number | string): Promise<Frame>;
8
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAQnD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAkBhG"}
@@ -0,0 +1,27 @@
1
+ import { getToolkitConfig } from './config.js';
2
+ import { RECORD_EDIT_ROUTE } from './http/record-edit.js';
3
+ import { DEFAULT_BACKEND_PATH } from './http/test-api.js';
4
+ const CONTENT_FRAME = '#typo3-contentIframe';
5
+ const EDIT_FORM = 'form[name="editform"]';
6
+ /**
7
+ * Opens the backend's edit form of one record on a page from the `backendPage`
8
+ * fixture, and answers the frame that holds it: the backend's content frame, or the
9
+ * page itself where a core shows the form without the frame.
10
+ */
11
+ export async function editRecord(page, table, uid) {
12
+ const config = getToolkitConfig();
13
+ const backendPath = config.backendPath ?? DEFAULT_BACKEND_PATH;
14
+ await page.goto(`${config.testingURL}${backendPath}${RECORD_EDIT_ROUTE}?edit%5B${table}%5D%5B${uid}%5D=edit`);
15
+ const shown = page.locator(`${CONTENT_FRAME}, ${EDIT_FORM}`).first();
16
+ await shown.waitFor();
17
+ if ('IFRAME' !== (await shown.evaluate((element) => element.tagName))) {
18
+ return page.mainFrame();
19
+ }
20
+ const frame = await (await shown.elementHandle())?.contentFrame();
21
+ if (!frame) {
22
+ throw new Error(`[typo3-playwright-toolkit] The backend's content frame for ${table}:${uid} has no document.`);
23
+ }
24
+ await frame.locator(EDIT_FORM).waitFor();
25
+ return frame;
26
+ }
27
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,aAAa,GAAG,sBAAsB,CAAA;AAC5C,MAAM,SAAS,GAAG,uBAAuB,CAAA;AAEzC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAU,EAAE,KAAa,EAAE,GAAoB;IAC5E,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;IACjC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,oBAAoB,CAAA;IAC9D,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,WAAW,GAAG,iBAAiB,WAAW,KAAK,SAAS,GAAG,UAAU,CAAC,CAAA;IAE7G,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,KAAK,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IACpE,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;IACrB,IAAI,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAA;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,8DAA8D,KAAK,IAAI,GAAG,mBAAmB,CAAC,CAAA;IAClH,CAAC;IACD,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;IAExC,OAAO,KAAK,CAAA;AAChB,CAAC"}
@@ -3,6 +3,7 @@ import { ContentBuilderInterface, type ContentFields } from '../types/content-bu
3
3
  import type { ContentTypeFor, ContentTypeKey } from './core-content.js';
4
4
  import { type RecordDataMap } from '../http/record-edit.js';
5
5
  import { type ChildRecord } from './relations.js';
6
+ import { type TranslationMode } from '../http/record-commit.js';
6
7
  import { type RequestContext } from './request-context.js';
7
8
  export declare class ContentBuilder {
8
9
  private page;
@@ -16,12 +17,28 @@ export declare class ContentBuilder {
16
17
  */
17
18
  ofType<K extends ContentTypeKey>(type: K): TypedContentBuilder<ContentTypeFor<K>>;
18
19
  ofType(type: string): TypedContentBuilder<ContentBuilderInterface>;
20
+ /**
21
+ * Makes create() translate the element the way the backend does, connected to
22
+ * it. Name its type to reach that type's setters through configure().
23
+ */
24
+ translate<K extends ContentTypeKey>(contentId: number | string, language: number, type: K): TypedContentBuilder<ContentTypeFor<K>>;
25
+ translate(contentId: number | string, language: number, type?: string): TypedContentBuilder<ContentBuilderInterface>;
26
+ /** Like translate(), as a free copy: connected to nothing, so it follows no change of the origin. */
27
+ copyTo<K extends ContentTypeKey>(contentId: number | string, language: number, type: K): TypedContentBuilder<ContentTypeFor<K>>;
28
+ copyTo(contentId: number | string, language: number, type?: string): TypedContentBuilder<ContentBuilderInterface>;
29
+ private translation;
30
+ }
31
+ interface ContentTranslation {
32
+ origin: number;
33
+ language: number;
34
+ mode: TranslationMode;
19
35
  }
20
36
  /** What `batch()` needs of a queued element, whatever CType it builds. */
21
37
  export interface QueuedContent {
22
38
  readonly identifier: string;
23
39
  readonly targetPageId: string;
24
40
  readonly skipsFormRules: boolean;
41
+ readonly translates?: boolean;
25
42
  prepared(context: RequestContext, positionPid: string): {
26
43
  row: Record<string, unknown>;
27
44
  records: RecordDataMap;
@@ -31,14 +48,17 @@ declare class TypedContentBuilder<B extends ContentBuilderInterface = ContentBui
31
48
  private page;
32
49
  private pageId;
33
50
  private requestContext?;
51
+ private readonly translation?;
34
52
  readonly identifier: string;
35
53
  private builder;
36
54
  private optedOutOfFormRules;
37
55
  private readonly fields;
56
+ private readonly copiedEdits;
38
57
  private readonly relations;
39
- constructor(page: Page, pageId: string, type: string, requestContext?: Partial<RequestContext> | undefined);
58
+ constructor(page: Page, pageId: string, type: string | undefined, requestContext?: Partial<RequestContext> | undefined, translation?: ContentTranslation | undefined);
40
59
  get targetPageId(): string;
41
60
  get skipsFormRules(): boolean;
61
+ get translates(): boolean;
42
62
  configure(fn: (builder: B) => void): this;
43
63
  withField(column: string, value: ContentFields[string]): this;
44
64
  withoutFormRules(): this;
@@ -46,13 +66,18 @@ declare class TypedContentBuilder<B extends ContentBuilderInterface = ContentBui
46
66
  withFileReferences(column: string, files: (string | number)[], fields?: ContentFields): this;
47
67
  withChild(column: string, table: string, configure: (child: ChildRecord) => void): this;
48
68
  withChildren<T>(column: string, table: string, items: T[], configure: (child: ChildRecord, item: T) => void): this;
69
+ /** On a translation: changes the reference it copied from that position (from 0) of the origin's column. */
70
+ withCopiedFileReference(column: string, position: number, fields: ContentFields): this;
49
71
  create(): Promise<{
50
72
  id: string;
51
73
  }>;
74
+ /** Saves the element as create() does, for a test that expects the backend to refuse it: TYPO3's reasons. */
75
+ refusal(): Promise<string[]>;
52
76
  prepared(context: RequestContext, positionPid: string): {
53
77
  row: Record<string, unknown>;
54
78
  records: RecordDataMap;
55
79
  };
80
+ private createTranslation;
56
81
  }
57
82
  /**
58
83
  * One request for many elements, which saves a backend bootstrap each. Their own
@@ -1 +1 @@
1
- {"version":3,"file":"content-builder.d.ts","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-builder.d.ts","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { createContent } from './content-factory.js';
2
- import { saveRecord } from '../http/record-edit.js';
3
- import { mergeRecords, RelationSet } from './relations.js';
4
- import { toColumnValues } from './fields.js';
2
+ import { refusalOf, saveRecord } from '../http/record-edit.js';
3
+ import { keepCopies, mergeRecords, RelationSet } from './relations.js';
4
+ import { ownValues, toColumnValues } from './fields.js';
5
+ import { translateRecord } from '../http/record-commit.js';
6
+ import { TRANSLATION_DEFAULTS } from './page-builder.js';
5
7
  import { replayParentId, resolveRequestContext } from './request-context.js';
6
8
  import { newRecordIdentifier } from './identifier.js';
7
9
  const lastElementOnPage = new WeakMap();
@@ -24,21 +26,38 @@ export class ContentBuilder {
24
26
  }
25
27
  return new TypedContentBuilder(this.page, this.pageId, type, this.requestContext);
26
28
  }
29
+ translate(contentId, language, type) {
30
+ return this.translation(contentId, language, 'localize', type);
31
+ }
32
+ copyTo(contentId, language, type) {
33
+ return this.translation(contentId, language, 'copyToLanguage', type);
34
+ }
35
+ translation(contentId, language, mode, type) {
36
+ return new TypedContentBuilder(this.page, this.pageId, type, this.requestContext, {
37
+ origin: Number(contentId),
38
+ language,
39
+ mode,
40
+ });
41
+ }
27
42
  }
43
+ const UNTYPED = { type: '', getFields: () => ({}) };
28
44
  class TypedContentBuilder {
29
45
  page;
30
46
  pageId;
31
47
  requestContext;
48
+ translation;
32
49
  identifier = newRecordIdentifier();
33
50
  builder;
34
51
  optedOutOfFormRules = false;
35
52
  fields = {};
53
+ copiedEdits = [];
36
54
  relations = new RelationSet('tt_content', (column) => column in this.fields);
37
- constructor(page, pageId, type, requestContext) {
55
+ constructor(page, pageId, type, requestContext, translation) {
38
56
  this.page = page;
39
57
  this.pageId = pageId;
40
58
  this.requestContext = requestContext;
41
- this.builder = createContent(type);
59
+ this.translation = translation;
60
+ this.builder = undefined === type ? UNTYPED : createContent(type);
42
61
  }
43
62
  get targetPageId() {
44
63
  return this.pageId;
@@ -46,6 +65,9 @@ class TypedContentBuilder {
46
65
  get skipsFormRules() {
47
66
  return this.optedOutOfFormRules;
48
67
  }
68
+ get translates() {
69
+ return undefined !== this.translation;
70
+ }
49
71
  configure(fn) {
50
72
  fn(this.builder);
51
73
  return this;
@@ -74,7 +96,15 @@ class TypedContentBuilder {
74
96
  this.relations.withChildren(column, table, items, configure);
75
97
  return this;
76
98
  }
99
+ /** On a translation: changes the reference it copied from that position (from 0) of the origin's column. */
100
+ withCopiedFileReference(column, position, fields) {
101
+ this.copiedEdits.push({ column, position, fields });
102
+ return this;
103
+ }
77
104
  async create() {
105
+ if (undefined !== this.translation) {
106
+ return this.createTranslation(this.translation);
107
+ }
78
108
  const context = resolveRequestContext(this.page, this.requestContext);
79
109
  const pageId = replayParentId(context, this.pageId);
80
110
  const { row, records } = this.prepared(context, insertPosition(this.page, pageId));
@@ -90,6 +120,10 @@ class TypedContentBuilder {
90
120
  lastElementOnPage.get(this.page)?.set(pageId, saved.uid);
91
121
  return { id: String(saved.uid) };
92
122
  }
123
+ /** Saves the element as create() does, for a test that expects the backend to refuse it: TYPO3's reasons. */
124
+ refusal() {
125
+ return refusalOf(() => this.create());
126
+ }
93
127
  prepared(context, positionPid) {
94
128
  const pageId = replayParentId(context, this.pageId);
95
129
  const fields = this.builder.getFields();
@@ -118,6 +152,40 @@ class TypedContentBuilder {
118
152
  mergeRecords(records, outer.records);
119
153
  return { row, records };
120
154
  }
155
+ async createTranslation(translation) {
156
+ const context = resolveRequestContext(this.page, this.requestContext);
157
+ const translated = await translateRecord(this.page.request, context, {
158
+ table: 'tt_content',
159
+ uid: translation.origin,
160
+ language: translation.language,
161
+ mode: translation.mode,
162
+ });
163
+ const id = String(translated.uid);
164
+ const owner = { pid: translated.pid, sys_language_uid: translation.language };
165
+ const inner = this.builder.getRelations?.(owner) ?? { columns: {}, records: {} };
166
+ const outer = this.relations.materialise(owner);
167
+ refuseSharedColumns(inner.columns, outer.columns);
168
+ const added = {};
169
+ mergeRecords(added, inner.records);
170
+ mergeRecords(added, outer.records);
171
+ const { columns, records } = keepCopies({ columns: { ...inner.columns, ...outer.columns }, records: added }, translated, this.copiedEdits);
172
+ const own = Object.fromEntries(Object.entries(this.builder.getFields()).filter(([column]) => 'CType' !== column));
173
+ const row = {
174
+ ...toColumnValues({ ...TRANSLATION_DEFAULTS, ...own, ...this.fields }),
175
+ ...columns,
176
+ };
177
+ const state = 'localize' === translation.mode ? { l10n_state: ownValues(Object.keys(row)) } : {};
178
+ const data = { tt_content: { [id]: { ...row, ...state } } };
179
+ mergeRecords(data, records);
180
+ await saveRecord(this.page.request, context, {
181
+ table: 'tt_content',
182
+ identifier: id,
183
+ target: translated.uid,
184
+ data,
185
+ withoutFormRules: this.optedOutOfFormRules,
186
+ });
187
+ return { id };
188
+ }
121
189
  }
122
190
  /**
123
191
  * One request for many elements, which saves a backend bootstrap each. Their own
@@ -129,6 +197,10 @@ export async function saveBatch(page, requestContext, queued) {
129
197
  if (0 === queued.length) {
130
198
  throw new Error('[typo3-playwright-toolkit] batch() was given nothing to build.');
131
199
  }
200
+ if (queued.some((element) => element.translates)) {
201
+ throw new Error('[typo3-playwright-toolkit] A translation cannot join a batch: the backend makes it with a ' +
202
+ 'command of its own. Call create() on it instead.');
203
+ }
132
204
  const context = resolveRequestContext(page, requestContext);
133
205
  refuseASecondPage(queued);
134
206
  const pageId = replayParentId(context, queued[0].targetPageId);
@@ -1 +1 @@
1
- {"version":3,"file":"content-builder.js","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-builder.js","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,11 @@ export type FlexFormValues = Record<string, string | number | boolean>;
24
24
  */
25
25
  export declare function flexForm(values: FlexFormValues): NestedFields;
26
26
  export declare function flexForm(sheets: Record<string, FlexFormValues>): NestedFields;
27
+ /**
28
+ * The `l10n_state` a backend form posts when an editor gives a connected translation
29
+ * its own value; core ignores the columns that never follow the origin.
30
+ */
31
+ export declare function ownValues(columns: string[]): Record<string, 'custom'>;
27
32
  /**
28
33
  * A boolean is a 0/1 int column. An undefined field is left out rather than sent
29
34
  * as null, which DataHandler would write.
@@ -1 +1 @@
1
- {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/builders/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAID,MAAM,WAAW,WAAW;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CAC/B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAE3D;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAYxE;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;AAEtE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAAA;AAC9D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,YAAY,CAAA;AAoB9E;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAevF"}
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/builders/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAID,MAAM,WAAW,WAAW;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CAC/B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAE3D;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAYxE;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;AAEtE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CAAA;AAC9D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,YAAY,CAAA;AAoB9E;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAErE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAevF"}
@@ -32,6 +32,13 @@ export function flexForm(input) {
32
32
  }
33
33
  return { data };
34
34
  }
35
+ /**
36
+ * The `l10n_state` a backend form posts when an editor gives a connected translation
37
+ * its own value; core ignores the columns that never follow the origin.
38
+ */
39
+ export function ownValues(columns) {
40
+ return Object.fromEntries(columns.map((column) => [column, 'custom']));
41
+ }
35
42
  /**
36
43
  * A boolean is a 0/1 int column. An undefined field is left out rather than sent
37
44
  * as null, which DataHandler would write.
@@ -1 +1 @@
1
- {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/builders/fields.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;AAQtE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,UAAuB,EAAE;IAC/C,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,QAAqC;IAC5D,MAAM,KAAK,GAA4B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG;YACV,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;YACrC,aAAa,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;YACrC,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;SACnC,CAAA;IACL,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC;AAUD,MAAM,UAAU,QAAQ,CACpB,KAAsD;IAEtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,OAAO,KAAK,CAAC;QAC3E,CAAC,CAAE,KAAwC;QAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,KAAuB,EAAE,CAAA;IAEvC,MAAM,IAAI,GAAiB,EAAE,CAAA;IAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAiB,EAAE,CAAA;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAClC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC1D,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,SAAQ;QACZ,CAAC;QACD,IAAI,SAAS,KAAK,OAAO,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,SAAQ;QACZ,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;IAC1B,CAAC;IAED,OAAO,MAAM,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/builders/fields.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;AAQtE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,UAAuB,EAAE;IAC/C,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,QAAqC;IAC5D,MAAM,KAAK,GAA4B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG;YACV,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;YACrC,aAAa,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;YACrC,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;SACnC,CAAA;IACL,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC;AAUD,MAAM,UAAU,QAAQ,CACpB,KAAsD;IAEtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,OAAO,KAAK,CAAC;QAC3E,CAAC,CAAE,KAAwC;QAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,KAAuB,EAAE,CAAA;IAEvC,MAAM,IAAI,GAAiB,EAAE,CAAA;IAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAiB,EAAE,CAAA;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAClC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAiB;IACvC,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC1D,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,SAAQ;QACZ,CAAC;QACD,IAAI,SAAS,KAAK,OAAO,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,SAAQ;QACZ,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;IAC1B,CAAC;IAED,OAAO,MAAM,CAAA;AACjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Page } from '@playwright/test';
2
+ import type { ContentFields } from '../types/content-builder.js';
3
+ import { type RequestContext } from './request-context.js';
4
+ export declare class FileMetadataBuilder {
5
+ private readonly page;
6
+ private readonly name;
7
+ private readonly requestContext?;
8
+ private language?;
9
+ private readonly fields;
10
+ constructor(page: Page, name: string, requestContext?: Partial<RequestContext> | undefined);
11
+ withField(column: string, value: ContentFields[string]): this;
12
+ /** Makes create() translate the metadata the way the backend does, then fill the translation. */
13
+ translate(language: number): this;
14
+ create(): Promise<{
15
+ id: string;
16
+ }>;
17
+ }
18
+ //# sourceMappingURL=file-metadata-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-metadata-builder.d.ts","sourceRoot":"","sources":["../../src/builders/file-metadata-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAKvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEjF,qBAAa,mBAAmB;IAKxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IANpC,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAGtB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,YAAA;IAU7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAM7D,iGAAiG;IACjG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM3B,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAyB1C"}
@@ -0,0 +1,54 @@
1
+ import { getToolkitConfig } from '../config.js';
2
+ import { translateRecord } from '../http/record-commit.js';
3
+ import { saveRecord } from '../http/record-edit.js';
4
+ import { resolveMetadataUid } from '../media/media-manifest.js';
5
+ import { toColumnValues } from './fields.js';
6
+ import { resolveRequestContext } from './request-context.js';
7
+ export class FileMetadataBuilder {
8
+ page;
9
+ name;
10
+ requestContext;
11
+ language;
12
+ fields = {};
13
+ constructor(page, name, requestContext) {
14
+ this.page = page;
15
+ this.name = name;
16
+ this.requestContext = requestContext;
17
+ if ('string' !== typeof name) {
18
+ throw new Error(`[typo3-playwright-toolkit] fileMetadata() takes the name of a media fixture, not ${String(name)}: ` +
19
+ 'a file uid does not say which metadata record belongs to it.');
20
+ }
21
+ }
22
+ withField(column, value) {
23
+ this.fields[column] = value;
24
+ return this;
25
+ }
26
+ /** Makes create() translate the metadata the way the backend does, then fill the translation. */
27
+ translate(language) {
28
+ this.language = language;
29
+ return this;
30
+ }
31
+ async create() {
32
+ const context = resolveRequestContext(this.page, this.requestContext);
33
+ let uid = resolveMetadataUid(getToolkitConfig(), this.name);
34
+ if (undefined !== this.language) {
35
+ uid = (await translateRecord(this.page.request, context, {
36
+ table: 'sys_file_metadata',
37
+ uid,
38
+ language: this.language,
39
+ mode: 'localize',
40
+ })).uid;
41
+ }
42
+ const row = toColumnValues(this.fields);
43
+ if (Object.keys(row).length > 0) {
44
+ await saveRecord(this.page.request, context, {
45
+ table: 'sys_file_metadata',
46
+ identifier: String(uid),
47
+ target: uid,
48
+ data: { sys_file_metadata: { [String(uid)]: row } },
49
+ });
50
+ }
51
+ return { id: String(uid) };
52
+ }
53
+ }
54
+ //# sourceMappingURL=file-metadata-builder.js.map