@contentful/field-editor-shared 2.17.0-alpha.0 → 2.17.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.
@@ -239,14 +239,12 @@ const getEntryImage = async ({ entry, contentType, localeCode }, getAsset)=>{
239
239
  return null;
240
240
  }
241
241
  };
242
- const DOWNLOADS_ENDPOINT = 'downloads.ctfassets.net';
243
- const TRANSFORMATIONS_ENDPOINT = 'images.ctfassets.net';
244
242
  const getResolvedImageUrl = (url, params)=>{
245
243
  try {
246
244
  const urlToParse = url.startsWith('//') ? `https:${url}` : url;
247
245
  const parsedUrl = new URL(urlToParse);
248
- if (parsedUrl.hostname === DOWNLOADS_ENDPOINT) {
249
- parsedUrl.hostname = TRANSFORMATIONS_ENDPOINT;
246
+ if (parsedUrl.hostname.startsWith('downloads.')) {
247
+ parsedUrl.hostname = parsedUrl.hostname.replace(/^downloads\./, 'images.');
250
248
  }
251
249
  if (params) {
252
250
  Object.entries(params).forEach(([key, value])=>{
@@ -151,72 +151,72 @@ describe('getEntityStatus', ()=>{
151
151
  });
152
152
  describe('getResolvedImageUrl', ()=>{
153
153
  describe('URL parsing and domain replacement', ()=>{
154
- test('replaces downloads.ctfassets.net with images.ctfassets.net', ()=>{
155
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg');
156
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
154
+ test('replaces downloads.* with images.*', ()=>{
155
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg');
156
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
157
157
  });
158
158
  test('handles protocol-relative URLs', ()=>{
159
- const result = (0, _entityHelpers.getResolvedImageUrl)('//downloads.ctfassets.net/space/asset.jpg');
160
- expect(result).toBe('//images.ctfassets.net/space/asset.jpg');
159
+ const result = (0, _entityHelpers.getResolvedImageUrl)('//downloads.example.com/space/asset.jpg');
160
+ expect(result).toBe('//images.example.com/space/asset.jpg');
161
161
  });
162
- test('does not modify URLs that are not from downloads.ctfassets.net', ()=>{
162
+ test('does not modify URLs that do not start with downloads.', ()=>{
163
163
  const result = (0, _entityHelpers.getResolvedImageUrl)('https://example.com/image.jpg');
164
164
  expect(result).toBe('https://example.com/image.jpg');
165
165
  });
166
- test('does not modify images.ctfassets.net URLs', ()=>{
167
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://images.ctfassets.net/space/asset.jpg');
168
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
166
+ test('does not modify images.* URLs', ()=>{
167
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://images.example.com/space/asset.jpg');
168
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
169
169
  });
170
170
  });
171
171
  describe('query parameters', ()=>{
172
172
  test('adds width parameter', ()=>{
173
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
174
- width: 100
173
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
174
+ w: 100
175
175
  });
176
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?width=100');
176
+ expect(result).toBe('https://images.example.com/space/asset.jpg?w=100');
177
177
  });
178
178
  test('adds height parameter', ()=>{
179
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
180
- height: 200
179
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
180
+ h: 200
181
181
  });
182
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?height=200');
182
+ expect(result).toBe('https://images.example.com/space/asset.jpg?h=200');
183
183
  });
184
184
  test('adds fit parameter', ()=>{
185
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
185
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
186
186
  fit: 'thumb'
187
187
  });
188
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?fit=thumb');
188
+ expect(result).toBe('https://images.example.com/space/asset.jpg?fit=thumb');
189
189
  });
190
190
  test('adds multiple parameters', ()=>{
191
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
192
- width: 100,
193
- height: 200,
191
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
192
+ w: 100,
193
+ h: 200,
194
194
  fit: 'thumb'
195
195
  });
196
- expect(result).toContain('width=100');
197
- expect(result).toContain('height=200');
196
+ expect(result).toContain('w=100');
197
+ expect(result).toContain('h=200');
198
198
  expect(result).toContain('fit=thumb');
199
- expect(result).toContain('images.ctfassets.net');
199
+ expect(result).toContain('images.example.com');
200
200
  });
201
201
  test('skips undefined parameters', ()=>{
202
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
203
- width: 100,
204
- height: undefined,
202
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
203
+ w: 100,
204
+ h: undefined,
205
205
  fit: 'thumb'
206
206
  });
207
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?width=100&fit=thumb');
207
+ expect(result).toBe('https://images.example.com/space/asset.jpg?w=100&fit=thumb');
208
208
  });
209
209
  test('returns URL without query string when no params provided', ()=>{
210
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg');
211
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
210
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg');
211
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
212
212
  });
213
213
  test('returns URL without query string when all params are undefined', ()=>{
214
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg', {
215
- width: undefined,
216
- height: undefined,
214
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg', {
215
+ w: undefined,
216
+ h: undefined,
217
217
  fit: undefined
218
218
  });
219
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
219
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
220
220
  });
221
221
  });
222
222
  describe('relative URL fallback', ()=>{
@@ -226,41 +226,62 @@ describe('getResolvedImageUrl', ()=>{
226
226
  });
227
227
  test('appends query params to relative URLs', ()=>{
228
228
  const result = (0, _entityHelpers.getResolvedImageUrl)('/assets/image.jpg', {
229
- width: 100,
230
- height: 200
229
+ w: 100,
230
+ h: 200
231
231
  });
232
- expect(result).toBe('/assets/image.jpg?width=100&height=200');
232
+ expect(result).toBe('/assets/image.jpg?w=100&h=200');
233
233
  });
234
234
  test('handles relative URLs with undefined params', ()=>{
235
235
  const result = (0, _entityHelpers.getResolvedImageUrl)('/assets/image.jpg', {
236
- width: 100,
237
- height: undefined
236
+ w: 100,
237
+ h: undefined
238
238
  });
239
- expect(result).toBe('/assets/image.jpg?width=100');
239
+ expect(result).toBe('/assets/image.jpg?w=100');
240
240
  });
241
241
  test('returns relative URL unchanged when all params are undefined', ()=>{
242
242
  const result = (0, _entityHelpers.getResolvedImageUrl)('/assets/image.jpg', {
243
- width: undefined,
244
- height: undefined
243
+ w: undefined,
244
+ h: undefined
245
245
  });
246
246
  expect(result).toBe('/assets/image.jpg');
247
247
  });
248
248
  });
249
249
  describe('edge cases', ()=>{
250
250
  test('preserves existing query parameters', ()=>{
251
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg?foo=bar', {
252
- width: 100
251
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg?foo=bar', {
252
+ w: 100
253
253
  });
254
254
  expect(result).toContain('foo=bar');
255
- expect(result).toContain('width=100');
255
+ expect(result).toContain('w=100');
256
256
  });
257
257
  test('handles URLs with fragments', ()=>{
258
- const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.ctfassets.net/space/asset.jpg#section', {
259
- width: 100
258
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg#section', {
259
+ w: 100
260
260
  });
261
- expect(result).toContain('images.ctfassets.net');
262
- expect(result).toContain('width=100');
261
+ expect(result).toContain('images.example.com');
262
+ expect(result).toContain('w=100');
263
263
  expect(result).toContain('#section');
264
264
  });
265
265
  });
266
+ describe('pattern-based domain replacement', ()=>{
267
+ test('replaces any downloads.* domain with images.*', ()=>{
268
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.example.com/space/asset.jpg');
269
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
270
+ });
271
+ test('handles protocol-relative downloads URLs', ()=>{
272
+ const result = (0, _entityHelpers.getResolvedImageUrl)('//downloads.example.com/space/asset.jpg');
273
+ expect(result).toBe('//images.example.com/space/asset.jpg');
274
+ });
275
+ test('adds query params to any downloads.* domain', ()=>{
276
+ const result = (0, _entityHelpers.getResolvedImageUrl)('https://downloads.another-example.com/space/asset.jpg', {
277
+ w: 150,
278
+ h: 150,
279
+ fit: 'thumb'
280
+ });
281
+ expect(result).toContain('images.another-example.com');
282
+ expect(result).toContain('w=150');
283
+ expect(result).toContain('h=150');
284
+ expect(result).toContain('fit=thumb');
285
+ });
286
+ });
266
287
  });
@@ -189,14 +189,12 @@ export const getEntryImage = async ({ entry, contentType, localeCode }, getAsset
189
189
  return null;
190
190
  }
191
191
  };
192
- const DOWNLOADS_ENDPOINT = 'downloads.ctfassets.net';
193
- const TRANSFORMATIONS_ENDPOINT = 'images.ctfassets.net';
194
192
  export const getResolvedImageUrl = (url, params)=>{
195
193
  try {
196
194
  const urlToParse = url.startsWith('//') ? `https:${url}` : url;
197
195
  const parsedUrl = new URL(urlToParse);
198
- if (parsedUrl.hostname === DOWNLOADS_ENDPOINT) {
199
- parsedUrl.hostname = TRANSFORMATIONS_ENDPOINT;
196
+ if (parsedUrl.hostname.startsWith('downloads.')) {
197
+ parsedUrl.hostname = parsedUrl.hostname.replace(/^downloads\./, 'images.');
200
198
  }
201
199
  if (params) {
202
200
  Object.entries(params).forEach(([key, value])=>{
@@ -147,72 +147,72 @@ describe('getEntityStatus', ()=>{
147
147
  });
148
148
  describe('getResolvedImageUrl', ()=>{
149
149
  describe('URL parsing and domain replacement', ()=>{
150
- test('replaces downloads.ctfassets.net with images.ctfassets.net', ()=>{
151
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg');
152
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
150
+ test('replaces downloads.* with images.*', ()=>{
151
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg');
152
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
153
153
  });
154
154
  test('handles protocol-relative URLs', ()=>{
155
- const result = getResolvedImageUrl('//downloads.ctfassets.net/space/asset.jpg');
156
- expect(result).toBe('//images.ctfassets.net/space/asset.jpg');
155
+ const result = getResolvedImageUrl('//downloads.example.com/space/asset.jpg');
156
+ expect(result).toBe('//images.example.com/space/asset.jpg');
157
157
  });
158
- test('does not modify URLs that are not from downloads.ctfassets.net', ()=>{
158
+ test('does not modify URLs that do not start with downloads.', ()=>{
159
159
  const result = getResolvedImageUrl('https://example.com/image.jpg');
160
160
  expect(result).toBe('https://example.com/image.jpg');
161
161
  });
162
- test('does not modify images.ctfassets.net URLs', ()=>{
163
- const result = getResolvedImageUrl('https://images.ctfassets.net/space/asset.jpg');
164
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
162
+ test('does not modify images.* URLs', ()=>{
163
+ const result = getResolvedImageUrl('https://images.example.com/space/asset.jpg');
164
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
165
165
  });
166
166
  });
167
167
  describe('query parameters', ()=>{
168
168
  test('adds width parameter', ()=>{
169
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
170
- width: 100
169
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
170
+ w: 100
171
171
  });
172
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?width=100');
172
+ expect(result).toBe('https://images.example.com/space/asset.jpg?w=100');
173
173
  });
174
174
  test('adds height parameter', ()=>{
175
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
176
- height: 200
175
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
176
+ h: 200
177
177
  });
178
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?height=200');
178
+ expect(result).toBe('https://images.example.com/space/asset.jpg?h=200');
179
179
  });
180
180
  test('adds fit parameter', ()=>{
181
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
181
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
182
182
  fit: 'thumb'
183
183
  });
184
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?fit=thumb');
184
+ expect(result).toBe('https://images.example.com/space/asset.jpg?fit=thumb');
185
185
  });
186
186
  test('adds multiple parameters', ()=>{
187
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
188
- width: 100,
189
- height: 200,
187
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
188
+ w: 100,
189
+ h: 200,
190
190
  fit: 'thumb'
191
191
  });
192
- expect(result).toContain('width=100');
193
- expect(result).toContain('height=200');
192
+ expect(result).toContain('w=100');
193
+ expect(result).toContain('h=200');
194
194
  expect(result).toContain('fit=thumb');
195
- expect(result).toContain('images.ctfassets.net');
195
+ expect(result).toContain('images.example.com');
196
196
  });
197
197
  test('skips undefined parameters', ()=>{
198
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
199
- width: 100,
200
- height: undefined,
198
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
199
+ w: 100,
200
+ h: undefined,
201
201
  fit: 'thumb'
202
202
  });
203
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg?width=100&fit=thumb');
203
+ expect(result).toBe('https://images.example.com/space/asset.jpg?w=100&fit=thumb');
204
204
  });
205
205
  test('returns URL without query string when no params provided', ()=>{
206
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg');
207
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
206
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg');
207
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
208
208
  });
209
209
  test('returns URL without query string when all params are undefined', ()=>{
210
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg', {
211
- width: undefined,
212
- height: undefined,
210
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg', {
211
+ w: undefined,
212
+ h: undefined,
213
213
  fit: undefined
214
214
  });
215
- expect(result).toBe('https://images.ctfassets.net/space/asset.jpg');
215
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
216
216
  });
217
217
  });
218
218
  describe('relative URL fallback', ()=>{
@@ -222,41 +222,62 @@ describe('getResolvedImageUrl', ()=>{
222
222
  });
223
223
  test('appends query params to relative URLs', ()=>{
224
224
  const result = getResolvedImageUrl('/assets/image.jpg', {
225
- width: 100,
226
- height: 200
225
+ w: 100,
226
+ h: 200
227
227
  });
228
- expect(result).toBe('/assets/image.jpg?width=100&height=200');
228
+ expect(result).toBe('/assets/image.jpg?w=100&h=200');
229
229
  });
230
230
  test('handles relative URLs with undefined params', ()=>{
231
231
  const result = getResolvedImageUrl('/assets/image.jpg', {
232
- width: 100,
233
- height: undefined
232
+ w: 100,
233
+ h: undefined
234
234
  });
235
- expect(result).toBe('/assets/image.jpg?width=100');
235
+ expect(result).toBe('/assets/image.jpg?w=100');
236
236
  });
237
237
  test('returns relative URL unchanged when all params are undefined', ()=>{
238
238
  const result = getResolvedImageUrl('/assets/image.jpg', {
239
- width: undefined,
240
- height: undefined
239
+ w: undefined,
240
+ h: undefined
241
241
  });
242
242
  expect(result).toBe('/assets/image.jpg');
243
243
  });
244
244
  });
245
245
  describe('edge cases', ()=>{
246
246
  test('preserves existing query parameters', ()=>{
247
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg?foo=bar', {
248
- width: 100
247
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg?foo=bar', {
248
+ w: 100
249
249
  });
250
250
  expect(result).toContain('foo=bar');
251
- expect(result).toContain('width=100');
251
+ expect(result).toContain('w=100');
252
252
  });
253
253
  test('handles URLs with fragments', ()=>{
254
- const result = getResolvedImageUrl('https://downloads.ctfassets.net/space/asset.jpg#section', {
255
- width: 100
254
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg#section', {
255
+ w: 100
256
256
  });
257
- expect(result).toContain('images.ctfassets.net');
258
- expect(result).toContain('width=100');
257
+ expect(result).toContain('images.example.com');
258
+ expect(result).toContain('w=100');
259
259
  expect(result).toContain('#section');
260
260
  });
261
261
  });
262
+ describe('pattern-based domain replacement', ()=>{
263
+ test('replaces any downloads.* domain with images.*', ()=>{
264
+ const result = getResolvedImageUrl('https://downloads.example.com/space/asset.jpg');
265
+ expect(result).toBe('https://images.example.com/space/asset.jpg');
266
+ });
267
+ test('handles protocol-relative downloads URLs', ()=>{
268
+ const result = getResolvedImageUrl('//downloads.example.com/space/asset.jpg');
269
+ expect(result).toBe('//images.example.com/space/asset.jpg');
270
+ });
271
+ test('adds query params to any downloads.* domain', ()=>{
272
+ const result = getResolvedImageUrl('https://downloads.another-example.com/space/asset.jpg', {
273
+ w: 150,
274
+ h: 150,
275
+ fit: 'thumb'
276
+ });
277
+ expect(result).toContain('images.another-example.com');
278
+ expect(result).toContain('w=150');
279
+ expect(result).toContain('h=150');
280
+ expect(result).toContain('fit=thumb');
281
+ });
282
+ });
262
283
  });
@@ -82,8 +82,8 @@ export declare const getEntryImage: ({ entry, contentType, localeCode, }: {
82
82
  defaultLocaleCode: string;
83
83
  }, getAsset: (assetId: string) => Promise<unknown>) => Promise<null | File>;
84
84
  export declare const getResolvedImageUrl: (url: string, params?: {
85
- width?: number;
86
- height?: number;
85
+ w?: number;
86
+ h?: number;
87
87
  fit?: string;
88
88
  }) => string;
89
89
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/field-editor-shared",
3
- "version": "2.17.0-alpha.0",
3
+ "version": "2.17.0",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -60,5 +60,5 @@
60
60
  "publishConfig": {
61
61
  "registry": "https://npm.pkg.github.com/"
62
62
  },
63
- "gitHead": "aae7ea3dcdc2010b1bc8c15a4d6ce3ddba9702e2"
63
+ "gitHead": "c85b1e8cd6772eb796ed2b22ebb778c717f4a7f4"
64
64
  }