@fjall/generator 21.0.0 → 22.0.0

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.
@@ -9,7 +9,7 @@
9
9
  "package.json",
10
10
  "tsconfig.json"
11
11
  ],
12
- "hash": "a8fe30228e8ef16982e4cc0bb7782027de7d1730579fd5bd975ffd89172cd4ff",
12
+ "hash": "072da3c52c9b559750731318bd00cee13ef1e254a1b6e8ece9e9f4378f958c06",
13
13
  "files": {
14
14
  "src/ast/astTestHelpers.ts": "026cac849eb88bdb",
15
15
  "src/ast/domain/astDomainParser.ts": "a88b990396db0a46",
@@ -111,10 +111,10 @@
111
111
  "src/codemod/validationGate/gates/schema.ts": "7ed5acaec0620a46",
112
112
  "src/codemod/validationGate/index.ts": "bbe1f460330a11cf",
113
113
  "src/codemod/validationGate/types.ts": "4a1cfa054e3383d5",
114
- "src/detection/index.ts": "b4ad9a935564cb3e",
114
+ "src/detection/index.ts": "88a577f0173028d4",
115
115
  "src/dns/bindParser.ts": "2b463c4dd1395ae5",
116
116
  "src/dns/bindWriter.ts": "c296911ce5aef77c",
117
- "src/dns/domainFileGenerator.ts": "cb03cd1a6b1bf452",
117
+ "src/dns/domainFileGenerator.ts": "f2d0ba8cca5ab1c9",
118
118
  "src/dns/domainRecords.ts": "8bdfcb0b3b32a000",
119
119
  "src/dns/index.ts": "5a0173ea07707af3",
120
120
  "src/dns/tsEmitter.ts": "8e56a893773c1c07",
@@ -165,7 +165,7 @@
165
165
  "src/schemas/computeSchemas.ts": "7105193fd34c8bcb",
166
166
  "src/schemas/constants.ts": "b0abe53d7a42feb0",
167
167
  "src/schemas/databaseSchemas.ts": "7d33a96789cbfdb5",
168
- "src/schemas/devRolePolicies.ts": "6ca70fb20f5fbebc",
168
+ "src/schemas/devRolePolicies.ts": "73000c87ea0de1d2",
169
169
  "src/schemas/index.ts": "a1500a885048074b",
170
170
  "src/schemas/instanceTypeArchitecture.ts": "6bf38031a54a4620",
171
171
  "src/schemas/messagingSchemas.ts": "2c1975fac903fd1b",
@@ -181,11 +181,11 @@
181
181
  "src/validation/patterns.ts": "f9629eafdad7ac3e",
182
182
  "src/validation/validationMessages.ts": "b03413b3953c3e79",
183
183
  "src/validation/validationPatterns.ts": "865f3d688975b7c8",
184
- "src/version.ts": "ff456d412182d095",
184
+ "src/version.ts": "b24668563e688655",
185
185
  "../scripts/minify-dist.mjs": "6b2e4b0df8aec601",
186
- "package.json": "f0c89fbf06f62083",
186
+ "package.json": "68bbbd728e286eff",
187
187
  "tsconfig.json": "1929cf3f99fe9b1e"
188
188
  },
189
- "outputHash": "17bb268b4bb5f05754b2b6ac16055f6f7abc5811faab1ac82b79c569c87e0937",
189
+ "outputHash": "b14439370356dd742ad72b81c29bf80df1c5ce3ffbd9470bac6637e6d3d42843",
190
190
  "outputFileCount": 343
191
191
  }
package/dist/.minified CHANGED
@@ -1 +1 @@
1
- 171 files minified at 2026-08-26T08:32:40.144Z
1
+ 171 files minified at 2026-08-30T00:18:26.718Z
@@ -10,8 +10,18 @@
10
10
  * `apps detect --output json` frame and the MCP `detect_app_framework`
11
11
  * tool's `outputSchema`.
12
12
  */
13
+ import { type Framework } from "@fjall/util";
13
14
  import { z } from "zod";
14
- export declare const FRAMEWORK_VALUES: readonly ["nextjs", "payload", "nextjs+payload", "express", "remix", "astro", "unknown"];
15
+ /**
16
+ * The framework vocabulary now lives in `@fjall/util/patterns`, beside the
17
+ * pattern vocabulary it has to be joined to — `FRAMEWORK_PATTERN_RECOMMENDATIONS`
18
+ * needs both halves in one module, and `generator` depends on `util` rather
19
+ * than the reverse. Re-exported here so detection's long-standing consumers,
20
+ * and the MCP tool's output contract, keep importing it from one place. This
21
+ * mirrors `STATIC_SITE_ROUTING_VALUES`: util owns the tuple, generator owns the
22
+ * Zod schema built over it.
23
+ */
24
+ export { FRAMEWORK_VALUES, type Framework, FRAMEWORKS, isFramework, type PatternRecommendation, FRAMEWORK_PATTERN_RECOMMENDATIONS, recommendPatternForFramework, CREATABLE_FRAMEWORKS, } from "@fjall/util";
15
25
  export declare const FrameworkSchema: z.ZodEnum<{
16
26
  unknown: "unknown";
17
27
  payload: "payload";
@@ -21,7 +31,93 @@ export declare const FrameworkSchema: z.ZodEnum<{
21
31
  remix: "remix";
22
32
  astro: "astro";
23
33
  }>;
24
- export type Framework = z.infer<typeof FrameworkSchema>;
34
+ /**
35
+ * What a detected workspace IS, as opposed to what it is built with.
36
+ *
37
+ * A monorepo's workspaces are mostly not deployable: a design-token package
38
+ * and a shared content package have a `package.json` and no framework, and
39
+ * reporting them beside the real sites made the agent's first decision a
40
+ * judgement call it had no basis for. Detection has the evidence, so
41
+ * detection makes the call.
42
+ */
43
+ export declare const APP_ROLE_VALUES: readonly ["application", "library"];
44
+ export declare const AppRoleSchema: z.ZodEnum<{
45
+ application: "application";
46
+ library: "library";
47
+ }>;
48
+ export type AppRole = z.infer<typeof AppRoleSchema>;
49
+ /**
50
+ * Classify a workspace. Deliberately conservative: a recognised framework or a
51
+ * Dockerfile is positive evidence of something deployable, and everything else
52
+ * is a library until it shows one. Being wrong in this direction costs the user
53
+ * an explicit `--pattern`; being wrong in the other direction invites an agent
54
+ * to scaffold infrastructure around a package that has no runtime.
55
+ */
56
+ export declare function inferAppRole(framework: Framework, hasDockerfile: boolean): AppRole;
57
+ /** The wire form of `@fjall/util`'s `PatternRecommendation`. */
58
+ export declare const PatternRecommendationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
59
+ kind: z.ZodLiteral<"recommended">;
60
+ pattern: z.ZodEnum<{
61
+ payload: "payload";
62
+ nextjs: "nextjs";
63
+ staticsite: "staticsite";
64
+ }>;
65
+ rationale: z.ZodString;
66
+ }, z.core.$strict>, z.ZodObject<{
67
+ kind: z.ZodLiteral<"blocked">;
68
+ pattern: z.ZodEnum<{
69
+ payload: "payload";
70
+ nextjs: "nextjs";
71
+ staticsite: "staticsite";
72
+ }>;
73
+ reason: z.ZodString;
74
+ }, z.core.$strict>, z.ZodObject<{
75
+ kind: z.ZodLiteral<"unsupported">;
76
+ reason: z.ZodString;
77
+ }, z.core.$strict>], "kind">;
78
+ /**
79
+ * Where each framework's build lands, relative to the workspace.
80
+ *
81
+ * `Record<Framework, ...>` so a new framework must state its convention rather
82
+ * than inherit a wrong default — and `outputDir` is the field where a wrong
83
+ * default is most expensive: the deploy succeeds and serves an empty bucket.
84
+ * `null` means "no convention worth asserting"; the caller then leaves the
85
+ * prefill empty and the create-time gate asks for the flag.
86
+ */
87
+ export declare const FRAMEWORK_OUTPUT_DIRS: Record<Framework, string | null>;
88
+ /**
89
+ * Values `fjall apps create` will ask for, read from the repository instead of
90
+ * guessed by the agent. Null when the framework has no creatable pattern.
91
+ *
92
+ * `outputDir` is a CONVENTION, not an observation — nothing here has run the
93
+ * build. The field description says so, because an agent that treats it as
94
+ * verified will deploy an empty bucket without ever seeing an error.
95
+ */
96
+ export declare const CreatePrefillSchema: z.ZodObject<{
97
+ pattern: z.ZodEnum<{
98
+ payload: "payload";
99
+ nextjs: "nextjs";
100
+ staticsite: "staticsite";
101
+ }>;
102
+ source: z.ZodString;
103
+ buildCommand: z.ZodNullable<z.ZodString>;
104
+ outputDir: z.ZodNullable<z.ZodString>;
105
+ routing: z.ZodNullable<z.ZodEnum<{
106
+ multipage: "multipage";
107
+ spa: "spa";
108
+ }>>;
109
+ }, z.core.$strict>;
110
+ export type CreatePrefill = z.infer<typeof CreatePrefillSchema>;
111
+ /**
112
+ * Assemble the create prefill for one detected workspace. Pure: the caller
113
+ * supplies the parsed `package.json` and the repo's monorepo tool.
114
+ */
115
+ export declare function inferCreatePrefill(input: {
116
+ framework: Framework;
117
+ relativePath: string;
118
+ pkg: ParsedPackageJson | null;
119
+ monorepoTool: MonorepoTool | null;
120
+ }): CreatePrefill | null;
25
121
  export declare const MONOREPO_TOOL_VALUES: readonly ["npm-workspaces", "pnpm", "lerna", "turbo", "nx"];
26
122
  export declare const MonorepoToolSchema: z.ZodEnum<{
27
123
  "npm-workspaces": "npm-workspaces";
@@ -50,6 +146,44 @@ export declare const AppDetectionSchema: z.ZodObject<{
50
146
  inferredPort: z.ZodNumber;
51
147
  suggestedAppName: z.ZodString;
52
148
  suggestedConfigPath: z.ZodString;
149
+ role: z.ZodEnum<{
150
+ application: "application";
151
+ library: "library";
152
+ }>;
153
+ recommendation: z.ZodDiscriminatedUnion<[z.ZodObject<{
154
+ kind: z.ZodLiteral<"recommended">;
155
+ pattern: z.ZodEnum<{
156
+ payload: "payload";
157
+ nextjs: "nextjs";
158
+ staticsite: "staticsite";
159
+ }>;
160
+ rationale: z.ZodString;
161
+ }, z.core.$strict>, z.ZodObject<{
162
+ kind: z.ZodLiteral<"blocked">;
163
+ pattern: z.ZodEnum<{
164
+ payload: "payload";
165
+ nextjs: "nextjs";
166
+ staticsite: "staticsite";
167
+ }>;
168
+ reason: z.ZodString;
169
+ }, z.core.$strict>, z.ZodObject<{
170
+ kind: z.ZodLiteral<"unsupported">;
171
+ reason: z.ZodString;
172
+ }, z.core.$strict>], "kind">;
173
+ create: z.ZodNullable<z.ZodObject<{
174
+ pattern: z.ZodEnum<{
175
+ payload: "payload";
176
+ nextjs: "nextjs";
177
+ staticsite: "staticsite";
178
+ }>;
179
+ source: z.ZodString;
180
+ buildCommand: z.ZodNullable<z.ZodString>;
181
+ outputDir: z.ZodNullable<z.ZodString>;
182
+ routing: z.ZodNullable<z.ZodEnum<{
183
+ multipage: "multipage";
184
+ spa: "spa";
185
+ }>>;
186
+ }, z.core.$strict>>;
53
187
  }, z.core.$strict>;
54
188
  export type AppDetection = z.infer<typeof AppDetectionSchema>;
55
189
  export declare const RepositoryDetectionSchema: z.ZodObject<{
@@ -81,6 +215,44 @@ export declare const RepositoryDetectionSchema: z.ZodObject<{
81
215
  inferredPort: z.ZodNumber;
82
216
  suggestedAppName: z.ZodString;
83
217
  suggestedConfigPath: z.ZodString;
218
+ role: z.ZodEnum<{
219
+ application: "application";
220
+ library: "library";
221
+ }>;
222
+ recommendation: z.ZodDiscriminatedUnion<[z.ZodObject<{
223
+ kind: z.ZodLiteral<"recommended">;
224
+ pattern: z.ZodEnum<{
225
+ payload: "payload";
226
+ nextjs: "nextjs";
227
+ staticsite: "staticsite";
228
+ }>;
229
+ rationale: z.ZodString;
230
+ }, z.core.$strict>, z.ZodObject<{
231
+ kind: z.ZodLiteral<"blocked">;
232
+ pattern: z.ZodEnum<{
233
+ payload: "payload";
234
+ nextjs: "nextjs";
235
+ staticsite: "staticsite";
236
+ }>;
237
+ reason: z.ZodString;
238
+ }, z.core.$strict>, z.ZodObject<{
239
+ kind: z.ZodLiteral<"unsupported">;
240
+ reason: z.ZodString;
241
+ }, z.core.$strict>], "kind">;
242
+ create: z.ZodNullable<z.ZodObject<{
243
+ pattern: z.ZodEnum<{
244
+ payload: "payload";
245
+ nextjs: "nextjs";
246
+ staticsite: "staticsite";
247
+ }>;
248
+ source: z.ZodString;
249
+ buildCommand: z.ZodNullable<z.ZodString>;
250
+ outputDir: z.ZodNullable<z.ZodString>;
251
+ routing: z.ZodNullable<z.ZodEnum<{
252
+ multipage: "multipage";
253
+ spa: "spa";
254
+ }>>;
255
+ }, z.core.$strict>>;
84
256
  }, z.core.$strict>>;
85
257
  warnings: z.ZodArray<z.ZodString>;
86
258
  }, z.core.$strict>;
@@ -1 +1 @@
1
- var c=Object.defineProperty;var n=(e,r)=>c(e,"name",{value:r,configurable:!0});import{buildAppConfigPath as p}from"@fjall/util";import{z as o}from"zod";const l=["nextjs","payload","nextjs+payload","express","remix","astro","unknown"],f=o.enum(l),u=["npm-workspaces","pnpm","lerna","turbo","nx"],d=o.enum(u),m=o.object({relativePath:o.string().describe("Path relative to repo root. '.' for flat repo, e.g. 'apps/website' for monorepo workspace."),framework:f,packageName:o.string().nullable(),hasDockerfile:o.boolean(),docker:o.object({path:o.string().describe("Path to chosen Dockerfile, relative to relativePath.")}).strict().nullable().describe("Docker build descriptor. Null if no Dockerfile present."),inferredPort:o.number().int().min(1).max(65535),suggestedAppName:o.string().describe("kebab-case app name suggestion derived from packageName or relativePath."),suggestedConfigPath:o.string().describe("Suggested fjall config path relative to repo root, e.g. 'fjall/website' or 'apps/website/fjall/website'.")}).strict(),D=o.object({isMonorepo:o.boolean(),monorepoTool:d.nullable(),rootPackageName:o.string().nullable(),apps:o.array(m).describe("Detected apps. Empty if nothing scaffoldable was found. Single-element for flat repos, multi-element for monorepos."),warnings:o.array(o.string()).describe("Non-fatal observations (e.g. 'apps/legacy has no package.json \u2014 skipped').")}).strict();function h(e,r){return r.turboJson?"turbo":r.nxJson?"nx":r.pnpmWorkspaceYaml?"pnpm":r.lernaJson?"lerna":e?.workspaces?"npm-workspaces":null}n(h,"inferMonorepoTool");function y(e){return e?.workspaces?Array.isArray(e.workspaces)?e.workspaces:e.workspaces.packages??[]:[]}n(y,"extractWorkspaceGlobs");const x=[{framework:"nextjs+payload",required:["next","payload"]},{framework:"nextjs",required:["next"]},{framework:"payload",required:["payload"]},{framework:"remix",required:["@remix-run/node"]},{framework:"astro",required:["astro"]},{framework:"express",required:["express"]}];function j(e){if(!e)return"unknown";const r={...e.dependencies??{},...e.devDependencies??{}};for(const s of x)if(s.required.every(t=>t in r))return s.framework;return"unknown"}n(j,"inferFrameworkFromDeps");const b={nextjs:3e3,"nextjs+payload":3e3,payload:3e3,remix:3e3,astro:4321,express:3e3,unknown:3e3};function v(e){return b[e]}n(v,"inferPortForFramework");function A(e){if(e.length===0)return null;const r=e.find(a=>a==="Dockerfile");if(r)return{name:r,isDev:!1};const s=e.find(a=>a.startsWith("Dockerfile")&&!/\.(dev|local|test)$/i.test(a));if(s)return{name:s,isDev:!1};const t=e.find(a=>/\.dev$/i.test(a));if(t)return{name:t,isDev:!0};const i=e[0];return i===void 0?null:{name:i,isDev:!1}}n(A,"pickPreferredDockerfile");function E(e,r){if(e){const t=e.replace(/^@[^/]+\//,"");if(t.length>0)return t}return r==="."||r===""?"app":r.split("/").pop()??"app"}n(E,"suggestAppName");function P(e,r){return r==="."||r===""?p(e):p(e,r)}n(P,"suggestConfigPath");export{m as AppDetectionSchema,l as FRAMEWORK_VALUES,f as FrameworkSchema,u as MONOREPO_TOOL_VALUES,d as MonorepoToolSchema,D as RepositoryDetectionSchema,y as extractWorkspaceGlobs,j as inferFrameworkFromDeps,h as inferMonorepoTool,v as inferPortForFramework,A as pickPreferredDockerfile,E as suggestAppName,P as suggestConfigPath};
1
+ var c=Object.defineProperty;var o=(e,t)=>c(e,"name",{value:t,configurable:!0});import{buildAppConfigPath as p,FRAMEWORK_VALUES as u,PATTERN_TYPE_VALUES as s,STATIC_SITE_ROUTING_VALUES as f,recommendPatternForFramework as d}from"@fjall/util";import{z as r}from"zod";import{FRAMEWORK_VALUES as q,FRAMEWORKS as V,isFramework as I,FRAMEWORK_PATTERN_RECOMMENDATIONS as B,recommendPatternForFramework as G,CREATABLE_FRAMEWORKS as J}from"@fjall/util";const m=r.enum(u),b=["application","library"],k=r.enum(b);function T(e,t){return e!=="unknown"||t?"application":"library"}o(T,"inferAppRole");const g=r.discriminatedUnion("kind",[r.object({kind:r.literal("recommended"),pattern:r.enum(s),rationale:r.string()}).strict(),r.object({kind:r.literal("blocked"),pattern:r.enum(s),reason:r.string()}).strict(),r.object({kind:r.literal("unsupported"),reason:r.string()}).strict()]),w={astro:"dist",nextjs:"out","nextjs+payload":null,payload:null,remix:null,express:null,unknown:null},x=r.object({pattern:r.enum(s),source:r.string().describe("Directory the build runs in, relative to the repo root."),buildCommand:r.string().nullable().describe("Build command, from the workspace's own build script. Null when it declares none."),outputDir:r.string().nullable().describe("Build output directory relative to `source`, by framework convention \u2014 NOT verified against disk. Confirm it exists after building before deploying."),routing:r.enum(f).nullable()}).strict();function h(e){return e==="pnpm"?"pnpm run build":"npm run build"}o(h,"buildCommandFor");function F(e){const t=d(e.framework);if(t.kind!=="recommended")return null;const n=typeof e.pkg?.scripts?.build=="string"&&e.pkg.scripts.build.trim().length>0;return{pattern:t.pattern,source:e.relativePath===""?".":e.relativePath,buildCommand:n?h(e.monorepoTool):null,outputDir:w[e.framework],routing:t.pattern==="staticsite"?"multipage":null}}o(F,"inferCreatePrefill");const A=["npm-workspaces","pnpm","lerna","turbo","nx"],E=r.enum(A),R=r.object({relativePath:r.string().describe("Path relative to repo root. '.' for flat repo, e.g. 'apps/website' for monorepo workspace."),framework:m,packageName:r.string().nullable(),hasDockerfile:r.boolean(),docker:r.object({path:r.string().describe("Path to chosen Dockerfile, relative to relativePath.")}).strict().nullable().describe("Docker build descriptor. Null if no Dockerfile present."),inferredPort:r.number().int().min(1).max(65535),suggestedAppName:r.string().describe("kebab-case app name suggestion derived from packageName or relativePath."),suggestedConfigPath:r.string().describe("Suggested fjall config path relative to repo root, e.g. 'fjall/website' or 'apps/website/fjall/website'."),role:k.describe("'application' if deployable evidence was found (a framework, or a Dockerfile); 'library' otherwise. Do not scaffold libraries."),recommendation:g.describe("What this workspace's framework means for `fjall apps create --pattern`. Pass `pattern` from here; never pass the framework name."),create:x.nullable().describe("Values to pass to `fjall apps create`, read from the repository. Null when no pattern applies.")}).strict(),O=r.object({isMonorepo:r.boolean(),monorepoTool:E.nullable(),rootPackageName:r.string().nullable(),apps:r.array(R).describe("Detected apps. Empty if nothing scaffoldable was found. Single-element for flat repos, multi-element for monorepos."),warnings:r.array(r.string()).describe("Non-fatal observations (e.g. 'apps/legacy has no package.json \u2014 skipped').")}).strict();function _(e,t){return t.turboJson?"turbo":t.nxJson?"nx":t.pnpmWorkspaceYaml?"pnpm":t.lernaJson?"lerna":e?.workspaces?"npm-workspaces":null}o(_,"inferMonorepoTool");function j(e){return e?.workspaces?Array.isArray(e.workspaces)?e.workspaces:e.workspaces.packages??[]:[]}o(j,"extractWorkspaceGlobs");const D=[{framework:"nextjs+payload",required:["next","payload"]},{framework:"nextjs",required:["next"]},{framework:"payload",required:["payload"]},{framework:"remix",required:["@remix-run/node"]},{framework:"astro",required:["astro"]},{framework:"express",required:["express"]}];function M(e){if(!e)return"unknown";const t={...e.dependencies??{},...e.devDependencies??{}};for(const n of D)if(n.required.every(a=>a in t))return n.framework;return"unknown"}o(M,"inferFrameworkFromDeps");const y={nextjs:3e3,"nextjs+payload":3e3,payload:3e3,remix:3e3,astro:4321,express:3e3,unknown:3e3};function C(e){return y[e]}o(C,"inferPortForFramework");function N(e){if(e.length===0)return null;const t=e.find(i=>i==="Dockerfile");if(t)return{name:t,isDev:!1};const n=e.find(i=>i.startsWith("Dockerfile")&&!/\.(dev|local|test)$/i.test(i));if(n)return{name:n,isDev:!1};const a=e.find(i=>/\.dev$/i.test(i));if(a)return{name:a,isDev:!0};const l=e[0];return l===void 0?null:{name:l,isDev:!1}}o(N,"pickPreferredDockerfile");function W(e,t){if(e){const a=e.replace(/^@[^/]+\//,"");if(a.length>0)return a}return t==="."||t===""?"app":t.split("/").pop()??"app"}o(W,"suggestAppName");function L(e,t){return t==="."||t===""?p(e):p(e,t)}o(L,"suggestConfigPath");export{b as APP_ROLE_VALUES,R as AppDetectionSchema,k as AppRoleSchema,J as CREATABLE_FRAMEWORKS,x as CreatePrefillSchema,V as FRAMEWORKS,w as FRAMEWORK_OUTPUT_DIRS,B as FRAMEWORK_PATTERN_RECOMMENDATIONS,q as FRAMEWORK_VALUES,m as FrameworkSchema,A as MONOREPO_TOOL_VALUES,E as MonorepoToolSchema,g as PatternRecommendationSchema,O as RepositoryDetectionSchema,j as extractWorkspaceGlobs,T as inferAppRole,F as inferCreatePrefill,M as inferFrameworkFromDeps,_ as inferMonorepoTool,C as inferPortForFramework,I as isFramework,N as pickPreferredDockerfile,G as recommendPatternForFramework,W as suggestAppName,L as suggestConfigPath};
@@ -1,4 +1,4 @@
1
- var p=Object.defineProperty;var o=(t,e)=>p(t,"name",{value:e,configurable:!0});import{getDomainStackName as g}from"@fjall/util";import{toPascalCase as h}from"../generation/common.js";import{GENERATOR_VERSION as d}from"../version.js";function I(t){const{domainName:e,hostedZoneId:r,records:n=[]}=t,a=t.basePath??`fjall/domains/${e}`;return[{path:`${a}/infrastructure.ts`,content:w({domainName:e,records:n,hostedZoneId:r})},{path:`${a}/package.json`,content:f(e)},{path:`${a}/tsconfig.json`,content:y},{path:`${a}/cdk.json`,content:N},{path:`${a}/cdk.context.json`,content:S},{path:`${a}/.gitignore`,content:k}]}o(I,"generateDomainFiles");function w(t){const{domainName:e,records:r,hostedZoneId:n}=t,a=h(e.split(".").join("")),i=g(e),c=r.map(s=>{const m=s.ttl!==void 0?`, ttl: ${s.ttl}`:"";return` { type: ${JSON.stringify(s.type)}, name: ${JSON.stringify(s.name)}, value: ${JSON.stringify(s.value)}${m} },`}),l=c.length>0?`[
1
+ var p=Object.defineProperty;var r=(t,e)=>p(t,"name",{value:e,configurable:!0});import{getDomainStackName as w,FJALL_COMPONENT_GITIGNORE as g}from"@fjall/util";import{toPascalCase as h}from"../generation/common.js";import{GENERATOR_VERSION as d}from"../version.js";function $(t){const{domainName:e,hostedZoneId:o,records:n=[]}=t,a=t.basePath??`fjall/domains/${e}`;return[{path:`${a}/infrastructure.ts`,content:k({domainName:e,records:n,hostedZoneId:o})},{path:`${a}/package.json`,content:f(e)},{path:`${a}/tsconfig.json`,content:N},{path:`${a}/cdk.json`,content:y},{path:`${a}/cdk.context.json`,content:S},{path:`${a}/.gitignore`,content:g}]}r($,"generateDomainFiles");function k(t){const{domainName:e,records:o,hostedZoneId:n}=t,a=h(e.split(".").join("")),i=w(e),c=o.map(s=>{const m=s.ttl!==void 0?`, ttl: ${s.ttl}`:"";return` { type: ${JSON.stringify(s.type)}, name: ${JSON.stringify(s.name)}, value: ${JSON.stringify(s.value)}${m} },`}),l=c.length>0?`[
2
2
  ${c.join(`
3
3
  `)}
4
4
  ]`:"[]",u=n?` hostedZoneId: ${JSON.stringify(n)},
@@ -44,7 +44,7 @@ ${u} // Position-independent record logical IDs (fresh-zone default): records
44
44
  // and adoptedNameServers (both together) on the child Domain \u2014 the literals
45
45
  // feed the parent NS UPSERT because an imported zone exposes no name-server
46
46
  // attribute at synth.
47
- `}o(w,"generateDefaultInfrastructureTs");function f(t){return`{
47
+ `}r(k,"generateDefaultInfrastructureTs");function f(t){return`{
48
48
  "name": ${JSON.stringify(`domain-${t}`)},
49
49
  "version": "${d}",
50
50
  "type": "module",
@@ -60,38 +60,7 @@ ${u} // Position-independent record logical IDs (fresh-zone default): records
60
60
  "constructs": "^10.7.2"
61
61
  }
62
62
  }
63
- `}o(f,"generateDomainPackageJson");const k=`*.js
64
- *.d.ts
65
- node_modules
66
- .cdk.staging
67
- **/**/cdk.out
68
-
69
- .DS_Store
70
-
71
- # Fjall config (contains organisation-specific settings)
72
- fjall-config.json
73
-
74
- # Fjall-managed state directories. Keep explicit so drift baselines
75
- # (Phase 6) and codemod history (Phase 2) stay out of version control.
76
- /.fjall/history/
77
- /.fjall/baseline/
78
- /.fjall/logs/
79
-
80
- # Fjall per-target deploy state \u2014 a per-machine cache of last-deployed template
81
- # hashes (cascade deploys write one file per account/region). Safe when absent:
82
- # a missing file marks every stack changed, so the next deploy is a full deploy.
83
- # Stays out of version control to avoid churn and merge conflicts between
84
- # deployers. The *.tmp pair covers atomic-write temp files; the
85
- # .deploy-state.json pair is the legacy name, kept while migration unlinks it.
86
- .fjall-state*.json
87
- .fjall-state*.json.tmp
88
- .deploy-state.json
89
- .deploy-state.json.tmp
90
-
91
- # Fjall backup files (sibling \`.bak\` from codemod mutations + domain eject)
92
- **/backup/
93
- *.bak
94
- `,y=`{
63
+ `}r(f,"generateDomainPackageJson");const N=`{
95
64
  "compilerOptions": {
96
65
  "target": "ES2022",
97
66
  "module": "NodeNext",
@@ -119,7 +88,7 @@ fjall-config.json
119
88
  `,S=`{
120
89
  "acknowledged-issue-numbers": [32775, 34892, 34635]
121
90
  }
122
- `,N=`{
91
+ `,y=`{
123
92
  "app": "npx tsx infrastructure.ts",
124
93
  "assetMetadata": false,
125
94
  "pathMetadata": false,
@@ -175,4 +144,4 @@ fjall-config.json
175
144
  "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true
176
145
  }
177
146
  }
178
- `;export{I as generateDomainFiles};
147
+ `;export{$ as generateDomainFiles};
@@ -11,7 +11,7 @@ import { type BoundaryStatement } from "./securityBoundary.js";
11
11
  * (`components/infrastructure/lib/config/aws/oidcConnector.ts`) — consumes
12
12
  * these builders directly, so construct⇔SSoT parity holds by construction;
13
13
  * 2. the static Quick-Create template
14
- * (`publicAssets/fjall/publicAssets/assets/oidc-connector.yaml`) — hand-
14
+ * (`public-assets/fjall/public-assets/assets/oidc-connector.yaml`) — hand-
15
15
  * mirrors the rendered JSON, locked by the deep-compare fixture in
16
16
  * `components/infrastructure/lib/__tests__/devRoleParity.test.ts`;
17
17
  * 3. the webapp `dev-gate-remediate` pass (Phase-2 Increment C) — imports
@@ -1 +1 @@
1
- export declare const GENERATOR_VERSION = "21.0.0";
1
+ export declare const GENERATOR_VERSION = "22.0.0";
@@ -1 +1 @@
1
- const E="21.0.0";export{E as GENERATOR_VERSION};
1
+ const E="22.0.0";export{E as GENERATOR_VERSION};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/generator",
3
- "version": "21.0.0",
3
+ "version": "22.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/fjall-tech/fjall.git",
@@ -58,7 +58,7 @@
58
58
  "license": "SEE LICENSE IN LICENSE",
59
59
  "dependencies": {
60
60
  "@babel/parser": "^7.29.8",
61
- "@fjall/util": "^21.0.0",
61
+ "@fjall/util": "^22.0.0",
62
62
  "ast-types": "^0.16.1",
63
63
  "recast": "^0.23.12",
64
64
  "ts-morph": "^28.0.0",