ugly-app 0.1.935 → 0.1.936

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.
@@ -95,6 +95,22 @@ export declare function corpRuleRef(domain: string): string;
95
95
  * publishes are idempotent.
96
96
  */
97
97
  export declare function ensureCorpHeaderRule(args: StaticDomainArgs): Promise<void>;
98
+ export declare function cacheRuleRef(domain: string): string;
99
+ /**
100
+ * Force the CDN to cache everything on the static host.
101
+ *
102
+ * Cloudflare's default cache level only caches a fixed list of "static" file
103
+ * EXTENSIONS. `.js`/`.css`/`.png` are on it; `.ugm`, `.ktx2`, `.basis` and
104
+ * every other custom asset format are not — those return
105
+ * `cf-cache-status: DYNAMIC` forever, hit R2 on every single request, and get
106
+ * none of the benefit this whole feature exists for. Measured on world3: the
107
+ * 35 `.ugm` files (~1-2 MB each, the biggest assets it serves) were entirely
108
+ * uncached while the JS beside them was HIT.
109
+ *
110
+ * `respect_origin` honours the `max-age=31536000, immutable` written at upload
111
+ * time rather than overriding it, so the TTL stays owned by one place.
112
+ */
113
+ export declare function ensureCacheEverythingRule(args: StaticDomainArgs): Promise<void>;
98
114
  /**
99
115
  * Provision everything the static host needs. Safe to re-run on every publish.
100
116
  *
@@ -1 +1 @@
1
- {"version":3,"file":"staticDomain.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/staticDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzE;AAgCD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAWD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAGrB,GACA,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"staticDomain.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/staticDomain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzE;AAgCD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAWD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAGrB,GACA,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
@@ -215,6 +215,54 @@ export async function ensureCorpHeaderRule(args) {
215
215
  body: JSON.stringify({ rules }),
216
216
  }, 'ensureCorpHeaderRule:put');
217
217
  }
218
+ export function cacheRuleRef(domain) {
219
+ return `ugly_app_static_cache__${domain.toLowerCase().replace(/[^a-z0-9]+/g, '_')}`;
220
+ }
221
+ /**
222
+ * Force the CDN to cache everything on the static host.
223
+ *
224
+ * Cloudflare's default cache level only caches a fixed list of "static" file
225
+ * EXTENSIONS. `.js`/`.css`/`.png` are on it; `.ugm`, `.ktx2`, `.basis` and
226
+ * every other custom asset format are not — those return
227
+ * `cf-cache-status: DYNAMIC` forever, hit R2 on every single request, and get
228
+ * none of the benefit this whole feature exists for. Measured on world3: the
229
+ * 35 `.ugm` files (~1-2 MB each, the biggest assets it serves) were entirely
230
+ * uncached while the JS beside them was HIT.
231
+ *
232
+ * `respect_origin` honours the `max-age=31536000, immutable` written at upload
233
+ * time rather than overriding it, so the TTL stays owned by one place.
234
+ */
235
+ export async function ensureCacheEverythingRule(args) {
236
+ const { token, rulesetToken, zoneId, domain } = args;
237
+ const ruleRef = cacheRuleRef(domain);
238
+ const headers = {
239
+ 'Authorization': `Bearer ${rulesetToken ?? token}`,
240
+ 'Content-Type': 'application/json',
241
+ };
242
+ const base = `${CLOUDFLARE_API_BASE}/zones/${zoneId}/rulesets`;
243
+ const phase = 'http_request_cache_settings';
244
+ const listed = await cf(`${base}/phases/${phase}/entrypoint`, { method: 'GET', headers }, 'ensureCacheEverythingRule:get').catch(() => null);
245
+ const existing = listed?.result
246
+ ?.rules ?? [];
247
+ const rule = {
248
+ ref: ruleRef,
249
+ action: 'set_cache_settings',
250
+ description: 'ugly-app: cache all static assets (custom extensions too)',
251
+ expression: `http.host eq "${domain}"`,
252
+ action_parameters: {
253
+ cache: true,
254
+ edge_ttl: { mode: 'respect_origin' },
255
+ browser_ttl: { mode: 'respect_origin' },
256
+ },
257
+ };
258
+ await cf(`${base}/phases/${phase}/entrypoint`, {
259
+ method: 'PUT',
260
+ headers,
261
+ body: JSON.stringify({
262
+ rules: [...existing.filter((r) => r.ref !== ruleRef), rule],
263
+ }),
264
+ }, 'ensureCacheEverythingRule:put');
265
+ }
218
266
  /**
219
267
  * Provision everything the static host needs. Safe to re-run on every publish.
220
268
  *
@@ -242,6 +290,16 @@ export async function ensureStaticDomain(args, log = (m) => {
242
290
  }) {
243
291
  await ensureR2CustomDomain(args);
244
292
  await putR2BucketCors(args);
293
+ try {
294
+ await ensureCacheEverythingRule(args);
295
+ }
296
+ catch (err) {
297
+ log(`[static] could not set the cache rule on ${args.domain}: ` +
298
+ `${err.message}\n` +
299
+ ` Assets with a file extension Cloudflare treats as static (.js, .css, ` +
300
+ `.png…) still cache; custom formats (.ugm, .ktx2…) will report ` +
301
+ `cf-cache-status: DYNAMIC and hit R2 on every request.`);
302
+ }
245
303
  try {
246
304
  await ensureCorpHeaderRule(args);
247
305
  }
@@ -1 +1 @@
1
- {"version":3,"file":"staticDomain.js","sourceRoot":"","sources":["../../../src/cli/publish/staticDomain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"staticDomain.js","sourceRoot":"","sources":["../../../src/cli/publish/staticDomain.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.935";
1
+ export declare const CLI_VERSION = "0.1.936";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.935";
2
+ export const CLI_VERSION = "0.1.936";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ugly-app",
3
3
  "packageManager": "pnpm@10.34.5",
4
- "version": "0.1.935",
4
+ "version": "0.1.936",
5
5
  "type": "module",
6
6
  "comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
7
7
  "files": [
@@ -1,6 +1,8 @@
1
1
  import { afterEach, describe, expect, it, vi } from 'vitest';
2
2
  import {
3
+ cacheRuleRef,
3
4
  corpRuleRef,
5
+ ensureCacheEverythingRule,
4
6
  ensureCorpHeaderRule,
5
7
  ensureR2CustomDomain,
6
8
  ensureStaticDomain,
@@ -428,3 +430,49 @@ describe('corpRuleRef — a shared zone must not have one app clobber another',
428
430
  expect(body.rules).toHaveLength(2);
429
431
  });
430
432
  });
433
+
434
+ describe('ensureCacheEverythingRule', () => {
435
+ // Cloudflare's default cache level only caches known static EXTENSIONS.
436
+ // .ugm/.ktx2/.basis are never cached without this — measured on world3,
437
+ // where 35 .ugm files were DYNAMIC while the JS next to them was HIT.
438
+ it('forces caching for the static host and respects the origin TTL', async () => {
439
+ const fetchMock = vi
440
+ .fn()
441
+ .mockResolvedValueOnce(ok({ success: true, result: { rules: [] } }))
442
+ .mockResolvedValueOnce(ok());
443
+ vi.stubGlobal('fetch', fetchMock);
444
+ await ensureCacheEverythingRule(ARGS);
445
+
446
+ const [url, init] = fetchMock.mock.calls[1]!;
447
+ expect(String(url)).toContain('http_request_cache_settings');
448
+ const rule = JSON.parse((init as RequestInit).body as string).rules[0];
449
+ expect(rule.expression).toBe('http.host eq "static.myapp.com"');
450
+ expect(rule.action).toBe('set_cache_settings');
451
+ expect(rule.action_parameters.cache).toBe(true);
452
+ // respect_origin keeps the TTL owned by the upload's cache-control.
453
+ expect(rule.action_parameters.edge_ttl.mode).toBe('respect_origin');
454
+ });
455
+
456
+ it('uses a per-host ref so a shared zone is safe', async () => {
457
+ expect(cacheRuleRef('world3-static.ugly.bot')).not.toBe(
458
+ cacheRuleRef('game-demo-static.ugly.bot'),
459
+ );
460
+ });
461
+
462
+ it('preserves another app cache rule on the same zone', async () => {
463
+ const other = cacheRuleRef('game-demo-static.ugly.bot');
464
+ const fetchMock = vi
465
+ .fn()
466
+ .mockResolvedValueOnce(
467
+ ok({ success: true, result: { rules: [{ ref: other }] } }),
468
+ )
469
+ .mockResolvedValueOnce(ok());
470
+ vi.stubGlobal('fetch', fetchMock);
471
+ await ensureCacheEverythingRule(ARGS);
472
+ const refs = JSON.parse(
473
+ (fetchMock.mock.calls[1]![1] as RequestInit).body as string,
474
+ ).rules.map((r: { ref: string }) => r.ref);
475
+ expect(refs).toContain(other);
476
+ expect(refs).toHaveLength(2);
477
+ });
478
+ });
@@ -298,6 +298,70 @@ export async function ensureCorpHeaderRule(
298
298
  );
299
299
  }
300
300
 
301
+ export function cacheRuleRef(domain: string): string {
302
+ return `ugly_app_static_cache__${domain.toLowerCase().replace(/[^a-z0-9]+/g, '_')}`;
303
+ }
304
+
305
+ /**
306
+ * Force the CDN to cache everything on the static host.
307
+ *
308
+ * Cloudflare's default cache level only caches a fixed list of "static" file
309
+ * EXTENSIONS. `.js`/`.css`/`.png` are on it; `.ugm`, `.ktx2`, `.basis` and
310
+ * every other custom asset format are not — those return
311
+ * `cf-cache-status: DYNAMIC` forever, hit R2 on every single request, and get
312
+ * none of the benefit this whole feature exists for. Measured on world3: the
313
+ * 35 `.ugm` files (~1-2 MB each, the biggest assets it serves) were entirely
314
+ * uncached while the JS beside them was HIT.
315
+ *
316
+ * `respect_origin` honours the `max-age=31536000, immutable` written at upload
317
+ * time rather than overriding it, so the TTL stays owned by one place.
318
+ */
319
+ export async function ensureCacheEverythingRule(
320
+ args: StaticDomainArgs,
321
+ ): Promise<void> {
322
+ const { token, rulesetToken, zoneId, domain } = args;
323
+ const ruleRef = cacheRuleRef(domain);
324
+ const headers = {
325
+ 'Authorization': `Bearer ${rulesetToken ?? token}`,
326
+ 'Content-Type': 'application/json',
327
+ };
328
+ const base = `${CLOUDFLARE_API_BASE}/zones/${zoneId}/rulesets`;
329
+ const phase = 'http_request_cache_settings';
330
+
331
+ const listed = await cf(
332
+ `${base}/phases/${phase}/entrypoint`,
333
+ { method: 'GET', headers },
334
+ 'ensureCacheEverythingRule:get',
335
+ ).catch(() => null);
336
+ const existing =
337
+ (listed?.result as { rules?: Record<string, unknown>[] } | undefined)
338
+ ?.rules ?? [];
339
+
340
+ const rule = {
341
+ ref: ruleRef,
342
+ action: 'set_cache_settings',
343
+ description: 'ugly-app: cache all static assets (custom extensions too)',
344
+ expression: `http.host eq "${domain}"`,
345
+ action_parameters: {
346
+ cache: true,
347
+ edge_ttl: { mode: 'respect_origin' },
348
+ browser_ttl: { mode: 'respect_origin' },
349
+ },
350
+ };
351
+
352
+ await cf(
353
+ `${base}/phases/${phase}/entrypoint`,
354
+ {
355
+ method: 'PUT',
356
+ headers,
357
+ body: JSON.stringify({
358
+ rules: [...existing.filter((r) => r.ref !== ruleRef), rule],
359
+ }),
360
+ },
361
+ 'ensureCacheEverythingRule:put',
362
+ );
363
+ }
364
+
301
365
  /**
302
366
  * Provision everything the static host needs. Safe to re-run on every publish.
303
367
  *
@@ -328,6 +392,17 @@ export async function ensureStaticDomain(
328
392
  ): Promise<void> {
329
393
  await ensureR2CustomDomain(args);
330
394
  await putR2BucketCors(args);
395
+ try {
396
+ await ensureCacheEverythingRule(args);
397
+ } catch (err) {
398
+ log(
399
+ `[static] could not set the cache rule on ${args.domain}: ` +
400
+ `${(err as Error).message}\n` +
401
+ ` Assets with a file extension Cloudflare treats as static (.js, .css, ` +
402
+ `.png…) still cache; custom formats (.ugm, .ktx2…) will report ` +
403
+ `cf-cache-status: DYNAMIC and hit R2 on every request.`,
404
+ );
405
+ }
331
406
  try {
332
407
  await ensureCorpHeaderRule(args);
333
408
  } catch (err) {
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.935";
2
+ export const CLI_VERSION = "0.1.936";