edgepress 2026.10.12 → 2026.10.13

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 (57) hide show
  1. package/README.md +12 -2
  2. package/config.yml +171 -171
  3. package/content/assets/edgepress/brand/sources/export-manifest.json +181 -181
  4. package/content/assets/edgepress-markdown-guide.svg +21 -21
  5. package/content/guides/markdown-media.md +38 -0
  6. package/content/guides/product-demos.md +30 -30
  7. package/content/pages/deployment/en.json +1 -1
  8. package/content/posts/2026-09-24-edgepress-release-2026-9-1/en.md +1 -1
  9. package/content/posts/2026-09-24-edgepress-release-2026-9-1/zh-cn.md +1 -1
  10. package/languages/base/en.json +98 -98
  11. package/languages/packs/zh-CN.json +98 -98
  12. package/package.json +90 -90
  13. package/src/assets.js +187 -186
  14. package/src/browser-audit.js +158 -158
  15. package/src/build.js +293 -291
  16. package/src/cli.js +364 -364
  17. package/src/content.js +233 -233
  18. package/src/data-saver.js +3 -3
  19. package/src/generators.js +414 -420
  20. package/src/i18n.js +86 -86
  21. package/src/markdown.js +195 -160
  22. package/src/page-check.js +1 -1
  23. package/src/plugin-api.js +77 -77
  24. package/src/report-visuals.js +642 -642
  25. package/src/revision-cards.js +30 -30
  26. package/src/rss.js +100 -0
  27. package/src/theme.js +4 -4
  28. package/src/video-metadata.js +36 -0
  29. package/static/edgepress/fonts/faces.css +2217 -2217
  30. package/static/edgepress/media-viewer.js +67 -10
  31. package/static/edgepress/project-demo.js +83 -83
  32. package/static/edgepress/search.js +84 -84
  33. package/tests/assets-runtime.test.mjs +26 -26
  34. package/tests/audit.test.mjs +142 -142
  35. package/tests/brand-regression.test.mjs +110 -110
  36. package/tests/document-package.test.mjs +2 -2
  37. package/tests/embed-syntax.test.mjs +68 -68
  38. package/tests/image-viewer.test.mjs +36 -36
  39. package/tests/markdown-media.test.mjs +119 -0
  40. package/tests/oembed-layout.test.mjs +6 -1
  41. package/tests/project-demo.test.mjs +73 -73
  42. package/tests/release-version.test.mjs +28 -0
  43. package/tests/rss.test.mjs +54 -0
  44. package/tests/video-metadata.test.mjs +28 -0
  45. package/tests/writing.test.mjs +83 -83
  46. package/themes/atelier/assets/style.css +340 -340
  47. package/themes/default/assets/style.css +371 -371
  48. package/themes/default/layouts/partials/head.html +1 -1
  49. package/themes/folio/assets/style.css +515 -515
  50. package/themes/folio/theme.json +5 -5
  51. package/themes/signal/assets/style.css +332 -332
  52. package/tools/README.md +10 -10
  53. package/tools/assets/generate-brand-assets.py +160 -160
  54. package/tools/assets/video-preview.mjs +15 -0
  55. package/tools/recordings/demo-workbench.mjs +53 -53
  56. package/tools/recordings/desktop-recording.mjs +70 -70
  57. package/tools/recordings/vm-desktop.mjs +59 -59
package/README.md CHANGED
@@ -49,6 +49,16 @@ Use Node.js 22.12 or newer. Set the real site URL and operator contact in config
49
49
 
50
50
  Run `edgepress init` in a new project directory to scaffold a site pinned to the installed EdgePress release. The initializer keeps the existing package name and scripts.
51
51
 
52
+ ## Maintainer npm and GitHub releases
53
+
54
+ Releases use **year.month.number of updates in that month**, not the calendar day. For example, `2026.10.12` is the twelfth update in October 2026; `2026.10.13` follows it, and November starts at `2026.11.1`. The release workflow uses **UTC** for the month boundary and checks `package.json`, existing `vYYYY.M.N` tags and published npm versions to avoid reusing a version.
55
+
56
+ Once the npm package owner has configured **Trusted Publishing** at [npmjs.com](https://www.npmjs.com/package/edgepress/access), choose GitHub Actions with owner `jsw-teams`, repository `edgepress`, workflow filename **`publish.yml`**, and allow **`npm publish`** (not only staging). No environment name is used. This is a one-time npm-side setup; no long-lived `NPM_TOKEN` is required. Restrict traditional publish tokens after confirming the first successful trusted publish.
57
+
58
+ To publish new source, a repository maintainer opens **Actions → Publish npm and GitHub Release → Run workflow** on `main`. The manual-only job installs Node 22 and npm 11, determines the next monthly update number, updates both package manifests, audits dependencies, runs the full browser test suite, builds the project and packs the source. Only after all checks pass does it push a non-force release commit and tag, publish that exact archive to npm with provenance, and create a GitHub Release containing the same `.tgz` and SHA-256 checksum. Ordinary pushes and PRs cannot trigger a publish.
59
+
60
+ **Recovery:** If a run fails *after* pushing its version tag, do not launch a new release blindly: check whether the tag, npm version or GitHub Release already exists and reconcile the incomplete publish first. npm versions cannot be overwritten. Protected branches must explicitly permit the GitHub Actions bot to create the release commit/tag or use a maintainer-approved release branch process.
61
+
52
62
  ## External link prompts
53
63
 
54
64
  The optional local prompt shows the complete destination URL (including path, query and fragment) once, with no duplicate hostname, and lets the visitor return or continue. It makes no request to the destination before confirmation. Configure exact origins, not wildcard domains:
@@ -173,7 +183,7 @@ Project guides are published from content/pages/: project introduction, quick st
173
183
 
174
184
  Version 2026.10.1 starts the October 2026 release series. Read the [October release notes](content/posts/2026-10-01-edgepress-release-2026-10-1/). The September updates are recorded in the [request 1 notes](content/posts/2026-09-24-edgepress-release-2026-9-1/), [request 2 notes](content/posts/2026-09-25-edgepress-release-2026-9-2/), [request 3 notes](content/posts/2026-09-25-edgepress-release-2026-9-3/), [request 4 notes](content/posts/2026-09-25-edgepress-release-2026-9-4/), [request 5 notes](content/posts/2026-09-25-edgepress-release-2026-9-5/), [request 6 notes](content/posts/2026-09-25-edgepress-release-2026-9-6/), [request 7 notes](content/posts/2026-09-26-edgepress-release-2026-9-7/), [request 8 notes](content/posts/2026-09-26-edgepress-release-2026-9-8/), [request 9 notes](content/posts/2026-09-26-edgepress-release-2026-9-9/), and [request 10 notes](content/posts/2026-09-27-edgepress-release-2026-9-10/).
175
185
 
176
- This release publishes page media from content/assets/, updates Wrangler to 4.144.0, and adds scheduled dependency checks and version-scoped Codex Security scans. Optional services remain disabled until a visitor makes an explicit choice.
186
+ This release publishes page media from content/assets/ and updates Wrangler to 4.144.0. GitHub Actions retains only scheduled and lockfile-change dependency security audits. Optional services remain disabled until a visitor makes an explicit choice.
177
187
 
178
188
  ## Journal categories, navigation, and author profiles
179
189
 
@@ -227,7 +237,7 @@ Multiple post lists on the same page share a displayed-article set: an article a
227
237
 
228
238
  ## Static platform deployment
229
239
 
230
- Run npm run deploy:cloudflare, npm run deploy:vercel, npm run deploy:netlify, npm run deploy:edgeone -- -n my-site, or npm run deploy:esa -- --name my-site. Platform authentication is required. GitHub Actions also provides a manual Deploy static website workflow using repository Secrets.
240
+ Run npm run deploy:cloudflare, npm run deploy:vercel, npm run deploy:netlify, npm run deploy:edgeone -- -n my-site, or npm run deploy:esa -- --name my-site. Platform authentication is required. Deployments run locally; GitHub Actions is limited to dependency security audits.
231
241
 
232
242
 
233
243
  All platforms build dist/. CSS and JS are fingerprinted, with one-year immutable cache policies for Cloudflare, Vercel, Netlify and EdgeOne. ESA uses the same assets; set its browser and edge cache rules for hashed CSS/JS while leaving HTML short-lived. See the [deployment guide](content/pages/deployment/en.json) and [ESA build configuration](https://help.aliyun.com/en/edge-security-acceleration/esa/user-guide/build-pages).
package/config.yml CHANGED
@@ -1,10 +1,10 @@
1
1
  # Site configuration (site, theme, privacy, optional consent services).
2
2
  # Build paths and enabled locales belong to edgepress.config.mjs.
3
- site:
4
- timeZone: Asia/Taipei
5
- title: EdgePress
6
- description: A static website builder for Cloudflare Workers with editable pages, Markdown posts, themes, and plugins.
7
- url: https://example.org
3
+ site:
4
+ timeZone: Asia/Taipei
5
+ title: EdgePress
6
+ description: A static website builder for Cloudflare Workers with editable pages, Markdown posts, themes, and plugins.
7
+ url: https://example.org
8
8
  language: en
9
9
  dataSaver: # site (optional text view; requires the theme dataSaver assets)
10
10
  enabled: false
@@ -13,169 +13,169 @@ site:
13
13
  detectSlowConnection: false
14
14
  respectBrowserPreference: false
15
15
  promptAfterMs: 5000
16
- head:
17
- titleSuffix: ""
18
- titleSeparator: " · "
19
- header:
20
- showBrand: true
21
- brandLabel: ""
22
- components:
23
- header: true
24
- primaryNavigation: true
25
- languageNavigation: true
26
- footer: true
27
- footerNavigation: true
28
- navigation:
29
- - key: home
30
- url: "@home"
31
- labels:
32
- en: Home
33
- zh-CN: 首页
34
- - key: guides
35
- url: /project-introduction/
36
- labels:
37
- en: Guides
38
- zh-CN: 项目指南
39
- - key: quick-start
40
- url: /quick-start/
41
- labels:
42
- en: Quick start
43
- zh-CN: 快速入门
44
- - key: posts
45
- url: "@archives"
46
- labels:
47
- en: Posts
48
- zh-CN: 文章
49
- - key: search
50
- url: "@search"
51
- labels:
52
- en: Search
53
- zh-CN: 搜索
54
- footerNavigation:
55
- - key: privacy
56
- url: /privacy-policy/
57
- labels:
58
- en: Privacy policy
59
- zh-CN: 隐私政策
60
- - key: feed
61
- url: "@feed"
62
- labels:
63
- en: Atom feed
64
- zh-CN: Atom 订阅
65
- footer: ""
66
- author:
67
- name: toewpq
68
- avatar: /edgepress/brand/avatar.png
69
- seo:
70
- author: toewpq
71
- keywords:
72
- - Markdown website builder
73
- - Cloudflare Workers
74
- - static site generator
75
- image: https://example.org/edgepress/brand/og-image.png
76
- robots: index,follow
77
- agentSeo:
78
- enabled: true
79
- summary: A static website builder for Cloudflare Workers, with row-based editable pages, Markdown posts,
80
- themes, plugins, and consent-gated integrations.
81
- topics:
82
- - Markdown website builder
83
- - Cloudflare Workers
84
- - composable page blocks
85
- - plugin development
86
- llmsTxt: true
87
- agentCrawlers:
88
- - GPTBot
89
- - ClaudeBot
90
- - PerplexityBot
91
- privacy:
92
- controller:
93
- name: toewpq
94
- contact: toewpq@gmail.com
95
- policyUrl: /privacy-policy/
96
- plugins:
97
- consent:
98
- enabled: true
99
- proposedDate: 2026-09-26
100
- effectiveDate: 2026-09-26
101
- expiresDays: 180
102
- services:
103
- - id: cloudflare-web-analytics
104
- provider: cloudflare-web-analytics
105
- name:
106
- en: Cloudflare Web Analytics
107
- zh-CN: Cloudflare 网站分析
108
- purpose:
109
- en: Measure visits and page performance to improve this site, only after you opt in.
110
- zh-CN: 在你同意后统计访问与页面性能,用于改进本站。
111
- dataCategories:
112
- en: Performance timing and page-view metrics; dimensions can include path, referrer, device, browser,
113
- operating system, and country. Cloudflare receives the beacon request's source IP and says it
114
- discards it at the nearest data center without storing it in core databases or logs.
115
- zh-CN: 性能计时和页面浏览指标,维度可能包括页面路径、来源页、设备、浏览器、操作系统和国家或地区。Cloudflare 会在信标请求中接收来源 IP,并表示会在最近的数据中心将其丢弃,不保存到核心数据库或日志中。
116
- recipient:
117
- en: Cloudflare, Inc.
118
- zh-CN: Cloudflare, Inc.
119
- retention:
120
- en: Unsampled beacon data is kept for 7 days, then aggregated to about 10% for long-term storage. Dashboard
121
- history is available for 6 months.
122
- zh-CN: 未采样的信标数据保留 7 天,之后会汇总为约 10% 的长期数据。仪表板可查看最近 6 个月的历史记录。
123
- privacyUrl: https://developers.cloudflare.com/speed/observatory/rum-beacon/
124
- token: 8347d72ba9f84e6783bf441e7832a80e
125
- - id: youtube
126
- provider: oembed
127
- enabled: true
128
- name: YouTube
129
- purpose:
130
- en: With your permission, load YouTube media and its player on request.
131
- zh-CN: 在你同意后,按你的请求加载 YouTube 分享内容及播放器。
132
- dataCategories:
133
- en: Requested content URL, IP address, browser information; provider cookies may be used after loading.
134
- zh-CN: 请求的内容链接、IP 地址、浏览器信息;加载后平台可能使用其 Cookie。
135
- recipient: YouTube
136
- retention:
137
- en: The site keeps the consent choice for 180 days; provider retention follows its linked privacy policy.
138
- zh-CN: 本站保存授权选择 180 天;平台处理与保留规则见所链接的隐私政策。
139
- privacyUrl: https://policies.google.com/privacy
140
- backendUrl: https://www.youtube.com
141
- oembedEndpoint: https://www.youtube.com/oembed
142
- sourceOrigins:
143
- - https://www.youtube.com
144
- - https://youtu.be
145
- - https://youtube.com
146
- - https://m.youtube.com
147
- embedOrigins:
148
- - https://www.youtube.com
149
- - https://www.youtube-nocookie.com
150
- - id: x-posts
151
- provider: oembed
152
- enabled: true
153
- name: X
154
- purpose:
155
- en: With your permission, load X media and its player on request.
156
- zh-CN: 在你同意后,按你的请求加载 X 分享内容及播放器。
157
- dataCategories:
158
- en: Requested content URL, IP address, browser information; provider cookies may be used after loading.
159
- zh-CN: 请求的内容链接、IP 地址、浏览器信息;加载后平台可能使用其 Cookie。
160
- recipient: X
161
- retention:
162
- en: The site keeps the consent choice for 180 days; provider retention follows its linked privacy policy.
163
- zh-CN: 本站保存授权选择 180 天;平台处理与保留规则见所链接的隐私政策。
164
- privacyUrl: https://x.com/en/privacy
165
- backendUrl: https://x.com
166
- oembedEndpoint: https://publish.x.com/oembed
167
- sourceOrigins:
168
- - https://x.com
169
- - https://twitter.com
170
- - https://www.x.com
171
- - https://www.twitter.com
172
- embedOrigins:
173
- - https://platform.x.com
174
- - https://platform.twitter.com
175
- - https://syndication.twitter.com
176
- - https://cdn.syndication.twimg.com
177
- - https://pbs.twimg.com
178
- - https://abs.twimg.com
179
- - https://video.twimg.com
180
- embedScripts:
181
- - https://platform.x.com/widgets.js
16
+ head:
17
+ titleSuffix: ""
18
+ titleSeparator: " · "
19
+ header:
20
+ showBrand: true
21
+ brandLabel: ""
22
+ components:
23
+ header: true
24
+ primaryNavigation: true
25
+ languageNavigation: true
26
+ footer: true
27
+ footerNavigation: true
28
+ navigation:
29
+ - key: home
30
+ url: "@home"
31
+ labels:
32
+ en: Home
33
+ zh-CN: 首页
34
+ - key: guides
35
+ url: /project-introduction/
36
+ labels:
37
+ en: Guides
38
+ zh-CN: 项目指南
39
+ - key: quick-start
40
+ url: /quick-start/
41
+ labels:
42
+ en: Quick start
43
+ zh-CN: 快速入门
44
+ - key: posts
45
+ url: "@archives"
46
+ labels:
47
+ en: Posts
48
+ zh-CN: 文章
49
+ - key: search
50
+ url: "@search"
51
+ labels:
52
+ en: Search
53
+ zh-CN: 搜索
54
+ footerNavigation:
55
+ - key: privacy
56
+ url: /privacy-policy/
57
+ labels:
58
+ en: Privacy policy
59
+ zh-CN: 隐私政策
60
+ - key: feed
61
+ url: "@feed"
62
+ labels:
63
+ en: Atom feed
64
+ zh-CN: Atom 订阅
65
+ footer: ""
66
+ author:
67
+ name: toewpq
68
+ avatar: /edgepress/brand/avatar.png
69
+ seo:
70
+ author: toewpq
71
+ keywords:
72
+ - Markdown website builder
73
+ - Cloudflare Workers
74
+ - static site generator
75
+ image: https://example.org/edgepress/brand/og-image.png
76
+ robots: index,follow
77
+ agentSeo:
78
+ enabled: true
79
+ summary: A static website builder for Cloudflare Workers, with row-based editable pages, Markdown posts,
80
+ themes, plugins, and consent-gated integrations.
81
+ topics:
82
+ - Markdown website builder
83
+ - Cloudflare Workers
84
+ - composable page blocks
85
+ - plugin development
86
+ llmsTxt: true
87
+ agentCrawlers:
88
+ - GPTBot
89
+ - ClaudeBot
90
+ - PerplexityBot
91
+ privacy:
92
+ controller:
93
+ name: toewpq
94
+ contact: toewpq@gmail.com
95
+ policyUrl: /privacy-policy/
96
+ plugins:
97
+ consent:
98
+ enabled: true
99
+ proposedDate: 2026-09-26
100
+ effectiveDate: 2026-09-26
101
+ expiresDays: 180
102
+ services:
103
+ - id: cloudflare-web-analytics
104
+ provider: cloudflare-web-analytics
105
+ name:
106
+ en: Cloudflare Web Analytics
107
+ zh-CN: Cloudflare 网站分析
108
+ purpose:
109
+ en: Measure visits and page performance to improve this site, only after you opt in.
110
+ zh-CN: 在你同意后统计访问与页面性能,用于改进本站。
111
+ dataCategories:
112
+ en: Performance timing and page-view metrics; dimensions can include path, referrer, device, browser,
113
+ operating system, and country. Cloudflare receives the beacon request's source IP and says it
114
+ discards it at the nearest data center without storing it in core databases or logs.
115
+ zh-CN: 性能计时和页面浏览指标,维度可能包括页面路径、来源页、设备、浏览器、操作系统和国家或地区。Cloudflare 会在信标请求中接收来源 IP,并表示会在最近的数据中心将其丢弃,不保存到核心数据库或日志中。
116
+ recipient:
117
+ en: Cloudflare, Inc.
118
+ zh-CN: Cloudflare, Inc.
119
+ retention:
120
+ en: Unsampled beacon data is kept for 7 days, then aggregated to about 10% for long-term storage. Dashboard
121
+ history is available for 6 months.
122
+ zh-CN: 未采样的信标数据保留 7 天,之后会汇总为约 10% 的长期数据。仪表板可查看最近 6 个月的历史记录。
123
+ privacyUrl: https://developers.cloudflare.com/speed/observatory/rum-beacon/
124
+ token: 8347d72ba9f84e6783bf441e7832a80e
125
+ - id: youtube
126
+ provider: oembed
127
+ enabled: true
128
+ name: YouTube
129
+ purpose:
130
+ en: With your permission, load YouTube media and its player on request.
131
+ zh-CN: 在你同意后,按你的请求加载 YouTube 分享内容及播放器。
132
+ dataCategories:
133
+ en: Requested content URL, IP address, browser information; provider cookies may be used after loading.
134
+ zh-CN: 请求的内容链接、IP 地址、浏览器信息;加载后平台可能使用其 Cookie。
135
+ recipient: YouTube
136
+ retention:
137
+ en: The site keeps the consent choice for 180 days; provider retention follows its linked privacy policy.
138
+ zh-CN: 本站保存授权选择 180 天;平台处理与保留规则见所链接的隐私政策。
139
+ privacyUrl: https://policies.google.com/privacy
140
+ backendUrl: https://www.youtube.com
141
+ oembedEndpoint: https://www.youtube.com/oembed
142
+ sourceOrigins:
143
+ - https://www.youtube.com
144
+ - https://youtu.be
145
+ - https://youtube.com
146
+ - https://m.youtube.com
147
+ embedOrigins:
148
+ - https://www.youtube.com
149
+ - https://www.youtube-nocookie.com
150
+ - id: x-posts
151
+ provider: oembed
152
+ enabled: true
153
+ name: X
154
+ purpose:
155
+ en: With your permission, load X media and its player on request.
156
+ zh-CN: 在你同意后,按你的请求加载 X 分享内容及播放器。
157
+ dataCategories:
158
+ en: Requested content URL, IP address, browser information; provider cookies may be used after loading.
159
+ zh-CN: 请求的内容链接、IP 地址、浏览器信息;加载后平台可能使用其 Cookie。
160
+ recipient: X
161
+ retention:
162
+ en: The site keeps the consent choice for 180 days; provider retention follows its linked privacy policy.
163
+ zh-CN: 本站保存授权选择 180 天;平台处理与保留规则见所链接的隐私政策。
164
+ privacyUrl: https://x.com/en/privacy
165
+ backendUrl: https://x.com
166
+ oembedEndpoint: https://publish.x.com/oembed
167
+ sourceOrigins:
168
+ - https://x.com
169
+ - https://twitter.com
170
+ - https://www.x.com
171
+ - https://www.twitter.com
172
+ embedOrigins:
173
+ - https://platform.x.com
174
+ - https://platform.twitter.com
175
+ - https://syndication.twitter.com
176
+ - https://cdn.syndication.twimg.com
177
+ - https://pbs.twimg.com
178
+ - https://abs.twimg.com
179
+ - https://video.twimg.com
180
+ embedScripts:
181
+ - https://platform.x.com/widgets.js