@voxgig/build 4.1.0 → 4.3.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.
Files changed (56) hide show
  1. package/build.ts +23 -0
  2. package/dist/build.d.ts +34 -1
  3. package/dist/build.js +19 -1
  4. package/dist/build.js.map +1 -1
  5. package/dist/env/env_gen.d.ts +17 -0
  6. package/dist/env/env_gen.js +154 -0
  7. package/dist/env/env_gen.js.map +1 -0
  8. package/dist/env/lambda/generate.d.ts +3 -2
  9. package/dist/env/lambda/generate.js +13 -9
  10. package/dist/env/lambda/generate.js.map +1 -1
  11. package/dist/env/web/web_gen.d.ts +19 -0
  12. package/dist/env/web/web_gen.js +93 -0
  13. package/dist/env/web/web_gen.js.map +1 -0
  14. package/env/env_gen.ts +179 -0
  15. package/env/lambda/generate.ts +15 -8
  16. package/env/web/web_gen.ts +115 -0
  17. package/package.json +1 -1
  18. package/tm/env/aws/README.md.frag +9 -0
  19. package/tm/env/aws/lambda.entry.ts.frag +89 -0
  20. package/tm/env/aws/serverless.yml.frag +23 -0
  21. package/tm/env/azure/README.md.frag +7 -0
  22. package/tm/env/azure/entry.ts.frag +49 -0
  23. package/tm/env/azure/host.json.frag +8 -0
  24. package/tm/env/basic/README.md.frag +7 -0
  25. package/tm/env/basic/backend.service.frag +14 -0
  26. package/tm/env/basic/deploy.sh.frag +13 -0
  27. package/tm/env/cloudflare/README.md.frag +7 -0
  28. package/tm/env/cloudflare/worker.ts.frag +13 -0
  29. package/tm/env/cloudflare/wrangler.toml.frag +7 -0
  30. package/tm/env/docker/Dockerfile.frag +10 -0
  31. package/tm/env/docker/README.md.frag +7 -0
  32. package/tm/env/docker/compose.yml.frag +10 -0
  33. package/tm/env/local/README.md.frag +7 -0
  34. package/tm/env/local/run.sh.frag +6 -0
  35. package/tm/env/server.entry.ts.frag +48 -0
  36. package/tm/env/vm/README.md.frag +5 -0
  37. package/tm/env/vm/cloud-init.yaml.frag +23 -0
  38. package/tm/web/backend/env/web/web.ts.frag +120 -0
  39. package/tm/web/backend/srv/auth/auth-srv.ts.frag +4 -0
  40. package/tm/web/backend/srv/auth/get_info.ts.frag +5 -0
  41. package/tm/web/backend/srv/auth/load_auth.ts.frag +6 -0
  42. package/tm/web/backend/srv/auth/signin_user.ts.frag +14 -0
  43. package/tm/web/backend/srv/auth/signout_user.ts.frag +5 -0
  44. package/tm/web/backend/srv/auth/web_load_auth.ts.frag +12 -0
  45. package/tm/web/backend/srv/auth/web_signin_user.ts.frag +25 -0
  46. package/tm/web/backend/srv/auth/web_signout_user.ts.frag +9 -0
  47. package/tm/web/web/e2e/smoke.spec.js.frag +21 -0
  48. package/tm/web/web/index.html.frag +13 -0
  49. package/tm/web/web/package.json.frag +17 -0
  50. package/tm/web/web/playwright.config.js.frag +36 -0
  51. package/tm/web/web/src/bus.js.frag +61 -0
  52. package/tm/web/web/src/cmp/admin.js.frag +254 -0
  53. package/tm/web/web/src/cmp/app.js.frag +30 -0
  54. package/tm/web/web/src/cmp/auth.js.frag +97 -0
  55. package/tm/web/web/src/main.js.frag +10 -0
  56. package/tm/web/web/src/style.css.frag +26 -0
package/build.ts CHANGED
@@ -17,6 +17,9 @@ import { srv_yml } from './env/lambda/srv_yml'
17
17
  import { srv_handler } from './env/lambda/srv_handler'
18
18
  import { resources_yml } from './env/lambda/res_yml'
19
19
 
20
+ import { env_gen, ENV_FILES, ENV_SRC, KINDS as ENV_KINDS } from './env/env_gen'
21
+ import { web_gen, WEB_FILES } from './env/web/web_gen'
22
+
20
23
  import {
21
24
  generate, empty, TM,
22
25
  loadFragment, renderFragment, listFragments, PKG_TM,
@@ -34,6 +37,24 @@ const EnvLambda = {
34
37
  }
35
38
 
36
39
 
40
+ // Per-environment deployment artifacts (gen/env/<name>/), driven by the
41
+ // model's `main: env:` declarations. See env/env_gen.ts.
42
+ const EnvGen = {
43
+ env_gen,
44
+ files: ENV_FILES,
45
+ srcfiles: ENV_SRC,
46
+ kinds: [...ENV_KINDS, 'web'],
47
+ }
48
+
49
+
50
+ // EnvWeb: the experimental web frontend (SPA + backend web runner +
51
+ // auth), generated create-once. See env/web/web_gen.ts.
52
+ const EnvWeb = {
53
+ web_gen,
54
+ files: WEB_FILES,
55
+ }
56
+
57
+
37
58
  // Fragment tooling (used by voxgig-system template list/eject/diff, and
38
59
  // available to project code).
39
60
  const Fragments = {
@@ -46,6 +67,8 @@ const Fragments = {
46
67
 
47
68
  export {
48
69
  EnvLambda,
70
+ EnvGen,
71
+ EnvWeb,
49
72
  Fragments,
50
73
 
51
74
  // Building blocks for ejected project templates (src/gen/<name>.ts
package/dist/build.d.ts CHANGED
@@ -23,10 +23,43 @@ declare const EnvLambda: {
23
23
  tm?: string;
24
24
  }) => Promise<void>;
25
25
  };
26
+ declare const EnvGen: {
27
+ env_gen: (model: any, spec: {
28
+ folder: string;
29
+ tm?: string;
30
+ src?: string;
31
+ root?: string;
32
+ }) => Promise<void>;
33
+ files: Record<string, {
34
+ frag: string;
35
+ out: string;
36
+ }[]>;
37
+ srcfiles: Record<string, {
38
+ frag: string;
39
+ dir: string;
40
+ out: string;
41
+ }[]>;
42
+ kinds: string[];
43
+ };
44
+ declare const EnvWeb: {
45
+ web_gen: (model: any, spec: {
46
+ root: string;
47
+ tm?: string;
48
+ env?: any;
49
+ force?: boolean;
50
+ }) => Promise<{
51
+ created: string[];
52
+ skipped: string[];
53
+ }>;
54
+ files: {
55
+ frag: string;
56
+ out: string;
57
+ }[];
58
+ };
26
59
  declare const Fragments: {
27
60
  load: typeof loadFragment;
28
61
  render: typeof renderFragment;
29
62
  list: typeof listFragments;
30
63
  folder: string;
31
64
  };
32
- export { EnvLambda, Fragments, generate, empty, TM, loadFragment, renderFragment, MsgMetaShape, CoreConfShape, CloudConfShape, res_dynamo_yml, };
65
+ export { EnvLambda, EnvGen, EnvWeb, Fragments, generate, empty, TM, loadFragment, renderFragment, MsgMetaShape, CoreConfShape, CloudConfShape, res_dynamo_yml, };
package/dist/build.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /* Copyright © 2022-2026 Voxgig Ltd, MIT License. */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.res_dynamo_yml = exports.CloudConfShape = exports.CoreConfShape = exports.MsgMetaShape = exports.renderFragment = exports.loadFragment = exports.TM = exports.empty = exports.generate = exports.Fragments = exports.EnvLambda = void 0;
4
+ exports.res_dynamo_yml = exports.CloudConfShape = exports.CoreConfShape = exports.MsgMetaShape = exports.renderFragment = exports.loadFragment = exports.TM = exports.empty = exports.generate = exports.Fragments = exports.EnvWeb = exports.EnvGen = exports.EnvLambda = void 0;
5
5
  // EnvLambda: generation of the Lambda deployment templates, built on the
6
6
  // jostraca templating library. The templates live in env/lambda/, one file
7
7
  // per output for convenience:
@@ -17,6 +17,8 @@ exports.res_dynamo_yml = exports.CloudConfShape = exports.CoreConfShape = export
17
17
  const srv_yml_1 = require("./env/lambda/srv_yml");
18
18
  const srv_handler_1 = require("./env/lambda/srv_handler");
19
19
  const res_yml_1 = require("./env/lambda/res_yml");
20
+ const env_gen_1 = require("./env/env_gen");
21
+ const web_gen_1 = require("./env/web/web_gen");
20
22
  const generate_1 = require("./env/lambda/generate");
21
23
  Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generate_1.generate; } });
22
24
  Object.defineProperty(exports, "empty", { enumerable: true, get: function () { return generate_1.empty; } });
@@ -36,6 +38,22 @@ const EnvLambda = {
36
38
  resources_yml: res_yml_1.resources_yml,
37
39
  };
38
40
  exports.EnvLambda = EnvLambda;
41
+ // Per-environment deployment artifacts (gen/env/<name>/), driven by the
42
+ // model's `main: env:` declarations. See env/env_gen.ts.
43
+ const EnvGen = {
44
+ env_gen: env_gen_1.env_gen,
45
+ files: env_gen_1.ENV_FILES,
46
+ srcfiles: env_gen_1.ENV_SRC,
47
+ kinds: [...env_gen_1.KINDS, 'web'],
48
+ };
49
+ exports.EnvGen = EnvGen;
50
+ // EnvWeb: the experimental web frontend (SPA + backend web runner +
51
+ // auth), generated create-once. See env/web/web_gen.ts.
52
+ const EnvWeb = {
53
+ web_gen: web_gen_1.web_gen,
54
+ files: web_gen_1.WEB_FILES,
55
+ };
56
+ exports.EnvWeb = EnvWeb;
39
57
  // Fragment tooling (used by voxgig-system template list/eject/diff, and
40
58
  // available to project code).
41
59
  const Fragments = {
package/dist/build.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../build.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,yEAAyE;AACzE,2EAA2E;AAC3E,8BAA8B;AAC9B,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,yEAAyE;AACzE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,qCAAqC;AAErC,kDAA8C;AAC9C,0DAAsD;AACtD,kDAAoD;AAEpD,oDAG8B;AA+B5B,yFAjCA,mBAAQ,OAiCA;AACR,sFAlCU,gBAAK,OAkCV;AACL,mFAnCiB,aAAE,OAmCjB;AACF,6FAnCA,uBAAY,OAmCA;AACZ,+FApCc,yBAAc,OAoCd;AAjChB,qCAA0C;AAkCxC,6FAlCO,kBAAY,OAkCP;AAjCd,uCAA4D;AAkC1D,8FAlCO,oBAAa,OAkCP;AACb,+FAnCsB,qBAAc,OAmCtB;AAlChB,yDAAqD;AAmCnD,+FAnCO,+BAAc,OAmCP;AAhChB,MAAM,SAAS,GAAG;IAChB,OAAO,EAAP,iBAAO;IACP,WAAW,EAAX,yBAAW;IACX,aAAa,EAAb,uBAAa;CACd,CAAA;AAcC,8BAAS;AAXX,wEAAwE;AACxE,8BAA8B;AAC9B,MAAM,SAAS,GAAG;IAChB,IAAI,EAAE,uBAAY;IAClB,MAAM,EAAE,yBAAc;IACtB,IAAI,EAAE,wBAAa;IACnB,MAAM,EAAE,iBAAM;CACf,CAAA;AAKC,8BAAS"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../build.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,yEAAyE;AACzE,2EAA2E;AAC3E,8BAA8B;AAC9B,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,yEAAyE;AACzE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,qCAAqC;AAErC,kDAA8C;AAC9C,0DAAsD;AACtD,kDAAoD;AAEpD,2CAA+E;AAC/E,+CAAsD;AAEtD,oDAG8B;AAmD5B,yFArDA,mBAAQ,OAqDA;AACR,sFAtDU,gBAAK,OAsDV;AACL,mFAvDiB,aAAE,OAuDjB;AACF,6FAvDA,uBAAY,OAuDA;AACZ,+FAxDc,yBAAc,OAwDd;AArDhB,qCAA0C;AAsDxC,6FAtDO,kBAAY,OAsDP;AArDd,uCAA4D;AAsD1D,8FAtDO,oBAAa,OAsDP;AACb,+FAvDsB,qBAAc,OAuDtB;AAtDhB,yDAAqD;AAuDnD,+FAvDO,+BAAc,OAuDP;AApDhB,MAAM,SAAS,GAAG;IAChB,OAAO,EAAP,iBAAO;IACP,WAAW,EAAX,yBAAW;IACX,aAAa,EAAb,uBAAa;CACd,CAAA;AAgCC,8BAAS;AA7BX,wEAAwE;AACxE,yDAAyD;AACzD,MAAM,MAAM,GAAG;IACb,OAAO,EAAP,iBAAO;IACP,KAAK,EAAE,mBAAS;IAChB,QAAQ,EAAE,iBAAO;IACjB,KAAK,EAAE,CAAC,GAAG,eAAS,EAAE,KAAK,CAAC;CAC7B,CAAA;AAuBC,wBAAM;AApBR,oEAAoE;AACpE,wDAAwD;AACxD,MAAM,MAAM,GAAG;IACb,OAAO,EAAP,iBAAO;IACP,KAAK,EAAE,mBAAS;CACjB,CAAA;AAgBC,wBAAM;AAbR,wEAAwE;AACxE,8BAA8B;AAC9B,MAAM,SAAS,GAAG;IAChB,IAAI,EAAE,uBAAY;IAClB,MAAM,EAAE,yBAAc;IACtB,IAAI,EAAE,wBAAa;IACnB,MAAM,EAAE,iBAAM;CACf,CAAA;AAOC,8BAAS"}
@@ -0,0 +1,17 @@
1
+ declare const ENV_FILES: Record<string, {
2
+ frag: string;
3
+ out: string;
4
+ }[]>;
5
+ declare const ENV_SRC: Record<string, {
6
+ frag: string;
7
+ dir: string;
8
+ out: string;
9
+ }[]>;
10
+ declare const KINDS: string[];
11
+ declare const env_gen: (model: any, spec: {
12
+ folder: string;
13
+ tm?: string;
14
+ src?: string;
15
+ root?: string;
16
+ }) => Promise<void>;
17
+ export { env_gen, ENV_FILES, ENV_SRC, KINDS, };
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /* Copyright © 2026 Voxgig Ltd, MIT License. */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.KINDS = exports.ENV_SRC = exports.ENV_FILES = exports.env_gen = void 0;
8
+ // EnvGen: per-environment deployment artifact generation. The project
9
+ // model declares its target environments under `main: env:`:
10
+ //
11
+ // main: env: local: { active: true }
12
+ // main: env: aws: { active: true, region: 'eu-west-1', stage: 'dev' }
13
+ //
14
+ // For each active environment this generates gen/env/<name>/ from the
15
+ // fragment set tm/env/<kind>/ (kind defaults to the env name, so a
16
+ // project can declare e.g. `aws2: { kind: 'aws', region: ... }`).
17
+ // Fragments are project-shadowable via spec.tm (the project's tm/env
18
+ // folder), like the lambda templates.
19
+ const fs_1 = __importDefault(require("fs"));
20
+ const path_1 = __importDefault(require("path"));
21
+ const util_1 = require("@voxgig/util");
22
+ const conf_1 = require("../shape/conf");
23
+ const generate_1 = require("./lambda/generate");
24
+ const web_gen_1 = require("./web/web_gen");
25
+ // The supported environment kinds and the files each generates.
26
+ // `out` may contain $$slots$$ (rendered with the same slot values).
27
+ const ENV_FILES = {
28
+ local: [
29
+ { frag: 'local/run.sh.frag', out: 'run.sh' },
30
+ { frag: 'local/README.md.frag', out: 'README.md' },
31
+ ],
32
+ basic: [
33
+ { frag: 'basic/backend.service.frag', out: '$$name$$-backend.service' },
34
+ { frag: 'basic/deploy.sh.frag', out: 'deploy.sh' },
35
+ { frag: 'basic/README.md.frag', out: 'README.md' },
36
+ ],
37
+ docker: [
38
+ { frag: 'docker/Dockerfile.frag', out: 'Dockerfile' },
39
+ { frag: 'docker/compose.yml.frag', out: 'compose.yml' },
40
+ { frag: 'docker/README.md.frag', out: 'README.md' },
41
+ ],
42
+ vm: [
43
+ { frag: 'vm/cloud-init.yaml.frag', out: 'cloud-init.yaml' },
44
+ { frag: 'vm/README.md.frag', out: 'README.md' },
45
+ ],
46
+ aws: [
47
+ { frag: 'aws/serverless.yml.frag', out: 'serverless.yml' },
48
+ { frag: 'aws/README.md.frag', out: 'README.md' },
49
+ ],
50
+ azure: [
51
+ { frag: 'azure/host.json.frag', out: 'host.json' },
52
+ { frag: 'azure/README.md.frag', out: 'README.md' },
53
+ ],
54
+ cloudflare: [
55
+ { frag: 'cloudflare/wrangler.toml.frag', out: 'wrangler.toml' },
56
+ { frag: 'cloudflare/README.md.frag', out: 'README.md' },
57
+ ],
58
+ };
59
+ exports.ENV_FILES = ENV_FILES;
60
+ // The runtime entry point + Seneca config setup each environment needs
61
+ // under src/env/. These are generated ONCE (only when missing): after
62
+ // creation the project owns them, like the scaffold's local entry. All
63
+ // entries route Seneca configuration through src/env/shared/basic.ts.
64
+ // `dir` is relative to the project src/env folder.
65
+ const ENV_SRC = {
66
+ local: [], // scaffold provides src/env/local/local.ts
67
+ basic: [
68
+ { frag: 'server.entry.ts.frag', dir: 'basic', out: 'basic.ts' },
69
+ ],
70
+ docker: [
71
+ { frag: 'server.entry.ts.frag', dir: 'docker', out: 'docker.ts' },
72
+ ],
73
+ vm: [
74
+ { frag: 'server.entry.ts.frag', dir: 'vm', out: 'vm.ts' },
75
+ ],
76
+ aws: [
77
+ // The Lambda bootstrap the generated handlers import.
78
+ { frag: 'aws/lambda.entry.ts.frag', dir: 'lambda', out: 'lambda.ts' },
79
+ ],
80
+ azure: [
81
+ { frag: 'azure/entry.ts.frag', dir: 'azure', out: 'azure.ts' },
82
+ ],
83
+ cloudflare: [
84
+ { frag: 'cloudflare/worker.ts.frag', dir: 'cloudflare', out: 'worker.ts' },
85
+ ],
86
+ };
87
+ exports.ENV_SRC = ENV_SRC;
88
+ const KINDS = Object.keys(ENV_FILES);
89
+ exports.KINDS = KINDS;
90
+ const env_gen = async (model, spec) => {
91
+ var _a;
92
+ const core = (0, conf_1.CoreConfShape)(model.main.conf.core);
93
+ const envs = model.main.env || {};
94
+ for (const entry of Object.entries(envs)) {
95
+ const name = entry[0];
96
+ const def = entry[1] || {};
97
+ if (false === def.active) {
98
+ continue;
99
+ }
100
+ const kind = def.kind || name;
101
+ // The 'web' kind is the frontend SPA (+ backend web runner + auth),
102
+ // not a flat deployment-artifact set - delegate to EnvWeb.
103
+ if ('web' === kind) {
104
+ if (null == spec.root) {
105
+ throw new Error('@voxgig/build: env kind "web" needs spec.root ' +
106
+ '(the project root); pass it from the build action');
107
+ }
108
+ await (0, web_gen_1.web_gen)(model, { root: spec.root, tm: spec.tm, env: def });
109
+ continue;
110
+ }
111
+ const filedefs = ENV_FILES[kind];
112
+ if (null == filedefs) {
113
+ throw new Error('@voxgig/build: unknown environment kind: ' + kind +
114
+ ' (env ' + name + '; known kinds: ' + KINDS.join(', ') + ')');
115
+ }
116
+ // Slot values: project identity, ports, and per-env config with
117
+ // sensible defaults. Additional scalar config keys on the env
118
+ // definition become slots too.
119
+ const slots = {
120
+ name: core.name,
121
+ Name: (0, util_1.camelify)(core.name),
122
+ env: name,
123
+ port: ((_a = model.main.conf.port) === null || _a === void 0 ? void 0 : _a.backend) || 8080,
124
+ node: def.node || '22',
125
+ region: def.region || 'us-east-1',
126
+ stage: def.stage || 'dev',
127
+ };
128
+ for (const key of Object.keys(def)) {
129
+ if ('object' !== typeof def[key] && null == slots[key]) {
130
+ slots[key] = def[key];
131
+ }
132
+ }
133
+ // Slot for the env name inside entry fragments.
134
+ slots.env = name;
135
+ const files = filedefs.map((fd) => ({
136
+ name: (0, generate_1.renderFragment)(fd.out, slots),
137
+ content: (0, generate_1.renderFragment)((0, generate_1.loadFragment)(fd.frag, spec, 'env'), slots),
138
+ }));
139
+ await (0, generate_1.generate)(spec.folder + '/' + name, files);
140
+ // Runtime entries: create-once into src/env (user-owned afterwards).
141
+ if (null != spec.src) {
142
+ for (const sd of (ENV_SRC[kind] || [])) {
143
+ const dest = path_1.default.join(spec.src, sd.dir, (0, generate_1.renderFragment)(sd.out, slots));
144
+ if (!fs_1.default.existsSync(dest)) {
145
+ const content = (0, generate_1.renderFragment)((0, generate_1.loadFragment)(sd.frag, spec, 'env'), slots);
146
+ fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
147
+ fs_1.default.writeFileSync(dest, content);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ };
153
+ exports.env_gen = env_gen;
154
+ //# sourceMappingURL=env_gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env_gen.js","sourceRoot":"","sources":["../../env/env_gen.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
+ declare const PKG_TM_ROOT: string;
1
2
  declare const PKG_TM: string;
2
3
  declare function loadFragment(name: string, spec?: {
3
4
  tm?: string;
4
- }): string;
5
+ }, area?: string): string;
5
6
  declare function renderFragment(src: string, slots: Record<string, any>): string;
6
7
  declare function listFragments(): string[];
7
8
  declare function generate(folder: string, files: {
@@ -10,4 +11,4 @@ declare function generate(folder: string, files: {
10
11
  }[]): Promise<void>;
11
12
  declare function empty(o: any): boolean;
12
13
  declare function TM(str: string): string;
13
- export { generate, empty, TM, loadFragment, renderFragment, listFragments, PKG_TM, };
14
+ export { generate, empty, TM, loadFragment, renderFragment, listFragments, PKG_TM, PKG_TM_ROOT, };
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.PKG_TM = void 0;
7
+ exports.PKG_TM_ROOT = exports.PKG_TM = void 0;
8
8
  exports.generate = generate;
9
9
  exports.empty = empty;
10
10
  exports.TM = TM;
@@ -23,21 +23,25 @@ const jostraca_1 = require("jostraca");
23
23
  // placing a same-named file in its own tm folder (passed as spec.tm by
24
24
  // the project's build actions). The fragment file's final newline is
25
25
  // dropped at load, so slot values fully control trailing bytes.
26
- // Package tm folder: compiled code lives at <pkg>/dist/env/lambda (three
26
+ // Package tm root: compiled code lives at <pkg>/dist/env/lambda (three
27
27
  // levels down), but test transforms run the source at <pkg>/env/lambda
28
- // (two levels down) - probe both.
29
- const PKG_TM = [
30
- path_1.default.join(__dirname, '..', '..', '..', 'tm', 'lambda'),
31
- path_1.default.join(__dirname, '..', '..', 'tm', 'lambda'),
28
+ // (two levels down) - probe both. Areas (tm/<area>/...) group fragment
29
+ // sets: 'lambda' (the EnvLambda templates) and 'env' (per-environment
30
+ // deployment templates).
31
+ const PKG_TM_ROOT = [
32
+ path_1.default.join(__dirname, '..', '..', '..', 'tm'),
33
+ path_1.default.join(__dirname, '..', '..', 'tm'),
32
34
  ].find((p) => fs_1.default.existsSync(p)) ||
33
- path_1.default.join(__dirname, '..', '..', '..', 'tm', 'lambda');
35
+ path_1.default.join(__dirname, '..', '..', '..', 'tm');
36
+ exports.PKG_TM_ROOT = PKG_TM_ROOT;
37
+ const PKG_TM = path_1.default.join(PKG_TM_ROOT, 'lambda');
34
38
  exports.PKG_TM = PKG_TM;
35
- function loadFragment(name, spec) {
39
+ function loadFragment(name, spec, area = 'lambda') {
36
40
  const candidates = [];
37
41
  if (spec === null || spec === void 0 ? void 0 : spec.tm) {
38
42
  candidates.push(path_1.default.join(spec.tm, name));
39
43
  }
40
- candidates.push(path_1.default.join(PKG_TM, name));
44
+ candidates.push(path_1.default.join(PKG_TM_ROOT, area, name));
41
45
  for (const c of candidates) {
42
46
  if (fs_1.default.existsSync(c)) {
43
47
  let src = fs_1.default.readFileSync(c, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../env/lambda/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../env/lambda/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ declare const WEB_FILES: {
2
+ frag: string;
3
+ out: string;
4
+ }[];
5
+ declare const DEFAULT_USERS: {
6
+ name: string;
7
+ email: string;
8
+ password: string;
9
+ }[];
10
+ declare const web_gen: (model: any, spec: {
11
+ root: string;
12
+ tm?: string;
13
+ env?: any;
14
+ force?: boolean;
15
+ }) => Promise<{
16
+ created: string[];
17
+ skipped: string[];
18
+ }>;
19
+ export { web_gen, WEB_FILES, DEFAULT_USERS, };
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /* Copyright © 2026 Voxgig Ltd, MIT License. */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DEFAULT_USERS = exports.WEB_FILES = exports.web_gen = void 0;
8
+ // EnvWeb: generate the experimental web frontend - a Single Page App built
9
+ // from web components on a client-side Seneca service bus (no React/Vue) -
10
+ // plus the backend web runner and auth service it needs.
11
+ //
12
+ // Everything EnvWeb generates is CREATE-ONCE: a project owns its frontend
13
+ // after generation (the SPA is a starting point users heavily customize).
14
+ // Fragments live in @voxgig/build tm/web/ and are project-shadowable via
15
+ // spec.tm (the project's tm/web folder), like every other template.
16
+ //
17
+ // The entity admin is model-driven at RUNTIME (it fetches the compiled
18
+ // model.json), so the generated SPA adapts to any model with no
19
+ // per-entity code generation.
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const path_1 = __importDefault(require("path"));
22
+ const util_1 = require("@voxgig/util");
23
+ const conf_1 = require("../../shape/conf");
24
+ const generate_1 = require("../lambda/generate");
25
+ // File manifest: fragment (relative to tm/web) -> output path (relative to
26
+ // the project root, which holds backend/ and web/). $$slots$$ in the
27
+ // output path are rendered too.
28
+ const WEB_FILES = [
29
+ // Frontend SPA (web/)
30
+ { frag: 'web/package.json.frag', out: 'web/package.json' },
31
+ { frag: 'web/index.html.frag', out: 'web/index.html' },
32
+ { frag: 'web/playwright.config.js.frag', out: 'web/playwright.config.js' },
33
+ { frag: 'web/src/main.js.frag', out: 'web/src/main.js' },
34
+ { frag: 'web/src/bus.js.frag', out: 'web/src/bus.js' },
35
+ { frag: 'web/src/style.css.frag', out: 'web/src/style.css' },
36
+ { frag: 'web/src/cmp/app.js.frag', out: 'web/src/cmp/app.js' },
37
+ { frag: 'web/src/cmp/auth.js.frag', out: 'web/src/cmp/auth.js' },
38
+ { frag: 'web/src/cmp/admin.js.frag', out: 'web/src/cmp/admin.js' },
39
+ { frag: 'web/e2e/smoke.spec.js.frag', out: 'web/e2e/smoke.spec.js' },
40
+ // Backend web runner + auth service (backend/src/...)
41
+ { frag: 'backend/env/web/web.ts.frag', out: 'backend/src/env/web/web.ts' },
42
+ { frag: 'backend/srv/auth/auth-srv.ts.frag', out: 'backend/src/srv/auth/auth-srv.ts' },
43
+ { frag: 'backend/srv/auth/get_info.ts.frag', out: 'backend/src/srv/auth/get_info.ts' },
44
+ { frag: 'backend/srv/auth/signin_user.ts.frag', out: 'backend/src/srv/auth/signin_user.ts' },
45
+ { frag: 'backend/srv/auth/signout_user.ts.frag', out: 'backend/src/srv/auth/signout_user.ts' },
46
+ { frag: 'backend/srv/auth/load_auth.ts.frag', out: 'backend/src/srv/auth/load_auth.ts' },
47
+ { frag: 'backend/srv/auth/web_signin_user.ts.frag', out: 'backend/src/srv/auth/web_signin_user.ts' },
48
+ { frag: 'backend/srv/auth/web_signout_user.ts.frag', out: 'backend/src/srv/auth/web_signout_user.ts' },
49
+ { frag: 'backend/srv/auth/web_load_auth.ts.frag', out: 'backend/src/srv/auth/web_load_auth.ts' },
50
+ ];
51
+ exports.WEB_FILES = WEB_FILES;
52
+ // Default seeded users (local testing only), rendered into the runner.
53
+ const DEFAULT_USERS = [
54
+ { name: 'Alice Example', email: 'alice@example.com', password: 'alice-pass-01' },
55
+ { name: 'Bob Example', email: 'bob@example.com', password: 'bob-pass-01' },
56
+ ];
57
+ exports.DEFAULT_USERS = DEFAULT_USERS;
58
+ // web_gen(model, spec): generate the frontend + backend web pieces into
59
+ // the project. spec.root is the project root (parent of backend/); files
60
+ // that already exist are left untouched (create-once).
61
+ const web_gen = async (model, spec) => {
62
+ const core = (0, conf_1.CoreConfShape)(model.main.conf.core);
63
+ const envdef = spec.env || {};
64
+ const users = envdef.users || DEFAULT_USERS;
65
+ const seed = users[0] || DEFAULT_USERS[0];
66
+ const port = envdef.port ||
67
+ (model.main.conf.port && model.main.conf.port.backend) || 8080;
68
+ const slots = {
69
+ name: core.name,
70
+ Name: (0, util_1.camelify)(core.name),
71
+ users: JSON.stringify(users, null, 2),
72
+ e2eport: envdef.e2eport || (port + 10),
73
+ seedEmail: seed.email,
74
+ seedPassword: seed.password,
75
+ };
76
+ const created = [];
77
+ const skipped = [];
78
+ for (const fd of WEB_FILES) {
79
+ const outrel = (0, generate_1.renderFragment)(fd.out, slots);
80
+ const dest = path_1.default.join(spec.root, outrel);
81
+ if (fs_1.default.existsSync(dest) && !spec.force) {
82
+ skipped.push(outrel);
83
+ continue;
84
+ }
85
+ const content = (0, generate_1.renderFragment)((0, generate_1.loadFragment)(fd.frag, spec, 'web'), slots);
86
+ fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
87
+ fs_1.default.writeFileSync(dest, content);
88
+ created.push(outrel);
89
+ }
90
+ return { created: created.sort(), skipped: skipped.sort() };
91
+ };
92
+ exports.web_gen = web_gen;
93
+ //# sourceMappingURL=web_gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_gen.js","sourceRoot":"","sources":["../../../env/web/web_gen.ts"],"names":[],"mappings":";AAAA,+CAA+C;;;;;;AAE/C,2EAA2E;AAC3E,2EAA2E;AAC3E,yDAAyD;AACzD,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,yEAAyE;AACzE,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,gEAAgE;AAChE,8BAA8B;AAE9B,4CAAmB;AACnB,gDAAuB;AAEvB,uCAAuC;AAEvC,2CAAgD;AAEhD,iDAAiE;AAGjE,2EAA2E;AAC3E,qEAAqE;AACrE,gCAAgC;AAChC,MAAM,SAAS,GAAoC;IACjD,sBAAsB;IACtB,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,EAAE,kBAAkB,EAAE;IAC1D,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,gBAAgB,EAAE;IACtD,EAAE,IAAI,EAAE,+BAA+B,EAAE,GAAG,EAAE,0BAA0B,EAAE;IAC1E,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,iBAAiB,EAAE;IACxD,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,gBAAgB,EAAE;IACtD,EAAE,IAAI,EAAE,wBAAwB,EAAE,GAAG,EAAE,mBAAmB,EAAE;IAC5D,EAAE,IAAI,EAAE,yBAAyB,EAAE,GAAG,EAAE,oBAAoB,EAAE;IAC9D,EAAE,IAAI,EAAE,0BAA0B,EAAE,GAAG,EAAE,qBAAqB,EAAE;IAChE,EAAE,IAAI,EAAE,2BAA2B,EAAE,GAAG,EAAE,sBAAsB,EAAE;IAClE,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,uBAAuB,EAAE;IAEpE,sDAAsD;IACtD,EAAE,IAAI,EAAE,6BAA6B,EAAE,GAAG,EAAE,4BAA4B,EAAE;IAC1E,EAAE,IAAI,EAAE,mCAAmC,EAAE,GAAG,EAAE,kCAAkC,EAAE;IACtF,EAAE,IAAI,EAAE,mCAAmC,EAAE,GAAG,EAAE,kCAAkC,EAAE;IACtF,EAAE,IAAI,EAAE,sCAAsC,EAAE,GAAG,EAAE,qCAAqC,EAAE;IAC5F,EAAE,IAAI,EAAE,uCAAuC,EAAE,GAAG,EAAE,sCAAsC,EAAE;IAC9F,EAAE,IAAI,EAAE,oCAAoC,EAAE,GAAG,EAAE,mCAAmC,EAAE;IACxF,EAAE,IAAI,EAAE,0CAA0C,EAAE,GAAG,EAAE,yCAAyC,EAAE;IACpG,EAAE,IAAI,EAAE,2CAA2C,EAAE,GAAG,EAAE,0CAA0C,EAAE;IACtG,EAAE,IAAI,EAAE,wCAAwC,EAAE,GAAG,EAAE,uCAAuC,EAAE;CACjG,CAAA;AA6DC,8BAAS;AA1DX,uEAAuE;AACvE,MAAM,aAAa,GAAG;IACpB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;IAChF,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE;CAC3E,CAAA;AAuDC,sCAAa;AApDf,wEAAwE;AACxE,yEAAyE;AACzE,uDAAuD;AACvD,MAAM,OAAO,GAAG,KAAK,EAAE,KAAU,EAAE,IAKlC,EAAE,EAAE;IAEH,MAAM,IAAI,GAAG,IAAA,oBAAa,EAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAA;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI;QACtB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IAEhE,MAAM,KAAK,GAAwB;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAA,eAAQ,EAAC,IAAI,CAAC,IAAI,CAAC;QACzB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACtC,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,YAAY,EAAE,IAAI,CAAC,QAAQ;KAC5B,CAAA;IAED,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAA,yBAAc,EAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAEzC,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpB,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,yBAAc,EAAC,IAAA,uBAAY,EAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;QACzE,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrD,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAA;AAC7D,CAAC,CAAA;AAIC,0BAAO"}