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.
- package/dist/cli/publish/staticDomain.d.ts +16 -0
- package/dist/cli/publish/staticDomain.d.ts.map +1 -1
- package/dist/cli/publish/staticDomain.js +58 -0
- package/dist/cli/publish/staticDomain.js.map +1 -1
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/package.json +1 -1
- package/src/cli/publish/staticDomain.test.ts +48 -0
- package/src/cli/publish/staticDomain.ts +75 -0
- package/src/cli/version.ts +1 -1
|
@@ -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,
|
|
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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"}
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.936";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
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.
|
|
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) {
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.936";
|