@exdst-sitecore-content-sdk/astro 0.0.23 → 0.0.25

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 (72) hide show
  1. package/package.json +9 -14
  2. package/src/client/sitecore-astro-client.ts +0 -45
  3. package/src/context.ts +14 -16
  4. package/src/env.d.ts +1 -1
  5. package/src/sharedTypes/component-props.ts +0 -10
  6. package/src/tools/generate-map.ts +9 -21
  7. package/src/client/sitecore-astro-client.test.ts +0 -292
  8. package/src/components/AstroImage.astro.test.ts +0 -541
  9. package/src/components/Date.astro.test.ts +0 -197
  10. package/src/components/EditingScripts.astro.test.ts +0 -267
  11. package/src/components/ErrorBoundary.astro.test.ts +0 -252
  12. package/src/components/ErrorComponent.astro.test.ts +0 -31
  13. package/src/components/FieldMetadata.astro.test.ts +0 -40
  14. package/src/components/File.astro.test.ts +0 -68
  15. package/src/components/HiddenRendering.astro.test.ts +0 -36
  16. package/src/components/Image.astro.test.ts +0 -438
  17. package/src/components/Link.astro.test.ts +0 -261
  18. package/src/components/MissingComponent.astro.test.ts +0 -21
  19. package/src/components/Placeholder/Placeholder.astro.test.ts +0 -1088
  20. package/src/components/Placeholder/PlaceholderMetadata.astro.test.ts +0 -228
  21. package/src/components/Placeholder/PlaceholderUtils.astro.test.ts +0 -149
  22. package/src/components/Placeholder/placeholder-utils.test.ts +0 -309
  23. package/src/components/RichText.astro.test.ts +0 -205
  24. package/src/components/Text.astro.test.ts +0 -273
  25. package/src/config/define-config.test.ts +0 -526
  26. package/src/config-cli/define-cli-config.test.ts +0 -88
  27. package/src/editing/editing-config-middleware.test.ts +0 -164
  28. package/src/editing/editing-render-middleware.test.ts +0 -1143
  29. package/src/editing/render-middleware.test.ts +0 -57
  30. package/src/editing/utils.test.ts +0 -1212
  31. package/src/enhancers/WithEmptyFieldEditingComponent.astro.test.ts +0 -380
  32. package/src/enhancers/WithFieldMetadata.astro.test.ts +0 -113
  33. package/src/middleware/middleware.test.ts +0 -520
  34. package/src/middleware/multisite-middleware.test.ts +0 -667
  35. package/src/middleware/robots-middleware.test.ts +0 -129
  36. package/src/middleware/sitemap-middleware.test.ts +0 -184
  37. package/src/services/component-props-service.ts +0 -183
  38. package/src/tests/astro-helpers.ts +0 -61
  39. package/src/tests/helpers.ts +0 -46
  40. package/src/tests/personalizeData.ts +0 -63
  41. package/src/tests/test-components/CustomErrorComponent.astro +0 -3
  42. package/src/tests/test-components/CustomHiddenRendering.astro +0 -10
  43. package/src/tests/test-components/CustomMissingComponent.astro +0 -9
  44. package/src/tests/test-components/DownloadCallout.astro +0 -12
  45. package/src/tests/test-components/EmptyFieldEditingComponent.astro +0 -5
  46. package/src/tests/test-components/ErrorBoundaryWithError.astro +0 -10
  47. package/src/tests/test-components/Home.astro +0 -12
  48. package/src/tests/test-components/SxaRichText.astro +0 -23
  49. package/src/tests/test-components/SxaRichTextDefault.astro +0 -7
  50. package/src/tests/test-components/SxaRichTextWithTitle.astro +0 -8
  51. package/src/tests/test-components/TestComponent.astro +0 -9
  52. package/src/tests/test-components/TestComponentWithError.astro +0 -4
  53. package/src/tests/test-components/TestComponentWithField.astro +0 -17
  54. package/src/tests/test-components/TestHeader.astro +0 -8
  55. package/src/tests/test-components/TestLogo.astro +0 -5
  56. package/src/tests/test-components/TestParentWrapperComponent.astro +0 -5
  57. package/src/tests/test-components/TestWrapperComponent.astro +0 -5
  58. package/src/tests/test-components/map-components/Bar.astro +0 -0
  59. package/src/tests/test-components/map-components/Baz.astro +0 -0
  60. package/src/tests/test-components/map-components/Foo.astro +0 -0
  61. package/src/tests/test-components/map-components/Hero.variant.astro +0 -0
  62. package/src/tests/test-components/map-components/NotComponent.bsx +0 -0
  63. package/src/tests/test-components/map-components/Qux.astro +0 -0
  64. package/src/tests/test-components/map-components/folded/Folded.astro +0 -0
  65. package/src/tests/test-components/map-components/folded/random-file-2.docx +0 -0
  66. package/src/tests/test-components/map-components/random-file.txt +0 -0
  67. package/src/tests/test-data/metadata-data.ts +0 -86
  68. package/src/tests/test-data/normal-mode-data.ts +0 -466
  69. package/src/tests/vitest.setup.ts +0 -4
  70. package/src/tools/templating/components.test.ts +0 -318
  71. package/src/tools/templating/default-component.test.ts +0 -31
  72. package/src/utils/utils.test.ts +0 -48
@@ -1,541 +0,0 @@
1
- import { describe, test, expect, vi } from 'vitest';
2
- import { mockSitecoreContext, renderAstroComponent } from '../tests/astro-helpers';
3
- import Image from './AstroImage.astro';
4
- import { ImageField } from './Image.astro';
5
- import DefaultEmptyFieldEditingComponentImage from './DefaultEmptyFieldEditingComponentImage.astro';
6
- import EmptyFieldEditingComponent from '../tests/test-components/EmptyFieldEditingComponent.astro';
7
- import { Page, PageMode } from '@sitecore-content-sdk/content/client';
8
- import { LayoutServicePageState } from '@sitecore-content-sdk/content/layout';
9
-
10
- vi.spyOn(console, 'warn').mockImplementation(() => undefined);
11
-
12
- // @ts-ignore
13
- const editingMode: PageMode = {
14
- name: LayoutServicePageState.Edit,
15
- isEditing: true,
16
- };
17
- // @ts-ignore
18
- const normalMode: PageMode = {
19
- name: LayoutServicePageState.Normal,
20
- isNormal: true,
21
- };
22
-
23
- describe('<Image />', () => {
24
- describe('with direct image object, no value', async () => {
25
- const page: Page = {
26
- locale: 'en',
27
- layout: {
28
- sitecore: {
29
- context: {},
30
- route: null,
31
- },
32
- },
33
- mode: normalMode,
34
- };
35
-
36
- mockSitecoreContext(page);
37
-
38
- const props = {
39
- field: {
40
- src: '/assets/img/test0.png',
41
- width: '8',
42
- height: '10',
43
- },
44
- id: 'some-id',
45
- style: {
46
- width: '100%',
47
- },
48
- className: 'the-dude-abides',
49
- };
50
-
51
- const rendered = (
52
- await renderAstroComponent(Image, {
53
- props: { ...props },
54
- })
55
- ).querySelectorAll('img');
56
-
57
- test('should render <img /> with url', async () => {
58
- expect(rendered).to.have.length(1);
59
- expect(rendered[0]?.getAttribute('src')).to.equal(props.field.src);
60
- expect(rendered[0]?.getAttribute('width')).to.equal(props.field.width);
61
- expect(rendered[0]?.getAttribute('height')).to.equal(props.field.height);
62
- });
63
-
64
- test('should render <img /> with non-media props', async () => {
65
- expect(rendered[0]?.getAttribute('id')).to.equal(props.id);
66
- });
67
-
68
- test('should render <img /> with style and className props', async () => {
69
- expect(rendered[0]?.getAttribute('style')).to.eql('width:100%');
70
- expect(rendered[0]?.getAttribute('class')).to.eql(props.className);
71
- });
72
- });
73
-
74
- describe('with responsive image object', async () => {
75
- const props = {
76
- field: {
77
- src: '/assets/img/test0.png',
78
- },
79
- widths: [100, 300],
80
- sizes: '(min-width: 960px) 300px, 100px',
81
- id: 'some-id',
82
- className: 'the-dude-abides',
83
- width: 960,
84
- height: 400,
85
- };
86
-
87
- const rendered = (
88
- await renderAstroComponent(Image, {
89
- props: { ...props },
90
- })
91
- ).querySelectorAll('img');
92
-
93
- test('should render <img /> with needed img tags', async () => {
94
- expect(rendered).to.have.length(1);
95
- expect(rendered[0]?.getAttribute('src')).to.equal(props.field.src);
96
- expect(rendered[0]?.getAttribute('srcSet')).to.equal(
97
- '/assets/img/test0.png 100w, /assets/img/test0.png 300w'
98
- );
99
- expect(rendered[0]?.getAttribute('sizes')).to.equal('(min-width: 960px) 300px, 100px');
100
- });
101
-
102
- test('should render <img /> with non-media props', async () => {
103
- expect(rendered[0]?.getAttribute('id')).to.equal(props.id);
104
- });
105
-
106
- test('should render <img /> with style and className props', async () => {
107
- expect(rendered[0]?.getAttribute('class')).to.eql(props.className);
108
- });
109
- });
110
-
111
- describe('with "value" property value', async () => {
112
- const props = {
113
- field: { value: { src: '/assets/img/test0.png', alt: 'my image' } },
114
- id: 'some-id',
115
- style: { width: '100%' },
116
- className: 'the-dude-abides',
117
- width: 960,
118
- height: 400,
119
- };
120
-
121
- const rendered = (
122
- await renderAstroComponent(Image, {
123
- props: { ...props },
124
- })
125
- ).querySelectorAll('img');
126
-
127
- test('should render <img /> component with "value" properties', async () => {
128
- expect(rendered).to.have.length(1);
129
- expect(rendered[0]?.getAttribute('src')).to.eql(props.field.value.src);
130
- expect(rendered[0]?.getAttribute('alt')).to.eql(props.field.value.alt);
131
- });
132
-
133
- test('should render <img /> with non-media props', async () => {
134
- expect(rendered[0]?.getAttribute('id')).to.equal(props.id);
135
- });
136
-
137
- test('should render <img /> with style and className props', async () => {
138
- expect(rendered[0]?.getAttribute('style')).to.eql('width:100%');
139
- expect(rendered[0]?.getAttribute('class')).to.eql(props.className);
140
- });
141
- });
142
-
143
- describe('with "class" and "className" property set', async () => {
144
- const props = {
145
- field: { value: { src: '/assets/img/test0.png', alt: 'my image' } },
146
- editable: false,
147
- style: { width: '100%' },
148
- className: 'the-dude',
149
- class: 'abides',
150
- width: 960,
151
- height: 400,
152
- };
153
-
154
- const rendered = (
155
- await renderAstroComponent(Image, {
156
- props: { ...props },
157
- })
158
- ).querySelector('img');
159
-
160
- test('should attach "class" value at the end of class attribute', async () => {
161
- expect(rendered?.getAttribute('class')).to.eql(`${props.className} ${props.class}`);
162
- });
163
- });
164
-
165
- describe('with "mediaUrlPrefix" property', async () => {
166
- test('should transform url with "value" property value', async () => {
167
- const props = {
168
- field: { value: { src: '/~assets/img/test0.png', alt: 'my image' } },
169
- id: 'some-id',
170
- style: { width: '100%' },
171
- className: 'the-dude-abides',
172
- imageParams: { foo: 'bar' },
173
- mediaUrlPrefix: /\/([-~]{1})assets\//i,
174
- width: 960,
175
- height: 400,
176
- };
177
-
178
- let rendered = await renderAstroComponent(Image, {
179
- props: { ...props },
180
- });
181
-
182
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal(
183
- '/~/jssmedia/img/test0.png?foo=bar'
184
- );
185
-
186
- const newProps = {
187
- ...props,
188
- field: { value: { src: '/-assets/img/test0.png', alt: 'my image' } },
189
- };
190
-
191
- rendered = await renderAstroComponent(Image, {
192
- props: { ...newProps },
193
- });
194
-
195
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal(
196
- '/-/jssmedia/img/test0.png?foo=bar'
197
- );
198
- });
199
-
200
- test('should transform url with direct image object, no value', async () => {
201
- const props = {
202
- field: {
203
- src: '/~assets/img/test0.png',
204
- width: 8,
205
- height: 10,
206
- },
207
- id: 'some-id',
208
- style: {
209
- width: '100%',
210
- },
211
- className: 'the-dude-abides',
212
- imageParams: { foo: 'bar' },
213
- mediaUrlPrefix: /\/([-~]{1})assets\//i,
214
- };
215
-
216
- let rendered = await renderAstroComponent(Image, {
217
- props: { ...props },
218
- });
219
-
220
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal(
221
- '/~/jssmedia/img/test0.png?foo=bar'
222
- );
223
-
224
- const newProps = {
225
- ...props,
226
- field: {
227
- src: '/-assets/img/test0.png',
228
- width: 8,
229
- height: 10,
230
- },
231
- };
232
-
233
- rendered = await renderAstroComponent(Image, {
234
- props: { ...newProps },
235
- });
236
-
237
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal(
238
- '/-/jssmedia/img/test0.png?foo=bar'
239
- );
240
- });
241
-
242
- test('should transform url with responsive image object', async () => {
243
- const page: Page = {
244
- locale: 'en',
245
- layout: {
246
- sitecore: {
247
- context: {},
248
- route: null,
249
- },
250
- },
251
- mode: normalMode,
252
- };
253
-
254
- mockSitecoreContext(page);
255
-
256
- const props = {
257
- field: {
258
- src: '/~assets/img/test0.png',
259
- width: 960,
260
- height: 400,
261
- },
262
- widths: [100, 300],
263
- sizes: '(min-width: 960px) 300px, 100px',
264
- id: 'some-id',
265
- className: 'the-dude-abides',
266
- mediaUrlPrefix: /\/([-~]{1})assets\//i,
267
- };
268
-
269
- let rendered = await renderAstroComponent(Image, {
270
- props: { ...props },
271
- });
272
-
273
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal('/~assets/img/test0.png');
274
- expect(rendered.querySelector('img')?.getAttribute('srcSet')).to.equal(
275
- '/~assets/img/test0.png 100w, /~assets/img/test0.png 300w'
276
- );
277
-
278
- const newProps = {
279
- ...props,
280
- field: {
281
- src: '/-assets/img/test0.png',
282
- width: 8,
283
- height: 10,
284
- },
285
- imageParams: { foo: 'bar' },
286
- };
287
-
288
- rendered = await renderAstroComponent(Image, {
289
- props: { ...newProps },
290
- });
291
-
292
- expect(rendered.querySelector('img')?.getAttribute('src')).to.equal(
293
- '/-/jssmedia/img/test0.png?foo=bar'
294
- );
295
- expect(rendered.querySelector('img')?.getAttribute('srcSet')).to.equal(
296
- '/-/jssmedia/img/test0.png?foo=bar 100w, /-/jssmedia/img/test0.png?foo=bar 300w'
297
- );
298
- });
299
- });
300
-
301
- test('should render <img /> with optimized img tags (Astro image) in normal mode', async () => {
302
- const props = {
303
- field: {
304
- src: '/assets/img/test0.png',
305
- width: 10,
306
- height: 8,
307
- },
308
- id: 'some-id',
309
- className: 'the-dude-abides',
310
- };
311
-
312
- const rendered = (
313
- await renderAstroComponent(Image, {
314
- props: { ...props },
315
- })
316
- ).querySelector('img');
317
-
318
- expect(rendered?.getAttribute('loading')).to.equal('lazy');
319
- expect(rendered?.getAttribute('decoding')).to.equal('async');
320
- });
321
-
322
- test('should render no <img /> when media prop is empty', async () => {
323
- const imgField = '' as ImageField;
324
-
325
- const rendered = await renderAstroComponent(Image, {
326
- props: { field: imgField },
327
- });
328
-
329
- expect(rendered.querySelectorAll('img')).to.have.length(0);
330
- });
331
-
332
- test('should render when field prop is used instead of media prop', async () => {
333
- const imgField = {
334
- src: '/assets/img/test0.png',
335
- width: 8,
336
- height: 10,
337
- };
338
-
339
- const rendered = await renderAstroComponent(Image, {
340
- props: { field: imgField },
341
- });
342
-
343
- expect(rendered.querySelectorAll('img')).to.have.length(1);
344
- });
345
-
346
- describe('edit mode', async () => {
347
- const page: Page = {
348
- locale: 'en',
349
- layout: {
350
- sitecore: {
351
- context: {},
352
- route: null,
353
- },
354
- },
355
- mode: editingMode,
356
- };
357
-
358
- const testMetadata = {
359
- contextItem: {
360
- id: '{09A07660-6834-476C-B93B-584248D3003B}',
361
- language: 'en',
362
- revision: 'a0b36ce0a7db49418edf90eb9621e145',
363
- version: 1,
364
- },
365
- fieldId: '{414061F4-FBB1-4591-BC37-BFFA67F745EB}',
366
- fieldType: 'image',
367
- rawValue: 'Test1',
368
- };
369
-
370
- test('should render field metadata component when metadata property is present', async () => {
371
- mockSitecoreContext(page);
372
-
373
- const imgField = {
374
- src: '/assets/img/test0.png',
375
- width: 8,
376
- height: 10,
377
- metadata: testMetadata,
378
- };
379
-
380
- const rendered = await renderAstroComponent(Image, {
381
- props: { field: imgField },
382
- });
383
-
384
- expect(rendered.innerHTML).to.equal(
385
- [
386
- `<code type="text/sitecore" chrometype="field" class="scpm" kind="open">${JSON.stringify(
387
- testMetadata
388
- )}</code>`,
389
- '<img width="8" height="10" src="/assets/img/test0.png">',
390
- '<code type="text/sitecore" chrometype="field" class="scpm" kind="close"></code>',
391
- ].join('')
392
- );
393
- });
394
-
395
- test('should render default empty field component for Image when field value src is not present', async () => {
396
- const imgField = {
397
- value: { src: undefined },
398
- metadata: testMetadata,
399
- };
400
-
401
- const rendered = await renderAstroComponent(Image, {
402
- props: { field: imgField },
403
- });
404
-
405
- const defaultEmptyImagePlaceholder = await renderAstroComponent(
406
- DefaultEmptyFieldEditingComponentImage
407
- );
408
-
409
- expect(rendered.innerHTML).to.equal(
410
- [
411
- `<code type="text/sitecore" chrometype="field" class="scpm" kind="open">${JSON.stringify(
412
- testMetadata
413
- )}</code>`,
414
- defaultEmptyImagePlaceholder.innerHTML,
415
- '<code type="text/sitecore" chrometype="field" class="scpm" kind="close"></code>',
416
- ].join('')
417
- );
418
- });
419
-
420
- test('should render default empty field component for Image when field src is not present', async () => {
421
- const imgField = {
422
- src: undefined,
423
- metadata: testMetadata,
424
- };
425
-
426
- const rendered = await renderAstroComponent(Image, {
427
- props: { field: imgField },
428
- });
429
-
430
- const defaultEmptyImagePlaceholder = await renderAstroComponent(
431
- DefaultEmptyFieldEditingComponentImage
432
- );
433
-
434
- expect(rendered.innerHTML).to.equal(
435
- [
436
- `<code type="text/sitecore" chrometype="field" class="scpm" kind="open">${JSON.stringify(
437
- testMetadata
438
- )}</code>`,
439
- defaultEmptyImagePlaceholder.innerHTML,
440
- '<code type="text/sitecore" chrometype="field" class="scpm" kind="close"></code>',
441
- ].join('')
442
- );
443
- });
444
-
445
- test('should render custom empty field component when provided, when field value src is not present', async () => {
446
- const imgField = {
447
- value: { src: undefined },
448
- metadata: testMetadata,
449
- };
450
-
451
- const rendered = await renderAstroComponent(Image, {
452
- props: {
453
- field: imgField,
454
- emptyFieldEditingComponent: EmptyFieldEditingComponent,
455
- },
456
- });
457
-
458
- expect(rendered.innerHTML).to.equal(
459
- [
460
- `<code type="text/sitecore" chrometype="field" class="scpm" kind="open">${JSON.stringify(
461
- testMetadata
462
- )}</code>`,
463
- '<span class="empty-field-value-placeholder">Custom Empty field value</span>',
464
- '<code type="text/sitecore" chrometype="field" class="scpm" kind="close"></code>',
465
- ].join('')
466
- );
467
- });
468
-
469
- test('should render custom empty field component when provided, when field src is not present', async () => {
470
- const imgField = {
471
- src: undefined,
472
- metadata: testMetadata,
473
- };
474
-
475
- const rendered = await renderAstroComponent(Image, {
476
- props: {
477
- field: imgField,
478
- emptyFieldEditingComponent: EmptyFieldEditingComponent,
479
- },
480
- });
481
-
482
- expect(rendered.innerHTML).to.equal(
483
- [
484
- `<code type="text/sitecore" chrometype="field" class="scpm" kind="open">${JSON.stringify(
485
- testMetadata
486
- )}</code>`,
487
- '<span class="empty-field-value-placeholder">Custom Empty field value</span>',
488
- '<code type="text/sitecore" chrometype="field" class="scpm" kind="close"></code>',
489
- ].join('')
490
- );
491
- });
492
-
493
- test('should render nothing when field value src is not present, when editing is explicitly disabled', async () => {
494
- const imgField = {
495
- value: { src: undefined },
496
- metadata: testMetadata,
497
- };
498
-
499
- const rendered = await renderAstroComponent(Image, {
500
- props: { field: imgField, editable: false },
501
- });
502
-
503
- expect(rendered.innerHTML).to.equal('');
504
- });
505
-
506
- test('should render nothing when field src is not present, when editing is explicitly disabled', async () => {
507
- const imgField = {
508
- src: undefined,
509
- metadata: testMetadata,
510
- };
511
-
512
- const rendered = await renderAstroComponent(Image, {
513
- props: { field: imgField, editable: false },
514
- });
515
-
516
- expect(rendered.innerHTML).to.equal('');
517
- });
518
-
519
- test('should render <img /> without optimized img tags (not Astro image) in edit mode', async () => {
520
- const props = {
521
- field: {
522
- src: '/assets/img/test0.png',
523
- width: 10,
524
- height: 8,
525
- },
526
- id: 'some-id',
527
- className: 'the-dude-abides',
528
- };
529
-
530
- const rendered = (
531
- await renderAstroComponent(Image, {
532
- props: { ...props },
533
- })
534
- ).querySelector('img');
535
-
536
- expect(rendered?.getAttribute('loading')).to.equal(null);
537
- expect(rendered?.getAttribute('decoding')).to.equal(null);
538
- expect(rendered?.getAttribute('fetchpriority')).to.equal(null);
539
- });
540
- });
541
- });