@coreframe/config 0.1.8 → 0.1.10
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/dist/index.d.ts +7 -2
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ type I18nConfig = {
|
|
|
98
98
|
sourceLocale: string;
|
|
99
99
|
};
|
|
100
100
|
type DeployEnvironment = "staging" | "production";
|
|
101
|
+
/** Active topology published by the Coreframe deployment workflow. */
|
|
102
|
+
type DeployMode = "client" | "full";
|
|
101
103
|
type DeployContext = {
|
|
102
104
|
/** Deployment environment being released. */environment: DeployEnvironment; /** Human-readable name assigned to the release. */
|
|
103
105
|
releaseName: string; /** Public URL of the deployed application. */
|
|
@@ -121,13 +123,15 @@ type StagingHostnameConfig = {
|
|
|
121
123
|
type DeployConfig = {
|
|
122
124
|
/** Hook called after all deployment work completes. */afterDeploy?: (context: DeployContext) => Promise<void> | void; /** Hook called immediately after the worker deployment completes. */
|
|
123
125
|
afterWorkerDeploy?: (context: DeployContext) => Promise<void> | void; /** Per-environment deployment overrides. */
|
|
124
|
-
environments?: Partial<Record<DeployEnvironment, DeployEnvironmentConfig>>;
|
|
126
|
+
environments?: Partial<Record<DeployEnvironment, DeployEnvironmentConfig>>; /** Deployed application topology selected by the Coreframe release workflow. */
|
|
127
|
+
mode: DeployMode;
|
|
125
128
|
/**
|
|
126
129
|
* HTTP checks run against the application after deployment.
|
|
127
130
|
*
|
|
128
131
|
* @example
|
|
129
132
|
* defineConfig({
|
|
130
133
|
* deploy: {
|
|
134
|
+
* mode: "full",
|
|
131
135
|
* smokeChecks: [
|
|
132
136
|
* { name: "home", path: "/" },
|
|
133
137
|
* {
|
|
@@ -146,6 +150,7 @@ type DeployConfig = {
|
|
|
146
150
|
* @example
|
|
147
151
|
* defineConfig({
|
|
148
152
|
* deploy: {
|
|
153
|
+
* mode: "full",
|
|
149
154
|
* stagingHostname: {
|
|
150
155
|
* managedLabelPrefix: "review-",
|
|
151
156
|
* parentHostname: "staging.example.com",
|
|
@@ -165,4 +170,4 @@ declare function readProjectConfig({
|
|
|
165
170
|
declare function importProjectModule<T>(path: string, cwd?: string): Promise<T>;
|
|
166
171
|
declare function importProjectDependency<T>(specifier: string, cwd?: string): Promise<T>;
|
|
167
172
|
//#endregion
|
|
168
|
-
export { AssetsConfig, CoreframeConfig, DatabaseConfig, DatabaseDialect, DeployConfig, DeployContext, DeployEnvironment, DeployEnvironmentConfig, DeploySmokeCheck, DevConfig, DevPlatform, FlutterConfig, FlutterDeepLinkConfig, I18nConfig, JsonObject, JsonValue, PreviewConfig, PreviewTunnelConfig, PreviewWorkerConfig, PrimaryWorkerContributions, PrimaryWorkerEnvironment, StagingHostnameConfig, WorkerConfig, WorkerDeployEnvironment, WorkerEnvironmentDeclaration, WorkerEnvironmentKind, WorkerEnvironmentVariableConfig, WranglerConfig, coreframeGeneratedWorkerVariables, coreframeLocalWorkerVariables, coreframeManagedWorkerSecrets, defineConfig, derivePrimaryWorkerConfig, importProjectDependency, importProjectModule, normalizeWorkerEnvironment, primaryWorkerConfigPath, primaryWorkerEnvironments, readProjectConfig, validateWorkerInventoryOwnership, workerBindingNames, wranglerEnvironmentNames };
|
|
173
|
+
export { AssetsConfig, CoreframeConfig, DatabaseConfig, DatabaseDialect, DeployConfig, DeployContext, DeployEnvironment, DeployEnvironmentConfig, DeployMode, DeploySmokeCheck, DevConfig, DevPlatform, FlutterConfig, FlutterDeepLinkConfig, I18nConfig, JsonObject, JsonValue, PreviewConfig, PreviewTunnelConfig, PreviewWorkerConfig, PrimaryWorkerContributions, PrimaryWorkerEnvironment, StagingHostnameConfig, WorkerConfig, WorkerDeployEnvironment, WorkerEnvironmentDeclaration, WorkerEnvironmentKind, WorkerEnvironmentVariableConfig, WranglerConfig, coreframeGeneratedWorkerVariables, coreframeLocalWorkerVariables, coreframeManagedWorkerSecrets, defineConfig, derivePrimaryWorkerConfig, importProjectDependency, importProjectModule, normalizeWorkerEnvironment, primaryWorkerConfigPath, primaryWorkerEnvironments, readProjectConfig, validateWorkerInventoryOwnership, workerBindingNames, wranglerEnvironmentNames };
|
package/dist/worker.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ declare const primaryWorkerConfigPath = "wrangler.jsonc";
|
|
|
7
7
|
declare const primaryWorkerEnvironments: readonly ["development", "staging", "production"];
|
|
8
8
|
declare const coreframeGeneratedWorkerVariables: readonly ["DEPLOY_ENV", "POSTHOG_RELEASE"];
|
|
9
9
|
declare const coreframeManagedWorkerSecrets: readonly ["COREFRAME_ACCESS_TOKEN_SECRET", "DASHBOARD_PASSWORD"];
|
|
10
|
-
declare const coreframeLocalWorkerVariables: readonly ["PGDATABASE", "PGHOST", "PGPASSWORD", "PGPORT", "PGUSER", "PORTLESS_URL", "TURSO_AUTH_TOKEN", "TURSO_DATABASE_URL"];
|
|
10
|
+
declare const coreframeLocalWorkerVariables: readonly ["COREFRAME_DEV_JOBS_TOKEN", "PGDATABASE", "PGHOST", "PGPASSWORD", "PGPORT", "PGUSER", "PORTLESS_URL", "TURSO_AUTH_TOKEN", "TURSO_DATABASE_URL"];
|
|
11
11
|
type PrimaryWorkerEnvironment = (typeof primaryWorkerEnvironments)[number];
|
|
12
12
|
type WorkerDeployEnvironment = Exclude<PrimaryWorkerEnvironment, "development">;
|
|
13
13
|
type WorkerEnvironmentKind = "secret" | "variable" | "generated";
|
package/dist/worker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=`wrangler.jsonc`,t=[`development`,`staging`,`production`],n=[`DEPLOY_ENV`,`POSTHOG_RELEASE`],r=[`COREFRAME_ACCESS_TOKEN_SECRET`,`DASHBOARD_PASSWORD`],i=[`PGDATABASE`,`PGHOST`,`PGPASSWORD`,`PGPORT`,`PGUSER`,`PORTLESS_URL`,`TURSO_AUTH_TOKEN`,`TURSO_DATABASE_URL`],a=/^[A-Z][A-Z0-9_]*$/;function o(e){return n.some(t=>t===e)}function s(e){return Object.entries(e??{}).map(([e,t])=>{if(!a.test(e))throw Error(`Invalid Worker environment name ${JSON.stringify(e)} in coreframe.config.ts. Use uppercase letters, numbers, and underscores.`);let n=[...new Set(t.requiredIn??[])];if(t.kind===`generated`&&!o(e))throw Error(`${e} is declared as generated, but Coreframe does not generate it. Use kind "variable" or "secret".`);if(o(e)&&t.kind!==`generated`)throw Error(`${e} is generated by Coreframe and must use kind "generated".`);return{...t,name:e,requiredIn:n}}).sort((e,t)=>e.name.localeCompare(t.name))}function c({config:e,environment:t,contributions:n={}}){let r=structuredClone(e),i=h(r.env,`env`),a=h(i[t],`env.${t}`),o=h(a.vars,`env.${t}.vars`),s=h(a.secrets,`env.${t}.secrets`),c=g(s.required,`env.${t}.secrets.required`),l=n.generatedValues??{},u=[...new Set(n.requiredSecrets??[])].sort();p(`variable`,Object.keys(o),Object.keys(l),t),p(`secret`,c,u,t);let d=n.bindings??{},{env:_,...v}=r,y=m(v,a),b=m(d);p(`binding`,[...y],[...b],t);let x=f(a,d,`env.${t}`);return Object.keys(l).length>0&&(x.vars={...o,...l}),u.length>0&&(x.secrets={...s,required:[...c,...u].sort()}),r.env={...i,[t]:x},r}function l(e){return m(e)}function u(e){let t=m(e),n=e=>{if(!_(e))return;let n=_(e.vars)?e.vars:{};Object.keys(n).forEach(e=>t.add(e));let r=_(e.secrets)?e.secrets:{};(Array.isArray(r.required)?r.required:[]).forEach(e=>{typeof e==`string`&&t.add(e)})};return n(e),_(e.env)&&Object.values(e.env).forEach(n),t}function d(e,t){let n=s(t),r=new Map(n.map(e=>[e.name,e])),i=[...m(e)].filter(e=>r.has(e)).sort(),a=new Set,o=new Set,c=e=>{_(e)&&(_(e.vars)&&Object.keys(e.vars).forEach(e=>{r.get(e)?.kind===`secret`&&a.add(e)}),_(e.secrets)&&Array.isArray(e.secrets.required)&&e.secrets.required.forEach(e=>{typeof e==`string`&&r.get(e)?.kind!==`secret`&&r.has(e)&&o.add(e)}))};c(e),_(e.env)&&Object.values(e.env).forEach(c);let l=[...i.map(e=>`${e} (native binding)`),...[...a].sort().map(e=>`${e} (plain variable)`),...[...o].sort().map(e=>`${e} (required secret)`)];if(l.length>0)throw Error(`Worker inventory ownership conflicts with wrangler.jsonc: ${l.join(`, `)}. Keep string metadata in coreframe.config.ts and native binding topology in wrangler.jsonc.`)}function f(e,t,n){let r={...e};for(let[i,a]of Object.entries(t)){if(i in e)throw Error(`Coreframe cannot contribute ${n}.${i}; wrangler.jsonc already owns it.`);r[i]=structuredClone(a)}return r}function p(e,t,n,r){let i=n.filter(e=>t.includes(e)).sort();if(i.length>0)throw Error(`Coreframe ${e} ownership conflicts in Wrangler environment ${r}: ${i.join(`, `)}. Remove the duplicate declarations from wrangler.jsonc.`)}function m(...e){let t=new Set,n=e=>{if(Array.isArray(e)){e.forEach(n);return}_(e)&&(typeof e.binding==`string`&&t.add(e.binding),Object.values(e).forEach(n))};return e.forEach(n),t}function h(e,t){if(e===void 0)return{};if(!_(e))throw Error(`${t} in wrangler.jsonc must be an object.`);return e}function g(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(e=>typeof e==`string`))throw Error(`${t} in wrangler.jsonc must be an array of strings.`);return e}function _(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{n as coreframeGeneratedWorkerVariables,i as coreframeLocalWorkerVariables,r as coreframeManagedWorkerSecrets,c as derivePrimaryWorkerConfig,s as normalizeWorkerEnvironment,e as primaryWorkerConfigPath,t as primaryWorkerEnvironments,d as validateWorkerInventoryOwnership,l as workerBindingNames,u as wranglerEnvironmentNames};
|
|
1
|
+
const e=`wrangler.jsonc`,t=[`development`,`staging`,`production`],n=[`DEPLOY_ENV`,`POSTHOG_RELEASE`],r=[`COREFRAME_ACCESS_TOKEN_SECRET`,`DASHBOARD_PASSWORD`],i=[`COREFRAME_DEV_JOBS_TOKEN`,`PGDATABASE`,`PGHOST`,`PGPASSWORD`,`PGPORT`,`PGUSER`,`PORTLESS_URL`,`TURSO_AUTH_TOKEN`,`TURSO_DATABASE_URL`],a=/^[A-Z][A-Z0-9_]*$/;function o(e){return n.some(t=>t===e)}function s(e){return Object.entries(e??{}).map(([e,t])=>{if(!a.test(e))throw Error(`Invalid Worker environment name ${JSON.stringify(e)} in coreframe.config.ts. Use uppercase letters, numbers, and underscores.`);let n=[...new Set(t.requiredIn??[])];if(t.kind===`generated`&&!o(e))throw Error(`${e} is declared as generated, but Coreframe does not generate it. Use kind "variable" or "secret".`);if(o(e)&&t.kind!==`generated`)throw Error(`${e} is generated by Coreframe and must use kind "generated".`);return{...t,name:e,requiredIn:n}}).sort((e,t)=>e.name.localeCompare(t.name))}function c({config:e,environment:t,contributions:n={}}){let r=structuredClone(e),i=h(r.env,`env`),a=h(i[t],`env.${t}`),o=h(a.vars,`env.${t}.vars`),s=h(a.secrets,`env.${t}.secrets`),c=g(s.required,`env.${t}.secrets.required`),l=n.generatedValues??{},u=[...new Set(n.requiredSecrets??[])].sort();p(`variable`,Object.keys(o),Object.keys(l),t),p(`secret`,c,u,t);let d=n.bindings??{},{env:_,...v}=r,y=m(v,a),b=m(d);p(`binding`,[...y],[...b],t);let x=f(a,d,`env.${t}`);return Object.keys(l).length>0&&(x.vars={...o,...l}),u.length>0&&(x.secrets={...s,required:[...c,...u].sort()}),r.env={...i,[t]:x},r}function l(e){return m(e)}function u(e){let t=m(e),n=e=>{if(!_(e))return;let n=_(e.vars)?e.vars:{};Object.keys(n).forEach(e=>t.add(e));let r=_(e.secrets)?e.secrets:{};(Array.isArray(r.required)?r.required:[]).forEach(e=>{typeof e==`string`&&t.add(e)})};return n(e),_(e.env)&&Object.values(e.env).forEach(n),t}function d(e,t){let n=s(t),r=new Map(n.map(e=>[e.name,e])),i=[...m(e)].filter(e=>r.has(e)).sort(),a=new Set,o=new Set,c=e=>{_(e)&&(_(e.vars)&&Object.keys(e.vars).forEach(e=>{r.get(e)?.kind===`secret`&&a.add(e)}),_(e.secrets)&&Array.isArray(e.secrets.required)&&e.secrets.required.forEach(e=>{typeof e==`string`&&r.get(e)?.kind!==`secret`&&r.has(e)&&o.add(e)}))};c(e),_(e.env)&&Object.values(e.env).forEach(c);let l=[...i.map(e=>`${e} (native binding)`),...[...a].sort().map(e=>`${e} (plain variable)`),...[...o].sort().map(e=>`${e} (required secret)`)];if(l.length>0)throw Error(`Worker inventory ownership conflicts with wrangler.jsonc: ${l.join(`, `)}. Keep string metadata in coreframe.config.ts and native binding topology in wrangler.jsonc.`)}function f(e,t,n){let r={...e};for(let[i,a]of Object.entries(t)){if(i in e)throw Error(`Coreframe cannot contribute ${n}.${i}; wrangler.jsonc already owns it.`);r[i]=structuredClone(a)}return r}function p(e,t,n,r){let i=n.filter(e=>t.includes(e)).sort();if(i.length>0)throw Error(`Coreframe ${e} ownership conflicts in Wrangler environment ${r}: ${i.join(`, `)}. Remove the duplicate declarations from wrangler.jsonc.`)}function m(...e){let t=new Set,n=e=>{if(Array.isArray(e)){e.forEach(n);return}_(e)&&(typeof e.binding==`string`&&t.add(e.binding),Object.values(e).forEach(n))};return e.forEach(n),t}function h(e,t){if(e===void 0)return{};if(!_(e))throw Error(`${t} in wrangler.jsonc must be an object.`);return e}function g(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(e=>typeof e==`string`))throw Error(`${t} in wrangler.jsonc must be an array of strings.`);return e}function _(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{n as coreframeGeneratedWorkerVariables,i as coreframeLocalWorkerVariables,r as coreframeManagedWorkerSecrets,c as derivePrimaryWorkerConfig,s as normalizeWorkerEnvironment,e as primaryWorkerConfigPath,t as primaryWorkerEnvironments,d as validateWorkerInventoryOwnership,l as workerBindingNames,u as wranglerEnvironmentNames};
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coreframe/config",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "Environment and project configuration utilities for Coreframe apps",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/
|
|
7
|
+
"url": "git+https://github.com/coreframe-js/coreframe.git",
|
|
8
8
|
"directory": "node/config"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|