@plan2net/typo3-playwright-toolkit 0.5.0 → 0.7.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.
- package/README.md +109 -13
- package/dist/builders/content-builder.d.ts +9 -1
- package/dist/builders/content-builder.d.ts.map +1 -1
- package/dist/builders/content-builder.js +66 -9
- package/dist/builders/content-builder.js.map +1 -1
- package/dist/builders/core-content.d.ts +46 -13
- package/dist/builders/core-content.d.ts.map +1 -1
- package/dist/builders/core-content.js +47 -50
- package/dist/builders/core-content.js.map +1 -1
- package/dist/builders/fields.d.ts +16 -1
- package/dist/builders/fields.d.ts.map +1 -1
- package/dist/builders/fields.js +19 -5
- package/dist/builders/fields.js.map +1 -1
- package/dist/builders/identifier.d.ts.map +1 -1
- package/dist/builders/identifier.js +1 -4
- package/dist/builders/identifier.js.map +1 -1
- package/dist/builders/page-builder.d.ts +12 -0
- package/dist/builders/page-builder.d.ts.map +1 -1
- package/dist/builders/page-builder.js +22 -9
- package/dist/builders/page-builder.js.map +1 -1
- package/dist/builders/relations.d.ts +41 -0
- package/dist/builders/relations.d.ts.map +1 -0
- package/dist/builders/relations.js +130 -0
- package/dist/builders/relations.js.map +1 -0
- package/dist/checks/screenshot.d.ts +1 -0
- package/dist/checks/screenshot.d.ts.map +1 -1
- package/dist/checks/screenshot.js +6 -4
- package/dist/checks/screenshot.js.map +1 -1
- package/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -1
- package/dist/http/record-edit.d.ts +7 -2
- package/dist/http/record-edit.d.ts.map +1 -1
- package/dist/http/record-edit.js +24 -7
- package/dist/http/record-edit.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scenario.d.ts +3 -3
- package/dist/scenario.d.ts.map +1 -1
- package/dist/scenario.js.map +1 -1
- package/dist/types/content-builder.d.ts +3 -0
- package/dist/types/content-builder.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,12 @@ It needs the [Composer extension](https://github.com/plan2net/typo3-playwright-t
|
|
|
18
18
|
databases, and the [DDEV add-on](https://github.com/plan2net/typo3-playwright-toolkit/tree/main/packages/ddev-typo3-playwright-toolkit), which provides
|
|
19
19
|
the database service and the commands.
|
|
20
20
|
|
|
21
|
+
> [!IMPORTANT]
|
|
22
|
+
> Setting this up for the first time? Follow
|
|
23
|
+
> **[SETUP.md](https://github.com/plan2net/typo3-playwright-toolkit/blob/main/SETUP.md)**
|
|
24
|
+
> instead. It covers all three packages in order. This README documents the npm
|
|
25
|
+
> package on its own.
|
|
26
|
+
|
|
21
27
|
[Requirements](#requirements) · [Install](#install) · [Configure](#configure) ·
|
|
22
28
|
[Using the package](#using-the-package) · [Reference](#reference) ·
|
|
23
29
|
[Troubleshooting](#troubleshooting) · [Related packages](#related-packages)
|
|
@@ -47,9 +53,10 @@ Add a `tsconfig.json` next to your tests that extends the one shipped here:
|
|
|
47
53
|
}
|
|
48
54
|
```
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
> [!IMPORTANT]
|
|
57
|
+
> This package is ESM and needs `"moduleResolution": "NodeNext"`. Without it
|
|
58
|
+
> TypeScript cannot read the package's exports, so `page` and `state` in your tests
|
|
59
|
+
> type as `any` and you lose every check your editor could give you.
|
|
53
60
|
|
|
54
61
|
## Configure
|
|
55
62
|
|
|
@@ -82,8 +89,9 @@ directory is not an error: the run works and writes its state somewhere you did
|
|
|
82
89
|
expect. Use `fileURLToPath` rather than `new URL(...).pathname`, which
|
|
83
90
|
percent-encodes a project path containing spaces or non-ASCII characters.
|
|
84
91
|
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
> [!IMPORTANT]
|
|
93
|
+
> `defineToolkitConfig` must run before the first import from this package.
|
|
94
|
+
> Everything else reads the values it stores.
|
|
87
95
|
|
|
88
96
|
## Using the package
|
|
89
97
|
|
|
@@ -134,6 +142,10 @@ test('renders the page title', async ({ page, state }) => {
|
|
|
134
142
|
setup, and the other tests wait. If the setup fails, the tests are skipped with the
|
|
135
143
|
reason instead of failing because content is missing.
|
|
136
144
|
|
|
145
|
+
The `slug` you get back is the one the site stored, which is not always the one you
|
|
146
|
+
asked for — a translation and a name already in use are two cases, and an extension
|
|
147
|
+
can add more. Navigate with the returned value, never with the string you passed in.
|
|
148
|
+
|
|
137
149
|
The setup runs once per file, even when the file runs in several browser projects.
|
|
138
150
|
The other projects use the state and the test database that the first one created.
|
|
139
151
|
|
|
@@ -209,6 +221,50 @@ A key with the name of a core CType replaces the built-in builder, and the other
|
|
|
209
221
|
core types stay as they are. That works for the type too: `ContentTypeMap` starts
|
|
210
222
|
empty, so your `text: MyTextContent` is what `.configure()` hands you.
|
|
211
223
|
|
|
224
|
+
### Files and child records
|
|
225
|
+
|
|
226
|
+
Four setters attach a relation, and they work the same on a content type, on a
|
|
227
|
+
child record, and on the builder in a test:
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
export class AccordionContent extends CoreContent {
|
|
231
|
+
readonly type = 'accordion'
|
|
232
|
+
|
|
233
|
+
withItems(items: AccordionItem[]): this {
|
|
234
|
+
return this.withChildren('items', 'tx_myext_accordion_item', items, (item, data) =>
|
|
235
|
+
item
|
|
236
|
+
.withField('title', data.title)
|
|
237
|
+
.withFileReference('image', data.imageId),
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`withFileReference(column, fileUid)` and `withFileReferences(column, fileUids)` take
|
|
244
|
+
the reference's own fields as a third argument, such as a `crop`. `withChild` and
|
|
245
|
+
`withChildren` hand the callback a record with the same four setters, so a child can
|
|
246
|
+
carry its own files and children.
|
|
247
|
+
|
|
248
|
+
The order you call them in is the order the records get. A child takes `pid` and
|
|
249
|
+
`sys_language_uid` from the record above it, so a translation sets the language once,
|
|
250
|
+
at the top.
|
|
251
|
+
|
|
252
|
+
Never set `uid_local`, `uid_foreign`, `tablenames`, `fieldname` or `sorting_foreign`:
|
|
253
|
+
the toolkit writes them, and your own value fails. A wrong `uid_foreign` saves a row
|
|
254
|
+
that points at nothing, and TYPO3 reports no error.
|
|
255
|
+
|
|
256
|
+
If a builder has no setter for a column, add the relation in the test:
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
await builders.content().onPage(page.id).ofType('textmedia')
|
|
260
|
+
.configure((element) => element.withHeader('Gallery', 'h2'))
|
|
261
|
+
.withFileReferences('assets', [1, 2], { crop: imageCrop({ ratio: '16:9' }) })
|
|
262
|
+
.create()
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Fill a column from one place only. Both the content type and the test, or `withField`
|
|
266
|
+
on top, fails.
|
|
267
|
+
|
|
212
268
|
### Calling the site directly
|
|
213
269
|
|
|
214
270
|
The `request` client — the one `defineScenario` hands your setup, and the `request`
|
|
@@ -243,7 +299,22 @@ await expectScreenshot(page, 'accordion', { include: '.accordion' }) // one elem
|
|
|
243
299
|
|
|
244
300
|
The name carries no file extension; Playwright adds `.png` and the platform suffix
|
|
245
301
|
itself. The first run writes the missing image and fails, as Playwright always does.
|
|
246
|
-
Every other option is passed on to `toHaveScreenshot
|
|
302
|
+
Every other option is passed on to `toHaveScreenshot`, and the tolerances come from
|
|
303
|
+
`screenshot` in `defineToolkitConfig`.
|
|
304
|
+
|
|
305
|
+
> [!IMPORTANT]
|
|
306
|
+
> Images are stored in CSS pixels, which is Playwright's default. If your projects
|
|
307
|
+
> set a `deviceScaleFactor`, a bug that only shows at 2x cannot fail a test, and
|
|
308
|
+
> images taken with `element.screenshot()` will not match. Ask for device pixels per
|
|
309
|
+
> shot, or for the whole project:
|
|
310
|
+
>
|
|
311
|
+
> ```ts
|
|
312
|
+
> await expectScreenshot(page, 'hero', { scale: 'device' })
|
|
313
|
+
>
|
|
314
|
+
> defineBasePlaywrightConfig(toolkit, {
|
|
315
|
+
> expect: { toHaveScreenshot: { scale: 'device' } },
|
|
316
|
+
> })
|
|
317
|
+
> ```
|
|
247
318
|
|
|
248
319
|
`expectScreenshot` waits for animations itself. When you interact and then assert
|
|
249
320
|
without a screenshot — an accessibility scan after opening an accordion, say — wait
|
|
@@ -271,8 +342,9 @@ await runAccessibilityScan(page, { exclude: '#ads' })
|
|
|
271
342
|
await runAccessibilityScan(page, { disabledRules: ['color-contrast'] })
|
|
272
343
|
```
|
|
273
344
|
|
|
274
|
-
|
|
275
|
-
|
|
345
|
+
> [!IMPORTANT]
|
|
346
|
+
> The test also fails when the check ran no rules at all. An empty area would
|
|
347
|
+
> otherwise pass without testing anything.
|
|
276
348
|
|
|
277
349
|
A check with `include` turns off the `heading-order` rule, because axe compares the
|
|
278
350
|
headings of a part of the page with the structure of the whole page. Checks of a
|
|
@@ -307,8 +379,9 @@ await page.goto('/')
|
|
|
307
379
|
await verifier.assertNoViolations(testInfo) // testInfo is optional
|
|
308
380
|
```
|
|
309
381
|
|
|
310
|
-
|
|
311
|
-
|
|
382
|
+
> [!IMPORTANT]
|
|
383
|
+
> `install()` must run before anything is loaded. A page that is already open
|
|
384
|
+
> reports nothing.
|
|
312
385
|
|
|
313
386
|
The test also fails if pages were requested but none of your own pages ever arrived,
|
|
314
387
|
so a navigation that never loaded cannot pass. Pass `testInfo` to attach the full
|
|
@@ -368,9 +441,32 @@ Every CType of a normal TYPO3 installation has a builder, and you register nothi
|
|
|
368
441
|
|
|
369
442
|
All builders share `withHeader`, `withSubheader`, `withHeaderLayout`,
|
|
370
443
|
`withHeaderLink`, `withColPos`, `setHidden`, and `withField(column, value)` for any
|
|
371
|
-
other TCA column.
|
|
372
|
-
`
|
|
373
|
-
`
|
|
444
|
+
other TCA column. They also share the four relation setters above —
|
|
445
|
+
`withFileReference`, `withFileReferences`, `withChild` and `withChildren`. Types with
|
|
446
|
+
images add `withFile` and `withFiles` for their own media column, plus `withColumns`,
|
|
447
|
+
`withOrientation` and `withImageSize`.
|
|
448
|
+
|
|
449
|
+
Where core stores a number that means nothing on its own, the setter takes the name
|
|
450
|
+
and your editor suggests the options:
|
|
451
|
+
|
|
452
|
+
```ts
|
|
453
|
+
element.withHeader('Chapter', 'h3') // header_layout 3, or 'hidden' for 100
|
|
454
|
+
element.withBulletsType('numbers') // bullets_type 1
|
|
455
|
+
element.withHeaderPosition('top') // table_header_position 1
|
|
456
|
+
element.withOrientation('in-text-right') // imageorient 17
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
`PageBuilder` does the same for the page type: `withDoktype('folder')` writes 254.
|
|
460
|
+
It also takes a number, for a doktype your own project registered.
|
|
461
|
+
|
|
462
|
+
The `crop` column of a file reference holds JSON text, which `imageCrop()` writes for
|
|
463
|
+
you. Without an area it keeps the whole image, which is what naming only a ratio
|
|
464
|
+
means:
|
|
465
|
+
|
|
466
|
+
```ts
|
|
467
|
+
imageCrop({ ratio: '16:9' })
|
|
468
|
+
imageCrop({ area: { x: 0.1, y: 0, width: 0.5, height: 1 } })
|
|
469
|
+
```
|
|
374
470
|
|
|
375
471
|
A flexform column takes `flexForm()`, because the form posts one field per value
|
|
376
472
|
rather than one for the column:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Page } from '@playwright/test';
|
|
2
|
-
import { ContentBuilderInterface } from '../types/content-builder.js';
|
|
2
|
+
import { ContentBuilderInterface, type ContentFields } from '../types/content-builder.js';
|
|
3
3
|
import type { ContentTypeFor, ContentTypeKey } from './core-content.js';
|
|
4
|
+
import { type ChildRecord } from './relations.js';
|
|
4
5
|
import { type RequestContext } from './request-context.js';
|
|
5
6
|
export declare class ContentBuilder {
|
|
6
7
|
private page;
|
|
@@ -20,8 +21,15 @@ declare class TypedContentBuilder<B extends ContentBuilderInterface = ContentBui
|
|
|
20
21
|
private pageId;
|
|
21
22
|
private requestContext?;
|
|
22
23
|
private builder;
|
|
24
|
+
private readonly fields;
|
|
25
|
+
private readonly relations;
|
|
23
26
|
constructor(page: Page, pageId: string, type: string, requestContext?: Partial<RequestContext> | undefined);
|
|
24
27
|
configure(fn: (builder: B) => void): this;
|
|
28
|
+
withField(column: string, value: ContentFields[string]): this;
|
|
29
|
+
withFileReference(column: string, fileUid: number, fields?: ContentFields): this;
|
|
30
|
+
withFileReferences(column: string, fileUids: number[], fields?: ContentFields): this;
|
|
31
|
+
withChild(column: string, table: string, configure: (child: ChildRecord) => void): this;
|
|
32
|
+
withChildren<T>(column: string, table: string, items: T[], configure: (child: ChildRecord, item: T) => void): this;
|
|
25
33
|
create(): Promise<{
|
|
26
34
|
id: string;
|
|
27
35
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-builder.d.ts","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"content-builder.d.ts","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,uBAAuB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEzF,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvE,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAKjG,qBAAa,cAAc;IACvB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;gBAE7C,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAKhE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B;;;OAGG;IACH,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAAC,uBAAuB,CAAC;CAWrE;AAED,cAAM,mBAAmB,CAAC,CAAC,SAAS,uBAAuB,GAAG,uBAAuB;IAM7E,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,cAAc,CAAC;IAR3B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;gBAGjF,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACJ,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,YAAA;IAKpD,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IAKzC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI;IAM7D,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,IAAI;IAMpF,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,aAAkB,GAAG,IAAI;IAMxF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAMvF,YAAY,CAAC,CAAC,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,GACjD,IAAI;IAMD,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAmD1C"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createContent } from './content-factory.js';
|
|
2
2
|
import { saveRecord } from '../http/record-edit.js';
|
|
3
|
-
import {
|
|
3
|
+
import { mergeRecords, RelationSet } from './relations.js';
|
|
4
|
+
import { toColumnValues } from './fields.js';
|
|
4
5
|
import { replayParentId, resolveRequestContext } from './request-context.js';
|
|
5
6
|
import { newRecordIdentifier } from './identifier.js';
|
|
7
|
+
const lastElementOnPage = new WeakMap();
|
|
6
8
|
export class ContentBuilder {
|
|
7
9
|
page;
|
|
8
10
|
pageId = '';
|
|
@@ -28,6 +30,8 @@ class TypedContentBuilder {
|
|
|
28
30
|
pageId;
|
|
29
31
|
requestContext;
|
|
30
32
|
builder;
|
|
33
|
+
fields = {};
|
|
34
|
+
relations = new RelationSet('tt_content', (column) => column in this.fields);
|
|
31
35
|
constructor(page, pageId, type, requestContext) {
|
|
32
36
|
this.page = page;
|
|
33
37
|
this.pageId = pageId;
|
|
@@ -38,6 +42,26 @@ class TypedContentBuilder {
|
|
|
38
42
|
fn(this.builder);
|
|
39
43
|
return this;
|
|
40
44
|
}
|
|
45
|
+
withField(column, value) {
|
|
46
|
+
this.fields[column] = value;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
withFileReference(column, fileUid, fields = {}) {
|
|
50
|
+
this.relations.withFileReference(column, fileUid, fields);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
withFileReferences(column, fileUids, fields = {}) {
|
|
54
|
+
this.relations.withFileReferences(column, fileUids, fields);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
withChild(column, table, configure) {
|
|
58
|
+
this.relations.withChild(column, table, configure);
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
withChildren(column, table, items, configure) {
|
|
62
|
+
this.relations.withChildren(column, table, items, configure);
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
41
65
|
async create() {
|
|
42
66
|
const context = resolveRequestContext(this.page, this.requestContext);
|
|
43
67
|
const identifier = newRecordIdentifier();
|
|
@@ -46,23 +70,56 @@ class TypedContentBuilder {
|
|
|
46
70
|
// CType and colPos are set below; an empty string means "the type did not
|
|
47
71
|
// set it".
|
|
48
72
|
const own = Object.fromEntries(Object.entries(fields).filter(([column, value]) => value !== '' && !['CType', 'colPos'].includes(column)));
|
|
73
|
+
const columnValues = toColumnValues({ ...own, ...this.fields });
|
|
74
|
+
// Not the record's own pid, which carries the -uid positioning the element.
|
|
75
|
+
const owner = {
|
|
76
|
+
pid: columnValues.pid ?? pageId,
|
|
77
|
+
sys_language_uid: columnValues.sys_language_uid ?? 0,
|
|
78
|
+
};
|
|
79
|
+
const inner = this.builder.getRelations?.(owner) ?? { columns: {}, records: {} };
|
|
80
|
+
const outer = this.relations.materialise(owner);
|
|
81
|
+
refuseSharedColumns(inner.columns, outer.columns);
|
|
49
82
|
const record = {
|
|
50
|
-
pid: pageId,
|
|
83
|
+
pid: insertPosition(this.page, pageId),
|
|
51
84
|
sys_language_uid: 0,
|
|
52
85
|
CType: fields.CType || this.builder.type,
|
|
53
86
|
colPos: fields.colPos ?? 0,
|
|
54
|
-
...
|
|
87
|
+
...columnValues,
|
|
88
|
+
...inner.columns,
|
|
89
|
+
...outer.columns,
|
|
55
90
|
};
|
|
56
|
-
|
|
91
|
+
// Merged per table, not spread: a child table may be tt_content itself.
|
|
92
|
+
const data = { tt_content: { [identifier]: record } };
|
|
93
|
+
mergeRecords(data, this.builder.getAdditionalRecords?.(identifier, pageId) ?? {});
|
|
94
|
+
mergeRecords(data, inner.records);
|
|
95
|
+
mergeRecords(data, outer.records);
|
|
96
|
+
const saved = await saveRecord(this.page.request, context, {
|
|
57
97
|
table: 'tt_content',
|
|
58
98
|
identifier: identifier,
|
|
59
99
|
target: Number(pageId),
|
|
60
|
-
data
|
|
61
|
-
tt_content: { [identifier]: record },
|
|
62
|
-
...(this.builder.getAdditionalRecords?.(identifier, pageId) ?? {}),
|
|
63
|
-
},
|
|
100
|
+
data,
|
|
64
101
|
});
|
|
65
|
-
|
|
102
|
+
lastElementOnPage.get(this.page)?.set(pageId, saved.uid);
|
|
103
|
+
return { id: String(saved.uid) };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function refuseSharedColumns(inner, outer) {
|
|
107
|
+
const shared = Object.keys(outer).filter((column) => column in inner);
|
|
108
|
+
if (shared.length > 0) {
|
|
109
|
+
throw new Error(`[typo3-playwright-toolkit] The column ${shared.join(' and ')} is filled twice — ` +
|
|
110
|
+
'once inside configure() and once on the builder. Nothing decides which of ' +
|
|
111
|
+
'the two comes first, so the records would end up in a random order. Put ' +
|
|
112
|
+
'them all in one place.');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Keyed by the page: `builders.content()` hands out a fresh builder per call. */
|
|
116
|
+
function insertPosition(page, pageId) {
|
|
117
|
+
let created = lastElementOnPage.get(page);
|
|
118
|
+
if (undefined === created) {
|
|
119
|
+
created = new Map();
|
|
120
|
+
lastElementOnPage.set(page, created);
|
|
66
121
|
}
|
|
122
|
+
const previous = created.get(pageId);
|
|
123
|
+
return undefined === previous ? pageId : `-${previous}`;
|
|
67
124
|
}
|
|
68
125
|
//# sourceMappingURL=content-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-builder.js","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"content-builder.js","sourceRoot":"","sources":["../../src/builders/content-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,45 @@
|
|
|
1
1
|
import type { ContentBuilderInterface, ContentFields } from '../types/content-builder.js';
|
|
2
|
-
import type
|
|
2
|
+
import { RelationSet, type ChildRecord, type RelationOutput, type RelationOwner } from './relations.js';
|
|
3
|
+
declare const HEADING_LEVELS: {
|
|
4
|
+
readonly h1: 1;
|
|
5
|
+
readonly h2: 2;
|
|
6
|
+
readonly h3: 3;
|
|
7
|
+
readonly h4: 4;
|
|
8
|
+
readonly h5: 5;
|
|
9
|
+
readonly hidden: 100;
|
|
10
|
+
};
|
|
11
|
+
declare const BULLET_TYPES: {
|
|
12
|
+
readonly bullets: 0;
|
|
13
|
+
readonly numbers: 1;
|
|
14
|
+
readonly definition: 2;
|
|
15
|
+
};
|
|
16
|
+
declare const TABLE_HEADER_POSITIONS: {
|
|
17
|
+
readonly none: 0;
|
|
18
|
+
readonly top: 1;
|
|
19
|
+
readonly left: 2;
|
|
20
|
+
readonly both: 3;
|
|
21
|
+
};
|
|
22
|
+
declare const IMAGE_ORIENTATIONS: {
|
|
23
|
+
readonly 'above-center': 0;
|
|
24
|
+
readonly 'above-right': 1;
|
|
25
|
+
readonly 'above-left': 2;
|
|
26
|
+
readonly 'below-center': 8;
|
|
27
|
+
readonly 'below-right': 9;
|
|
28
|
+
readonly 'below-left': 10;
|
|
29
|
+
readonly 'in-text-right': 17;
|
|
30
|
+
readonly 'in-text-left': 18;
|
|
31
|
+
readonly 'beside-text-right': 25;
|
|
32
|
+
readonly 'beside-text-left': 26;
|
|
33
|
+
};
|
|
34
|
+
export type HeadingLevel = keyof typeof HEADING_LEVELS;
|
|
35
|
+
export type BulletType = keyof typeof BULLET_TYPES;
|
|
36
|
+
export type TableHeaderPosition = keyof typeof TABLE_HEADER_POSITIONS;
|
|
37
|
+
export type ImageOrientation = keyof typeof IMAGE_ORIENTATIONS;
|
|
3
38
|
export declare abstract class CoreContent implements ContentBuilderInterface {
|
|
4
39
|
abstract readonly type: string;
|
|
5
40
|
protected fields: ContentFields;
|
|
6
|
-
|
|
41
|
+
protected readonly relations: RelationSet;
|
|
42
|
+
withHeader(header: string, level?: HeadingLevel): this;
|
|
7
43
|
withSubheader(subheader: string): this;
|
|
8
44
|
/** 0 is "hidden", 1–5 are h1–h5 in a stock fluid_styled_content install. */
|
|
9
45
|
withHeaderLayout(layout: number): this;
|
|
@@ -12,24 +48,23 @@ export declare abstract class CoreContent implements ContentBuilderInterface {
|
|
|
12
48
|
setHidden(hidden?: boolean): this;
|
|
13
49
|
/** Any column the typed setters do not cover, including your own. */
|
|
14
50
|
withField(column: string, value: ContentFields[string]): this;
|
|
51
|
+
withFileReference(column: string, fileUid: number, fields?: ContentFields): this;
|
|
52
|
+
withFileReferences(column: string, fileUids: number[], fields?: ContentFields): this;
|
|
53
|
+
withChild(column: string, table: string, configure: (child: ChildRecord) => void): this;
|
|
54
|
+
withChildren<T>(column: string, table: string, items: T[], configure: (child: ChildRecord, item: T) => void): this;
|
|
55
|
+
getRelations(owner: RelationOwner): RelationOutput;
|
|
15
56
|
getFields(): ContentFields;
|
|
16
57
|
protected set(column: string, value: ContentFields[string]): this;
|
|
17
58
|
}
|
|
18
59
|
declare abstract class MediaCoreContent extends CoreContent {
|
|
19
60
|
/** The tt_content column the references hang off — `assets`, `image`, `media`. */
|
|
20
61
|
protected abstract readonly mediaColumn: string;
|
|
21
|
-
private fileUids;
|
|
22
|
-
private identifiers;
|
|
23
62
|
withFile(fileUid: number): this;
|
|
24
63
|
withFiles(fileUids: number[]): this;
|
|
25
|
-
getFields(): ContentFields;
|
|
26
|
-
getAdditionalRecords(contentIdentifier: string, pageId: string): RecordDataMap;
|
|
27
|
-
private referenceIdentifiers;
|
|
28
64
|
}
|
|
29
65
|
declare abstract class GalleryCoreContent extends MediaCoreContent {
|
|
30
66
|
withColumns(imagecols: number): this;
|
|
31
|
-
|
|
32
|
-
withOrientation(imageorient: number): this;
|
|
67
|
+
withOrientation(orientation: ImageOrientation): this;
|
|
33
68
|
withImageSize(width?: number, height?: number): this;
|
|
34
69
|
}
|
|
35
70
|
export declare class HeaderContent extends CoreContent {
|
|
@@ -57,15 +92,13 @@ export declare class BulletsContent extends CoreContent {
|
|
|
57
92
|
readonly type = "bullets";
|
|
58
93
|
/** One bullet per line — the column is a plain newline-separated text field. */
|
|
59
94
|
withItems(items: string[]): this;
|
|
60
|
-
|
|
61
|
-
withBulletsType(bulletsType: number): this;
|
|
95
|
+
withBulletsType(type: BulletType): this;
|
|
62
96
|
}
|
|
63
97
|
export declare class TableContent extends CoreContent {
|
|
64
98
|
readonly type = "table";
|
|
65
99
|
withRows(rows: string[][]): this;
|
|
66
100
|
withCaption(caption: string): this;
|
|
67
|
-
|
|
68
|
-
withHeaderPosition(position: number): this;
|
|
101
|
+
withHeaderPosition(position: TableHeaderPosition): this;
|
|
69
102
|
private delimiter;
|
|
70
103
|
}
|
|
71
104
|
export declare class UploadsContent extends MediaCoreContent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-content.d.ts","sourceRoot":"","sources":["../../src/builders/core-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AACzF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"core-content.d.ts","sourceRoot":"","sources":["../../src/builders/core-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RelationSet, } from './relations.js';
|
|
2
|
+
const HEADING_LEVELS = { h1: 1, h2: 2, h3: 3, h4: 4, h5: 5, hidden: 100 };
|
|
3
|
+
const BULLET_TYPES = { bullets: 0, numbers: 1, definition: 2 };
|
|
4
|
+
const TABLE_HEADER_POSITIONS = { none: 0, top: 1, left: 2, both: 3 };
|
|
5
|
+
const IMAGE_ORIENTATIONS = {
|
|
6
|
+
'above-center': 0,
|
|
7
|
+
'above-right': 1,
|
|
8
|
+
'above-left': 2,
|
|
9
|
+
'below-center': 8,
|
|
10
|
+
'below-right': 9,
|
|
11
|
+
'below-left': 10,
|
|
12
|
+
'in-text-right': 17,
|
|
13
|
+
'in-text-left': 18,
|
|
14
|
+
'beside-text-right': 25,
|
|
15
|
+
'beside-text-left': 26,
|
|
16
|
+
};
|
|
2
17
|
export class CoreContent {
|
|
3
18
|
fields = {};
|
|
4
|
-
|
|
5
|
-
|
|
19
|
+
relations = new RelationSet('tt_content', (column) => column in this.fields);
|
|
20
|
+
withHeader(header, level) {
|
|
21
|
+
this.set('header', header);
|
|
22
|
+
return undefined === level ? this : this.withHeaderLayout(HEADING_LEVELS[level]);
|
|
6
23
|
}
|
|
7
24
|
withSubheader(subheader) {
|
|
8
25
|
return this.set('subheader', subheader);
|
|
@@ -24,66 +41,48 @@ export class CoreContent {
|
|
|
24
41
|
withField(column, value) {
|
|
25
42
|
return this.set(column, value);
|
|
26
43
|
}
|
|
44
|
+
withFileReference(column, fileUid, fields = {}) {
|
|
45
|
+
this.relations.withFileReference(column, fileUid, fields);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
withFileReferences(column, fileUids, fields = {}) {
|
|
49
|
+
this.relations.withFileReferences(column, fileUids, fields);
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
withChild(column, table, configure) {
|
|
53
|
+
this.relations.withChild(column, table, configure);
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
withChildren(column, table, items, configure) {
|
|
57
|
+
this.relations.withChildren(column, table, items, configure);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
getRelations(owner) {
|
|
61
|
+
return this.relations.materialise(owner);
|
|
62
|
+
}
|
|
27
63
|
getFields() {
|
|
28
64
|
return { CType: this.type, ...this.fields };
|
|
29
65
|
}
|
|
30
66
|
set(column, value) {
|
|
67
|
+
this.relations.refuseColumnHeld(column);
|
|
31
68
|
this.fields[column] = value;
|
|
32
69
|
return this;
|
|
33
70
|
}
|
|
34
71
|
}
|
|
35
72
|
class MediaCoreContent extends CoreContent {
|
|
36
|
-
fileUids = [];
|
|
37
|
-
identifiers = [];
|
|
38
73
|
withFile(fileUid) {
|
|
39
|
-
this.
|
|
40
|
-
return this;
|
|
74
|
+
return this.withFileReference(this.mediaColumn, fileUid);
|
|
41
75
|
}
|
|
42
76
|
withFiles(fileUids) {
|
|
43
|
-
this.
|
|
44
|
-
return this;
|
|
45
|
-
}
|
|
46
|
-
getFields() {
|
|
47
|
-
const fields = super.getFields();
|
|
48
|
-
if (this.fileUids.length > 0) {
|
|
49
|
-
fields[this.mediaColumn] = this.referenceIdentifiers().join(',');
|
|
50
|
-
}
|
|
51
|
-
return fields;
|
|
52
|
-
}
|
|
53
|
-
getAdditionalRecords(contentIdentifier, pageId) {
|
|
54
|
-
if (this.fileUids.length === 0) {
|
|
55
|
-
return {};
|
|
56
|
-
}
|
|
57
|
-
const identifiers = this.referenceIdentifiers();
|
|
58
|
-
const references = {};
|
|
59
|
-
this.fileUids.forEach((fileUid, index) => {
|
|
60
|
-
references[identifiers[index]] = {
|
|
61
|
-
uid_local: fileUid,
|
|
62
|
-
pid: pageId,
|
|
63
|
-
tablenames: 'tt_content',
|
|
64
|
-
fieldname: this.mediaColumn,
|
|
65
|
-
sys_language_uid: 0,
|
|
66
|
-
sorting_foreign: index + 1,
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
return { sys_file_reference: references };
|
|
70
|
-
}
|
|
71
|
-
// Minted once: getFields() lists them in the parent column and
|
|
72
|
-
// getAdditionalRecords() keys the children by them, and the two must agree.
|
|
73
|
-
referenceIdentifiers() {
|
|
74
|
-
while (this.identifiers.length < this.fileUids.length) {
|
|
75
|
-
this.identifiers.push(newRecordIdentifier());
|
|
76
|
-
}
|
|
77
|
-
return this.identifiers;
|
|
77
|
+
return this.withFileReferences(this.mediaColumn, fileUids);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
class GalleryCoreContent extends MediaCoreContent {
|
|
81
81
|
withColumns(imagecols) {
|
|
82
82
|
return this.set('imagecols', imagecols);
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return this.set('imageorient', imageorient);
|
|
84
|
+
withOrientation(orientation) {
|
|
85
|
+
return this.set('imageorient', IMAGE_ORIENTATIONS[orientation]);
|
|
87
86
|
}
|
|
88
87
|
withImageSize(width, height) {
|
|
89
88
|
if (undefined !== width) {
|
|
@@ -128,9 +127,8 @@ export class BulletsContent extends CoreContent {
|
|
|
128
127
|
withItems(items) {
|
|
129
128
|
return this.set('bodytext', items.join('\n'));
|
|
130
129
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return this.set('bullets_type', bulletsType);
|
|
130
|
+
withBulletsType(type) {
|
|
131
|
+
return this.set('bullets_type', BULLET_TYPES[type]);
|
|
134
132
|
}
|
|
135
133
|
}
|
|
136
134
|
export class TableContent extends CoreContent {
|
|
@@ -142,9 +140,8 @@ export class TableContent extends CoreContent {
|
|
|
142
140
|
withCaption(caption) {
|
|
143
141
|
return this.set('table_caption', caption);
|
|
144
142
|
}
|
|
145
|
-
/** 1 puts the first row in a thead; 0 none, 2 first column, 3 both. */
|
|
146
143
|
withHeaderPosition(position) {
|
|
147
|
-
return this.set('table_header_position', position);
|
|
144
|
+
return this.set('table_header_position', TABLE_HEADER_POSITIONS[position]);
|
|
148
145
|
}
|
|
149
146
|
delimiter() {
|
|
150
147
|
const configured = this.fields.table_delimiter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-content.js","sourceRoot":"","sources":["../../src/builders/core-content.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core-content.js","sourceRoot":"","sources":["../../src/builders/core-content.ts"],"names":[],"mappings":"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"}
|