@whop/react-native 0.0.21 → 0.0.22

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/cli/index.js CHANGED
@@ -24,21 +24,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  ));
25
25
 
26
26
  // src/cli/index.ts
27
- var import_node_fs2 = require("fs");
28
- var import_node_path4 = __toESM(require("path"));
27
+ var import_node_fs3 = require("fs");
28
+ var import_node_path5 = __toESM(require("path"));
29
29
  var import_node_util = require("util");
30
30
  var import_find_up2 = require("find-up");
31
31
  var import_qrcode_terminal = __toESM(require("qrcode-terminal"));
32
32
  var import_rimraf = require("rimraf");
33
33
 
34
34
  // src/cli/mobile.ts
35
- var import_node_fs = require("fs");
35
+ var import_node_fs2 = require("fs");
36
36
  var import_promises2 = require("fs/promises");
37
- var import_node_path2 = __toESM(require("path"));
37
+ var import_node_path3 = __toESM(require("path"));
38
38
  var import_metro_config = require("@react-native/metro-config");
39
39
  var import_find_up = require("find-up");
40
40
  var import_jszip = __toESM(require("jszip"));
41
- var import_metro = require("metro");
41
+ var import_metro2 = require("metro");
42
42
 
43
43
  // src/cli/file.ts
44
44
  var import_node_crypto = require("crypto");
@@ -84,16 +84,26 @@ async function getChecksum(data) {
84
84
  return hash.digest("hex");
85
85
  }
86
86
 
87
+ // src/cli/load-metro-config.ts
88
+ var import_node_fs = __toESM(require("fs"));
89
+ var import_node_path = __toESM(require("path"));
90
+ var import_metro = require("metro");
91
+ async function loadMetroConfig(projectRoot) {
92
+ const file = import_node_fs.default.existsSync(import_node_path.default.join(projectRoot, "metro.config.js"));
93
+ if (!file) return {};
94
+ return await (0, import_metro.loadConfig)({ cwd: projectRoot }, {});
95
+ }
96
+
87
97
  // src/cli/valid-view-type.ts
88
98
  var import_promises = require("fs/promises");
89
- var import_node_path = __toESM(require("path"));
99
+ var import_node_path2 = __toESM(require("path"));
90
100
  var VALID_VIEW_TYPES = [
91
101
  "experience-view",
92
102
  "discover-view",
93
103
  "dashboard-view"
94
104
  ];
95
105
  async function getSupportedAppViewTypes(root) {
96
- const views = await (0, import_promises.readdir)(import_node_path.default.join(root, "src", "views"), {
106
+ const views = await (0, import_promises.readdir)(import_node_path2.default.join(root, "src", "views"), {
97
107
  withFileTypes: true,
98
108
  recursive: false
99
109
  });
@@ -126,15 +136,14 @@ async function buildAndPublish(root, platform, {
126
136
  }
127
137
  async function bundle(root, platform) {
128
138
  await makeEntrypoint(root, platform);
129
- const outputFile = import_node_path2.default.join(
139
+ const outputFile = import_node_path3.default.join(
130
140
  root,
131
141
  "build",
132
142
  "output",
133
143
  platform,
134
144
  "main_js_bundle"
135
145
  );
136
- await (0, import_promises2.mkdir)(import_node_path2.default.dirname(outputFile), { recursive: true });
137
- const defaultConfig = (0, import_metro_config.getDefaultConfig)(root);
146
+ await (0, import_promises2.mkdir)(import_node_path3.default.dirname(outputFile), { recursive: true });
138
147
  const babelLocation = require.resolve("@babel/runtime/package");
139
148
  const bableNodeModules = await (0, import_find_up.findUp)("node_modules", {
140
149
  cwd: babelLocation,
@@ -143,45 +152,40 @@ async function bundle(root, platform) {
143
152
  if (!bableNodeModules) {
144
153
  throw new Error("babel node_modules parent folder not found");
145
154
  }
146
- await (0, import_metro.runBuild)(
147
- {
148
- ...defaultConfig,
149
- projectRoot: root,
150
- transformer: {
151
- ...defaultConfig.transformer,
152
- babelTransformerPath: require.resolve("./whop-react-native-babel-transformer.js")
153
- },
154
- watchFolders: [
155
- root,
156
- import_node_path2.default.resolve(root, "node_modules"),
157
- bableNodeModules
158
- ],
159
- reporter: new CustomReporter(),
160
- resolver: {
161
- ...defaultConfig.resolver,
162
- nodeModulesPaths: [
163
- ...defaultConfig.resolver?.nodeModulesPaths ?? [],
164
- bableNodeModules
165
- ]
166
- }
155
+ const defaultConfig = (0, import_metro_config.getDefaultConfig)(root);
156
+ const projectConfig = await loadMetroConfig(root);
157
+ const defaultMetroConfig = (0, import_metro_config.mergeConfig)(defaultConfig, projectConfig);
158
+ const metroConfig = (0, import_metro_config.mergeConfig)(defaultMetroConfig, {
159
+ projectRoot: root,
160
+ transformer: {
161
+ babelTransformerPath: require.resolve("./whop-react-native-babel-transformer.js")
167
162
  },
168
- {
169
- dev: false,
170
- entry: `build/entrypoints/${platform}/index.js`,
171
- minify: false,
172
- platform,
173
- sourceMap: false,
174
- out: outputFile
163
+ cacheStores: [],
164
+ watchFolders: [root, import_node_path3.default.resolve(root, "node_modules"), bableNodeModules],
165
+ reporter: new CustomReporter(),
166
+ resolver: {
167
+ nodeModulesPaths: [
168
+ ...defaultMetroConfig.resolver?.nodeModulesPaths ?? [],
169
+ bableNodeModules
170
+ ]
175
171
  }
176
- );
172
+ });
173
+ await (0, import_metro2.runBuild)(metroConfig, {
174
+ dev: false,
175
+ entry: `build/entrypoints/${platform}/index.js`,
176
+ minify: false,
177
+ platform,
178
+ sourceMap: false,
179
+ out: outputFile
180
+ });
177
181
  await (0, import_promises2.rename)(
178
182
  `${outputFile}.js`,
179
- import_node_path2.default.join(root, "build", "output", platform, "main_js_bundle.hbc")
183
+ import_node_path3.default.join(root, "build", "output", platform, "main_js_bundle.hbc")
180
184
  );
181
185
  console.log(` \u2714\uFE0E [${platform}] bundle created`);
182
186
  }
183
187
  async function makeEntrypoint(root, platform) {
184
- const entrypoint = import_node_path2.default.join(
188
+ const entrypoint = import_node_path3.default.join(
185
189
  root,
186
190
  "build",
187
191
  "entrypoints",
@@ -201,7 +205,7 @@ ${imports.join("\n")}
201
205
 
202
206
  ${registry.join("\n")}
203
207
  `;
204
- const entrypointDir = import_node_path2.default.dirname(entrypoint);
208
+ const entrypointDir = import_node_path3.default.dirname(entrypoint);
205
209
  await (0, import_promises2.mkdir)(entrypointDir, { recursive: true });
206
210
  await (0, import_promises2.writeFile)(entrypoint, entrypointContent, "utf-8");
207
211
  console.log(` \u2714\uFE0E [${platform}] entrypoint created`);
@@ -209,12 +213,12 @@ ${registry.join("\n")}
209
213
  }
210
214
  async function createMobileBuild(root, platform) {
211
215
  const viewTypes = await getSupportedAppViewTypes(root);
212
- const fullDirectory = import_node_path2.default.join(root, "build", "output", platform);
213
- const mainJsBundle = import_node_path2.default.join(fullDirectory, "main_js_bundle.hbc");
214
- if (!(0, import_node_fs.existsSync)(mainJsBundle)) {
216
+ const fullDirectory = import_node_path3.default.join(root, "build", "output", platform);
217
+ const mainJsBundle = import_node_path3.default.join(fullDirectory, "main_js_bundle.hbc");
218
+ if (!(0, import_node_fs2.existsSync)(mainJsBundle)) {
215
219
  throw new Error(`main_js_bundle.hbc not found in ${fullDirectory}`);
216
220
  }
217
- const files = (0, import_node_fs.readdirSync)(fullDirectory);
221
+ const files = (0, import_node_fs2.readdirSync)(fullDirectory);
218
222
  if (files.length > 2 || files.length < 1 || !files.includes("main_js_bundle.hbc")) {
219
223
  throw new Error(
220
224
  "Directory must contain only the main_js_bundle.hbc file and an optional `assets` folder"
@@ -240,7 +244,8 @@ async function createMobileBuild(root, platform) {
240
244
  supportedAppViewTypes: viewTypes.map(
241
245
  (view) => ({
242
246
  "experience-view": "hub",
243
- "discover-view": "discover"
247
+ "discover-view": "discover",
248
+ "dashboard-view": "dashboard"
244
249
  })[view]
245
250
  )
246
251
  });
@@ -251,7 +256,7 @@ async function createMobileBuild(root, platform) {
251
256
  console.log(`
252
257
  \u2714\uFE0E [${platform}] deployed as development build \u2714\uFE0E
253
258
  - build id: ${build2.id}
254
- - view types: ${viewTypes.join(", ")}
259
+ - view types: ${build2.supportedAppViewTypes.join(", ")}
255
260
  - promote to production here: ${dashboardUrl}
256
261
  `);
257
262
  return build2;
@@ -259,15 +264,15 @@ async function createMobileBuild(root, platform) {
259
264
  async function zipDirectory(directory) {
260
265
  const zip = new import_jszip.default();
261
266
  function addFilesToZip(currentPath, relativePath = "") {
262
- const items = (0, import_node_fs.readdirSync)(currentPath);
267
+ const items = (0, import_node_fs2.readdirSync)(currentPath);
263
268
  for (const item of items) {
264
- const fullPath = import_node_path2.default.join(currentPath, item);
265
- const zipPath = relativePath ? import_node_path2.default.join(relativePath, item) : item;
266
- const stats = (0, import_node_fs.statSync)(fullPath);
269
+ const fullPath = import_node_path3.default.join(currentPath, item);
270
+ const zipPath = relativePath ? import_node_path3.default.join(relativePath, item) : item;
271
+ const stats = (0, import_node_fs2.statSync)(fullPath);
267
272
  if (stats.isDirectory()) {
268
273
  addFilesToZip(fullPath, zipPath);
269
274
  } else {
270
- const fileContent = (0, import_node_fs.readFileSync)(fullPath);
275
+ const fileContent = (0, import_node_fs2.readFileSync)(fullPath);
271
276
  zip.file(zipPath, fileContent);
272
277
  }
273
278
  }
@@ -283,21 +288,21 @@ var CustomReporter = class {
283
288
 
284
289
  // src/cli/web.ts
285
290
  var import_promises3 = require("fs/promises");
286
- var import_node_path3 = __toESM(require("path"));
291
+ var import_node_path4 = __toESM(require("path"));
287
292
  var import_esbuild = require("esbuild");
288
293
 
289
294
  // src/cli/reanimated-bable.ts
290
- var fs = __toESM(require("fs/promises"));
291
- var path3 = __toESM(require("path"));
295
+ var fs2 = __toESM(require("fs/promises"));
296
+ var path4 = __toESM(require("path"));
292
297
  var babel = __toESM(require("@babel/core"));
293
298
  var JS_RE = /\.(m|c)?(t|j)sx?$/;
294
299
  function reanimatedBabelPlugin() {
295
300
  const shouldTransform = (p) => {
296
301
  if (!JS_RE.test(p)) return false;
297
- if (p.includes(`${path3.sep}react-native-reanimated${path3.sep}`))
302
+ if (p.includes(`${path4.sep}react-native-reanimated${path4.sep}`))
298
303
  return true;
299
- if (p.includes(`${path3.sep}node_modules${path3.sep}`)) return false;
300
- return p.includes(`${path3.sep}src${path3.sep}`);
304
+ if (p.includes(`${path4.sep}node_modules${path4.sep}`)) return false;
305
+ return p.includes(`${path4.sep}src${path4.sep}`);
301
306
  };
302
307
  return {
303
308
  name: "reanimated-babel",
@@ -306,7 +311,7 @@ function reanimatedBabelPlugin() {
306
311
  if (!shouldTransform(args.path)) {
307
312
  return null;
308
313
  }
309
- const code = await fs.readFile(args.path, "utf8");
314
+ const code = await fs2.readFile(args.path, "utf8");
310
315
  const result = await babel.transformAsync(code, {
311
316
  filename: args.path,
312
317
  sourceMaps: false,
@@ -345,7 +350,7 @@ function reanimatedBabelPlugin() {
345
350
  };
346
351
  }
347
352
  function pickLoader(file) {
348
- const ext = path3.extname(file).toLowerCase();
353
+ const ext = path4.extname(file).toLowerCase();
349
354
  if (ext === ".tsx") return "tsx";
350
355
  if (ext === ".ts") return "ts";
351
356
  if (ext === ".jsx") return "jsx";
@@ -353,7 +358,7 @@ function pickLoader(file) {
353
358
  }
354
359
 
355
360
  // src/cli/strip-flow.ts
356
- var fs2 = __toESM(require("fs/promises"));
361
+ var fs3 = __toESM(require("fs/promises"));
357
362
  var babel2 = __toESM(require("@babel/core"));
358
363
  function stripFlowWithBabel() {
359
364
  const filter = /\.(m|c)?jsx?$/;
@@ -362,7 +367,7 @@ function stripFlowWithBabel() {
362
367
  // biome-ignore lint/suspicious/noExplicitAny: <explanation>
363
368
  setup(b) {
364
369
  b.onLoad({ filter }, async (args) => {
365
- const code = await fs2.readFile(args.path, "utf8");
370
+ const code = await fs3.readFile(args.path, "utf8");
366
371
  const out = await babel2.transformAsync(code, {
367
372
  filename: args.path,
368
373
  babelrc: false,
@@ -414,7 +419,7 @@ function toPascalCase(str) {
414
419
  }
415
420
  async function makeWebEntrypoint(root) {
416
421
  const files = await getSupportedAppViewTypes(root);
417
- const packageJsonPath = import_node_path3.default.join(root, "package.json");
422
+ const packageJsonPath = import_node_path4.default.join(root, "package.json");
418
423
  const packageJson = JSON.parse(await (0, import_promises3.readFile)(packageJsonPath, "utf-8"));
419
424
  const hasReactNativeReanimated = packageJson.dependencies?.["react-native-reanimated"];
420
425
  const imports = files.map(
@@ -444,18 +449,18 @@ const root = document.getElementById("root") || (() => {
444
449
  })();
445
450
  AppRegistry.runApplication(viewType, { rootTag: root });
446
451
  `;
447
- const entryFile = import_node_path3.default.join(root, "build", "entrypoints", "web", "index.tsx");
448
- await (0, import_promises3.mkdir)(import_node_path3.default.dirname(entryFile), { recursive: true });
452
+ const entryFile = import_node_path4.default.join(root, "build", "entrypoints", "web", "index.tsx");
453
+ await (0, import_promises3.mkdir)(import_node_path4.default.dirname(entryFile), { recursive: true });
449
454
  await (0, import_promises3.writeFile)(entryFile, entry, "utf-8");
450
455
  return entryFile;
451
456
  }
452
457
  async function bundleWeb(root) {
453
458
  const entry = await makeWebEntrypoint(root);
454
- const outDir = import_node_path3.default.join(root, "build", "output", "web");
459
+ const outDir = import_node_path4.default.join(root, "build", "output", "web");
455
460
  await (0, import_promises3.mkdir)(outDir, { recursive: true });
456
461
  await (0, import_esbuild.build)({
457
462
  entryPoints: [entry],
458
- outfile: import_node_path3.default.join(outDir, "main.js"),
463
+ outfile: import_node_path4.default.join(outDir, "main.js"),
459
464
  bundle: true,
460
465
  minify: false,
461
466
  format: "esm",
@@ -503,7 +508,7 @@ async function bundleWeb(root) {
503
508
  setup(b) {
504
509
  b.onResolve({ filter: /^\.\/native-whop-core$/ }, (args) => {
505
510
  return {
506
- path: import_node_path3.default.join(args.resolveDir, "native-whop-core"),
511
+ path: import_node_path4.default.join(args.resolveDir, "native-whop-core"),
507
512
  namespace: "file"
508
513
  };
509
514
  });
@@ -536,7 +541,7 @@ async function bundleWeb(root) {
536
541
  <script type="module" src="./main.js"></script>
537
542
  </body>
538
543
  </html>`;
539
- await (0, import_promises3.writeFile)(import_node_path3.default.join(outDir, "index.html"), html, "utf-8");
544
+ await (0, import_promises3.writeFile)(import_node_path4.default.join(outDir, "index.html"), html, "utf-8");
540
545
  console.log(" \u2714\uFE0E [web] bundle created at build/output/web/main.js");
541
546
  }
542
547
  async function buildAndPublish2(root, {
@@ -554,8 +559,8 @@ async function buildAndPublish2(root, {
554
559
  }
555
560
  }
556
561
  async function createWebBuild(root) {
557
- const fullDirectory = import_node_path3.default.join(root, "build", "output", "web");
558
- const mainJsFile = import_node_path3.default.join(fullDirectory, "main.js");
562
+ const fullDirectory = import_node_path4.default.join(root, "build", "output", "web");
563
+ const mainJsFile = import_node_path4.default.join(fullDirectory, "main.js");
559
564
  try {
560
565
  await (0, import_promises3.readFile)(mainJsFile);
561
566
  } catch {
@@ -660,8 +665,8 @@ async function main() {
660
665
  await Promise.all(promises);
661
666
  }
662
667
  async function cleanBuildDirectory(root) {
663
- const buildDirectory = import_node_path4.default.join(root, "build");
664
- if ((0, import_node_fs2.existsSync)(buildDirectory)) {
668
+ const buildDirectory = import_node_path5.default.join(root, "build");
669
+ if ((0, import_node_fs3.existsSync)(buildDirectory)) {
665
670
  await (0, import_rimraf.rimraf)(buildDirectory);
666
671
  }
667
672
  console.log(" \u2714\uFE0E cleaned build directory");
@@ -673,7 +678,7 @@ async function getRootProjectDirectory() {
673
678
  "please run this command inside a whop react native project"
674
679
  );
675
680
  }
676
- const root = import_node_path4.default.dirname(file);
681
+ const root = import_node_path5.default.dirname(file);
677
682
  return root;
678
683
  }
679
684
  async function handleInstall() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/mobile.ts","../../src/cli/file.ts","../../src/cli/sdk.ts","../../src/cli/valid-view-type.ts","../../src/cli/web.ts","../../src/cli/reanimated-bable.ts","../../src/cli/strip-flow.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { findUp } from \"find-up\";\nimport qrcode from \"qrcode-terminal\";\nimport { rimraf } from \"rimraf\";\nimport { buildAndPublish } from \"./mobile\";\nimport { env } from \"./sdk\";\nimport { buildAndPublish as buildAndPublishWeb } from \"./web\";\n\nasync function main() {\n\tconst args = parseArgs({\n\t\toptions: {\n\t\t\tios: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t\tandroid: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t\tweb: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t},\n\t\tstrict: true,\n\t\tallowPositionals: true,\n\t\targs: process.argv.slice(2),\n\t});\n\n\tconst [command] = args.positionals;\n\n\tif (command === \"install\") {\n\t\tawait handleInstall();\n\t\treturn;\n\t}\n\n\tlet shouldBuild = true;\n\tlet shouldUpload = true;\n\tlet shouldClean = true;\n\tif (command === \"build\") {\n\t\tshouldUpload = false;\n\t} else if (command === \"ship\") {\n\t\tshouldBuild = true;\n\t\tshouldUpload = true;\n\t} else if (command === \"upload\") {\n\t\tshouldBuild = false;\n\t\tshouldClean = false;\n\t} else if (command === \"clean\") {\n\t\tshouldBuild = false;\n\t\tshouldUpload = false;\n\t} else {\n\t\tconsole.error(\n\t\t\t`Usage:\n\twhop-react-native ship [--ios] [--android] [--web] # runs build and then publishes it as a dev build to whop.\n\twhop-react-native build [--ios] [--android] [--web] # builds your app into a distributable bundle in the build/ directory.\n\twhop-react-native upload [--ios] [--android] [--web] # uploads the existing build directory to whop.\n\twhop-react-native clean # cleans the build directory.`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tconst root = await getRootProjectDirectory();\n\n\tif (shouldClean) {\n\t\tawait cleanBuildDirectory(root);\n\t}\n\n\tconst didProvidePlatform =\n\t\targs.values.ios || args.values.android || args.values.web;\n\n\tconst opts = { shouldBuild, shouldUpload };\n\tconst promises: Promise<void>[] = [];\n\n\tif (args.values.ios || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublish(root, \"ios\", opts));\n\t}\n\tif (args.values.android || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublish(root, \"android\", opts));\n\t}\n\tif (args.values.web || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublishWeb(root, opts));\n\t}\n\n\tawait Promise.all(promises);\n}\n\nasync function cleanBuildDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build directory\");\n}\n\nasync function getRootProjectDirectory() {\n\tconst file = await findUp(\"package.json\", { cwd: process.cwd() });\n\tif (!file) {\n\t\tthrow new Error(\n\t\t\t\"please run this command inside a whop react native project\",\n\t\t);\n\t}\n\tconst root = path.dirname(file);\n\treturn root;\n}\n\nasync function handleInstall() {\n\tconst appId = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\tconst installLink = `https://whop.com/apps/${appId}/install`;\n\n\tconsole.log(`\nOpen this link in your browser to install the app into your whop.\n${installLink}\n\nOr scan the QR code with your iPhone:\n\t`);\n\n\tqrcode.generate(installLink, { small: true });\n}\n\nmain()\n\t.catch((err) => {\n\t\tconsole.error(err);\n\t\tprocess.exit(1);\n\t})\n\t.then(() => {\n\t\tprocess.exit(0);\n\t});\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getDefaultConfig } from \"@react-native/metro-config\";\nimport { findUp } from \"find-up\";\nimport JSZip from \"jszip\";\nimport { type ReportableEvent, type Reporter, runBuild } from \"metro\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { APP_ID, COMPANY_ID, whopSdk } from \"./sdk\";\nimport { getSupportedAppViewTypes } from \"./valid-view-type\";\n\nexport async function buildAndPublish(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n\t{\n\t\tshouldBuild = true,\n\t\tshouldUpload = true,\n\t}: { shouldBuild: boolean; shouldUpload: boolean } = {\n\t\tshouldBuild: true,\n\t\tshouldUpload: true,\n\t},\n) {\n\tif (shouldBuild) {\n\t\tawait bundle(root, platform);\n\t}\n\tif (shouldUpload) {\n\t\tawait createMobileBuild(root, platform);\n\t}\n}\n\nexport async function bundle(root: string, platform: \"ios\" | \"android\") {\n\tawait makeEntrypoint(root, platform);\n\n\tconst outputFile = path.join(\n\t\troot,\n\t\t\"build\",\n\t\t\"output\",\n\t\tplatform,\n\t\t\"main_js_bundle\",\n\t);\n\tawait mkdir(path.dirname(outputFile), { recursive: true });\n\n\tconst defaultConfig = getDefaultConfig(root);\n\n\tconst babelLocation = require.resolve(\"@babel/runtime/package\");\n\n\tconst bableNodeModules = await findUp(\"node_modules\", {\n\t\tcwd: babelLocation,\n\t\ttype: \"directory\",\n\t});\n\tif (!bableNodeModules) {\n\t\tthrow new Error(\"babel node_modules parent folder not found\");\n\t}\n\n\tawait runBuild(\n\t\t{\n\t\t\t...defaultConfig,\n\t\t\tprojectRoot: root,\n\t\t\ttransformer: {\n\t\t\t\t...defaultConfig.transformer,\n\t\t\t\tbabelTransformerPath: require.resolve(\n\t\t\t\t\t\"./whop-react-native-babel-transformer.js\",\n\t\t\t\t),\n\t\t\t},\n\t\t\twatchFolders: [\n\t\t\t\troot,\n\t\t\t\tpath.resolve(root, \"node_modules\"),\n\t\t\t\tbableNodeModules,\n\t\t\t],\n\t\t\treporter: new CustomReporter(),\n\t\t\tresolver: {\n\t\t\t\t...defaultConfig.resolver,\n\t\t\t\tnodeModulesPaths: [\n\t\t\t\t\t...(defaultConfig.resolver?.nodeModulesPaths ?? []),\n\t\t\t\t\tbableNodeModules,\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tdev: false,\n\t\t\tentry: `build/entrypoints/${platform}/index.js`,\n\t\t\tminify: false,\n\t\t\tplatform: platform,\n\t\t\tsourceMap: false,\n\t\t\tout: outputFile,\n\t\t},\n\t);\n\n\tawait rename(\n\t\t`${outputFile}.js`,\n\t\tpath.join(root, \"build\", \"output\", platform, \"main_js_bundle.hbc\"),\n\t);\n\n\tconsole.log(` ✔︎ [${platform}] bundle created`);\n}\n\n// getSupportedAppViewTypes moved to valid-view-type.ts\n\nasync function makeEntrypoint(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n): Promise<string> {\n\tconst entrypoint = path.join(\n\t\troot,\n\t\t\"build\",\n\t\t\"entrypoints\",\n\t\tplatform,\n\t\t\"index.js\",\n\t);\n\n\tconst files = await getSupportedAppViewTypes(root);\n\n\tconst pascalCase = (str: string) =>\n\t\tstr\n\t\t\t.split(\"-\")\n\t\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t.join(\"\");\n\n\tconst imports = files.map(\n\t\t(file) =>\n\t\t\t`import { ${pascalCase(file)} } from \"../../../src/views/${file}\";`,\n\t);\n\tconst registry = files.map(\n\t\t(file) =>\n\t\t\t`AppRegistry.registerComponent(\"${pascalCase(file)}\", () => ${pascalCase(file)});`,\n\t);\n\n\tconst entrypointContent = `import { AppRegistry } from \"react-native\";\n${imports.join(\"\\n\")}\n\n${registry.join(\"\\n\")}\n`;\n\n\tconst entrypointDir = path.dirname(entrypoint);\n\tawait mkdir(entrypointDir, { recursive: true });\n\tawait writeFile(entrypoint, entrypointContent, \"utf-8\");\n\n\tconsole.log(` ✔︎ [${platform}] entrypoint created`);\n\n\treturn entrypoint;\n}\n\nexport async function createMobileBuild(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n) {\n\tconst viewTypes = await getSupportedAppViewTypes(root);\n\n\tconst fullDirectory = path.join(root, \"build\", \"output\", platform);\n\n\t// Check if the directory contains a file called `main_js_bundle.hbc`\n\tconst mainJsBundle = path.join(fullDirectory, \"main_js_bundle.hbc\");\n\n\tif (!existsSync(mainJsBundle)) {\n\t\tthrow new Error(`main_js_bundle.hbc not found in ${fullDirectory}`);\n\t}\n\n\t// check that that folder only contains the main_js_bundle.hbc file and an optional `assets` folder\n\tconst files = readdirSync(fullDirectory);\n\tif (\n\t\tfiles.length > 2 ||\n\t\tfiles.length < 1 ||\n\t\t!files.includes(\"main_js_bundle.hbc\")\n\t) {\n\t\tthrow new Error(\n\t\t\t\"Directory must contain only the main_js_bundle.hbc file and an optional `assets` folder\",\n\t\t);\n\t}\n\tif (files.length === 2 && !files.includes(\"assets\")) {\n\t\tthrow new Error(\n\t\t\t\"Directory must contain only the main_js_bundle.hbc file and an optional `assets` folder\",\n\t\t);\n\t}\n\n\t// Zip the directory\n\tconst zipData = await zipDirectory(fullDirectory);\n\n\tconst checksum = await getChecksum(zipData);\n\n\tconsole.log(` ✔︎ [${platform}] build zipped with checksum: ${checksum}`);\n\n\tconst fileName = `app_build_${platform}.zip`;\n\tconst uploadedFile = await uploadFile(zipData, fileName, \"application/zip\");\n\n\tconsole.log(\n\t\t` ✔︎ [${platform}] uploaded build: ${fileName} (${(zipData.length / 1024).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.apps.createAppBuild({\n\t\tattachment: { directUploadId: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tplatform,\n\t\tsupportedAppViewTypes: viewTypes.map(\n\t\t\t(view) =>\n\t\t\t\t({\n\t\t\t\t\t\"experience-view\": \"hub\" as const,\n\t\t\t\t\t\"discover-view\": \"discover\" as const,\n\t\t\t\t})[view],\n\t\t),\n\t});\n\n\tif (!build) {\n\t\tthrow new Error(\"Failed to create app build\");\n\t}\n\n\tconst dashboardUrl = `https://whop.com/dashboard/${COMPANY_ID}/developer/apps/${APP_ID}/builds/?platform=${platform}`;\n\n\tconsole.log(`\\n ✔︎ [${platform}] deployed as development build ✔︎\n - build id: ${build.id}\n - view types: ${viewTypes.join(\", \")}\n - promote to production here: ${dashboardUrl}\\n`);\n\n\treturn build;\n}\n\nasync function zipDirectory(\n\tdirectory: string,\n): Promise<Buffer<ArrayBufferLike>> {\n\tconst zip = new JSZip();\n\n\t// Recursively add files to zip\n\tfunction addFilesToZip(currentPath: string, relativePath = \"\") {\n\t\tconst items = readdirSync(currentPath);\n\n\t\tfor (const item of items) {\n\t\t\tconst fullPath = path.join(currentPath, item);\n\t\t\tconst zipPath = relativePath ? path.join(relativePath, item) : item;\n\t\t\tconst stats = statSync(fullPath);\n\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\taddFilesToZip(fullPath, zipPath);\n\t\t\t} else {\n\t\t\t\tconst fileContent = readFileSync(fullPath);\n\t\t\t\tzip.file(zipPath, fileContent);\n\t\t\t}\n\t\t}\n\t}\n\n\taddFilesToZip(directory);\n\n\t// Generate zip file\n\tconst zipData = await zip.generateAsync({ type: \"nodebuffer\" });\n\n\treturn zipData;\n}\n\nclass CustomReporter implements Reporter {\n\tupdate(event: ReportableEvent) {\n\t\t// Do nothing.\n\t}\n}\n","import { createHash } from \"node:crypto\";\nimport { AGENT_USER_ID, APP_ID, whopSdk } from \"./sdk\";\n\nexport async function uploadFile(\n\tdata: Buffer<ArrayBufferLike>,\n\tname: string,\n\tcontentType: string,\n) {\n\tconst file = new File([data], name, {\n\t\ttype: contentType,\n\t});\n\n\tconst uploadedFile = await whopSdk\n\t\t.withUser(AGENT_USER_ID)\n\t\t.attachments.uploadAttachment({\n\t\t\tfile,\n\t\t\trecord: \"app\",\n\t\t\tid: APP_ID,\n\t\t});\n\n\treturn uploadedFile;\n}\n\nexport async function getChecksum(data: Buffer<ArrayBufferLike>) {\n\tconst hash = createHash(\"sha256\");\n\thash.update(data);\n\treturn hash.digest(\"hex\");\n}\n","import { WhopServerSdk } from \"@whop/api\";\nimport { config } from \"dotenv\";\n\nconfig({\n\tpath: [\".env\", \".env.local\", \".env.development\", \".env.production\"],\n});\n\nexport function env(key: string) {\n\tconst value = process.env[key];\n\tif (!value) {\n\t\tthrow new Error(`Missing environment variable: ${key}`);\n\t}\n\treturn value;\n}\n\nexport const AGENT_USER_ID = env(\"NEXT_PUBLIC_WHOP_AGENT_USER_ID\");\nexport const COMPANY_ID = env(\"NEXT_PUBLIC_WHOP_COMPANY_ID\");\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\nexport const whopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n\tcompanyId: COMPANY_ID,\n\tonBehalfOfUserId: AGENT_USER_ID,\n});\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { APP_ID, COMPANY_ID, whopSdk } from \"./sdk\";\nimport { stripFlowWithBabel } from \"./strip-flow\";\nimport { getSupportedAppViewTypes } from \"./valid-view-type\";\n\nfunction aliasReactNativePlugin() {\n\treturn {\n\t\tname: \"alias-react-native\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\tb.onResolve({ filter: /^react-native$/ }, () => ({\n\t\t\t\tpath: require.resolve(\"react-native-web\"),\n\t\t\t}));\n\t\t},\n\t} satisfies import(\"esbuild\").Plugin;\n}\n\nfunction forceSingleReact() {\n\tconst map = new Map<string, string>([\n\t\t[\"react\", require.resolve(\"react\")],\n\t\t[\"react/jsx-runtime\", require.resolve(\"react/jsx-runtime\")],\n\t\t[\"react/jsx-dev-runtime\", require.resolve(\"react/jsx-dev-runtime\")],\n\t\t[\"react-dom\", require.resolve(\"react-dom\")],\n\t\t[\"react-dom/client\", require.resolve(\"react-dom/client\")],\n\t]);\n\n\tconst rx = /^(react(?:\\/jsx-(?:dev-)?runtime)?|react-dom(?:\\/client)?)$/;\n\n\treturn {\n\t\tname: \"force-single-react\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\tb.onResolve({ filter: rx }, (args) => ({ path: map.get(args.path)! }));\n\t\t},\n\t} satisfies import(\"esbuild\").Plugin;\n}\n\nfunction toPascalCase(str: string) {\n\treturn str\n\t\t.split(\"-\")\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t.join(\"\");\n}\n\nasync function makeWebEntrypoint(root: string) {\n\tconst files = await getSupportedAppViewTypes(root);\n\n\tconst packageJsonPath = path.join(root, \"package.json\");\n\tconst packageJson = JSON.parse(await readFile(packageJsonPath, \"utf-8\"));\n\tconst hasReactNativeReanimated =\n\t\tpackageJson.dependencies?.[\"react-native-reanimated\"];\n\n\tconst imports = files.map(\n\t\t(file) =>\n\t\t\t`import { ${toPascalCase(file)} } from \"../../../src/views/${file}\";`,\n\t);\n\tconst registry = files.map(\n\t\t(file) =>\n\t\t\t`AppRegistry.registerComponent(\"${toPascalCase(file)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(file)}\", ${toPascalCase(file)}));`,\n\t);\n\n\tconst defaultKey = toPascalCase(files[0] ?? \"experience-view\");\n\tconst reanimatedImport = hasReactNativeReanimated\n\t\t? `import \"react-native-reanimated\";`\n\t\t: \"\";\n\n\tconst entry = `import { AppRegistry } from \"react-native\";\nimport * as React from \"react\";\nimport { WhopNavigationWrapper } from \"@whop/react-native/web\";\n${reanimatedImport}\n\n${imports.join(\"\\n\")} \n\n${registry.join(\"\\n\")} \n\nconst viewType = new URLSearchParams(window.location.search).get(\"app_view\") ?? \"${defaultKey}\"; \n\nconst root = document.getElementById(\"root\") || (() => {\n\tconst d = document.createElement(\"div\");\n\td.id = \"root\";\n\tdocument.body.appendChild(d);\n\treturn d;\n})();\nAppRegistry.runApplication(viewType, { rootTag: root });\n`;\n\n\tconst entryFile = path.join(root, \"build\", \"entrypoints\", \"web\", \"index.tsx\");\n\tawait mkdir(path.dirname(entryFile), { recursive: true });\n\tawait writeFile(entryFile, entry, \"utf-8\");\n\n\treturn entryFile;\n}\n\nexport async function bundleWeb(root: string) {\n\tconst entry = await makeWebEntrypoint(root);\n\n\tconst outDir = path.join(root, \"build\", \"output\", \"web\");\n\tawait mkdir(outDir, { recursive: true });\n\n\tawait build({\n\t\tentryPoints: [entry],\n\t\toutfile: path.join(outDir, \"main.js\"),\n\t\tbundle: true,\n\t\tminify: false,\n\t\tformat: \"esm\",\n\t\tplatform: \"browser\",\n\t\tsourcemap: false,\n\t\tjsx: \"automatic\",\n\t\tmainFields: [\"browser\", \"module\", \"main\"],\n\t\tconditions: [\"browser\", \"import\", \"default\"],\n\t\tdefine: {\n\t\t\tprocess: \"{}\",\n\t\t\t\"process.env\": \"{}\",\n\t\t\t\"process.env.NODE_ENV\": '\"production\"',\n\t\t\t__DEV__: \"false\",\n\t\t\t\"process.env.NEXT_PUBLIC_WHOP_APP_ID\": `\"${APP_ID}\"`,\n\t\t\t// Some RN libraries (e.g., RNGH) expect a Node-like global in the browser\n\t\t\tglobal: \"globalThis\",\n\t\t},\n\t\tresolveExtensions: [\n\t\t\t\".web.tsx\",\n\t\t\t\".web.ts\",\n\t\t\t\".web.js\",\n\t\t\t\".tsx\",\n\t\t\t\".ts\",\n\t\t\t\".jsx\",\n\t\t\t\".js\",\n\t\t],\n\t\tloader: {\n\t\t\t\".png\": \"dataurl\",\n\t\t\t\".jpg\": \"dataurl\",\n\t\t\t\".jpeg\": \"dataurl\",\n\t\t\t\".svg\": \"dataurl\",\n\t\t\t\".ttf\": \"dataurl\",\n\t\t\t\".woff\": \"dataurl\",\n\t\t\t\".woff2\": \"dataurl\",\n\t\t\t\".js\": \"jsx\",\n\t\t\t\".jsx\": \"jsx\",\n\t\t},\n\t\tplugins: [\n\t\t\tforceSingleReact(),\n\t\t\taliasReactNativePlugin(),\n\t\t\treanimatedBabelPlugin(),\n\t\t\tstripFlowWithBabel(),\n\t\t\t{\n\t\t\t\tname: \"force-native-web-stub\",\n\t\t\t\tsetup(b) {\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\t\t\tb.onResolve({ filter: /^\\.\\/native-whop-core$/ }, (args: any) => {\n\t\t\t\t\t\t// Always resolve the local source file so extension resolution (.web.ts) applies\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tpath: path.join(args.resolveDir, \"native-whop-core\"),\n\t\t\t\t\t\t\tnamespace: \"file\",\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\n\tconst html = `<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t\t<title>Whop App (Web)</title>\n\t\t<style>\n\t\t\t#root {\n\t\t\t\twidth: 100vw;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: stretch;\n\t\t\t\tjustify-content: start;\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div id=\"root\"></div>\n\t\t<script type=\"module\" src=\"./main.js\"></script>\n\t</body>\n</html>`;\n\tawait writeFile(path.join(outDir, \"index.html\"), html, \"utf-8\");\n\n\tconsole.log(\" ✔︎ [web] bundle created at build/output/web/main.js\");\n}\n\nexport async function buildAndPublish(\n\troot: string,\n\t{\n\t\tshouldBuild = true,\n\t\tshouldUpload = true,\n\t}: { shouldBuild: boolean; shouldUpload: boolean } = {\n\t\tshouldBuild: true,\n\t\tshouldUpload: true,\n\t},\n) {\n\tif (shouldBuild) {\n\t\tawait bundleWeb(root);\n\t}\n\tif (shouldUpload) {\n\t\tawait createWebBuild(root);\n\t}\n}\n\nexport async function createWebBuild(root: string) {\n\tconst fullDirectory = path.join(root, \"build\", \"output\", \"web\");\n\tconst mainJsFile = path.join(fullDirectory, \"main.js\");\n\n\t// Verify bundle exists\n\ttry {\n\t\tawait readFile(mainJsFile);\n\t} catch {\n\t\tthrow new Error(`main.js not found in ${fullDirectory}`);\n\t}\n\n\tconst buf = await readFile(mainJsFile);\n\tconst checksum = await getChecksum(buf);\n\n\tconsole.log(` ✔︎ [web] build checksummed: ${checksum}`);\n\n\tconst fileName = `rnweb_${checksum}.js`;\n\tconst uploadedFile = await uploadFile(\n\t\tbuf,\n\t\tfileName,\n\t\t\"application/javascript\",\n\t);\n\n\tconsole.log(\n\t\t` ✔︎ [web] uploaded build: ${fileName} (${(buf.length / 1024).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.apps.createAppBuild({\n\t\tattachment: { directUploadId: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tplatform: \"web\",\n\t\tsupportedAppViewTypes: [\"hub\"],\n\t});\n\n\tif (!build) {\n\t\tthrow new Error(\"Failed to create app build\");\n\t}\n\n\tconst dashboardUrl = `https://whop.com/dashboard/${COMPANY_ID}/developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${build.id}\\n - view types: hub\\n - promote to production here: ${dashboardUrl}\\n`,\n\t);\n\n\treturn build;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n// build/plugins/reanimatedBabel.ts\nimport * as babel from \"@babel/core\";\n\nconst JS_RE = /\\.(m|c)?(t|j)sx?$/;\n\nexport function reanimatedBabelPlugin() {\n\t// Transform only: your app source (outside node_modules) and reanimated itself.\n\tconst shouldTransform = (p: string) => {\n\t\tif (!JS_RE.test(p)) return false;\n\t\t// Always run on reanimated’s files\n\t\tif (p.includes(`${path.sep}react-native-reanimated${path.sep}`))\n\t\t\treturn true;\n\t\t// Never touch third-party deps\n\t\tif (p.includes(`${path.sep}node_modules${path.sep}`)) return false;\n\t\t// Run on app code under src/\n\t\treturn p.includes(`${path.sep}src${path.sep}`);\n\t};\n\n\treturn {\n\t\tname: \"reanimated-babel\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\tb.onLoad({ filter: JS_RE }, async (args) => {\n\t\t\t\tif (!shouldTransform(args.path)) {\n\t\t\t\t\t// Skip non-target files so other plugins (and esbuild) can process them\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst code = await fs.readFile(args.path, \"utf8\");\n\t\t\t\tconst result = await babel.transformAsync(code, {\n\t\t\t\t\tfilename: args.path,\n\t\t\t\t\tsourceMaps: false,\n\t\t\t\t\tbabelrc: false,\n\t\t\t\t\tconfigFile: false,\n\t\t\t\t\t// ORDER MATTERS: Reanimated plugin MUST BE LAST\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t// Needed by Reanimated on web per docs\n\t\t\t\t\t\t\"@babel/plugin-transform-export-namespace-from\",\n\t\t\t\t\t\t// Handle Flow types present in some RN libs\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"@babel/plugin-transform-flow-strip-types\",\n\t\t\t\t\t\t\t{ allowDeclareFields: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\t// MUST be last\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"react-native-reanimated/plugin\",\n\t\t\t\t\t\t\t{ relativeSourceLocation: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tpresets: [], // esbuild handles TS/JSX syntax; no preset-env/preset-react\n\t\t\t\t\tcaller: { name: \"esbuild\" },\n\t\t\t\t\t// Let Babel parse TS/JSX/Flow; keep it broad\n\t\t\t\t\tparserOpts: { plugins: [\"jsx\", \"typescript\"] },\n\t\t\t\t\tgeneratorOpts: { decoratorsBeforeExport: true },\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\t\t\tcontents: result!.code!,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\t\t\tloader: pickLoader(args.path) as any,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t};\n}\n\nfunction pickLoader(file: string) {\n\tconst ext = path.extname(file).toLowerCase();\n\tif (ext === \".tsx\") return \"tsx\";\n\tif (ext === \".ts\") return \"ts\";\n\tif (ext === \".jsx\") return \"jsx\";\n\t// For .js: many RN libs contain JSX; be permissive\n\treturn \"jsx\";\n}\n","import * as fs from \"node:fs/promises\";\n// stripFlowWithBabel.ts\nimport * as babel from \"@babel/core\";\n\nexport function stripFlowWithBabel() {\n\tconst filter = /\\.(m|c)?jsx?$/;\n\treturn {\n\t\tname: \"strip-flow-with-babel\",\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tsetup(b: any) {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\tb.onLoad({ filter }, async (args: any) => {\n\t\t\t\tconst code = await fs.readFile(args.path, \"utf8\");\n\t\t\t\tconst out = await babel.transformAsync(code, {\n\t\t\t\t\tfilename: args.path,\n\t\t\t\t\tbabelrc: false,\n\t\t\t\t\tconfigFile: false,\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"@babel/plugin-transform-flow-strip-types\",\n\t\t\t\t\t\t\t{ allowDeclareFields: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tparserOpts: { plugins: [\"jsx\", \"flow\"] },\n\t\t\t\t\tsourceMaps: false,\n\t\t\t\t});\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\t\treturn { contents: out!.code!, loader: \"jsx\" };\n\t\t\t});\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_find_up","import_promises","import_node_path","path","path","build","JSZip","import_promises","import_node_path","path","fs","babel","path","buildAndPublish","build","buildAndPublish","path","qrcode"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/mobile.ts","../../src/cli/file.ts","../../src/cli/sdk.ts","../../src/cli/load-metro-config.ts","../../src/cli/valid-view-type.ts","../../src/cli/web.ts","../../src/cli/reanimated-bable.ts","../../src/cli/strip-flow.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { findUp } from \"find-up\";\nimport qrcode from \"qrcode-terminal\";\nimport { rimraf } from \"rimraf\";\nimport { buildAndPublish } from \"./mobile\";\nimport { env } from \"./sdk\";\nimport { buildAndPublish as buildAndPublishWeb } from \"./web\";\n\nasync function main() {\n\tconst args = parseArgs({\n\t\toptions: {\n\t\t\tios: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t\tandroid: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t\tweb: {\n\t\t\t\ttype: \"boolean\",\n\t\t\t},\n\t\t},\n\t\tstrict: true,\n\t\tallowPositionals: true,\n\t\targs: process.argv.slice(2),\n\t});\n\n\tconst [command] = args.positionals;\n\n\tif (command === \"install\") {\n\t\tawait handleInstall();\n\t\treturn;\n\t}\n\n\tlet shouldBuild = true;\n\tlet shouldUpload = true;\n\tlet shouldClean = true;\n\tif (command === \"build\") {\n\t\tshouldUpload = false;\n\t} else if (command === \"ship\") {\n\t\tshouldBuild = true;\n\t\tshouldUpload = true;\n\t} else if (command === \"upload\") {\n\t\tshouldBuild = false;\n\t\tshouldClean = false;\n\t} else if (command === \"clean\") {\n\t\tshouldBuild = false;\n\t\tshouldUpload = false;\n\t} else {\n\t\tconsole.error(\n\t\t\t`Usage:\n\twhop-react-native ship [--ios] [--android] [--web] # runs build and then publishes it as a dev build to whop.\n\twhop-react-native build [--ios] [--android] [--web] # builds your app into a distributable bundle in the build/ directory.\n\twhop-react-native upload [--ios] [--android] [--web] # uploads the existing build directory to whop.\n\twhop-react-native clean # cleans the build directory.`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tconst root = await getRootProjectDirectory();\n\n\tif (shouldClean) {\n\t\tawait cleanBuildDirectory(root);\n\t}\n\n\tconst didProvidePlatform =\n\t\targs.values.ios || args.values.android || args.values.web;\n\n\tconst opts = { shouldBuild, shouldUpload };\n\tconst promises: Promise<void>[] = [];\n\n\tif (args.values.ios || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublish(root, \"ios\", opts));\n\t}\n\tif (args.values.android || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublish(root, \"android\", opts));\n\t}\n\tif (args.values.web || !didProvidePlatform) {\n\t\tpromises.push(buildAndPublishWeb(root, opts));\n\t}\n\n\tawait Promise.all(promises);\n}\n\nasync function cleanBuildDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build directory\");\n}\n\nasync function getRootProjectDirectory() {\n\tconst file = await findUp(\"package.json\", { cwd: process.cwd() });\n\tif (!file) {\n\t\tthrow new Error(\n\t\t\t\"please run this command inside a whop react native project\",\n\t\t);\n\t}\n\tconst root = path.dirname(file);\n\treturn root;\n}\n\nasync function handleInstall() {\n\tconst appId = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\tconst installLink = `https://whop.com/apps/${appId}/install`;\n\n\tconsole.log(`\nOpen this link in your browser to install the app into your whop.\n${installLink}\n\nOr scan the QR code with your iPhone:\n\t`);\n\n\tqrcode.generate(installLink, { small: true });\n}\n\nmain()\n\t.catch((err) => {\n\t\tconsole.error(err);\n\t\tprocess.exit(1);\n\t})\n\t.then(() => {\n\t\tprocess.exit(0);\n\t});\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { mkdir, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getDefaultConfig, mergeConfig } from \"@react-native/metro-config\";\nimport { findUp } from \"find-up\";\nimport JSZip from \"jszip\";\nimport { type ReportableEvent, type Reporter, runBuild } from \"metro\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { loadMetroConfig } from \"./load-metro-config\";\nimport { APP_ID, COMPANY_ID, whopSdk } from \"./sdk\";\nimport { getSupportedAppViewTypes } from \"./valid-view-type\";\n\nexport async function buildAndPublish(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n\t{\n\t\tshouldBuild = true,\n\t\tshouldUpload = true,\n\t}: { shouldBuild: boolean; shouldUpload: boolean } = {\n\t\tshouldBuild: true,\n\t\tshouldUpload: true,\n\t},\n) {\n\tif (shouldBuild) {\n\t\tawait bundle(root, platform);\n\t}\n\tif (shouldUpload) {\n\t\tawait createMobileBuild(root, platform);\n\t}\n}\n\nexport async function bundle(root: string, platform: \"ios\" | \"android\") {\n\tawait makeEntrypoint(root, platform);\n\n\tconst outputFile = path.join(\n\t\troot,\n\t\t\"build\",\n\t\t\"output\",\n\t\tplatform,\n\t\t\"main_js_bundle\",\n\t);\n\n\tawait mkdir(path.dirname(outputFile), { recursive: true });\n\n\tconst babelLocation = require.resolve(\"@babel/runtime/package\");\n\n\tconst bableNodeModules = await findUp(\"node_modules\", {\n\t\tcwd: babelLocation,\n\t\ttype: \"directory\",\n\t});\n\n\tif (!bableNodeModules) {\n\t\tthrow new Error(\"babel node_modules parent folder not found\");\n\t}\n\n\tconst defaultConfig = getDefaultConfig(root);\n\tconst projectConfig = await loadMetroConfig(root);\n\n\tconst defaultMetroConfig = mergeConfig(defaultConfig, projectConfig);\n\n\tconst metroConfig = mergeConfig(defaultMetroConfig, {\n\t\tprojectRoot: root,\n\t\ttransformer: {\n\t\t\tbabelTransformerPath: require.resolve(\n\t\t\t\t\"./whop-react-native-babel-transformer.js\",\n\t\t\t),\n\t\t},\n\t\tcacheStores: [],\n\t\twatchFolders: [root, path.resolve(root, \"node_modules\"), bableNodeModules],\n\t\treporter: new CustomReporter(),\n\t\tresolver: {\n\t\t\tnodeModulesPaths: [\n\t\t\t\t...(defaultMetroConfig.resolver?.nodeModulesPaths ?? []),\n\t\t\t\tbableNodeModules,\n\t\t\t],\n\t\t},\n\t});\n\n\tawait runBuild(metroConfig, {\n\t\tdev: false,\n\t\tentry: `build/entrypoints/${platform}/index.js`,\n\t\tminify: false,\n\t\tplatform: platform,\n\t\tsourceMap: false,\n\t\tout: outputFile,\n\t});\n\n\tawait rename(\n\t\t`${outputFile}.js`,\n\t\tpath.join(root, \"build\", \"output\", platform, \"main_js_bundle.hbc\"),\n\t);\n\n\tconsole.log(` ✔︎ [${platform}] bundle created`);\n}\n\n// getSupportedAppViewTypes moved to valid-view-type.ts\n\nasync function makeEntrypoint(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n): Promise<string> {\n\tconst entrypoint = path.join(\n\t\troot,\n\t\t\"build\",\n\t\t\"entrypoints\",\n\t\tplatform,\n\t\t\"index.js\",\n\t);\n\n\tconst files = await getSupportedAppViewTypes(root);\n\n\tconst pascalCase = (str: string) =>\n\t\tstr\n\t\t\t.split(\"-\")\n\t\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t.join(\"\");\n\n\tconst imports = files.map(\n\t\t(file) =>\n\t\t\t`import { ${pascalCase(file)} } from \"../../../src/views/${file}\";`,\n\t);\n\tconst registry = files.map(\n\t\t(file) =>\n\t\t\t`AppRegistry.registerComponent(\"${pascalCase(file)}\", () => ${pascalCase(file)});`,\n\t);\n\n\tconst entrypointContent = `import { AppRegistry } from \"react-native\";\n${imports.join(\"\\n\")}\n\n${registry.join(\"\\n\")}\n`;\n\n\tconst entrypointDir = path.dirname(entrypoint);\n\tawait mkdir(entrypointDir, { recursive: true });\n\tawait writeFile(entrypoint, entrypointContent, \"utf-8\");\n\n\tconsole.log(` ✔︎ [${platform}] entrypoint created`);\n\n\treturn entrypoint;\n}\n\nexport async function createMobileBuild(\n\troot: string,\n\tplatform: \"ios\" | \"android\",\n) {\n\tconst viewTypes = await getSupportedAppViewTypes(root);\n\n\tconst fullDirectory = path.join(root, \"build\", \"output\", platform);\n\n\t// Check if the directory contains a file called `main_js_bundle.hbc`\n\tconst mainJsBundle = path.join(fullDirectory, \"main_js_bundle.hbc\");\n\n\tif (!existsSync(mainJsBundle)) {\n\t\tthrow new Error(`main_js_bundle.hbc not found in ${fullDirectory}`);\n\t}\n\n\t// check that that folder only contains the main_js_bundle.hbc file and an optional `assets` folder\n\tconst files = readdirSync(fullDirectory);\n\tif (\n\t\tfiles.length > 2 ||\n\t\tfiles.length < 1 ||\n\t\t!files.includes(\"main_js_bundle.hbc\")\n\t) {\n\t\tthrow new Error(\n\t\t\t\"Directory must contain only the main_js_bundle.hbc file and an optional `assets` folder\",\n\t\t);\n\t}\n\tif (files.length === 2 && !files.includes(\"assets\")) {\n\t\tthrow new Error(\n\t\t\t\"Directory must contain only the main_js_bundle.hbc file and an optional `assets` folder\",\n\t\t);\n\t}\n\n\t// Zip the directory\n\tconst zipData = await zipDirectory(fullDirectory);\n\n\tconst checksum = await getChecksum(zipData);\n\n\tconsole.log(` ✔︎ [${platform}] build zipped with checksum: ${checksum}`);\n\n\tconst fileName = `app_build_${platform}.zip`;\n\tconst uploadedFile = await uploadFile(zipData, fileName, \"application/zip\");\n\n\tconsole.log(\n\t\t` ✔︎ [${platform}] uploaded build: ${fileName} (${(zipData.length / 1024).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.apps.createAppBuild({\n\t\tattachment: { directUploadId: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tplatform,\n\t\tsupportedAppViewTypes: viewTypes.map(\n\t\t\t(view) =>\n\t\t\t\t({\n\t\t\t\t\t\"experience-view\": \"hub\" as const,\n\t\t\t\t\t\"discover-view\": \"discover\" as const,\n\t\t\t\t\t\"dashboard-view\": \"dashboard\" as const,\n\t\t\t\t})[view],\n\t\t),\n\t});\n\n\tif (!build) {\n\t\tthrow new Error(\"Failed to create app build\");\n\t}\n\n\tconst dashboardUrl = `https://whop.com/dashboard/${COMPANY_ID}/developer/apps/${APP_ID}/builds/?platform=${platform}`;\n\n\tconsole.log(`\\n ✔︎ [${platform}] deployed as development build ✔︎\n - build id: ${build.id}\n - view types: ${build.supportedAppViewTypes.join(\", \")}\n - promote to production here: ${dashboardUrl}\\n`);\n\n\treturn build;\n}\n\nasync function zipDirectory(\n\tdirectory: string,\n): Promise<Buffer<ArrayBufferLike>> {\n\tconst zip = new JSZip();\n\n\t// Recursively add files to zip\n\tfunction addFilesToZip(currentPath: string, relativePath = \"\") {\n\t\tconst items = readdirSync(currentPath);\n\n\t\tfor (const item of items) {\n\t\t\tconst fullPath = path.join(currentPath, item);\n\t\t\tconst zipPath = relativePath ? path.join(relativePath, item) : item;\n\t\t\tconst stats = statSync(fullPath);\n\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\taddFilesToZip(fullPath, zipPath);\n\t\t\t} else {\n\t\t\t\tconst fileContent = readFileSync(fullPath);\n\t\t\t\tzip.file(zipPath, fileContent);\n\t\t\t}\n\t\t}\n\t}\n\n\taddFilesToZip(directory);\n\n\t// Generate zip file\n\tconst zipData = await zip.generateAsync({ type: \"nodebuffer\" });\n\n\treturn zipData;\n}\n\nclass CustomReporter implements Reporter {\n\tupdate(event: ReportableEvent) {\n\t\t// Do nothing.\n\t}\n}\n","import { createHash } from \"node:crypto\";\nimport { AGENT_USER_ID, APP_ID, whopSdk } from \"./sdk\";\n\nexport async function uploadFile(\n\tdata: Buffer<ArrayBufferLike>,\n\tname: string,\n\tcontentType: string,\n) {\n\tconst file = new File([data], name, {\n\t\ttype: contentType,\n\t});\n\n\tconst uploadedFile = await whopSdk\n\t\t.withUser(AGENT_USER_ID)\n\t\t.attachments.uploadAttachment({\n\t\t\tfile,\n\t\t\trecord: \"app\",\n\t\t\tid: APP_ID,\n\t\t});\n\n\treturn uploadedFile;\n}\n\nexport async function getChecksum(data: Buffer<ArrayBufferLike>) {\n\tconst hash = createHash(\"sha256\");\n\thash.update(data);\n\treturn hash.digest(\"hex\");\n}\n","import { WhopServerSdk } from \"@whop/api\";\nimport { config } from \"dotenv\";\n\nconfig({\n\tpath: [\".env\", \".env.local\", \".env.development\", \".env.production\"],\n});\n\nexport function env(key: string) {\n\tconst value = process.env[key];\n\tif (!value) {\n\t\tthrow new Error(`Missing environment variable: ${key}`);\n\t}\n\treturn value;\n}\n\nexport const AGENT_USER_ID = env(\"NEXT_PUBLIC_WHOP_AGENT_USER_ID\");\nexport const COMPANY_ID = env(\"NEXT_PUBLIC_WHOP_COMPANY_ID\");\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\nexport const whopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n\tcompanyId: COMPANY_ID,\n\tonBehalfOfUserId: AGENT_USER_ID,\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"metro\";\n\nexport async function loadMetroConfig(projectRoot: string) {\n\tconst file = fs.existsSync(path.join(projectRoot, \"metro.config.js\"));\n\tif (!file) return {};\n\treturn await loadConfig({ cwd: projectRoot }, {});\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { APP_ID, COMPANY_ID, whopSdk } from \"./sdk\";\nimport { stripFlowWithBabel } from \"./strip-flow\";\nimport { getSupportedAppViewTypes } from \"./valid-view-type\";\n\nfunction aliasReactNativePlugin() {\n\treturn {\n\t\tname: \"alias-react-native\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\tb.onResolve({ filter: /^react-native$/ }, () => ({\n\t\t\t\tpath: require.resolve(\"react-native-web\"),\n\t\t\t}));\n\t\t},\n\t} satisfies import(\"esbuild\").Plugin;\n}\n\nfunction forceSingleReact() {\n\tconst map = new Map<string, string>([\n\t\t[\"react\", require.resolve(\"react\")],\n\t\t[\"react/jsx-runtime\", require.resolve(\"react/jsx-runtime\")],\n\t\t[\"react/jsx-dev-runtime\", require.resolve(\"react/jsx-dev-runtime\")],\n\t\t[\"react-dom\", require.resolve(\"react-dom\")],\n\t\t[\"react-dom/client\", require.resolve(\"react-dom/client\")],\n\t]);\n\n\tconst rx = /^(react(?:\\/jsx-(?:dev-)?runtime)?|react-dom(?:\\/client)?)$/;\n\n\treturn {\n\t\tname: \"force-single-react\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\tb.onResolve({ filter: rx }, (args) => ({ path: map.get(args.path)! }));\n\t\t},\n\t} satisfies import(\"esbuild\").Plugin;\n}\n\nfunction toPascalCase(str: string) {\n\treturn str\n\t\t.split(\"-\")\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t.join(\"\");\n}\n\nasync function makeWebEntrypoint(root: string) {\n\tconst files = await getSupportedAppViewTypes(root);\n\n\tconst packageJsonPath = path.join(root, \"package.json\");\n\tconst packageJson = JSON.parse(await readFile(packageJsonPath, \"utf-8\"));\n\tconst hasReactNativeReanimated =\n\t\tpackageJson.dependencies?.[\"react-native-reanimated\"];\n\n\tconst imports = files.map(\n\t\t(file) =>\n\t\t\t`import { ${toPascalCase(file)} } from \"../../../src/views/${file}\";`,\n\t);\n\tconst registry = files.map(\n\t\t(file) =>\n\t\t\t`AppRegistry.registerComponent(\"${toPascalCase(file)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(file)}\", ${toPascalCase(file)}));`,\n\t);\n\n\tconst defaultKey = toPascalCase(files[0] ?? \"experience-view\");\n\tconst reanimatedImport = hasReactNativeReanimated\n\t\t? `import \"react-native-reanimated\";`\n\t\t: \"\";\n\n\tconst entry = `import { AppRegistry } from \"react-native\";\nimport * as React from \"react\";\nimport { WhopNavigationWrapper } from \"@whop/react-native/web\";\n${reanimatedImport}\n\n${imports.join(\"\\n\")} \n\n${registry.join(\"\\n\")} \n\nconst viewType = new URLSearchParams(window.location.search).get(\"app_view\") ?? \"${defaultKey}\"; \n\nconst root = document.getElementById(\"root\") || (() => {\n\tconst d = document.createElement(\"div\");\n\td.id = \"root\";\n\tdocument.body.appendChild(d);\n\treturn d;\n})();\nAppRegistry.runApplication(viewType, { rootTag: root });\n`;\n\n\tconst entryFile = path.join(root, \"build\", \"entrypoints\", \"web\", \"index.tsx\");\n\tawait mkdir(path.dirname(entryFile), { recursive: true });\n\tawait writeFile(entryFile, entry, \"utf-8\");\n\n\treturn entryFile;\n}\n\nexport async function bundleWeb(root: string) {\n\tconst entry = await makeWebEntrypoint(root);\n\n\tconst outDir = path.join(root, \"build\", \"output\", \"web\");\n\tawait mkdir(outDir, { recursive: true });\n\n\tawait build({\n\t\tentryPoints: [entry],\n\t\toutfile: path.join(outDir, \"main.js\"),\n\t\tbundle: true,\n\t\tminify: false,\n\t\tformat: \"esm\",\n\t\tplatform: \"browser\",\n\t\tsourcemap: false,\n\t\tjsx: \"automatic\",\n\t\tmainFields: [\"browser\", \"module\", \"main\"],\n\t\tconditions: [\"browser\", \"import\", \"default\"],\n\t\tdefine: {\n\t\t\tprocess: \"{}\",\n\t\t\t\"process.env\": \"{}\",\n\t\t\t\"process.env.NODE_ENV\": '\"production\"',\n\t\t\t__DEV__: \"false\",\n\t\t\t\"process.env.NEXT_PUBLIC_WHOP_APP_ID\": `\"${APP_ID}\"`,\n\t\t\t// Some RN libraries (e.g., RNGH) expect a Node-like global in the browser\n\t\t\tglobal: \"globalThis\",\n\t\t},\n\t\tresolveExtensions: [\n\t\t\t\".web.tsx\",\n\t\t\t\".web.ts\",\n\t\t\t\".web.js\",\n\t\t\t\".tsx\",\n\t\t\t\".ts\",\n\t\t\t\".jsx\",\n\t\t\t\".js\",\n\t\t],\n\t\tloader: {\n\t\t\t\".png\": \"dataurl\",\n\t\t\t\".jpg\": \"dataurl\",\n\t\t\t\".jpeg\": \"dataurl\",\n\t\t\t\".svg\": \"dataurl\",\n\t\t\t\".ttf\": \"dataurl\",\n\t\t\t\".woff\": \"dataurl\",\n\t\t\t\".woff2\": \"dataurl\",\n\t\t\t\".js\": \"jsx\",\n\t\t\t\".jsx\": \"jsx\",\n\t\t},\n\t\tplugins: [\n\t\t\tforceSingleReact(),\n\t\t\taliasReactNativePlugin(),\n\t\t\treanimatedBabelPlugin(),\n\t\t\tstripFlowWithBabel(),\n\t\t\t{\n\t\t\t\tname: \"force-native-web-stub\",\n\t\t\t\tsetup(b) {\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\t\t\tb.onResolve({ filter: /^\\.\\/native-whop-core$/ }, (args: any) => {\n\t\t\t\t\t\t// Always resolve the local source file so extension resolution (.web.ts) applies\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tpath: path.join(args.resolveDir, \"native-whop-core\"),\n\t\t\t\t\t\t\tnamespace: \"file\",\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\n\tconst html = `<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t\t<title>Whop App (Web)</title>\n\t\t<style>\n\t\t\t#root {\n\t\t\t\twidth: 100vw;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: stretch;\n\t\t\t\tjustify-content: start;\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div id=\"root\"></div>\n\t\t<script type=\"module\" src=\"./main.js\"></script>\n\t</body>\n</html>`;\n\tawait writeFile(path.join(outDir, \"index.html\"), html, \"utf-8\");\n\n\tconsole.log(\" ✔︎ [web] bundle created at build/output/web/main.js\");\n}\n\nexport async function buildAndPublish(\n\troot: string,\n\t{\n\t\tshouldBuild = true,\n\t\tshouldUpload = true,\n\t}: { shouldBuild: boolean; shouldUpload: boolean } = {\n\t\tshouldBuild: true,\n\t\tshouldUpload: true,\n\t},\n) {\n\tif (shouldBuild) {\n\t\tawait bundleWeb(root);\n\t}\n\tif (shouldUpload) {\n\t\tawait createWebBuild(root);\n\t}\n}\n\nexport async function createWebBuild(root: string) {\n\tconst fullDirectory = path.join(root, \"build\", \"output\", \"web\");\n\tconst mainJsFile = path.join(fullDirectory, \"main.js\");\n\n\t// Verify bundle exists\n\ttry {\n\t\tawait readFile(mainJsFile);\n\t} catch {\n\t\tthrow new Error(`main.js not found in ${fullDirectory}`);\n\t}\n\n\tconst buf = await readFile(mainJsFile);\n\tconst checksum = await getChecksum(buf);\n\n\tconsole.log(` ✔︎ [web] build checksummed: ${checksum}`);\n\n\tconst fileName = `rnweb_${checksum}.js`;\n\tconst uploadedFile = await uploadFile(\n\t\tbuf,\n\t\tfileName,\n\t\t\"application/javascript\",\n\t);\n\n\tconsole.log(\n\t\t` ✔︎ [web] uploaded build: ${fileName} (${(buf.length / 1024).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.apps.createAppBuild({\n\t\tattachment: { directUploadId: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tplatform: \"web\",\n\t\tsupportedAppViewTypes: [\"hub\"],\n\t});\n\n\tif (!build) {\n\t\tthrow new Error(\"Failed to create app build\");\n\t}\n\n\tconst dashboardUrl = `https://whop.com/dashboard/${COMPANY_ID}/developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${build.id}\\n - view types: hub\\n - promote to production here: ${dashboardUrl}\\n`,\n\t);\n\n\treturn build;\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n// build/plugins/reanimatedBabel.ts\nimport * as babel from \"@babel/core\";\n\nconst JS_RE = /\\.(m|c)?(t|j)sx?$/;\n\nexport function reanimatedBabelPlugin() {\n\t// Transform only: your app source (outside node_modules) and reanimated itself.\n\tconst shouldTransform = (p: string) => {\n\t\tif (!JS_RE.test(p)) return false;\n\t\t// Always run on reanimated’s files\n\t\tif (p.includes(`${path.sep}react-native-reanimated${path.sep}`))\n\t\t\treturn true;\n\t\t// Never touch third-party deps\n\t\tif (p.includes(`${path.sep}node_modules${path.sep}`)) return false;\n\t\t// Run on app code under src/\n\t\treturn p.includes(`${path.sep}src${path.sep}`);\n\t};\n\n\treturn {\n\t\tname: \"reanimated-babel\",\n\t\tsetup(b: import(\"esbuild\").PluginBuild) {\n\t\t\tb.onLoad({ filter: JS_RE }, async (args) => {\n\t\t\t\tif (!shouldTransform(args.path)) {\n\t\t\t\t\t// Skip non-target files so other plugins (and esbuild) can process them\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst code = await fs.readFile(args.path, \"utf8\");\n\t\t\t\tconst result = await babel.transformAsync(code, {\n\t\t\t\t\tfilename: args.path,\n\t\t\t\t\tsourceMaps: false,\n\t\t\t\t\tbabelrc: false,\n\t\t\t\t\tconfigFile: false,\n\t\t\t\t\t// ORDER MATTERS: Reanimated plugin MUST BE LAST\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t// Needed by Reanimated on web per docs\n\t\t\t\t\t\t\"@babel/plugin-transform-export-namespace-from\",\n\t\t\t\t\t\t// Handle Flow types present in some RN libs\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"@babel/plugin-transform-flow-strip-types\",\n\t\t\t\t\t\t\t{ allowDeclareFields: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\t// MUST be last\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"react-native-reanimated/plugin\",\n\t\t\t\t\t\t\t{ relativeSourceLocation: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tpresets: [], // esbuild handles TS/JSX syntax; no preset-env/preset-react\n\t\t\t\t\tcaller: { name: \"esbuild\" },\n\t\t\t\t\t// Let Babel parse TS/JSX/Flow; keep it broad\n\t\t\t\t\tparserOpts: { plugins: [\"jsx\", \"typescript\"] },\n\t\t\t\t\tgeneratorOpts: { decoratorsBeforeExport: true },\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\t\t\tcontents: result!.code!,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\t\t\tloader: pickLoader(args.path) as any,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t};\n}\n\nfunction pickLoader(file: string) {\n\tconst ext = path.extname(file).toLowerCase();\n\tif (ext === \".tsx\") return \"tsx\";\n\tif (ext === \".ts\") return \"ts\";\n\tif (ext === \".jsx\") return \"jsx\";\n\t// For .js: many RN libs contain JSX; be permissive\n\treturn \"jsx\";\n}\n","import * as fs from \"node:fs/promises\";\n// stripFlowWithBabel.ts\nimport * as babel from \"@babel/core\";\n\nexport function stripFlowWithBabel() {\n\tconst filter = /\\.(m|c)?jsx?$/;\n\treturn {\n\t\tname: \"strip-flow-with-babel\",\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tsetup(b: any) {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\t\tb.onLoad({ filter }, async (args: any) => {\n\t\t\t\tconst code = await fs.readFile(args.path, \"utf8\");\n\t\t\t\tconst out = await babel.transformAsync(code, {\n\t\t\t\t\tfilename: args.path,\n\t\t\t\t\tbabelrc: false,\n\t\t\t\t\tconfigFile: false,\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"@babel/plugin-transform-flow-strip-types\",\n\t\t\t\t\t\t\t{ allowDeclareFields: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tparserOpts: { plugins: [\"jsx\", \"flow\"] },\n\t\t\t\t\tsourceMaps: false,\n\t\t\t\t});\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\t\treturn { contents: out!.code!, loader: \"jsx\" };\n\t\t\t});\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_find_up","import_node_fs","import_promises","import_node_path","import_metro","fs","path","import_node_path","path","path","build","JSZip","import_promises","import_node_path","fs","path","fs","babel","path","buildAndPublish","build","buildAndPublish","path","qrcode"]}