edgepress 2026.9.10 → 2026.10.1

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/README.md CHANGED
@@ -30,12 +30,13 @@ Each page has a folder under content/pages/ and one lowercase locale Markdown fi
30
30
  - Choose element types inside each cell.
31
31
  - Edit each element's copy, media, links, and presentation options in that page file.
32
32
 
33
- Posts under content/posts/ use the Markdown renderer. Themes own shared head, navigation, footer, error-page layout, and their CSS color palettes.
33
+ Put images and other page media in content/assets/, preserving their public URL path. For example, content/assets/images/diagram.svg is published as /images/diagram.svg. Posts under content/posts/ use the Markdown renderer. Themes own shared head, navigation, footer, error-page layout, and their CSS color palettes.
34
34
 
35
35
  ## Project files
36
36
 
37
37
  - content/posts/<post-id>/: Markdown articles with one file per locale.
38
38
  - content/pages/<page-id>/: page layouts and all page element content.
39
+ - content/assets/: page images and other content media, copied to the output root with matching paths.
39
40
  - themes/default/, themes/atelier/, themes/signal/: shared HTML layouts, partials, and theme styles. Themes installed from npm or created as a blank scaffold live here too.
40
41
  - config.yml: site metadata, navigation, privacy settings, and consent-gated browser services.
41
42
  - edgepress.config.mjs: paths, permalink, locales, and trusted build-time plugins.
@@ -67,6 +68,6 @@ The main navigation includes a Posts entry to the localized article archive. The
67
68
 
68
69
  Project guides are published from content/pages/: project introduction, quick start, theme development, plugin development, and privacy policy. The starter config uses `https://edgepress.js.gripe` and credits `toewpq`. Before production use, confirm that the configured operator name identifies the responsible person or organization and complete any applicable representative or data protection officer details.
69
70
 
70
- Version 2026.9.10 records the tenth requested release update for September 2026. See 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/).
71
+ 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/).
71
72
 
72
- This release keeps privacy choices across locale changes, adds localized page-block links, improves article tag links, loads search code only on search pages, redraws two SVG icons, and simplifies privacy wording. Optional services remain disabled until a visitor makes an explicit choice.
73
+ 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.
File without changes
@@ -40,6 +40,7 @@ blocks:
40
40
  - Use double-brace placeholders for escaped values. The approved raw placeholders are generated page content, JSON-LD, and EdgePress-generated navigation markup. Keep the skip link, one main landmark, labeled navigation, visible focus, and one page-level h1.
41
41
  - Page-block links can use /[launge]/quick-start/. The generated page replaces [launge] with the current language path and removes the segment for the default language, so the same link works in both locales.
42
42
  - Keep the body as a full-height vertical layout and let main grow so the footer stays at the bottom on short pages.
43
+ - Put page images and downloads in content/assets/. EdgePress publishes each file at its matching site-root path. For example, content/assets/images/diagram.svg becomes /images/diagram.svg. Keep themes/<name>/assets/ for shared CSS and JavaScript.
43
44
  - Style shared code blocks, copy buttons, and article contents in the theme. Code lines wrap on small viewports, copy controls have visible keyboard focus, and the generated post contents list links to heading anchors.
44
45
  -
45
46
  - type: section
@@ -128,4 +129,4 @@ blocks:
128
129
  - title: Posts use Markdown
129
130
  icon: file-text
130
131
  text: Write and publish an article.
131
- ---
132
+ ---
@@ -40,6 +40,7 @@ blocks:
40
40
  - 使用双花括号占位符输出经过转义的值。唯一允许的原样占位符是生成的页面内容、JSON-LD 和 EdgePress 生成的导航标记。保留跳转链接、唯一 main 主区域、带标签的导航、可见焦点和一个页面级 h1。
41
41
  - 页面块中的站内链接可写成 /[launge]/quick-start/。生成页面会把 [launge] 替换为当前语言路径;默认语言会移除该段,因此同一链接可用于中英文页面。
42
42
  - 将 body 保持为全高纵向布局,并让 main 延伸,这样短页面的页脚也会留在视口底部。
43
+ - 将页面图片和下载文件放在 content/assets/。EdgePress 会按原相对路径发布到站点根目录,例如 content/assets/images/diagram.svg 对应 /images/diagram.svg。themes/<name>/assets/ 用于共享 CSS 和 JavaScript。
43
44
  - 在主题中统一设计代码块、复制按钮和文章目录。窄屏代码行会自动折行,复制控件具有清晰的键盘焦点,生成的文章目录会链接到标题锚点。
44
45
  -
45
46
  - type: section
@@ -128,4 +129,4 @@ blocks:
128
129
  - title: 文章使用 Markdown
129
130
  icon: file-text
130
131
  text: 撰写并发布文章。
131
- ---
132
+ ---
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: "EdgePress October 2026 update"
3
+ author: toewpq
4
+ date: 2026-10-01
5
+ lang: en
6
+ slug: edgepress-release-2026-10-1
7
+ tags:
8
+ - release
9
+ - assets
10
+ - security
11
+ description: Publish page media from content/assets, update Wrangler, and add automated dependency and release security checks.
12
+ ---
13
+
14
+ This release starts the October 2026 update series.
15
+
16
+ ## Publish page media from content/assets
17
+
18
+ Files under `content/assets/` are now published at matching site-root paths. For example, `content/assets/images/diagram.svg` becomes `/images/diagram.svg`. Shared theme CSS and JavaScript remain in each theme's `assets/` directory.
19
+
20
+ ## Update build dependencies
21
+
22
+ Wrangler is updated to 4.144.0 along with its Cloudflare runtime dependencies. Dependabot now checks npm packages and GitHub Actions weekly, and a scheduled workflow runs `npm audit` and the project build.
23
+
24
+ ## Scan version builds
25
+
26
+ The Codex Security workflow can scan a version build when manually started or when an enabled version tag is pushed. Completed findings are uploaded to GitHub Code Scanning. Tag scans require the `CODEX_SECURITY_ENABLED` repository variable, and every scan requires the `OPENAI_API_KEY` Actions secret.
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: EdgePress 2026 年 10 月更新
3
+ author: toewpq
4
+ date: 2026-10-01
5
+ lang: zh-cn
6
+ slug: edgepress-release-2026-10-1
7
+ tags:
8
+ - 发布
9
+ - 资源
10
+ - 安全
11
+ description: 发布 content/assets 中的页面资源,更新 Wrangler,并加入自动依赖检查和版本安全扫描。
12
+ ---
13
+
14
+ 本次更新开启 EdgePress 2026 年 10 月更新系列。
15
+
16
+ ## 从 content/assets 发布页面资源
17
+
18
+ 现在,`content/assets/` 中的文件会按相同路径发布到站点根目录。例如,`content/assets/images/diagram.svg` 会生成 `/images/diagram.svg`。共享主题 CSS 和 JavaScript 仍放在各主题的 `assets/` 目录中。
19
+
20
+ ## 更新构建依赖
21
+
22
+ Wrangler 更新至 4.144.0,并同步更新 Cloudflare 运行时依赖。Dependabot 现在每周检查 npm 包和 GitHub Actions;定时工作流会运行 `npm audit` 和项目构建。
23
+
24
+ ## 扫描版本构建
25
+
26
+ 手动启动或推送已启用的版本标签时,Codex Security 工作流可以扫描版本构建,并将完成的发现上传到 GitHub Code Scanning。标签扫描需要仓库变量 `CODEX_SECURITY_ENABLED`,所有扫描都需要 Actions 密钥 `OPENAI_API_KEY`。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edgepress",
3
- "version": "2026.9.10",
3
+ "version": "2026.10.1",
4
4
  "description": "A static website builder for Cloudflare Workers with editable pages, Markdown posts, local search, themes, and consent-gated integrations.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -54,6 +54,6 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "playwright": "^1.63.0",
57
- "wrangler": "^4.129.1"
57
+ "wrangler": "^4.144.0"
58
58
  }
59
59
  }
package/src/assets.js CHANGED
@@ -79,16 +79,17 @@ function rewriteCodeReferences(item, text, outputByOriginal) {
79
79
 
80
80
  export async function collectAssets(config) {
81
81
  const sources = [];
82
- for (const source of await walk(config.resolvedPaths.static)) {
83
- const path = relative(config.resolvedPaths.static, source).split(sep).join('/');
84
- if (path.split('/').includes('.gitkeep')) continue;
85
- sources.push({ source, path });
86
- }
87
- const themeAssets = resolve(config.resolvedPaths.theme, 'assets');
88
- for (const source of await walk(themeAssets)) {
89
- const path = relative(themeAssets, source).split(sep).join('/');
90
- if (path.split('/').includes('.gitkeep')) continue;
91
- sources.push({ source, path });
82
+ const directories = [
83
+ { root: config.resolvedPaths.static, name: 'static' },
84
+ { root: resolve(config.resolvedPaths.content, 'assets'), name: 'content/assets' },
85
+ { root: resolve(config.resolvedPaths.theme, 'assets'), name: 'theme assets' }
86
+ ];
87
+ for (const { root, name } of directories) {
88
+ for (const source of await walk(root)) {
89
+ const path = relative(root, source).split(sep).join('/');
90
+ if (path.split('/').includes('.gitkeep')) continue;
91
+ sources.push({ source, path, sourceName: name });
92
+ }
92
93
  }
93
94
 
94
95
  const headers = [];
@@ -104,11 +105,14 @@ export async function collectAssets(config) {
104
105
  content: isCodeAsset(item.path) ? await readFile(item.source) : null
105
106
  }))
106
107
  ]);
107
- const originals = new Set();
108
+ const originals = new Map();
108
109
  for (const item of items) {
109
110
  const normalized = item.path.toLowerCase();
110
- if (originals.has(normalized)) throw new Error('Static and theme assets have the same output path: ' + item.path);
111
- originals.add(normalized);
111
+ const previousSource = originals.get(normalized);
112
+ if (previousSource) {
113
+ throw new Error(previousSource + ' and ' + item.sourceName + ' assets have the same output path: ' + item.path);
114
+ }
115
+ originals.set(normalized, item.sourceName);
112
116
  }
113
117
  const byOriginal = new Map(items.map((item) => [item.path, item]));
114
118
  const dependencies = new Map();