@rm-industries/create-forge 0.4.0-beta.6 → 1.0.0-rc.2
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 +11 -5
- package/dist/template/.github/dependabot.yml +6 -0
- package/dist/template/.github/workflows/project.yml +3 -3
- package/dist/template/.gitignore.template +5 -0
- package/dist/template/README.md +22 -0
- package/dist/template/package-lock.json +4 -4
- package/dist/template/package.json +1 -1
- package/dist/template/playwright.config.ts +8 -0
- package/dist/template/src/components/seo/SeoHead.astro +1 -0
- package/dist/template/tests/accessibility.spec.ts +2 -2
- package/dist/template/tests/routes.spec.ts +1 -0
- package/dist/template/tests/theme.spec.ts +2 -2
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -54,8 +54,14 @@ To exercise the packed CLI across the complete generator fixture matrix:
|
|
|
54
54
|
npm run test:generator:e2e
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
This generates default, fully specified, scoped-package-name,
|
|
58
|
-
conflict fixtures in an OS temporary directory. The default
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
is removed after the
|
|
57
|
+
This generates default, fully specified, scoped-package-name, current-directory,
|
|
58
|
+
no-install, and conflict fixtures in an OS temporary directory. The default
|
|
59
|
+
fixture installs and runs the complete generated-project quality pipeline
|
|
60
|
+
outside the Forge workspace. The conflict fixture also proves that a failed
|
|
61
|
+
invocation leaves existing files unchanged. Every fixture is removed after the
|
|
62
|
+
run.
|
|
63
|
+
|
|
64
|
+
The release compatibility matrix runs the same packed fixtures with the
|
|
65
|
+
generated project's core quality gate on every supported Node line on Ubuntu
|
|
66
|
+
and on macOS. The complete end-to-end job adds the multi-browser and Lighthouse
|
|
67
|
+
checks once on the primary Node runtime.
|
|
@@ -12,6 +12,9 @@ updates:
|
|
|
12
12
|
open-pull-requests-limit: 5
|
|
13
13
|
commit-message:
|
|
14
14
|
prefix: chore
|
|
15
|
+
labels:
|
|
16
|
+
- dependencies
|
|
17
|
+
- github-actions
|
|
15
18
|
groups:
|
|
16
19
|
github-actions:
|
|
17
20
|
patterns:
|
|
@@ -30,6 +33,9 @@ updates:
|
|
|
30
33
|
open-pull-requests-limit: 5
|
|
31
34
|
commit-message:
|
|
32
35
|
prefix: chore
|
|
36
|
+
labels:
|
|
37
|
+
- dependencies
|
|
38
|
+
- npm
|
|
33
39
|
groups:
|
|
34
40
|
production-dependencies:
|
|
35
41
|
dependency-type: production
|
|
@@ -173,8 +173,8 @@ jobs:
|
|
|
173
173
|
with:
|
|
174
174
|
node-version: '26.x'
|
|
175
175
|
|
|
176
|
-
- name: Install
|
|
177
|
-
run: npx playwright install --with-deps chromium
|
|
176
|
+
- name: Install supported browsers
|
|
177
|
+
run: npx playwright install --with-deps chromium firefox webkit
|
|
178
178
|
|
|
179
179
|
- name: Run browser and accessibility tests
|
|
180
180
|
run: npm run test:e2e
|
|
@@ -259,4 +259,4 @@ jobs:
|
|
|
259
259
|
steps:
|
|
260
260
|
- name: Deploy GitHub Pages
|
|
261
261
|
id: deployment
|
|
262
|
-
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
|
|
262
|
+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
|
package/dist/template/README.md
CHANGED
|
@@ -125,6 +125,21 @@ tested content-model release first. No version is ignored, security updates
|
|
|
125
125
|
remain enabled, and every update must pass the complete project and security
|
|
126
126
|
workflows before merging.
|
|
127
127
|
|
|
128
|
+
Dependabot pull requests use `dependencies` plus the readable ecosystem label
|
|
129
|
+
`npm` or `github-actions`. GitHub ignores configured custom labels that do not
|
|
130
|
+
exist, so initialize them once after creating the repository:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
gh label create dependencies --color 0366d6 --description "Pull requests that update a dependency file" --force
|
|
134
|
+
gh label create npm --color cb3837 --description "Pull requests that update npm dependencies" --force
|
|
135
|
+
gh label create github-actions --color 2088ff --description "Pull requests that update GitHub Actions dependencies" --force
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Run these commands from the generated repository while authenticated with the
|
|
139
|
+
GitHub CLI. They are idempotent because `--force` updates an existing label. If
|
|
140
|
+
they are not run, Dependabot still opens update pull requests but omits any
|
|
141
|
+
configured label that is missing.
|
|
142
|
+
|
|
128
143
|
GitHub chooses the Dependabot run times, distributing update checks across its
|
|
129
144
|
available schedule. Forge derives distinct weekly CodeQL and workflow-validation
|
|
130
145
|
minutes from the generated package name. This keeps generation reproducible
|
|
@@ -289,6 +304,13 @@ reference in `robots.txt`. Replace `public/favicon.svg` and
|
|
|
289
304
|
`public/social-card.svg` when establishing a project identity, and update
|
|
290
305
|
`socialImage` in `src/config/site.ts` if the sharing image path changes.
|
|
291
306
|
|
|
307
|
+
Every HTML page, including `/admin/`, also includes the nonvisual, standard
|
|
308
|
+
`generator` metadata value `Forge by RM Industries`. It makes Forge-generated
|
|
309
|
+
sites identifiable in page source without adding telemetry, network requests,
|
|
310
|
+
client-side JavaScript, accessibility-tree content, or visible branding. This
|
|
311
|
+
generated project is owned source: remove or change the element in
|
|
312
|
+
`src/components/seo/SeoHead.astro` if you do not want to retain the attribution.
|
|
313
|
+
|
|
292
314
|
## Content manager
|
|
293
315
|
|
|
294
316
|
Run the development server and open `/admin/` to use Sveltia CMS. Sveltia
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"@astrojs/sitemap": "^3.7.3",
|
|
13
13
|
"@fontsource/fira-code": "^5.3.0",
|
|
14
14
|
"@fontsource/fira-sans": "^5.3.0",
|
|
15
|
-
"@rm-industries/content-model": "0.
|
|
15
|
+
"@rm-industries/content-model": "1.0.0-rc.1",
|
|
16
16
|
"@sveltia/cms": "0.203.2",
|
|
17
17
|
"astro": "^7.2.9"
|
|
18
18
|
},
|
|
@@ -5389,9 +5389,9 @@
|
|
|
5389
5389
|
}
|
|
5390
5390
|
},
|
|
5391
5391
|
"node_modules/@rm-industries/content-model": {
|
|
5392
|
-
"version": "0.
|
|
5393
|
-
"resolved": "https://registry.npmjs.org/@rm-industries/content-model/-/content-model-0.
|
|
5394
|
-
"integrity": "sha512-
|
|
5392
|
+
"version": "1.0.0-rc.1",
|
|
5393
|
+
"resolved": "https://registry.npmjs.org/@rm-industries/content-model/-/content-model-1.0.0-rc.1.tgz",
|
|
5394
|
+
"integrity": "sha512-AqsJ8X0WLjR2VXEpl45Thbfl54w4PzVAUqf2WXexpppOVEELl0VvgCVgkyIUbHpmlxb2ZbClNifY8qJoMbw4kw==",
|
|
5395
5395
|
"license": "MIT",
|
|
5396
5396
|
"engines": {
|
|
5397
5397
|
"node": "^22.22.2 || ^24.0.0 || ^26.0.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@astrojs/sitemap": "^3.7.3",
|
|
41
41
|
"@fontsource/fira-code": "^5.3.0",
|
|
42
42
|
"@fontsource/fira-sans": "^5.3.0",
|
|
43
|
-
"@rm-industries/content-model": "0.
|
|
43
|
+
"@rm-industries/content-model": "1.0.0-rc.1",
|
|
44
44
|
"@sveltia/cms": "0.203.2",
|
|
45
45
|
"astro": "^7.2.9"
|
|
46
46
|
},
|
|
@@ -19,6 +19,14 @@ export default defineConfig({
|
|
|
19
19
|
name: 'chromium',
|
|
20
20
|
use: { ...devices['Desktop Chrome'] },
|
|
21
21
|
},
|
|
22
|
+
{
|
|
23
|
+
name: 'firefox',
|
|
24
|
+
use: { ...devices['Desktop Firefox'] },
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'webkit',
|
|
28
|
+
use: { ...devices['Desktop Safari'] },
|
|
29
|
+
},
|
|
22
30
|
],
|
|
23
31
|
webServer: {
|
|
24
32
|
command: 'npm run build && npm run preview -- --host 127.0.0.1',
|
|
@@ -28,6 +28,7 @@ const socialImageUrl = new URL(resolveSiteHref(site.socialImage), new URL(site.u
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
30
|
<title>{pageTitle}</title>
|
|
31
|
+
<meta name="generator" content="Forge by RM Industries" />
|
|
31
32
|
<meta name="description" content={description} />
|
|
32
33
|
<link rel="canonical" href={canonicalUrl} />
|
|
33
34
|
<link rel="sitemap" href={resolveSiteHref('/sitemap-index.xml')} />
|
|
@@ -49,9 +49,9 @@ test('identifies the current primary navigation item', async ({ page }) => {
|
|
|
49
49
|
await expect(page.getByRole('link', { name: 'Home' })).toHaveAttribute('aria-current', 'page');
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
-
test('moves keyboard users directly to the main content', async ({ page }) => {
|
|
52
|
+
test('moves keyboard users directly to the main content', async ({ browserName, page }) => {
|
|
53
53
|
await page.goto(resolvePreviewPath('/'));
|
|
54
|
-
await page.keyboard.press('Tab');
|
|
54
|
+
await page.keyboard.press(browserName === 'webkit' && process.platform === 'darwin' ? 'Alt+Tab' : 'Tab');
|
|
55
55
|
|
|
56
56
|
const skipLink = page.getByRole('link', { name: 'Skip to content' });
|
|
57
57
|
await expect(skipLink).toBeFocused();
|
|
@@ -11,6 +11,7 @@ test('serves every baseline page with configured canonical and social metadata',
|
|
|
11
11
|
|
|
12
12
|
const canonicalUrl = new URL(resolvePreviewPath(route), site.url).href;
|
|
13
13
|
|
|
14
|
+
await expect(page.locator('meta[name="generator"]')).toHaveAttribute('content', 'Forge by RM Industries');
|
|
14
15
|
await expect(page.locator('link[rel="canonical"]')).toHaveAttribute('href', canonicalUrl);
|
|
15
16
|
await expect(page.locator('meta[property="og:site_name"]')).toHaveAttribute('content', site.name);
|
|
16
17
|
await expect(page.locator('meta[property="og:url"]')).toHaveAttribute('content', canonicalUrl);
|
|
@@ -33,14 +33,14 @@ test('makes every Catppuccin flavor available explicitly', async ({ page }) => {
|
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
test('serves fonts locally and presents a visible keyboard focus indicator', async ({ page }) => {
|
|
36
|
+
test('serves fonts locally and presents a visible keyboard focus indicator', async ({ browserName, page }) => {
|
|
37
37
|
const fontRequests: string[] = [];
|
|
38
38
|
page.on('request', (request) => {
|
|
39
39
|
if (request.resourceType() === 'font') fontRequests.push(request.url());
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
await page.goto(resolvePreviewPath('/'));
|
|
43
|
-
await page.keyboard.press('Tab');
|
|
43
|
+
await page.keyboard.press(browserName === 'webkit' && process.platform === 'darwin' ? 'Alt+Tab' : 'Tab');
|
|
44
44
|
|
|
45
45
|
await expect(page.locator('a').first()).toBeFocused();
|
|
46
46
|
await expect(page.locator('a').first()).not.toHaveCSS('outline-style', 'none');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rm-industries/create-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
4
|
"description": "Create a content-driven Forge website",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"build": "tsdown && node scripts/copy-template.ts",
|
|
34
34
|
"prepack": "npm run typecheck && npm test && npm run build",
|
|
35
35
|
"test": "vitest run",
|
|
36
|
+
"test:compatibility": "npm run build && node scripts/test-generator-e2e.ts --compatibility",
|
|
36
37
|
"test:e2e": "npm run build && node scripts/test-generator-e2e.ts",
|
|
37
38
|
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
38
39
|
"verify:package": "npm run build && node scripts/verify-package.ts"
|