@bravostudioai/react 0.1.18 → 0.1.21
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/_virtual/index.js +6 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/_virtual/use-sync-external-store-shim.development.js +5 -0
- package/dist/_virtual/use-sync-external-store-shim.development.js.map +1 -0
- package/dist/_virtual/use-sync-external-store-shim.production.js +5 -0
- package/dist/_virtual/use-sync-external-store-shim.production.js.map +1 -0
- package/dist/cli/commands/generate.js +144 -129
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/components/DynamicComponent.js.map +1 -1
- package/dist/components/EncoreApp.js +42 -39
- package/dist/components/EncoreApp.js.map +1 -1
- package/dist/components/EncoreErrorBoundary.js.map +1 -1
- package/dist/components/EncoreLoadingFallback.js.map +1 -1
- package/dist/components.js +343 -336
- package/dist/components.js.map +1 -1
- package/dist/contexts/EncoreActionContext.js +3 -3
- package/dist/contexts/EncoreActionContext.js.map +1 -1
- package/dist/contexts/EncoreAppContext.js +2 -2
- package/dist/contexts/EncoreAppContext.js.map +1 -1
- package/dist/contexts/EncoreBindingContext.js +2 -2
- package/dist/contexts/EncoreBindingContext.js.map +1 -1
- package/dist/contexts/EncoreComponentIdContext.js +3 -5
- package/dist/contexts/EncoreComponentIdContext.js.map +1 -1
- package/dist/contexts/EncoreRepeatingContainerContext.js +2 -2
- package/dist/contexts/EncoreRepeatingContainerContext.js.map +1 -1
- package/dist/contexts/EncoreRouterContext.js +2 -2
- package/dist/contexts/EncoreRouterContext.js.map +1 -1
- package/dist/hooks/usePusherUpdates.js +1 -1
- package/dist/hooks/usePusherUpdates.js.map +1 -1
- package/dist/index.js +21 -19
- package/dist/index.js.map +1 -1
- package/dist/lib/fetcher.js +22 -17
- package/dist/lib/fetcher.js.map +1 -1
- package/dist/node_modules/dequal/lite/index.js +25 -0
- package/dist/node_modules/dequal/lite/index.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/config-context-12s-Dh3trQsc.js +289 -0
- package/dist/node_modules/swr/dist/_internal/config-context-12s-Dh3trQsc.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/constants.js +5 -0
- package/dist/node_modules/swr/dist/_internal/constants.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/events.js +8 -0
- package/dist/node_modules/swr/dist/_internal/events.js.map +1 -0
- package/dist/node_modules/swr/dist/_internal/index.js +78 -0
- package/dist/node_modules/swr/dist/_internal/index.js.map +1 -0
- package/dist/node_modules/swr/dist/index/index.js +216 -0
- package/dist/node_modules/swr/dist/index/index.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +59 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +47 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js +11 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
- package/dist/src/cli/commands/generate.d.ts.map +1 -1
- package/dist/src/components/DynamicComponent.d.ts.map +1 -1
- package/dist/src/components/EncoreApp.d.ts.map +1 -1
- package/dist/src/components/EncoreErrorBoundary.d.ts.map +1 -1
- package/dist/src/components/EncoreLoadingFallback.d.ts.map +1 -1
- package/dist/src/components.d.ts.map +1 -1
- package/dist/src/contexts/EncoreActionContext.d.ts +1 -2
- package/dist/src/contexts/EncoreActionContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreAppContext.d.ts +1 -2
- package/dist/src/contexts/EncoreAppContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreBindingContext.d.ts +1 -2
- package/dist/src/contexts/EncoreBindingContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreComponentIdContext.d.ts +1 -2
- package/dist/src/contexts/EncoreComponentIdContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreRepeatingContainerContext.d.ts +1 -2
- package/dist/src/contexts/EncoreRepeatingContainerContext.d.ts.map +1 -1
- package/dist/src/contexts/EncoreRouterContext.d.ts +1 -2
- package/dist/src/contexts/EncoreRouterContext.d.ts.map +1 -1
- package/dist/src/hooks/useAuthRedirect.d.ts.map +1 -1
- package/dist/src/hooks/usePusherUpdates.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/lib/fetcher.d.ts.map +1 -1
- package/dist/src/stores/useEncoreState.d.ts.map +1 -1
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/stores/useEncoreState.js.map +1 -1
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -2
- package/src/components/DynamicComponent.tsx +1 -0
- package/src/components/EncoreApp.tsx +3 -1
- package/src/components/EncoreErrorBoundary.tsx +36 -35
- package/src/components/EncoreLoadingFallback.tsx +19 -18
- package/src/components.tsx +5 -34
- package/src/contexts/EncoreActionContext.ts +4 -2
- package/src/contexts/EncoreAppContext.ts +4 -2
- package/src/contexts/EncoreBindingContext.ts +4 -2
- package/src/contexts/EncoreComponentIdContext.ts +4 -4
- package/src/contexts/EncoreRepeatingContainerContext.ts +4 -3
- package/src/contexts/EncoreRouterContext.ts +4 -2
- package/src/hooks/useAuthRedirect.ts +2 -0
- package/src/hooks/usePusherUpdates.ts +2 -0
- package/src/index.ts +2 -0
- package/src/stores/useEncoreState.ts +2 -0
- package/src/version.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-sync-external-store-shim.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-sync-external-store-shim.production.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { promises as
|
|
2
|
-
import { join as
|
|
3
|
-
import { m as
|
|
4
|
-
import { CONST_APPS_SERVICE_URL as
|
|
5
|
-
import { findSlidersAndDataBindings as
|
|
6
|
-
import { generateComponentCode as
|
|
7
|
-
const { writeFile:
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
console.log(`Using APPS_SERVICE_URL: ${
|
|
11
|
-
const
|
|
12
|
-
async function
|
|
1
|
+
import { promises as k, existsSync as v } from "fs";
|
|
2
|
+
import { join as i, dirname as W } from "path";
|
|
3
|
+
import { m as Y } from "../../_virtual/main.js";
|
|
4
|
+
import { CONST_APPS_SERVICE_URL as q, CONST_COMPONENTS_CDN_URL as z } from "../../packages/encore-lib/constants.js";
|
|
5
|
+
import { findSlidersAndDataBindings as X, findStandaloneComponents as Z, findInputGroups as H, findForms as Q, qualifyFormInputs as ee, findStandaloneSelectInputs as te, findActionButtons as oe, sanitizePropName as A } from "../../codegen/parser.js";
|
|
6
|
+
import { generateComponentCode as ae, generateReadme as ne } from "../../codegen/generator.js";
|
|
7
|
+
const { writeFile: P, mkdir: G, readFile: R } = k;
|
|
8
|
+
Y.config();
|
|
9
|
+
const E = process.env.APPS_SERVICE_URL || process.env.VITE_APPS_SERVICE_URL || q;
|
|
10
|
+
console.log(`Using APPS_SERVICE_URL: ${E}`);
|
|
11
|
+
const se = z;
|
|
12
|
+
async function U(o, n) {
|
|
13
13
|
const t = await fetch(o, {
|
|
14
|
-
headers:
|
|
14
|
+
headers: n || {}
|
|
15
15
|
});
|
|
16
16
|
if (!t.ok)
|
|
17
17
|
throw new Error(
|
|
@@ -19,178 +19,191 @@ async function _(o, a) {
|
|
|
19
19
|
);
|
|
20
20
|
return await t.text();
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
const t =
|
|
22
|
+
function re(o, n) {
|
|
23
|
+
const t = A(o), p = A(n), g = t.charAt(0).toUpperCase() + t.slice(1), d = p.charAt(0).toUpperCase() + p.slice(1);
|
|
24
24
|
return {
|
|
25
|
-
directoryPath:
|
|
26
|
-
componentName:
|
|
25
|
+
directoryPath: i(g, d),
|
|
26
|
+
componentName: d
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
-
async function
|
|
30
|
-
const
|
|
31
|
-
console.log(`Fetching app data from ${
|
|
29
|
+
async function ie(o) {
|
|
30
|
+
const n = `${E}/devices/apps/${o}`;
|
|
31
|
+
console.log(`Fetching app data from ${n}...`);
|
|
32
32
|
try {
|
|
33
|
-
const t = await
|
|
34
|
-
return { pages:
|
|
33
|
+
const t = await U(n), p = JSON.parse(t);
|
|
34
|
+
return { pages: p?.app?.data?.pages || [], appData: p };
|
|
35
35
|
} catch (t) {
|
|
36
36
|
throw console.error("Failed to fetch app data:", t), t;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
async function
|
|
39
|
+
async function K({
|
|
40
40
|
appId: o,
|
|
41
|
-
pageId:
|
|
41
|
+
pageId: n,
|
|
42
42
|
outputPath: t,
|
|
43
|
-
cachedAppData:
|
|
44
|
-
isProduction:
|
|
43
|
+
cachedAppData: p,
|
|
44
|
+
isProduction: g,
|
|
45
|
+
usedNames: d
|
|
45
46
|
}) {
|
|
46
|
-
console.log(`Generating wrapper for app: ${o}, page: ${
|
|
47
|
-
let
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
47
|
+
console.log(`Generating wrapper for app: ${o}, page: ${n}`);
|
|
48
|
+
let s = t, u = !1;
|
|
49
|
+
const l = t.split(".").pop()?.toLowerCase();
|
|
50
|
+
if (l !== "tsx" && l !== "ts" && l !== "jsx" && l !== "js") {
|
|
50
51
|
const { stat: e } = await import("fs/promises");
|
|
51
52
|
try {
|
|
52
|
-
(await e(t)).isDirectory() && (
|
|
53
|
+
(await e(t)).isDirectory() && (u = !0);
|
|
53
54
|
} catch {
|
|
54
|
-
(!
|
|
55
|
+
(!l || t.endsWith("/")) && (u = !0);
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
u && console.log(
|
|
58
59
|
"Output path is a directory, will generate filename from app/page names"
|
|
59
60
|
), console.log(`Output path: ${t}`);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
const
|
|
61
|
+
const f = i(process.cwd(), ".temp-bravo", o, n);
|
|
62
|
+
v(f) || await G(f, { recursive: !0 });
|
|
63
|
+
const _ = [
|
|
63
64
|
{
|
|
64
|
-
url: `${
|
|
65
|
+
url: `${E}/devices/apps/${o}`,
|
|
65
66
|
filename: "app.json",
|
|
66
67
|
skipIfCached: !0
|
|
67
68
|
},
|
|
68
69
|
{
|
|
69
|
-
url: `${
|
|
70
|
+
url: `${E}/devices/apps/${o}/node/${n}`,
|
|
70
71
|
filename: "page.json"
|
|
71
72
|
},
|
|
72
73
|
{
|
|
73
|
-
url: `${
|
|
74
|
+
url: `${se}/${o}/draft/components/${n}.js`,
|
|
74
75
|
filename: "component.js"
|
|
75
76
|
}
|
|
76
77
|
];
|
|
77
|
-
for (const e of
|
|
78
|
-
if (e.skipIfCached &&
|
|
78
|
+
for (const e of _) {
|
|
79
|
+
if (e.skipIfCached && p) {
|
|
79
80
|
console.log(`Using cached ${e.filename} (skipping download)`);
|
|
80
|
-
const r =
|
|
81
|
-
await
|
|
81
|
+
const r = i(f, e.filename);
|
|
82
|
+
await P(
|
|
82
83
|
r,
|
|
83
|
-
JSON.stringify(
|
|
84
|
+
JSON.stringify(p, null, 2),
|
|
84
85
|
"utf-8"
|
|
85
86
|
), console.log(`✓ Saved ${e.filename} from cache`);
|
|
86
87
|
continue;
|
|
87
88
|
}
|
|
88
89
|
try {
|
|
89
90
|
console.log(`Downloading ${e.filename} from ${e.url}...`);
|
|
90
|
-
const r = await
|
|
91
|
-
await
|
|
91
|
+
const r = await U(e.url, e.headers), c = i(f, e.filename);
|
|
92
|
+
await P(c, r, "utf-8"), console.log(`✓ Saved ${e.filename}`);
|
|
92
93
|
} catch (r) {
|
|
93
94
|
throw console.error(`✗ Failed to download ${e.filename}:`, r), r;
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
|
-
const
|
|
97
|
-
let
|
|
98
|
-
if (!
|
|
97
|
+
const w = i(f, "page.json"), C = await R(w, "utf-8"), x = JSON.parse(C);
|
|
98
|
+
let a = x.data || x;
|
|
99
|
+
if (!a.body && !a.data?.body) {
|
|
99
100
|
console.log("Page data doesn't have body, trying app.json...");
|
|
100
101
|
try {
|
|
101
|
-
let e =
|
|
102
|
+
let e = p;
|
|
102
103
|
if (!e) {
|
|
103
|
-
const h = `${
|
|
104
|
-
e = JSON.parse(
|
|
104
|
+
const h = `${E}/devices/apps/${o}`, y = await U(h);
|
|
105
|
+
e = JSON.parse(y);
|
|
105
106
|
}
|
|
106
|
-
const
|
|
107
|
-
|
|
107
|
+
const c = (e?.app?.data?.pages || []).find((h) => h.id === n);
|
|
108
|
+
c && (a = c, console.log("✓ Found page data in app.json"));
|
|
108
109
|
} catch (e) {
|
|
109
110
|
console.warn("Could not load app.json:", e);
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
let
|
|
113
|
+
const O = X(a), j = Z(a), D = H(a), $ = Q(a);
|
|
114
|
+
ee($);
|
|
115
|
+
const F = te(a, $), J = oe(a);
|
|
116
|
+
let S = "Encore App", N = "Page";
|
|
116
117
|
try {
|
|
117
|
-
let e =
|
|
118
|
+
let e = p;
|
|
118
119
|
if (!e) {
|
|
119
|
-
const r =
|
|
120
|
-
if (
|
|
121
|
-
const
|
|
122
|
-
e = JSON.parse(
|
|
120
|
+
const r = i(f, "app.json");
|
|
121
|
+
if (v(r)) {
|
|
122
|
+
const c = await R(r, "utf-8");
|
|
123
|
+
e = JSON.parse(c);
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
|
-
e && (
|
|
126
|
+
e && (S = e?.app?.store?.name || S);
|
|
126
127
|
} catch {
|
|
127
128
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (
|
|
131
|
-
|
|
129
|
+
N = a.name || a.id || N;
|
|
130
|
+
let { directoryPath: L, componentName: m } = re(S, N);
|
|
131
|
+
if (d) {
|
|
132
|
+
let e = m, r = 2;
|
|
133
|
+
for (; d.has(e); )
|
|
134
|
+
e = `${m}${r}`, r++;
|
|
135
|
+
if (e !== m) {
|
|
136
|
+
m = e;
|
|
137
|
+
const c = A(S), h = c.charAt(0).toUpperCase() + c.slice(1);
|
|
138
|
+
L = i(h, m);
|
|
139
|
+
}
|
|
140
|
+
d.add(m);
|
|
141
|
+
}
|
|
142
|
+
const T = L;
|
|
143
|
+
if (u)
|
|
144
|
+
s = i(t, T);
|
|
132
145
|
else {
|
|
133
|
-
const e =
|
|
134
|
-
|
|
146
|
+
const e = W(s);
|
|
147
|
+
s = i(e, T);
|
|
135
148
|
}
|
|
136
|
-
const
|
|
149
|
+
const V = ae(
|
|
137
150
|
o,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
x,
|
|
141
|
-
A,
|
|
151
|
+
n,
|
|
152
|
+
m,
|
|
142
153
|
O,
|
|
143
|
-
y,
|
|
144
|
-
U,
|
|
145
154
|
j,
|
|
146
|
-
|
|
155
|
+
D,
|
|
156
|
+
$,
|
|
157
|
+
F,
|
|
158
|
+
J,
|
|
159
|
+
!!g,
|
|
147
160
|
{
|
|
148
|
-
width:
|
|
149
|
-
height:
|
|
150
|
-
aspectRatio:
|
|
161
|
+
width: a.style?.width,
|
|
162
|
+
height: a.style?.height,
|
|
163
|
+
aspectRatio: a.style?.width && a.style?.height ? a.style.width / a.style.height : void 0
|
|
151
164
|
}
|
|
152
|
-
),
|
|
165
|
+
), b = ne(
|
|
153
166
|
o,
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
x,
|
|
159
|
-
A,
|
|
167
|
+
n,
|
|
168
|
+
S,
|
|
169
|
+
N,
|
|
170
|
+
m,
|
|
160
171
|
O,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
172
|
+
j,
|
|
173
|
+
D,
|
|
174
|
+
$,
|
|
175
|
+
F,
|
|
176
|
+
J
|
|
164
177
|
);
|
|
165
|
-
if (
|
|
166
|
-
const e =
|
|
178
|
+
if (v(s) || await G(s, { recursive: !0 }), g) {
|
|
179
|
+
const e = i(f, "component.js");
|
|
167
180
|
let r = "";
|
|
168
181
|
try {
|
|
169
|
-
r = await
|
|
182
|
+
r = await R(e, "utf-8");
|
|
170
183
|
} catch {
|
|
171
184
|
}
|
|
172
|
-
let
|
|
173
|
-
if (!
|
|
185
|
+
let c = p;
|
|
186
|
+
if (!c)
|
|
174
187
|
try {
|
|
175
|
-
const
|
|
176
|
-
|
|
188
|
+
const y = i(f, "app.json"), M = await R(y, "utf-8");
|
|
189
|
+
c = JSON.parse(M);
|
|
177
190
|
} catch {
|
|
178
191
|
}
|
|
179
192
|
const h = {
|
|
180
|
-
app:
|
|
181
|
-
page:
|
|
193
|
+
app: c,
|
|
194
|
+
page: a,
|
|
182
195
|
componentCode: r
|
|
183
196
|
};
|
|
184
|
-
await
|
|
185
|
-
|
|
197
|
+
await P(
|
|
198
|
+
i(s, "data.json"),
|
|
186
199
|
JSON.stringify(h, null, 2),
|
|
187
200
|
"utf-8"
|
|
188
201
|
);
|
|
189
202
|
}
|
|
190
|
-
const
|
|
191
|
-
await
|
|
203
|
+
const I = i(s, "index.tsx"), B = i(s, "README.md");
|
|
204
|
+
await P(I, V, "utf-8"), await P(B, b, "utf-8"), console.log(`✓ Generated wrapper component at: ${I}`);
|
|
192
205
|
}
|
|
193
|
-
function
|
|
206
|
+
function pe() {
|
|
194
207
|
console.log(`
|
|
195
208
|
Usage: generate-wrapper.ts <appId> [pageId] <outputPath>
|
|
196
209
|
|
|
@@ -206,49 +219,51 @@ Example:
|
|
|
206
219
|
generate-wrapper.ts 01KA964B1T6KCKSKCNMYSTKRKZ 01KA964B2F42MN4WGCYDTG1Y70 ./src/components/MyEncoreApp.tsx
|
|
207
220
|
`);
|
|
208
221
|
}
|
|
209
|
-
async function
|
|
210
|
-
const
|
|
211
|
-
if ((t.length < 2 || t.includes("--help") || t.includes("-h")) && (
|
|
222
|
+
async function he(o) {
|
|
223
|
+
const n = o.includes("--production"), t = o.filter((s) => s !== "--production");
|
|
224
|
+
if ((t.length < 2 || t.includes("--help") || t.includes("-h")) && (pe(), process.exit(
|
|
212
225
|
t.includes("--help") || t.includes("-h") ? 0 : 1
|
|
213
226
|
)), t.length === 2) {
|
|
214
|
-
const [
|
|
227
|
+
const [s, u] = t;
|
|
215
228
|
try {
|
|
216
|
-
const { pages:
|
|
217
|
-
if (
|
|
229
|
+
const { pages: l, appData: f } = await ie(s);
|
|
230
|
+
if (l.length === 0) {
|
|
218
231
|
console.warn("No pages found for this app.");
|
|
219
232
|
return;
|
|
220
233
|
}
|
|
221
|
-
|
|
222
|
-
|
|
234
|
+
const _ = /* @__PURE__ */ new Set();
|
|
235
|
+
for (const w of l)
|
|
236
|
+
if (w.id)
|
|
223
237
|
try {
|
|
224
|
-
await
|
|
225
|
-
appId:
|
|
226
|
-
pageId:
|
|
227
|
-
outputPath:
|
|
228
|
-
cachedAppData:
|
|
229
|
-
isProduction:
|
|
238
|
+
await K({
|
|
239
|
+
appId: s,
|
|
240
|
+
pageId: w.id,
|
|
241
|
+
outputPath: u,
|
|
242
|
+
cachedAppData: f,
|
|
243
|
+
isProduction: n,
|
|
244
|
+
usedNames: _
|
|
230
245
|
});
|
|
231
|
-
} catch (
|
|
246
|
+
} catch (C) {
|
|
232
247
|
console.warn(
|
|
233
|
-
`Error with page ${
|
|
234
|
-
|
|
248
|
+
`Error with page ${w.id}:`,
|
|
249
|
+
C instanceof Error ? C.message : C
|
|
235
250
|
);
|
|
236
251
|
}
|
|
237
|
-
} catch (
|
|
252
|
+
} catch (l) {
|
|
238
253
|
console.error(`
|
|
239
|
-
Error:`,
|
|
254
|
+
Error:`, l instanceof Error ? l.message : l), process.exit(1);
|
|
240
255
|
}
|
|
241
256
|
return;
|
|
242
257
|
}
|
|
243
|
-
const [
|
|
258
|
+
const [p, g, d] = t;
|
|
244
259
|
try {
|
|
245
|
-
await
|
|
246
|
-
} catch (
|
|
260
|
+
await K({ appId: p, pageId: g, outputPath: d, isProduction: n });
|
|
261
|
+
} catch (s) {
|
|
247
262
|
console.error(`
|
|
248
|
-
Error:`,
|
|
263
|
+
Error:`, s instanceof Error ? s.message : s), process.exit(1);
|
|
249
264
|
}
|
|
250
265
|
}
|
|
251
266
|
export {
|
|
252
|
-
|
|
267
|
+
he as runGenerate
|
|
253
268
|
};
|
|
254
269
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sources":["../../../src/cli/commands/generate.ts"],"sourcesContent":["import { promises as fs } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as dotenv from \"dotenv\";\nimport {\n CONST_APPS_SERVICE_URL,\n CONST_COMPONENTS_CDN_URL,\n} from \"../../../constants\";\nimport {\n findSlidersAndDataBindings,\n findStandaloneComponents,\n findInputGroups,\n findForms,\n findStandaloneSelectInputs,\n findActionButtons,\n qualifyFormInputs,\n generateComponentCode,\n generateReadme,\n sanitizePropName,\n} from \"../../codegen\";\n\nconst { writeFile, mkdir, readFile } = fs;\n\ndotenv.config();\n\n// Default apps service URL (can be overridden with APPS_SERVICE_URL env var)\nconst APPS_SERVICE_URL =\n process.env.APPS_SERVICE_URL ||\n process.env.VITE_APPS_SERVICE_URL ||\n CONST_APPS_SERVICE_URL;\nconsole.log(`Using APPS_SERVICE_URL: ${APPS_SERVICE_URL}`);\nconst COMPONENTS_CDN_URL = CONST_COMPONENTS_CDN_URL;\n\nasync function downloadFile(\n url: string,\n headers?: Record<string, string>\n): Promise<string> {\n const response = await fetch(url, {\n headers: headers || {},\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`\n );\n }\n\n return await response.text();\n}\n\nfunction generateNames(\n appName: string,\n pageName: string\n): { directoryPath: string; componentName: string } {\n const appCamel = sanitizePropName(appName);\n const pageCamel = sanitizePropName(pageName);\n // Capitalize first letter for PascalCase\n const appPascal = appCamel.charAt(0).toUpperCase() + appCamel.slice(1);\n const pagePascal = pageCamel.charAt(0).toUpperCase() + pageCamel.slice(1);\n return {\n directoryPath: join(appPascal, pagePascal),\n componentName: pagePascal,\n };\n}\n\nasync function getAppPages(\n appId: string\n): Promise<{ pages: any[]; appData: any }> {\n const url = `${APPS_SERVICE_URL}/devices/apps/${appId}`;\n console.log(`Fetching app data from ${url}...`);\n try {\n const content = await downloadFile(url);\n const appData = JSON.parse(content);\n const pages = appData?.app?.data?.pages || [];\n return { pages, appData };\n } catch (error) {\n console.error(\"Failed to fetch app data:\", error);\n throw error;\n }\n}\n\nasync function generateWrapper({\n appId,\n pageId,\n outputPath,\n cachedAppData,\n isProduction,\n}: {\n appId: string;\n pageId: string;\n outputPath: string;\n cachedAppData?: any;\n isProduction?: boolean;\n}) {\n console.log(`Generating wrapper for app: ${appId}, page: ${pageId}`);\n\n // Determine final output path - we'll update it after we get app/page names\n let finalOutputPath = outputPath;\n let needsFilenameGeneration = false;\n const pathExt = outputPath.split(\".\").pop()?.toLowerCase();\n if (\n pathExt !== \"tsx\" &&\n pathExt !== \"ts\" &&\n pathExt !== \"jsx\" &&\n pathExt !== \"js\"\n ) {\n // Path doesn't have a file extension, treat as directory\n const { stat } = await import(\"fs/promises\");\n try {\n const pathStats = await stat(outputPath);\n if (pathStats.isDirectory()) {\n needsFilenameGeneration = true;\n }\n } catch {\n // Path doesn't exist, check if it looks like a directory (no extension)\n if (!pathExt || outputPath.endsWith(\"/\")) {\n needsFilenameGeneration = true;\n }\n }\n }\n\n if (needsFilenameGeneration) {\n console.log(\n `Output path is a directory, will generate filename from app/page names`\n );\n }\n\n console.log(`Output path: ${outputPath}`);\n\n // Create temp directory for downloaded files\n const tempDir = join(process.cwd(), \".temp-bravo\", appId, pageId);\n if (!existsSync(tempDir)) {\n await mkdir(tempDir, { recursive: true });\n }\n\n // Download files (skip app.json if we have cached data)\n const files: Array<{\n url: string;\n filename: string;\n headers?: Record<string, string>;\n skipIfCached?: boolean;\n }> = [\n {\n url: `${APPS_SERVICE_URL}/devices/apps/${appId}`,\n filename: \"app.json\",\n skipIfCached: true,\n },\n {\n url: `${APPS_SERVICE_URL}/devices/apps/${appId}/node/${pageId}`,\n filename: \"page.json\",\n },\n {\n url: `${COMPONENTS_CDN_URL}/${appId}/draft/components/${pageId}.js`,\n filename: \"component.js\",\n },\n ];\n\n for (const file of files) {\n // Skip app.json if we have cached data\n if (file.skipIfCached && cachedAppData) {\n console.log(`Using cached ${file.filename} (skipping download)`);\n const filePath = join(tempDir, file.filename);\n await writeFile(\n filePath,\n JSON.stringify(cachedAppData, null, 2),\n \"utf-8\"\n );\n console.log(`✓ Saved ${file.filename} from cache`);\n continue;\n }\n\n try {\n console.log(`Downloading ${file.filename} from ${file.url}...`);\n const content = await downloadFile(file.url, file.headers);\n const filePath = join(tempDir, file.filename);\n await writeFile(filePath, content, \"utf-8\");\n console.log(`✓ Saved ${file.filename}`);\n } catch (error) {\n console.error(`✗ Failed to download ${file.filename}:`, error);\n throw error;\n }\n }\n\n // Read and parse page.json\n const pageJsonPath = join(tempDir, \"page.json\");\n const pageJsonContent = await readFile(pageJsonPath, \"utf-8\");\n const pageResponse = JSON.parse(pageJsonContent);\n\n // Extract page data - API response has it under 'data' field\n let pageData = pageResponse.data || pageResponse;\n\n // If pageData doesn't have body, try using cached app.json or downloading as fallback\n if (!pageData.body && !(pageData as any).data?.body) {\n console.log(\"Page data doesn't have body, trying app.json...\");\n try {\n let appData = cachedAppData;\n\n // If we don't have cached data, download it\n if (!appData) {\n const appUrl = `${APPS_SERVICE_URL}/devices/apps/${appId}`;\n const appContent = await downloadFile(appUrl);\n appData = JSON.parse(appContent);\n }\n\n // Find the page in app.data.pages\n const pages = appData?.app?.data?.pages || [];\n const page = pages.find((p: any) => p.id === pageId);\n if (page) {\n pageData = page;\n console.log(\"✓ Found page data in app.json\");\n }\n } catch (error) {\n console.warn(\"Could not load app.json:\", error);\n }\n }\n\n // Find components using extracted logic\n const sliders = findSlidersAndDataBindings(pageData);\n const standaloneComponents = findStandaloneComponents(pageData);\n const inputGroups = findInputGroups(pageData);\n const forms = findForms(pageData);\n\n // Qualify form input prop names\n qualifyFormInputs(forms);\n\n const selectInputs = findStandaloneSelectInputs(pageData, forms);\n const actionButtons = findActionButtons(pageData);\n\n // Extract app name and page name\n let appName = \"Encore App\";\n let pageName = \"Page\";\n\n try {\n let appDataForName = cachedAppData;\n if (!appDataForName) {\n const appJsonPath = join(tempDir, \"app.json\");\n if (existsSync(appJsonPath)) {\n const appJsonContent = await readFile(appJsonPath, \"utf-8\");\n appDataForName = JSON.parse(appJsonContent);\n }\n }\n if (appDataForName) {\n appName = appDataForName?.app?.store?.name || appName;\n }\n } catch (error) {\n // Ignore errors, use defaults\n }\n\n pageName = pageData.name || pageData.id || pageName;\n\n // Generate component name and directory name\n const { directoryPath, componentName } = generateNames(appName, pageName);\n const directoryName = directoryPath;\n\n // Update output path\n if (needsFilenameGeneration) {\n finalOutputPath = join(outputPath, directoryName);\n } else {\n const providedDir = dirname(finalOutputPath);\n finalOutputPath = join(providedDir, directoryName);\n }\n\n // Generate component code and README\n const componentCode = generateComponentCode(\n appId,\n pageId,\n componentName,\n sliders,\n standaloneComponents,\n inputGroups,\n forms,\n selectInputs,\n actionButtons,\n !!isProduction,\n {\n width: pageData.style?.width,\n height: pageData.style?.height,\n aspectRatio:\n pageData.style?.width && pageData.style?.height\n ? pageData.style.width / pageData.style.height\n : undefined,\n }\n );\n\n const readmeContent = generateReadme(\n appId,\n pageId,\n appName,\n pageName,\n componentName,\n sliders,\n standaloneComponents,\n inputGroups,\n forms,\n selectInputs,\n actionButtons\n );\n\n // Ensure output directory exists\n if (!existsSync(finalOutputPath)) {\n await mkdir(finalOutputPath, { recursive: true });\n }\n\n // Write files\n if (isProduction) {\n const componentJsPath = join(tempDir, \"component.js\");\n let componentCodeContent = \"\";\n try {\n componentCodeContent = await readFile(componentJsPath, \"utf-8\");\n } catch (e) {}\n\n let appDataForProd = cachedAppData;\n if (!appDataForProd) {\n try {\n const appJsonPath = join(tempDir, \"app.json\");\n const appJsonContent = await readFile(appJsonPath, \"utf-8\");\n appDataForProd = JSON.parse(appJsonContent);\n } catch (e) {}\n }\n\n const productionData = {\n app: appDataForProd,\n page: pageData,\n componentCode: componentCodeContent,\n };\n await writeFile(\n join(finalOutputPath, \"data.json\"),\n JSON.stringify(productionData, null, 2),\n \"utf-8\"\n );\n }\n\n const indexPath = join(finalOutputPath, \"index.tsx\");\n const readmePath = join(finalOutputPath, \"README.md\");\n\n await writeFile(indexPath, componentCode, \"utf-8\");\n await writeFile(readmePath, readmeContent, \"utf-8\");\n\n console.log(`✓ Generated wrapper component at: ${indexPath}`);\n}\n\nfunction printUsage() {\n console.log(`\nUsage: generate-wrapper.ts <appId> [pageId] <outputPath>\n\nArguments:\n appId The Encore app ID\n pageId The Encore page ID (optional - if omitted, generates wrappers for ALL pages)\n outputPath Path where the generated TSX file(s) should be saved\n\nEnvironment variables:\n APPS_SERVICE_URL Base URL for the apps service\n\nExample:\n generate-wrapper.ts 01KA964B1T6KCKSKCNMYSTKRKZ 01KA964B2F42MN4WGCYDTG1Y70 ./src/components/MyEncoreApp.tsx\n`);\n}\n\nexport async function runGenerate(args: string[]) {\n const isProduction = args.includes(\"--production\");\n const cleanArgs = args.filter((arg) => arg !== \"--production\");\n\n if (\n cleanArgs.length < 2 ||\n cleanArgs.includes(\"--help\") ||\n cleanArgs.includes(\"-h\")\n ) {\n printUsage();\n process.exit(\n cleanArgs.includes(\"--help\") || cleanArgs.includes(\"-h\") ? 0 : 1\n );\n }\n\n if (cleanArgs.length === 2) {\n const [appId, outputPath] = cleanArgs;\n\n try {\n const { pages, appData } = await getAppPages(appId);\n if (pages.length === 0) {\n console.warn(\"No pages found for this app.\");\n return;\n }\n\n for (const page of pages) {\n if (!page.id) continue;\n try {\n await generateWrapper({\n appId,\n pageId: page.id,\n outputPath,\n cachedAppData: appData,\n isProduction,\n });\n } catch (error) {\n console.warn(\n `Error with page ${page.id}:`,\n error instanceof Error ? error.message : error\n );\n }\n }\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n return;\n }\n\n const [appId, pageId, outputPath] = cleanArgs;\n\n try {\n await generateWrapper({ appId, pageId, outputPath, isProduction });\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n"],"names":["writeFile","mkdir","readFile","fs","dotenv.config","APPS_SERVICE_URL","CONST_APPS_SERVICE_URL","COMPONENTS_CDN_URL","CONST_COMPONENTS_CDN_URL","downloadFile","url","headers","response","generateNames","appName","pageName","appCamel","sanitizePropName","pageCamel","appPascal","pagePascal","join","getAppPages","appId","content","appData","error","generateWrapper","pageId","outputPath","cachedAppData","isProduction","finalOutputPath","needsFilenameGeneration","pathExt","stat","tempDir","existsSync","files","file","filePath","pageJsonPath","pageJsonContent","pageResponse","pageData","appUrl","appContent","page","p","sliders","findSlidersAndDataBindings","standaloneComponents","findStandaloneComponents","inputGroups","findInputGroups","forms","findForms","qualifyFormInputs","selectInputs","findStandaloneSelectInputs","actionButtons","findActionButtons","appDataForName","appJsonPath","appJsonContent","directoryPath","componentName","directoryName","providedDir","dirname","componentCode","generateComponentCode","readmeContent","generateReadme","componentJsPath","componentCodeContent","appDataForProd","productionData","indexPath","readmePath","printUsage","runGenerate","args","cleanArgs","arg","pages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate.js","sources":["../../../src/cli/commands/generate.ts"],"sourcesContent":["import { promises as fs } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { existsSync } from \"fs\";\nimport * as dotenv from \"dotenv\";\nimport {\n CONST_APPS_SERVICE_URL,\n CONST_COMPONENTS_CDN_URL,\n} from \"../../../constants\";\nimport {\n findSlidersAndDataBindings,\n findStandaloneComponents,\n findInputGroups,\n findForms,\n findStandaloneSelectInputs,\n findActionButtons,\n qualifyFormInputs,\n generateComponentCode,\n generateReadme,\n sanitizePropName,\n} from \"../../codegen\";\n\nconst { writeFile, mkdir, readFile } = fs;\n\ndotenv.config();\n\n// Default apps service URL (can be overridden with APPS_SERVICE_URL env var)\nconst APPS_SERVICE_URL =\n process.env.APPS_SERVICE_URL ||\n process.env.VITE_APPS_SERVICE_URL ||\n CONST_APPS_SERVICE_URL;\nconsole.log(`Using APPS_SERVICE_URL: ${APPS_SERVICE_URL}`);\nconst COMPONENTS_CDN_URL = CONST_COMPONENTS_CDN_URL;\n\nasync function downloadFile(\n url: string,\n headers?: Record<string, string>\n): Promise<string> {\n const response = await fetch(url, {\n headers: headers || {},\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to download ${url}: ${response.status} ${response.statusText}`\n );\n }\n\n return await response.text();\n}\n\nfunction generateNames(\n appName: string,\n pageName: string\n): { directoryPath: string; componentName: string } {\n const appCamel = sanitizePropName(appName);\n const pageCamel = sanitizePropName(pageName);\n // Capitalize first letter for PascalCase\n const appPascal = appCamel.charAt(0).toUpperCase() + appCamel.slice(1);\n const pagePascal = pageCamel.charAt(0).toUpperCase() + pageCamel.slice(1);\n return {\n directoryPath: join(appPascal, pagePascal),\n componentName: pagePascal,\n };\n}\n\nasync function getAppPages(\n appId: string\n): Promise<{ pages: any[]; appData: any }> {\n const url = `${APPS_SERVICE_URL}/devices/apps/${appId}`;\n console.log(`Fetching app data from ${url}...`);\n try {\n const content = await downloadFile(url);\n const appData = JSON.parse(content);\n const pages = appData?.app?.data?.pages || [];\n return { pages, appData };\n } catch (error) {\n console.error(\"Failed to fetch app data:\", error);\n throw error;\n }\n}\n\nasync function generateWrapper({\n appId,\n pageId,\n outputPath,\n cachedAppData,\n isProduction,\n usedNames,\n}: {\n appId: string;\n pageId: string;\n outputPath: string;\n cachedAppData?: any;\n isProduction?: boolean;\n usedNames?: Set<string>;\n}) {\n console.log(`Generating wrapper for app: ${appId}, page: ${pageId}`);\n\n // Determine final output path - we'll update it after we get app/page names\n let finalOutputPath = outputPath;\n let needsFilenameGeneration = false;\n const pathExt = outputPath.split(\".\").pop()?.toLowerCase();\n if (\n pathExt !== \"tsx\" &&\n pathExt !== \"ts\" &&\n pathExt !== \"jsx\" &&\n pathExt !== \"js\"\n ) {\n // Path doesn't have a file extension, treat as directory\n const { stat } = await import(\"fs/promises\");\n try {\n const pathStats = await stat(outputPath);\n if (pathStats.isDirectory()) {\n needsFilenameGeneration = true;\n }\n } catch {\n // Path doesn't exist, check if it looks like a directory (no extension)\n if (!pathExt || outputPath.endsWith(\"/\")) {\n needsFilenameGeneration = true;\n }\n }\n }\n\n if (needsFilenameGeneration) {\n console.log(\n `Output path is a directory, will generate filename from app/page names`\n );\n }\n\n console.log(`Output path: ${outputPath}`);\n\n // Create temp directory for downloaded files\n const tempDir = join(process.cwd(), \".temp-bravo\", appId, pageId);\n if (!existsSync(tempDir)) {\n await mkdir(tempDir, { recursive: true });\n }\n\n // Download files (skip app.json if we have cached data)\n const files: Array<{\n url: string;\n filename: string;\n headers?: Record<string, string>;\n skipIfCached?: boolean;\n }> = [\n {\n url: `${APPS_SERVICE_URL}/devices/apps/${appId}`,\n filename: \"app.json\",\n skipIfCached: true,\n },\n {\n url: `${APPS_SERVICE_URL}/devices/apps/${appId}/node/${pageId}`,\n filename: \"page.json\",\n },\n {\n url: `${COMPONENTS_CDN_URL}/${appId}/draft/components/${pageId}.js`,\n filename: \"component.js\",\n },\n ];\n\n for (const file of files) {\n // Skip app.json if we have cached data\n if (file.skipIfCached && cachedAppData) {\n console.log(`Using cached ${file.filename} (skipping download)`);\n const filePath = join(tempDir, file.filename);\n await writeFile(\n filePath,\n JSON.stringify(cachedAppData, null, 2),\n \"utf-8\"\n );\n console.log(`✓ Saved ${file.filename} from cache`);\n continue;\n }\n\n try {\n console.log(`Downloading ${file.filename} from ${file.url}...`);\n const content = await downloadFile(file.url, file.headers);\n const filePath = join(tempDir, file.filename);\n await writeFile(filePath, content, \"utf-8\");\n console.log(`✓ Saved ${file.filename}`);\n } catch (error) {\n console.error(`✗ Failed to download ${file.filename}:`, error);\n throw error;\n }\n }\n\n // Read and parse page.json\n const pageJsonPath = join(tempDir, \"page.json\");\n const pageJsonContent = await readFile(pageJsonPath, \"utf-8\");\n const pageResponse = JSON.parse(pageJsonContent);\n\n // Extract page data - API response has it under 'data' field\n let pageData = pageResponse.data || pageResponse;\n\n // If pageData doesn't have body, try using cached app.json or downloading as fallback\n if (!pageData.body && !(pageData as any).data?.body) {\n console.log(\"Page data doesn't have body, trying app.json...\");\n try {\n let appData = cachedAppData;\n\n // If we don't have cached data, download it\n if (!appData) {\n const appUrl = `${APPS_SERVICE_URL}/devices/apps/${appId}`;\n const appContent = await downloadFile(appUrl);\n appData = JSON.parse(appContent);\n }\n\n // Find the page in app.data.pages\n const pages = appData?.app?.data?.pages || [];\n const page = pages.find((p: any) => p.id === pageId);\n if (page) {\n pageData = page;\n console.log(\"✓ Found page data in app.json\");\n }\n } catch (error) {\n console.warn(\"Could not load app.json:\", error);\n }\n }\n\n // Find components using extracted logic\n const sliders = findSlidersAndDataBindings(pageData);\n const standaloneComponents = findStandaloneComponents(pageData);\n const inputGroups = findInputGroups(pageData);\n const forms = findForms(pageData);\n\n // Qualify form input prop names\n qualifyFormInputs(forms);\n\n const selectInputs = findStandaloneSelectInputs(pageData, forms);\n const actionButtons = findActionButtons(pageData);\n\n // Extract app name and page name\n let appName = \"Encore App\";\n let pageName = \"Page\";\n\n try {\n let appDataForName = cachedAppData;\n if (!appDataForName) {\n const appJsonPath = join(tempDir, \"app.json\");\n if (existsSync(appJsonPath)) {\n const appJsonContent = await readFile(appJsonPath, \"utf-8\");\n appDataForName = JSON.parse(appJsonContent);\n }\n }\n if (appDataForName) {\n appName = appDataForName?.app?.store?.name || appName;\n }\n } catch (error) {\n // Ignore errors, use defaults\n }\n\n pageName = pageData.name || pageData.id || pageName;\n\n // Generate component name and directory name\n let { directoryPath, componentName } = generateNames(appName, pageName);\n\n // Ensure unique component name\n if (usedNames) {\n let uniqueName = componentName;\n let counter = 2;\n while (usedNames.has(uniqueName)) {\n uniqueName = `${componentName}${counter}`;\n counter++;\n }\n if (uniqueName !== componentName) {\n componentName = uniqueName;\n // Reconstitute directory path with new component name\n // generateNames uses: join(appPascal, pagePascal) where pagePascal is componentName\n const appCamel = sanitizePropName(appName);\n const appPascal = appCamel.charAt(0).toUpperCase() + appCamel.slice(1);\n directoryPath = join(appPascal, componentName);\n }\n usedNames.add(componentName);\n }\n\n const directoryName = directoryPath;\n\n // Update output path\n if (needsFilenameGeneration) {\n finalOutputPath = join(outputPath, directoryName);\n } else {\n const providedDir = dirname(finalOutputPath);\n finalOutputPath = join(providedDir, directoryName);\n }\n\n // Generate component code and README\n const componentCode = generateComponentCode(\n appId,\n pageId,\n componentName,\n sliders,\n standaloneComponents,\n inputGroups,\n forms,\n selectInputs,\n actionButtons,\n !!isProduction,\n {\n width: pageData.style?.width,\n height: pageData.style?.height,\n aspectRatio:\n pageData.style?.width && pageData.style?.height\n ? pageData.style.width / pageData.style.height\n : undefined,\n }\n );\n\n const readmeContent = generateReadme(\n appId,\n pageId,\n appName,\n pageName,\n componentName,\n sliders,\n standaloneComponents,\n inputGroups,\n forms,\n selectInputs,\n actionButtons\n );\n\n // Ensure output directory exists\n if (!existsSync(finalOutputPath)) {\n await mkdir(finalOutputPath, { recursive: true });\n }\n\n // Write files\n if (isProduction) {\n const componentJsPath = join(tempDir, \"component.js\");\n let componentCodeContent = \"\";\n try {\n componentCodeContent = await readFile(componentJsPath, \"utf-8\");\n } catch (e) {}\n\n let appDataForProd = cachedAppData;\n if (!appDataForProd) {\n try {\n const appJsonPath = join(tempDir, \"app.json\");\n const appJsonContent = await readFile(appJsonPath, \"utf-8\");\n appDataForProd = JSON.parse(appJsonContent);\n } catch (e) {}\n }\n\n const productionData = {\n app: appDataForProd,\n page: pageData,\n componentCode: componentCodeContent,\n };\n await writeFile(\n join(finalOutputPath, \"data.json\"),\n JSON.stringify(productionData, null, 2),\n \"utf-8\"\n );\n }\n\n const indexPath = join(finalOutputPath, \"index.tsx\");\n const readmePath = join(finalOutputPath, \"README.md\");\n\n await writeFile(indexPath, componentCode, \"utf-8\");\n await writeFile(readmePath, readmeContent, \"utf-8\");\n\n console.log(`✓ Generated wrapper component at: ${indexPath}`);\n}\n\nfunction printUsage() {\n console.log(`\nUsage: generate-wrapper.ts <appId> [pageId] <outputPath>\n\nArguments:\n appId The Encore app ID\n pageId The Encore page ID (optional - if omitted, generates wrappers for ALL pages)\n outputPath Path where the generated TSX file(s) should be saved\n\nEnvironment variables:\n APPS_SERVICE_URL Base URL for the apps service\n\nExample:\n generate-wrapper.ts 01KA964B1T6KCKSKCNMYSTKRKZ 01KA964B2F42MN4WGCYDTG1Y70 ./src/components/MyEncoreApp.tsx\n`);\n}\n\nexport async function runGenerate(args: string[]) {\n const isProduction = args.includes(\"--production\");\n const cleanArgs = args.filter((arg) => arg !== \"--production\");\n\n if (\n cleanArgs.length < 2 ||\n cleanArgs.includes(\"--help\") ||\n cleanArgs.includes(\"-h\")\n ) {\n printUsage();\n process.exit(\n cleanArgs.includes(\"--help\") || cleanArgs.includes(\"-h\") ? 0 : 1\n );\n }\n\n if (cleanArgs.length === 2) {\n const [appId, outputPath] = cleanArgs;\n\n try {\n const { pages, appData } = await getAppPages(appId);\n if (pages.length === 0) {\n console.warn(\"No pages found for this app.\");\n return;\n }\n\n const usedNames = new Set<string>();\n for (const page of pages) {\n if (!page.id) continue;\n try {\n await generateWrapper({\n appId,\n pageId: page.id,\n outputPath,\n cachedAppData: appData,\n isProduction,\n usedNames,\n });\n } catch (error) {\n console.warn(\n `Error with page ${page.id}:`,\n error instanceof Error ? error.message : error\n );\n }\n }\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n return;\n }\n\n const [appId, pageId, outputPath] = cleanArgs;\n\n try {\n await generateWrapper({ appId, pageId, outputPath, isProduction }); // Single page generation, no collision context needed unless we wanted global uniqueness but usually used for one-off\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n"],"names":["writeFile","mkdir","readFile","fs","dotenv.config","APPS_SERVICE_URL","CONST_APPS_SERVICE_URL","COMPONENTS_CDN_URL","CONST_COMPONENTS_CDN_URL","downloadFile","url","headers","response","generateNames","appName","pageName","appCamel","sanitizePropName","pageCamel","appPascal","pagePascal","join","getAppPages","appId","content","appData","error","generateWrapper","pageId","outputPath","cachedAppData","isProduction","usedNames","finalOutputPath","needsFilenameGeneration","pathExt","stat","tempDir","existsSync","files","file","filePath","pageJsonPath","pageJsonContent","pageResponse","pageData","appUrl","appContent","page","p","sliders","findSlidersAndDataBindings","standaloneComponents","findStandaloneComponents","inputGroups","findInputGroups","forms","findForms","qualifyFormInputs","selectInputs","findStandaloneSelectInputs","actionButtons","findActionButtons","appDataForName","appJsonPath","appJsonContent","directoryPath","componentName","uniqueName","counter","directoryName","providedDir","dirname","componentCode","generateComponentCode","readmeContent","generateReadme","componentJsPath","componentCodeContent","appDataForProd","productionData","indexPath","readmePath","printUsage","runGenerate","args","cleanArgs","arg","pages"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicComponent.js","sources":["../../src/components/DynamicComponent.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"DynamicComponent.js","sources":["../../src/components/DynamicComponent.tsx"],"sourcesContent":["\"use client\";\nimport React, { useMemo, Suspense } from \"react\";\n\ntype Props = {\n name: string;\n children: unknown;\n componentId?: string;\n fallback?: React.ReactNode;\n reloadKey?: string | number;\n componentCode?: string;\n};\n\nconst DynamicComponent: React.FC<Props> = ({\n name,\n children,\n fallback,\n reloadKey,\n componentCode,\n ...props\n}) => {\n const Component = useMemo(() => {\n return React.lazy(async () => {\n if (componentCode) {\n // Use provided code instead of fetching\n const { loadAMDModule } = await import(\"../lib/dynamicModules\");\n return await loadAMDModule(name, componentCode);\n }\n const { fetchDep } = await import(\"../lib/dynamicModules\");\n const r = (await fetchDep(name)) as any;\n return r;\n });\n }, [name, reloadKey, componentCode]); // Include componentCode and reloadKey to force reload when they change\n const thisFallback = fallback || <div>Loading...</div>;\n return (\n <Suspense fallback={thisFallback}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n};\n\nexport default React.memo(DynamicComponent);\n"],"names":["DynamicComponent","name","children","fallback","reloadKey","componentCode","props","Component","useMemo","React","loadAMDModule","fetchDep","jsx","Suspense","DynamicComponent$1"],"mappings":";;AAYA,MAAMA,IAAoC,CAAC;AAAA,EACzC,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYC,EAAQ,MACjBC,EAAM,KAAK,YAAY;AAC5B,QAAIJ,GAAe;AAEjB,YAAM,EAAE,eAAAK,EAAA,IAAkB,MAAM,OAAO,0BAAuB;AAC9D,aAAO,MAAMA,EAAcT,GAAMI,CAAa;AAAA,IAChD;AACA,UAAM,EAAE,UAAAM,EAAA,IAAa,MAAM,OAAO,0BAAuB;AAEzD,WADW,MAAMA,EAASV,CAAI;AAAA,EAEhC,CAAC,GACA,CAACA,GAAMG,GAAWC,CAAa,CAAC;AAEnC,SACE,gBAAAO,EAACC,KAAS,UAFSV,KAAY,gBAAAS,EAAC,OAAA,EAAI,UAAA,cAAU,GAG5C,4BAACL,GAAA,EAAW,GAAGD,GAAQ,UAAAJ,EAAA,CAAS,EAAA,CAClC;AAEJ,GAEAY,IAAeL,EAAM,KAAKT,CAAgB;"}
|