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.
@@ -60,53 +60,10 @@ export function repoSlug() {
60
60
  return '';
61
61
  }
62
62
 
63
- export const PROD_GIT_BASE = 'https://signin.ferst.co.uk';
64
- export const DEV_GIT_BASE = 'https://signin-dev.ferst.co.uk';
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';
@@ -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 './cms-config.mjs';
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 '../../bin/cms-config.mjs';
10
+ import { resolveGitBase } from '../../lib/git-base.mjs';
11
11
 
12
12
  interface Props {
13
13
  form: string;
@@ -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.6",
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",