ferst-core 0.9.6 → 0.9.7
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/bin/cms-config.mjs +4 -47
- package/bin/ferst-modules.mjs +1 -1
- package/components/recipes/Form.astro +1 -1
- package/lib/git-base.mjs +62 -0
- package/package.json +1 -1
package/bin/cms-config.mjs
CHANGED
|
@@ -60,53 +60,10 @@ export function repoSlug() {
|
|
|
60
60
|
return '';
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
* The platform git-proxy origin (CMS `base_url` / `api_root`) for THIS build:
|
|
68
|
-
* 1. `FERST_GIT_BASE` env — explicit override, always wins.
|
|
69
|
-
* 2. committed `ferst-site.json` `gitBase` — an explicit per-site pin (e.g. a
|
|
70
|
-
* custom proxy); a BYO/seeded site can hard-bind its origin this way.
|
|
71
|
-
* 3. otherwise DERIVE from the deploy environment: the production branch talks to
|
|
72
|
-
* the prod git-proxy, every other (preview/dev) branch talks to the dev
|
|
73
|
-
* git-proxy. So a templated repo self-configures per environment on deploy — a
|
|
74
|
-
* dev-branch build points its CMS at the dev worker and main at prod — with NO
|
|
75
|
-
* per-client config. (The production branch defaults to `main`; override via
|
|
76
|
-
* `FERST_PROD_BRANCH` env or `ferst-site.json` `productionBranch`.)
|
|
77
|
-
* This restores the "site respects the environment it's deployed in" binding the old
|
|
78
|
-
* per-branch site config gave, without a per-client file to maintain.
|
|
79
|
-
*/
|
|
80
|
-
export function resolveGitBase(cwd = process.cwd(), branch = deploymentBranch()) {
|
|
81
|
-
const fromEnv = env('FERST_GIT_BASE');
|
|
82
|
-
if (fromEnv) return fromEnv;
|
|
83
|
-
let prodBranch = env('FERST_PROD_BRANCH') || 'main';
|
|
84
|
-
try {
|
|
85
|
-
const site = JSON.parse(readFileSync(resolve(cwd, 'ferst-site.json'), 'utf8'));
|
|
86
|
-
if (site && typeof site.gitBase === 'string' && site.gitBase.trim()) return site.gitBase.trim();
|
|
87
|
-
if (!env('FERST_PROD_BRANCH') && site && typeof site.productionBranch === 'string' && site.productionBranch.trim()) {
|
|
88
|
-
prodBranch = site.productionBranch.trim();
|
|
89
|
-
}
|
|
90
|
-
} catch {
|
|
91
|
-
/* no ferst-site.json (e.g. the template repo itself) — derive from the branch */
|
|
92
|
-
}
|
|
93
|
-
return branch === prodBranch ? PROD_GIT_BASE : DEV_GIT_BASE;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** The deployment branch: CF Pages env → current git branch → main. */
|
|
97
|
-
export function deploymentBranch() {
|
|
98
|
-
const cf = env('CF_PAGES_BRANCH');
|
|
99
|
-
if (cf) return cf;
|
|
100
|
-
try {
|
|
101
|
-
const git = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
102
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
103
|
-
}).toString().trim();
|
|
104
|
-
if (git && git !== 'HEAD') return git;
|
|
105
|
-
} catch {
|
|
106
|
-
/* not a git checkout — fall through */
|
|
107
|
-
}
|
|
108
|
-
return 'main';
|
|
109
|
-
}
|
|
63
|
+
// The git-proxy origin lives in lib/git-base.mjs, which components can import: this file is a
|
|
64
|
+
// build-time script whose module scope needs a real filesystem (TEMPLATE_PATH).
|
|
65
|
+
export { PROD_GIT_BASE, DEV_GIT_BASE, resolveGitBase, deploymentBranch } from '../lib/git-base.mjs';
|
|
66
|
+
import { resolveGitBase, deploymentBranch } from '../lib/git-base.mjs';
|
|
110
67
|
|
|
111
68
|
/** Ferst's managed GitHub org: its sites are on the Basic plan. */
|
|
112
69
|
const MANAGED_OWNER = 'myai4webdev';
|
package/bin/ferst-modules.mjs
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import { readFileSync, realpathSync } from 'node:fs';
|
|
13
13
|
import { resolve } from 'node:path';
|
|
14
14
|
import { pathToFileURL } from 'node:url';
|
|
15
|
-
import { resolveGitBase } from '
|
|
15
|
+
import { resolveGitBase } from '../lib/git-base.mjs';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* True when THIS file is run as a CLI (not imported). Each bin needs its own copy:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import ContactForm from './ContactForm.astro';
|
|
9
9
|
import { loadFormDefinition } from '../../lib/forms';
|
|
10
|
-
import { resolveGitBase } from '../../
|
|
10
|
+
import { resolveGitBase } from '../../lib/git-base.mjs';
|
|
11
11
|
|
|
12
12
|
interface Props {
|
|
13
13
|
form: string;
|
package/lib/git-base.mjs
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform git-proxy origin for this build (the CMS `base_url`, and where the Form block
|
|
3
|
+
* reads a form's fields). Kept apart from bin/cms-config.mjs so components can import it: that
|
|
4
|
+
* file is a build-time script whose module scope needs a real filesystem, which an on-request
|
|
5
|
+
* renderer (Cloudflare Workers) doesn't have. Nothing here runs at import time.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { execSync } from 'node:child_process';
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
|
|
11
|
+
function env(name) {
|
|
12
|
+
const v = typeof process !== 'undefined' ? process.env?.[name] : undefined;
|
|
13
|
+
return v && v.trim() ? v.trim() : '';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const PROD_GIT_BASE = 'https://signin.ferst.co.uk';
|
|
17
|
+
export const DEV_GIT_BASE = 'https://signin-dev.ferst.co.uk';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The platform git-proxy origin (CMS `base_url` / `api_root`) for THIS build:
|
|
21
|
+
* 1. `FERST_GIT_BASE` env — explicit override, always wins.
|
|
22
|
+
* 2. committed `ferst-site.json` `gitBase` — an explicit per-site pin (e.g. a
|
|
23
|
+
* custom proxy); a BYO/seeded site can hard-bind its origin this way.
|
|
24
|
+
* 3. otherwise DERIVE from the deploy environment: the production branch talks to
|
|
25
|
+
* the prod git-proxy, every other (preview/dev) branch talks to the dev
|
|
26
|
+
* git-proxy. So a templated repo self-configures per environment on deploy — a
|
|
27
|
+
* dev-branch build points its CMS at the dev worker and main at prod — with NO
|
|
28
|
+
* per-client config. (The production branch defaults to `main`; override via
|
|
29
|
+
* `FERST_PROD_BRANCH` env or `ferst-site.json` `productionBranch`.)
|
|
30
|
+
* This restores the "site respects the environment it's deployed in" binding the old
|
|
31
|
+
* per-branch site config gave, without a per-client file to maintain.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveGitBase(cwd = process.cwd(), branch = deploymentBranch()) {
|
|
34
|
+
const fromEnv = env('FERST_GIT_BASE');
|
|
35
|
+
if (fromEnv) return fromEnv;
|
|
36
|
+
let prodBranch = env('FERST_PROD_BRANCH') || 'main';
|
|
37
|
+
try {
|
|
38
|
+
const site = JSON.parse(readFileSync(resolve(cwd, 'ferst-site.json'), 'utf8'));
|
|
39
|
+
if (site && typeof site.gitBase === 'string' && site.gitBase.trim()) return site.gitBase.trim();
|
|
40
|
+
if (!env('FERST_PROD_BRANCH') && site && typeof site.productionBranch === 'string' && site.productionBranch.trim()) {
|
|
41
|
+
prodBranch = site.productionBranch.trim();
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
/* no ferst-site.json (e.g. the template repo itself) — derive from the branch */
|
|
45
|
+
}
|
|
46
|
+
return branch === prodBranch ? PROD_GIT_BASE : DEV_GIT_BASE;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The deployment branch: CF Pages env → current git branch → main. */
|
|
50
|
+
export function deploymentBranch() {
|
|
51
|
+
const cf = env('CF_PAGES_BRANCH');
|
|
52
|
+
if (cf) return cf;
|
|
53
|
+
try {
|
|
54
|
+
const git = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
55
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
56
|
+
}).toString().trim();
|
|
57
|
+
if (git && git !== 'HEAD') return git;
|
|
58
|
+
} catch {
|
|
59
|
+
/* not a git checkout — fall through */
|
|
60
|
+
}
|
|
61
|
+
return 'main';
|
|
62
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ferst-core",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ferst Core — the shared, brand-agnostic client-site system: Astro components, layouts, content schemas, the layered config resolver, and a neutral styling architecture that every client overrides.",
|
|
6
6
|
"license": "BUSL-1.1",
|