@voxgig/build 4.11.0 → 4.12.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.
@@ -30,34 +30,34 @@ const WEB_FILES = [
30
30
  // an app shell (nav / project selector / user menu / collapsible entity
31
31
  // menu), and generic CRUD with relationship navigation. All runtime
32
32
  // model-driven (model.js reads /model.json), so it fits any entity graph.
33
- { frag: 'web/package.json.frag', out: 'web/package.json' },
34
- { frag: 'web/index.html.frag', out: 'web/index.html' },
35
- { frag: 'web/playwright.config.js.frag', out: 'web/playwright.config.js' },
36
- { frag: 'web/src/main.js.frag', out: 'web/src/main.js' },
37
- { frag: 'web/src/bus.js.frag', out: 'web/src/bus.js' },
38
- { frag: 'web/src/model.js.frag', out: 'web/src/model.js' },
39
- { frag: 'web/src/api.js.frag', out: 'web/src/api.js' },
40
- { frag: 'web/src/hooks.js.frag', out: 'web/src/hooks.js' },
41
- { frag: 'web/src/theme.js.frag', out: 'web/src/theme.js' },
42
- { frag: 'web/src/customise.js.frag', out: 'web/src/customise.js' },
43
- { frag: 'web/src/custom.css.frag', out: 'web/src/custom.css' },
44
- { frag: 'web/src/style.css.frag', out: 'web/src/style.css' },
45
- { frag: 'web/src/cmp/app.js.frag', out: 'web/src/cmp/app.js' },
46
- { frag: 'web/src/cmp/public.js.frag', out: 'web/src/cmp/public.js' },
47
- { frag: 'web/src/cmp/auth.js.frag', out: 'web/src/cmp/auth.js' },
48
- { frag: 'web/src/cmp/shell.js.frag', out: 'web/src/cmp/shell.js' },
49
- { frag: 'web/src/cmp/admin.js.frag', out: 'web/src/cmp/admin.js' },
50
- { frag: 'web/src/cmp/settings.js.frag', out: 'web/src/cmp/settings.js' },
33
+ { frag: 'web/package.json.frag', out: '$$fe$$/package.json' },
34
+ { frag: 'web/index.html.frag', out: '$$fe$$/index.html' },
35
+ { frag: 'web/playwright.config.js.frag', out: '$$fe$$/playwright.config.js' },
36
+ { frag: 'web/src/main.js.frag', out: '$$fe$$/src/main.js' },
37
+ { frag: 'web/src/bus.js.frag', out: '$$fe$$/src/bus.js' },
38
+ { frag: 'web/src/model.js.frag', out: '$$fe$$/src/model.js' },
39
+ { frag: 'web/src/api.js.frag', out: '$$fe$$/src/api.js' },
40
+ { frag: 'web/src/hooks.js.frag', out: '$$fe$$/src/hooks.js' },
41
+ { frag: 'web/src/theme.js.frag', out: '$$fe$$/src/theme.js' },
42
+ { frag: 'web/src/customise.js.frag', out: '$$fe$$/src/customise.js' },
43
+ { frag: 'web/src/custom.css.frag', out: '$$fe$$/src/custom.css' },
44
+ { frag: 'web/src/style.css.frag', out: '$$fe$$/src/style.css' },
45
+ { frag: 'web/src/cmp/app.js.frag', out: '$$fe$$/src/cmp/app.js' },
46
+ { frag: 'web/src/cmp/public.js.frag', out: '$$fe$$/src/cmp/public.js' },
47
+ { frag: 'web/src/cmp/auth.js.frag', out: '$$fe$$/src/cmp/auth.js' },
48
+ { frag: 'web/src/cmp/shell.js.frag', out: '$$fe$$/src/cmp/shell.js' },
49
+ { frag: 'web/src/cmp/admin.js.frag', out: '$$fe$$/src/cmp/admin.js' },
50
+ { frag: 'web/src/cmp/settings.js.frag', out: '$$fe$$/src/cmp/settings.js' },
51
51
  // Per-component doc sidecars (mermaid structure + message diagrams),
52
52
  // create-once next to each component.
53
- { frag: 'web/src/cmp/app.md.frag', out: 'web/src/cmp/app.md' },
54
- { frag: 'web/src/cmp/public.md.frag', out: 'web/src/cmp/public.md' },
55
- { frag: 'web/src/cmp/auth.md.frag', out: 'web/src/cmp/auth.md' },
56
- { frag: 'web/src/cmp/shell.md.frag', out: 'web/src/cmp/shell.md' },
57
- { frag: 'web/src/cmp/admin.md.frag', out: 'web/src/cmp/admin.md' },
58
- { frag: 'web/src/cmp/settings.md.frag', out: 'web/src/cmp/settings.md' },
59
- { frag: 'web/e2e/smoke.spec.js.frag', out: 'web/e2e/smoke.spec.js' },
60
- { frag: 'web/AGENTS.md.frag', out: 'web/AGENTS.md' },
53
+ { frag: 'web/src/cmp/app.md.frag', out: '$$fe$$/src/cmp/app.md' },
54
+ { frag: 'web/src/cmp/public.md.frag', out: '$$fe$$/src/cmp/public.md' },
55
+ { frag: 'web/src/cmp/auth.md.frag', out: '$$fe$$/src/cmp/auth.md' },
56
+ { frag: 'web/src/cmp/shell.md.frag', out: '$$fe$$/src/cmp/shell.md' },
57
+ { frag: 'web/src/cmp/admin.md.frag', out: '$$fe$$/src/cmp/admin.md' },
58
+ { frag: 'web/src/cmp/settings.md.frag', out: '$$fe$$/src/cmp/settings.md' },
59
+ { frag: 'web/e2e/smoke.spec.js.frag', out: '$$fe$$/e2e/smoke.spec.js' },
60
+ { frag: 'web/AGENTS.md.frag', out: '$$fe$$/AGENTS.md' },
61
61
  // Project docs (Diátaxis) for the web app, alongside the scaffold's
62
62
  // backend docs (@voxgig/create-system DocsPart). Create-once like all
63
63
  // WEB_FILES: the project owns its docs after generation.
@@ -137,12 +137,39 @@ const DEFAULT_USERS = [
137
137
  { name: 'Bob Example', email: 'bob@example.com', password: 'bob-pass-01' },
138
138
  ];
139
139
  exports.DEFAULT_USERS = DEFAULT_USERS;
140
+ // The frontend folder name, from the model env entry (`web: { dir: ... }`).
141
+ // Defaults to 'web', so a project that says nothing keeps the layout it
142
+ // already has. Everything that names the folder - the WEB_FILES output
143
+ // paths, views.js, theme.css, and the static path the backend runner
144
+ // serves - goes through this one value, via the $$fe$$ slot.
145
+ //
146
+ // Only the FOLDER moves. The `aim:web` message namespace is unrelated and
147
+ // must never follow it: the gateway allow-list is the literal
148
+ // { 'aim:web': true }, and backend/src/env/web/ is the backend runner, not
149
+ // the SPA.
150
+ const DEFAULT_FE = 'web';
151
+ // Absent means 'web'. ANYTHING ELSE provided is validated rather than
152
+ // silently defaulted - `dir: ''` is a mistake, not a request for 'web', and
153
+ // defaulting it would generate the whole SPA into the project root.
154
+ function feDir(envdef) {
155
+ const dir = null == envdef ? undefined : envdef.dir;
156
+ if (null == dir) {
157
+ return DEFAULT_FE;
158
+ }
159
+ if ('string' !== typeof dir || '' === dir || dir.split('/').includes('..') ||
160
+ path_1.default.isAbsolute(dir)) {
161
+ throw new Error('EnvWeb: env web `dir` must be a non-empty relative folder name, got: ' +
162
+ JSON.stringify(dir));
163
+ }
164
+ return dir;
165
+ }
140
166
  // web_gen(model, spec): generate the frontend + backend web pieces into
141
167
  // the project. spec.root is the project root (parent of backend/); files
142
168
  // that already exist are left untouched (create-once).
143
169
  const web_gen = async (model, spec) => {
144
170
  const core = (0, conf_1.CoreConfShape)(model.main.conf.core);
145
171
  const envdef = spec.env || {};
172
+ const fe = feDir(envdef);
146
173
  const users = envdef.users || DEFAULT_USERS;
147
174
  const seed = users[0] || DEFAULT_USERS[0];
148
175
  const port = envdef.port ||
@@ -150,6 +177,7 @@ const web_gen = async (model, spec) => {
150
177
  const slots = {
151
178
  name: core.name,
152
179
  Name: (0, util_1.camelify)(core.name),
180
+ fe,
153
181
  users: JSON.stringify(users, null, 2),
154
182
  e2eport: envdef.e2eport || (port + 10),
155
183
  seedEmail: seed.email,
@@ -193,7 +221,7 @@ const web_gen = async (model, spec) => {
193
221
  });
194
222
  // The component starter plus its doc sidecar, both create-once.
195
223
  for (const ext of ['js', 'md']) {
196
- const outrel = 'web/src/cmp/view/' + c.zone + '_' + c.name + '.' + ext;
224
+ const outrel = fe + '/src/cmp/view/' + c.zone + '_' + c.name + '.' + ext;
197
225
  const dest = path_1.default.join(spec.root, outrel);
198
226
  if (fs_1.default.existsSync(dest) && !spec.force) {
199
227
  skipped.push(outrel);
@@ -207,7 +235,7 @@ const web_gen = async (model, spec) => {
207
235
  }
208
236
  // views.js — the generated index of custom views. Regenerated whenever the
209
237
  // set of custom views changes; a no-op run leaves it (and `created`) alone.
210
- const viewsRel = 'web/src/views.js';
238
+ const viewsRel = fe + '/src/views.js';
211
239
  const viewsPath = path_1.default.join(spec.root, viewsRel);
212
240
  const viewsBody = '// AUTO-GENERATED: imports every custom entity view (model entities declaring\n' +
213
241
  '// ux:{view:\'custom\'}). Regenerated from the model — do not edit. The view\n' +
@@ -215,7 +243,7 @@ const web_gen = async (model, spec) => {
215
243
  customs.map((c) => `import './cmp/view/${c.zone}_${c.name}.js'`).join('\n') + '\n';
216
244
  const existingViews = fs_1.default.existsSync(viewsPath) ? fs_1.default.readFileSync(viewsPath, 'utf8') : null;
217
245
  if (existingViews !== viewsBody) {
218
- fs_1.default.mkdirSync(path_1.default.join(spec.root, 'web/src'), { recursive: true });
246
+ fs_1.default.mkdirSync(path_1.default.join(spec.root, fe, 'src'), { recursive: true });
219
247
  fs_1.default.writeFileSync(viewsPath, viewsBody);
220
248
  created.push(viewsRel);
221
249
  }
@@ -237,12 +265,12 @@ const web_gen = async (model, spec) => {
237
265
  const themeBody = '/* AUTO-GENERATED from the model theme (main.theme) — do not edit.\n' +
238
266
  ' Override tokens in custom.css; add modes via the theme:modes hook. */\n\n' +
239
267
  blocks.join('\n\n') + '\n';
240
- const themePath = path_1.default.join(spec.root, 'web/src/theme.css');
268
+ const themePath = path_1.default.join(spec.root, fe, 'src/theme.css');
241
269
  const existingTheme = fs_1.default.existsSync(themePath) ? fs_1.default.readFileSync(themePath, 'utf8') : null;
242
270
  if (existingTheme !== themeBody) {
243
- fs_1.default.mkdirSync(path_1.default.join(spec.root, 'web/src'), { recursive: true });
271
+ fs_1.default.mkdirSync(path_1.default.join(spec.root, fe, 'src'), { recursive: true });
244
272
  fs_1.default.writeFileSync(themePath, themeBody);
245
- created.push('web/src/theme.css');
273
+ created.push(fe + '/src/theme.css');
246
274
  }
247
275
  }
248
276
  return { created: created.sort(), skipped: skipped.sort() };
@@ -1 +1 @@
1
- {"version":3,"file":"web_gen.js","sourceRoot":"","sources":["../../../env/web/web_gen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web_gen.js","sourceRoot":"","sources":["../../../env/web/web_gen.ts"],"names":[],"mappings":"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"}
@@ -31,35 +31,35 @@ const WEB_FILES: { frag: string, out: string }[] = [
31
31
  // an app shell (nav / project selector / user menu / collapsible entity
32
32
  // menu), and generic CRUD with relationship navigation. All runtime
33
33
  // model-driven (model.js reads /model.json), so it fits any entity graph.
34
- { frag: 'web/package.json.frag', out: 'web/package.json' },
35
- { frag: 'web/index.html.frag', out: 'web/index.html' },
36
- { frag: 'web/playwright.config.js.frag', out: 'web/playwright.config.js' },
37
- { frag: 'web/src/main.js.frag', out: 'web/src/main.js' },
38
- { frag: 'web/src/bus.js.frag', out: 'web/src/bus.js' },
39
- { frag: 'web/src/model.js.frag', out: 'web/src/model.js' },
40
- { frag: 'web/src/api.js.frag', out: 'web/src/api.js' },
41
- { frag: 'web/src/hooks.js.frag', out: 'web/src/hooks.js' },
42
- { frag: 'web/src/theme.js.frag', out: 'web/src/theme.js' },
43
- { frag: 'web/src/customise.js.frag', out: 'web/src/customise.js' },
44
- { frag: 'web/src/custom.css.frag', out: 'web/src/custom.css' },
45
- { frag: 'web/src/style.css.frag', out: 'web/src/style.css' },
46
- { frag: 'web/src/cmp/app.js.frag', out: 'web/src/cmp/app.js' },
47
- { frag: 'web/src/cmp/public.js.frag', out: 'web/src/cmp/public.js' },
48
- { frag: 'web/src/cmp/auth.js.frag', out: 'web/src/cmp/auth.js' },
49
- { frag: 'web/src/cmp/shell.js.frag', out: 'web/src/cmp/shell.js' },
50
- { frag: 'web/src/cmp/admin.js.frag', out: 'web/src/cmp/admin.js' },
51
- { frag: 'web/src/cmp/settings.js.frag', out: 'web/src/cmp/settings.js' },
34
+ { frag: 'web/package.json.frag', out: '$$fe$$/package.json' },
35
+ { frag: 'web/index.html.frag', out: '$$fe$$/index.html' },
36
+ { frag: 'web/playwright.config.js.frag', out: '$$fe$$/playwright.config.js' },
37
+ { frag: 'web/src/main.js.frag', out: '$$fe$$/src/main.js' },
38
+ { frag: 'web/src/bus.js.frag', out: '$$fe$$/src/bus.js' },
39
+ { frag: 'web/src/model.js.frag', out: '$$fe$$/src/model.js' },
40
+ { frag: 'web/src/api.js.frag', out: '$$fe$$/src/api.js' },
41
+ { frag: 'web/src/hooks.js.frag', out: '$$fe$$/src/hooks.js' },
42
+ { frag: 'web/src/theme.js.frag', out: '$$fe$$/src/theme.js' },
43
+ { frag: 'web/src/customise.js.frag', out: '$$fe$$/src/customise.js' },
44
+ { frag: 'web/src/custom.css.frag', out: '$$fe$$/src/custom.css' },
45
+ { frag: 'web/src/style.css.frag', out: '$$fe$$/src/style.css' },
46
+ { frag: 'web/src/cmp/app.js.frag', out: '$$fe$$/src/cmp/app.js' },
47
+ { frag: 'web/src/cmp/public.js.frag', out: '$$fe$$/src/cmp/public.js' },
48
+ { frag: 'web/src/cmp/auth.js.frag', out: '$$fe$$/src/cmp/auth.js' },
49
+ { frag: 'web/src/cmp/shell.js.frag', out: '$$fe$$/src/cmp/shell.js' },
50
+ { frag: 'web/src/cmp/admin.js.frag', out: '$$fe$$/src/cmp/admin.js' },
51
+ { frag: 'web/src/cmp/settings.js.frag', out: '$$fe$$/src/cmp/settings.js' },
52
52
 
53
53
  // Per-component doc sidecars (mermaid structure + message diagrams),
54
54
  // create-once next to each component.
55
- { frag: 'web/src/cmp/app.md.frag', out: 'web/src/cmp/app.md' },
56
- { frag: 'web/src/cmp/public.md.frag', out: 'web/src/cmp/public.md' },
57
- { frag: 'web/src/cmp/auth.md.frag', out: 'web/src/cmp/auth.md' },
58
- { frag: 'web/src/cmp/shell.md.frag', out: 'web/src/cmp/shell.md' },
59
- { frag: 'web/src/cmp/admin.md.frag', out: 'web/src/cmp/admin.md' },
60
- { frag: 'web/src/cmp/settings.md.frag', out: 'web/src/cmp/settings.md' },
61
- { frag: 'web/e2e/smoke.spec.js.frag', out: 'web/e2e/smoke.spec.js' },
62
- { frag: 'web/AGENTS.md.frag', out: 'web/AGENTS.md' },
55
+ { frag: 'web/src/cmp/app.md.frag', out: '$$fe$$/src/cmp/app.md' },
56
+ { frag: 'web/src/cmp/public.md.frag', out: '$$fe$$/src/cmp/public.md' },
57
+ { frag: 'web/src/cmp/auth.md.frag', out: '$$fe$$/src/cmp/auth.md' },
58
+ { frag: 'web/src/cmp/shell.md.frag', out: '$$fe$$/src/cmp/shell.md' },
59
+ { frag: 'web/src/cmp/admin.md.frag', out: '$$fe$$/src/cmp/admin.md' },
60
+ { frag: 'web/src/cmp/settings.md.frag', out: '$$fe$$/src/cmp/settings.md' },
61
+ { frag: 'web/e2e/smoke.spec.js.frag', out: '$$fe$$/e2e/smoke.spec.js' },
62
+ { frag: 'web/AGENTS.md.frag', out: '$$fe$$/AGENTS.md' },
63
63
 
64
64
  // Project docs (Diátaxis) for the web app, alongside the scaffold's
65
65
  // backend docs (@voxgig/create-system DocsPart). Create-once like all
@@ -149,19 +149,51 @@ const DEFAULT_USERS = [
149
149
  ]
150
150
 
151
151
 
152
+ // The frontend folder name, from the model env entry (`web: { dir: ... }`).
153
+ // Defaults to 'web', so a project that says nothing keeps the layout it
154
+ // already has. Everything that names the folder - the WEB_FILES output
155
+ // paths, views.js, theme.css, and the static path the backend runner
156
+ // serves - goes through this one value, via the $$fe$$ slot.
157
+ //
158
+ // Only the FOLDER moves. The `aim:web` message namespace is unrelated and
159
+ // must never follow it: the gateway allow-list is the literal
160
+ // { 'aim:web': true }, and backend/src/env/web/ is the backend runner, not
161
+ // the SPA.
162
+ const DEFAULT_FE = 'web'
163
+
164
+ // Absent means 'web'. ANYTHING ELSE provided is validated rather than
165
+ // silently defaulted - `dir: ''` is a mistake, not a request for 'web', and
166
+ // defaulting it would generate the whole SPA into the project root.
167
+ function feDir(envdef: any): string {
168
+ const dir = null == envdef ? undefined : envdef.dir
169
+ if (null == dir) {
170
+ return DEFAULT_FE
171
+ }
172
+ if ('string' !== typeof dir || '' === dir || dir.split('/').includes('..') ||
173
+ Path.isAbsolute(dir)) {
174
+ throw new Error(
175
+ 'EnvWeb: env web `dir` must be a non-empty relative folder name, got: ' +
176
+ JSON.stringify(dir))
177
+ }
178
+ return dir
179
+ }
180
+
181
+
152
182
  // web_gen(model, spec): generate the frontend + backend web pieces into
153
183
  // the project. spec.root is the project root (parent of backend/); files
154
184
  // that already exist are left untouched (create-once).
155
185
  const web_gen = async (model: any, spec: {
156
- root: string // project root (holds backend/ and web/)
186
+ root: string // project root (holds backend/ and the frontend folder)
157
187
  tm?: string // project tm/web folder (fragment shadowing)
158
- env?: any // the model env entry (config: port, users)
188
+ env?: any // the model env entry (config: port, users, dir)
159
189
  force?: boolean // overwrite existing files (default: create-once)
160
190
  }) => {
161
191
 
162
192
  const core = CoreConfShape(model.main.conf.core)
163
193
  const envdef = spec.env || {}
164
194
 
195
+ const fe = feDir(envdef)
196
+
165
197
  const users = envdef.users || DEFAULT_USERS
166
198
  const seed = users[0] || DEFAULT_USERS[0]
167
199
  const port = envdef.port ||
@@ -170,6 +202,7 @@ const web_gen = async (model: any, spec: {
170
202
  const slots: Record<string, any> = {
171
203
  name: core.name,
172
204
  Name: camelify(core.name),
205
+ fe,
173
206
  users: JSON.stringify(users, null, 2),
174
207
  e2eport: envdef.e2eport || (port + 10),
175
208
  seedEmail: seed.email,
@@ -219,7 +252,7 @@ const web_gen = async (model: any, spec: {
219
252
  })
220
253
  // The component starter plus its doc sidecar, both create-once.
221
254
  for (const ext of ['js', 'md']) {
222
- const outrel = 'web/src/cmp/view/' + c.zone + '_' + c.name + '.' + ext
255
+ const outrel = fe + '/src/cmp/view/' + c.zone + '_' + c.name + '.' + ext
223
256
  const dest = Path.join(spec.root, outrel)
224
257
  if (Fs.existsSync(dest) && !spec.force) {
225
258
  skipped.push(outrel)
@@ -235,7 +268,7 @@ const web_gen = async (model: any, spec: {
235
268
 
236
269
  // views.js — the generated index of custom views. Regenerated whenever the
237
270
  // set of custom views changes; a no-op run leaves it (and `created`) alone.
238
- const viewsRel = 'web/src/views.js'
271
+ const viewsRel = fe + '/src/views.js'
239
272
  const viewsPath = Path.join(spec.root, viewsRel)
240
273
  const viewsBody =
241
274
  '// AUTO-GENERATED: imports every custom entity view (model entities declaring\n' +
@@ -244,7 +277,7 @@ const web_gen = async (model: any, spec: {
244
277
  customs.map((c) => `import './cmp/view/${c.zone}_${c.name}.js'`).join('\n') + '\n'
245
278
  const existingViews = Fs.existsSync(viewsPath) ? Fs.readFileSync(viewsPath, 'utf8') : null
246
279
  if (existingViews !== viewsBody) {
247
- Fs.mkdirSync(Path.join(spec.root, 'web/src'), { recursive: true })
280
+ Fs.mkdirSync(Path.join(spec.root, fe, 'src'), { recursive: true })
248
281
  Fs.writeFileSync(viewsPath, viewsBody)
249
282
  created.push(viewsRel)
250
283
  }
@@ -268,12 +301,12 @@ const web_gen = async (model: any, spec: {
268
301
  '/* AUTO-GENERATED from the model theme (main.theme) — do not edit.\n' +
269
302
  ' Override tokens in custom.css; add modes via the theme:modes hook. */\n\n' +
270
303
  blocks.join('\n\n') + '\n'
271
- const themePath = Path.join(spec.root, 'web/src/theme.css')
304
+ const themePath = Path.join(spec.root, fe, 'src/theme.css')
272
305
  const existingTheme = Fs.existsSync(themePath) ? Fs.readFileSync(themePath, 'utf8') : null
273
306
  if (existingTheme !== themeBody) {
274
- Fs.mkdirSync(Path.join(spec.root, 'web/src'), { recursive: true })
307
+ Fs.mkdirSync(Path.join(spec.root, fe, 'src'), { recursive: true })
275
308
  Fs.writeFileSync(themePath, themeBody)
276
- created.push('web/src/theme.css')
309
+ created.push(fe + '/src/theme.css')
277
310
  }
278
311
  }
279
312
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxgig/build",
3
- "version": "4.11.0",
3
+ "version": "4.12.0",
4
4
  "main": "dist/build.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/build.d.ts",
@@ -1,6 +1,6 @@
1
1
 
2
2
  // Local web runner: the local in-memory backend plus an HTTP layer for
3
- // the SPA - express serving web/dist, the model, and a single seneca
3
+ // the SPA - express serving the frontend dist, the model, and a single seneca
4
4
  // gateway endpoint (/seneca) that the browser-side Seneca bus posts
5
5
  // messages to (seneca-browser fetch transport). Cookie auth via
6
6
  // @seneca/gateway-auth (express_cookie): signin sets the todo-auth
@@ -120,10 +120,12 @@ async function run() {
120
120
  await seedDemo(seneca, usersByEmail)
121
121
 
122
122
  const app = Express()
123
- // web/ is a sibling of backend/; from dist/env/local go up to the
124
- // project root, then web/dist.
123
+ // The frontend folder is a sibling of backend/; from dist/env/local go
124
+ // up to the project root, then into its dist. The folder name comes from
125
+ // the model (env web `dir`, default 'web'), so it stays in step if the
126
+ // project renames it.
125
127
  const webdist = Path.join(
126
- __dirname, '..', '..', '..', '..', 'web', 'dist')
128
+ __dirname, '..', '..', '..', '..', '$$fe$$', 'dist')
127
129
 
128
130
  app
129
131
  .use(Express.json())
@@ -17,9 +17,9 @@ shop: product: ux: { view: 'custom' }
17
17
  cd backend && npm run model-build
18
18
  ```
19
19
 
20
- This creates `web/src/cmp/view/shop_product.js` (a working starter
20
+ This creates `$$fe$$/src/cmp/view/shop_product.js` (a working starter
21
21
  component — create-once, so your edits survive every future build) and
22
- regenerates `web/src/views.js`, the index that imports all custom views.
22
+ regenerates `$$fe$$/src/views.js`, the index that imports all custom views.
23
23
  The shell now mounts `<vg-view-shop-product>` instead of the generic
24
24
  `<vg-entity-admin>` for that entity.
25
25
 
@@ -23,7 +23,7 @@ Then regenerate:
23
23
  cd backend && npm run model-build
24
24
  ```
25
25
 
26
- `web/src/theme.css` is rewritten: every token becomes a CSS variable
26
+ `$$fe$$/src/theme.css` is rewritten: every token becomes a CSS variable
27
27
  (`--vg-primary`, ...) scoped to its mode
28
28
  (`:root[data-theme-mode="light"]`; the default mode also on `:root`).
29
29
  Do not edit `theme.css` by hand — it regenerates from the model.
@@ -38,7 +38,7 @@ choice persists (localStorage `vg-theme-mode`).
38
38
 
39
39
  ## Override per project without touching the model
40
40
 
41
- `web/src/custom.css` loads after the theme:
41
+ `$$fe$$/src/custom.css` loads after the theme:
42
42
 
43
43
  ```css
44
44
  :root { --vg-radius: 10px; } /* all modes */
@@ -48,7 +48,7 @@ choice persists (localStorage `vg-theme-mode`).
48
48
  ## Add modes or intercept the mode list at runtime
49
49
 
50
50
  ```js
51
- // web/src/customise.js
51
+ // $$fe$$/src/customise.js
52
52
  import * as Hooks from './hooks.js'
53
53
  Hooks.addFilter('theme:modes', (modes) => [...modes, 'sepia'])
54
54
  ```
@@ -4,13 +4,13 @@
4
4
  without editing generated components.*
5
5
 
6
6
  Customisations live in two create-once files that survive regeneration:
7
- `web/src/customise.js` (hook registrations) and `web/src/custom.css`
7
+ `$$fe$$/src/customise.js` (hook registrations) and `$$fe$$/src/custom.css`
8
8
  (style overrides).
9
9
 
10
10
  ## Inject or change HTML
11
11
 
12
12
  ```js
13
- // web/src/customise.js
13
+ // $$fe$$/src/customise.js
14
14
  import * as Hooks from './hooks.js'
15
15
 
16
16
  Hooks.addHtml('shell:topbar:right', () => '<span class="vg-badge">Beta</span>')
@@ -46,7 +46,7 @@ and skipped). The full list of points is in the
46
46
  ## Override styles
47
47
 
48
48
  Generated styles use CSS variables from the theme. Override tokens or add
49
- rules in `web/src/custom.css`:
49
+ rules in `$$fe$$/src/custom.css`:
50
50
 
51
51
  ```css
52
52
  :root { --vg-primary: #7c3aed; }
@@ -3,7 +3,7 @@
3
3
  *Diátaxis: reference — the generated SPA's structure, messages, hook
4
4
  points, and theme contract.*
5
5
 
6
- ## Files (web/src/)
6
+ ## Files ($$fe$$/src/)
7
7
 
8
8
  | File | Role | Regenerated? |
9
9
  |---|---|---|
@@ -39,7 +39,7 @@ class $$className$$ extends HTMLElement {
39
39
  `<li>${String(null == it[labelField] ? it.id : it[labelField])}</li>`).join('')
40
40
  || '<li class="vg-muted">Nothing yet.</li>'}</ul>
41
41
  <p class="vg-hint">Hand-coded custom view — edit
42
- web/src/cmp/view/$$zone$$_$$name$$.js to build it out.</p>
42
+ $$fe$$/src/cmp/view/$$zone$$_$$name$$.js to build it out.</p>
43
43
  </div>`
44
44
  }
45
45
  }