@mccaskie-labs/workbench-config 0.1.16 → 0.1.17
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/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./schema.json",
|
|
3
|
+
"format": 1,
|
|
4
|
+
"component": "pdf",
|
|
5
|
+
"title": "Branded PDFs",
|
|
6
|
+
"summary": "workbench-pdf prints an app's content as a PDF with its brand.json logo, colours and fonts, in the app's own Worker through its Browser Rendering binding (BROWSER). Nothing goes through the Gateway and the app holds no Cloudflare token. The standard layout takes plain-text blocks; html() takes the app's own markup.",
|
|
7
|
+
"status": "built",
|
|
8
|
+
"surfaces": {
|
|
9
|
+
"package": [
|
|
10
|
+
"createPdfMaker",
|
|
11
|
+
"WorkbenchPdfError"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"limits": [
|
|
15
|
+
{
|
|
16
|
+
"id": "pdf.blocks",
|
|
17
|
+
"value": 2000,
|
|
18
|
+
"unit": "blocks",
|
|
19
|
+
"per": "document",
|
|
20
|
+
"enforced_by": "types"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "pdf.text",
|
|
24
|
+
"value": 20000,
|
|
25
|
+
"unit": "characters",
|
|
26
|
+
"per": "text",
|
|
27
|
+
"enforced_by": "types"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "pdf.logo-size",
|
|
31
|
+
"value": 1048576,
|
|
32
|
+
"unit": "bytes",
|
|
33
|
+
"per": "logo",
|
|
34
|
+
"enforced_by": "types"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "pdf.time",
|
|
38
|
+
"value": 120000,
|
|
39
|
+
"unit": "ms",
|
|
40
|
+
"per": "document",
|
|
41
|
+
"enforced_by": "types"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"rules": [
|
|
45
|
+
{
|
|
46
|
+
"id": "pdf.brand-file",
|
|
47
|
+
"kind": "must",
|
|
48
|
+
"text": "Brand every PDF from the app's brand.json through defineBrand, the same file the account emails use.",
|
|
49
|
+
"enforced_by": "types",
|
|
50
|
+
"probe": "pdf.document"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "pdf.own-binding",
|
|
54
|
+
"kind": "must_not",
|
|
55
|
+
"text": "Hold a Cloudflare token for Browser Rendering or send PDFs through the Gateway (hard rules 1 and 2): print through the Worker's own BROWSER binding.",
|
|
56
|
+
"enforced_by": "review",
|
|
57
|
+
"probe": "pdf.document"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "pdf.no-page-network",
|
|
61
|
+
"kind": "must_not",
|
|
62
|
+
"text": "Let a printed page run script or load anything but data: URIs, the brand's font hosts and the origins the app lists in allowOrigins.",
|
|
63
|
+
"enforced_by": "types",
|
|
64
|
+
"probe": "pdf.html"
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"examples": [
|
|
68
|
+
{
|
|
69
|
+
"id": "pdf.example.document",
|
|
70
|
+
"title": "Print a branded invoice",
|
|
71
|
+
"lang": "ts",
|
|
72
|
+
"probe": "pdf.document",
|
|
73
|
+
"code": "import { defineBrand } from '@mccaskie-labs/workbench-config'\nimport { createPdfMaker } from '@mccaskie-labs/workbench-pdf'\nimport brandFile from '../brand.json'\n\nconst pdf = createPdfMaker({ browser: env.BROWSER, brand: defineBrand(brandFile) })\nconst bytes = await pdf.document({ title: 'Invoice 42', blocks: [{ type: 'table', columns: ['Item', 'Amount'], rows: [['Probe run', '₱112.50']] }] })\nreturn new Response(bytes, { headers: { 'content-type': 'application/pdf' } })"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"probes": [
|
|
77
|
+
{
|
|
78
|
+
"id": "pdf.document",
|
|
79
|
+
"half": "runtime",
|
|
80
|
+
"expect": "pass",
|
|
81
|
+
"smoke": true,
|
|
82
|
+
"cost_hint_usd": 0,
|
|
83
|
+
"note": "Prints the standard layout from the app's brand.json through the BROWSER binding; checks the bytes are a PDF and the page carried the brand name"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "pdf.html",
|
|
87
|
+
"half": "runtime",
|
|
88
|
+
"expect": "pass",
|
|
89
|
+
"cost_hint_usd": 0,
|
|
90
|
+
"note": "Prints the app's own HTML holding an image from a host not in allowOrigins; the PDF is made and the browser reports that image's request as blocked"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
package/capabilities/schema.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const MANIFEST_VERSION: "
|
|
1
|
+
export declare const MANIFEST_VERSION: "849b265d6d63";
|
|
2
2
|
export declare const capabilities: {
|
|
3
3
|
readonly ai: {
|
|
4
4
|
readonly $schema: "./schema.json";
|
|
@@ -1442,6 +1442,82 @@ export declare const capabilities: {
|
|
|
1442
1442
|
readonly cost_hint_usd: 0;
|
|
1443
1443
|
}];
|
|
1444
1444
|
};
|
|
1445
|
+
readonly pdf: {
|
|
1446
|
+
readonly $schema: "./schema.json";
|
|
1447
|
+
readonly format: 1;
|
|
1448
|
+
readonly component: "pdf";
|
|
1449
|
+
readonly title: "Branded PDFs";
|
|
1450
|
+
readonly summary: "workbench-pdf prints an app's content as a PDF with its brand.json logo, colours and fonts, in the app's own Worker through its Browser Rendering binding (BROWSER). Nothing goes through the Gateway and the app holds no Cloudflare token. The standard layout takes plain-text blocks; html() takes the app's own markup.";
|
|
1451
|
+
readonly status: "built";
|
|
1452
|
+
readonly surfaces: {
|
|
1453
|
+
readonly package: readonly ["createPdfMaker", "WorkbenchPdfError"];
|
|
1454
|
+
};
|
|
1455
|
+
readonly limits: readonly [{
|
|
1456
|
+
readonly id: "pdf.blocks";
|
|
1457
|
+
readonly value: 2000;
|
|
1458
|
+
readonly unit: "blocks";
|
|
1459
|
+
readonly per: "document";
|
|
1460
|
+
readonly enforced_by: "types";
|
|
1461
|
+
}, {
|
|
1462
|
+
readonly id: "pdf.text";
|
|
1463
|
+
readonly value: 20000;
|
|
1464
|
+
readonly unit: "characters";
|
|
1465
|
+
readonly per: "text";
|
|
1466
|
+
readonly enforced_by: "types";
|
|
1467
|
+
}, {
|
|
1468
|
+
readonly id: "pdf.logo-size";
|
|
1469
|
+
readonly value: 1048576;
|
|
1470
|
+
readonly unit: "bytes";
|
|
1471
|
+
readonly per: "logo";
|
|
1472
|
+
readonly enforced_by: "types";
|
|
1473
|
+
}, {
|
|
1474
|
+
readonly id: "pdf.time";
|
|
1475
|
+
readonly value: 120000;
|
|
1476
|
+
readonly unit: "ms";
|
|
1477
|
+
readonly per: "document";
|
|
1478
|
+
readonly enforced_by: "types";
|
|
1479
|
+
}];
|
|
1480
|
+
readonly rules: readonly [{
|
|
1481
|
+
readonly id: "pdf.brand-file";
|
|
1482
|
+
readonly kind: "must";
|
|
1483
|
+
readonly text: "Brand every PDF from the app's brand.json through defineBrand, the same file the account emails use.";
|
|
1484
|
+
readonly enforced_by: "types";
|
|
1485
|
+
readonly probe: "pdf.document";
|
|
1486
|
+
}, {
|
|
1487
|
+
readonly id: "pdf.own-binding";
|
|
1488
|
+
readonly kind: "must_not";
|
|
1489
|
+
readonly text: "Hold a Cloudflare token for Browser Rendering or send PDFs through the Gateway (hard rules 1 and 2): print through the Worker's own BROWSER binding.";
|
|
1490
|
+
readonly enforced_by: "review";
|
|
1491
|
+
readonly probe: "pdf.document";
|
|
1492
|
+
}, {
|
|
1493
|
+
readonly id: "pdf.no-page-network";
|
|
1494
|
+
readonly kind: "must_not";
|
|
1495
|
+
readonly text: "Let a printed page run script or load anything but data: URIs, the brand's font hosts and the origins the app lists in allowOrigins.";
|
|
1496
|
+
readonly enforced_by: "types";
|
|
1497
|
+
readonly probe: "pdf.html";
|
|
1498
|
+
}];
|
|
1499
|
+
readonly examples: readonly [{
|
|
1500
|
+
readonly id: "pdf.example.document";
|
|
1501
|
+
readonly title: "Print a branded invoice";
|
|
1502
|
+
readonly lang: "ts";
|
|
1503
|
+
readonly code: "import { defineBrand } from '@mccaskie-labs/workbench-config'\nimport { createPdfMaker } from '@mccaskie-labs/workbench-pdf'\nimport brandFile from '../brand.json'\n\nconst pdf = createPdfMaker({ browser: env.BROWSER, brand: defineBrand(brandFile) })\nconst bytes = await pdf.document({ title: 'Invoice 42', blocks: [{ type: 'table', columns: ['Item', 'Amount'], rows: [['Probe run', '₱112.50']] }] })\nreturn new Response(bytes, { headers: { 'content-type': 'application/pdf' } })";
|
|
1504
|
+
readonly probe: "pdf.document";
|
|
1505
|
+
}];
|
|
1506
|
+
readonly probes: readonly [{
|
|
1507
|
+
readonly id: "pdf.document";
|
|
1508
|
+
readonly half: "runtime";
|
|
1509
|
+
readonly expect: "pass";
|
|
1510
|
+
readonly smoke: true;
|
|
1511
|
+
readonly cost_hint_usd: 0;
|
|
1512
|
+
readonly note: "Prints the standard layout from the app's brand.json through the BROWSER binding; checks the bytes are a PDF and the page carried the brand name";
|
|
1513
|
+
}, {
|
|
1514
|
+
readonly id: "pdf.html";
|
|
1515
|
+
readonly half: "runtime";
|
|
1516
|
+
readonly expect: "pass";
|
|
1517
|
+
readonly cost_hint_usd: 0;
|
|
1518
|
+
readonly note: "Prints the app's own HTML holding an image from a host not in allowOrigins; the PDF is made and the browser reports that image's request as blocked";
|
|
1519
|
+
}];
|
|
1520
|
+
};
|
|
1445
1521
|
};
|
|
1446
1522
|
export type Alias = (typeof capabilities)["ai"]["allowed"]["aliases"][number]["alias"];
|
|
1447
1523
|
export type GatewayScope = (typeof capabilities)["gateway"]["allowed"]["scopes"][number];
|
package/dist/capabilities.gen.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Generated by `npm run capabilities:build` from capabilities/*.json. Do not edit.
|
|
2
2
|
// check:capabilities fails in Checks when this file is stale.
|
|
3
|
-
export const MANIFEST_VERSION = "
|
|
3
|
+
export const MANIFEST_VERSION = "849b265d6d63";
|
|
4
4
|
export const capabilities = {
|
|
5
5
|
"ai": {
|
|
6
6
|
"$schema": "./schema.json",
|
|
@@ -1959,5 +1959,98 @@ export const capabilities = {
|
|
|
1959
1959
|
"cost_hint_usd": 0
|
|
1960
1960
|
}
|
|
1961
1961
|
]
|
|
1962
|
+
},
|
|
1963
|
+
"pdf": {
|
|
1964
|
+
"$schema": "./schema.json",
|
|
1965
|
+
"format": 1,
|
|
1966
|
+
"component": "pdf",
|
|
1967
|
+
"title": "Branded PDFs",
|
|
1968
|
+
"summary": "workbench-pdf prints an app's content as a PDF with its brand.json logo, colours and fonts, in the app's own Worker through its Browser Rendering binding (BROWSER). Nothing goes through the Gateway and the app holds no Cloudflare token. The standard layout takes plain-text blocks; html() takes the app's own markup.",
|
|
1969
|
+
"status": "built",
|
|
1970
|
+
"surfaces": {
|
|
1971
|
+
"package": [
|
|
1972
|
+
"createPdfMaker",
|
|
1973
|
+
"WorkbenchPdfError"
|
|
1974
|
+
]
|
|
1975
|
+
},
|
|
1976
|
+
"limits": [
|
|
1977
|
+
{
|
|
1978
|
+
"id": "pdf.blocks",
|
|
1979
|
+
"value": 2000,
|
|
1980
|
+
"unit": "blocks",
|
|
1981
|
+
"per": "document",
|
|
1982
|
+
"enforced_by": "types"
|
|
1983
|
+
},
|
|
1984
|
+
{
|
|
1985
|
+
"id": "pdf.text",
|
|
1986
|
+
"value": 20000,
|
|
1987
|
+
"unit": "characters",
|
|
1988
|
+
"per": "text",
|
|
1989
|
+
"enforced_by": "types"
|
|
1990
|
+
},
|
|
1991
|
+
{
|
|
1992
|
+
"id": "pdf.logo-size",
|
|
1993
|
+
"value": 1048576,
|
|
1994
|
+
"unit": "bytes",
|
|
1995
|
+
"per": "logo",
|
|
1996
|
+
"enforced_by": "types"
|
|
1997
|
+
},
|
|
1998
|
+
{
|
|
1999
|
+
"id": "pdf.time",
|
|
2000
|
+
"value": 120000,
|
|
2001
|
+
"unit": "ms",
|
|
2002
|
+
"per": "document",
|
|
2003
|
+
"enforced_by": "types"
|
|
2004
|
+
}
|
|
2005
|
+
],
|
|
2006
|
+
"rules": [
|
|
2007
|
+
{
|
|
2008
|
+
"id": "pdf.brand-file",
|
|
2009
|
+
"kind": "must",
|
|
2010
|
+
"text": "Brand every PDF from the app's brand.json through defineBrand, the same file the account emails use.",
|
|
2011
|
+
"enforced_by": "types",
|
|
2012
|
+
"probe": "pdf.document"
|
|
2013
|
+
},
|
|
2014
|
+
{
|
|
2015
|
+
"id": "pdf.own-binding",
|
|
2016
|
+
"kind": "must_not",
|
|
2017
|
+
"text": "Hold a Cloudflare token for Browser Rendering or send PDFs through the Gateway (hard rules 1 and 2): print through the Worker's own BROWSER binding.",
|
|
2018
|
+
"enforced_by": "review",
|
|
2019
|
+
"probe": "pdf.document"
|
|
2020
|
+
},
|
|
2021
|
+
{
|
|
2022
|
+
"id": "pdf.no-page-network",
|
|
2023
|
+
"kind": "must_not",
|
|
2024
|
+
"text": "Let a printed page run script or load anything but data: URIs, the brand's font hosts and the origins the app lists in allowOrigins.",
|
|
2025
|
+
"enforced_by": "types",
|
|
2026
|
+
"probe": "pdf.html"
|
|
2027
|
+
}
|
|
2028
|
+
],
|
|
2029
|
+
"examples": [
|
|
2030
|
+
{
|
|
2031
|
+
"id": "pdf.example.document",
|
|
2032
|
+
"title": "Print a branded invoice",
|
|
2033
|
+
"lang": "ts",
|
|
2034
|
+
"code": "import { defineBrand } from '@mccaskie-labs/workbench-config'\nimport { createPdfMaker } from '@mccaskie-labs/workbench-pdf'\nimport brandFile from '../brand.json'\n\nconst pdf = createPdfMaker({ browser: env.BROWSER, brand: defineBrand(brandFile) })\nconst bytes = await pdf.document({ title: 'Invoice 42', blocks: [{ type: 'table', columns: ['Item', 'Amount'], rows: [['Probe run', '₱112.50']] }] })\nreturn new Response(bytes, { headers: { 'content-type': 'application/pdf' } })",
|
|
2035
|
+
"probe": "pdf.document"
|
|
2036
|
+
}
|
|
2037
|
+
],
|
|
2038
|
+
"probes": [
|
|
2039
|
+
{
|
|
2040
|
+
"id": "pdf.document",
|
|
2041
|
+
"half": "runtime",
|
|
2042
|
+
"expect": "pass",
|
|
2043
|
+
"smoke": true,
|
|
2044
|
+
"cost_hint_usd": 0,
|
|
2045
|
+
"note": "Prints the standard layout from the app's brand.json through the BROWSER binding; checks the bytes are a PDF and the page carried the brand name"
|
|
2046
|
+
},
|
|
2047
|
+
{
|
|
2048
|
+
"id": "pdf.html",
|
|
2049
|
+
"half": "runtime",
|
|
2050
|
+
"expect": "pass",
|
|
2051
|
+
"cost_hint_usd": 0,
|
|
2052
|
+
"note": "Prints the app's own HTML holding an image from a host not in allowOrigins; the PDF is made and the browser reports that image's request as blocked"
|
|
2053
|
+
}
|
|
2054
|
+
]
|
|
1962
2055
|
}
|
|
1963
2056
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const COMPONENTS: readonly ["gateway", "ai", "images", "image-search", "config", "email", "email-inbound", "email-sending", "database", "workers", "domains", "dns", "analytics", "country", "access", "r2", "kv", "github"];
|
|
2
|
+
export declare const COMPONENTS: readonly ["gateway", "ai", "images", "image-search", "config", "email", "email-inbound", "email-sending", "database", "workers", "domains", "dns", "analytics", "country", "pdf", "access", "r2", "kv", "github"];
|
|
3
3
|
export type Component = (typeof COMPONENTS)[number];
|
|
4
4
|
export declare const allowedSchemas: {
|
|
5
5
|
gateway: z.ZodObject<{
|
|
@@ -108,6 +108,7 @@ export declare const capabilitySchema: z.ZodObject<{
|
|
|
108
108
|
"image-search": "image-search";
|
|
109
109
|
images: "images";
|
|
110
110
|
kv: "kv";
|
|
111
|
+
pdf: "pdf";
|
|
111
112
|
r2: "r2";
|
|
112
113
|
workers: "workers";
|
|
113
114
|
}>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mccaskie-labs/workbench-config",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"description": "Workbench app configuration: WORKBENCH_ENV, typed variables that fail by name, secrets that are never printed, and the capabilities manifest.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|