@whop/react-native 0.1.3 → 0.1.5

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
@@ -59,6 +59,7 @@ function env(key) {
59
59
  }
60
60
  var COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;
61
61
  var APP_ID = env("NEXT_PUBLIC_WHOP_APP_ID");
62
+ var AI_PROMPT_ID = process.env.AI_PROMPT_ID;
62
63
  var oldWhopSdk = (0, import_api.WhopServerSdk)({
63
64
  appApiKey: env("WHOP_API_KEY"),
64
65
  appId: APP_ID
@@ -243,6 +244,7 @@ async function createMobileBuild(root, platform) {
243
244
  checksum,
244
245
  app_id: APP_ID,
245
246
  platform,
247
+ ai_prompt_id: AI_PROMPT_ID,
246
248
  supported_app_view_types: viewTypes.map(
247
249
  (view) => ({
248
250
  "experience-view": "hub",
@@ -362,6 +364,7 @@ function pickLoader(file) {
362
364
 
363
365
  // src/cli/strip-flow.ts
364
366
  var fs3 = __toESM(require("fs/promises"));
367
+ var path5 = __toESM(require("path"));
365
368
  var babel2 = __toESM(require("@babel/core"));
366
369
  function stripFlowWithBabel() {
367
370
  const filter = /\.(m|c)?jsx?$/;
@@ -370,18 +373,22 @@ function stripFlowWithBabel() {
370
373
  // biome-ignore lint/suspicious/noExplicitAny: <explanation>
371
374
  setup(b) {
372
375
  b.onLoad({ filter }, async (args) => {
376
+ if (!args.path.includes(`${path5.sep}react-native${path5.sep}`)) {
377
+ return null;
378
+ }
373
379
  const code = await fs3.readFile(args.path, "utf8");
374
380
  const out = await babel2.transformAsync(code, {
375
381
  filename: args.path,
376
382
  babelrc: false,
377
383
  configFile: false,
378
384
  plugins: [
385
+ // Use Hermes parser to handle modern Flow syntax (as casts, type predicates, mapped types, etc.)
386
+ "babel-plugin-syntax-hermes-parser",
379
387
  [
380
388
  "@babel/plugin-transform-flow-strip-types",
381
389
  { allowDeclareFields: true }
382
390
  ]
383
391
  ],
384
- parserOpts: { plugins: ["jsx", "flow"] },
385
392
  sourceMaps: false
386
393
  });
387
394
  return { contents: out.code, loader: "jsx" };
@@ -593,6 +600,7 @@ async function createWebBuild(root) {
593
600
  checksum,
594
601
  app_id: APP_ID,
595
602
  platform: "web",
603
+ ai_prompt_id: AI_PROMPT_ID,
596
604
  supported_app_view_types: viewTypes.map(
597
605
  (view) => ({
598
606
  "experience-view": "hub",
@@ -1 +1 @@
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(\n\t\t\t\tfile,\n\t\t\t)});`,\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} (${(\n\t\t\tzipData.length / 1024\n\t\t).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}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.supported_app_view_types.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 { APP_ID, oldWhopSdk } 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 oldWhopSdk.attachments.uploadAttachment({\n\t\tfile,\n\t\trecord: \"app\",\n\t\tid: APP_ID,\n\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 Whop from \"@whop/sdk\";\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 COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\nexport const oldWhopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n});\n\nexport const whopSdk = new Whop({ appID: APP_ID });\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(\n\t\t\t\tfile,\n\t\t\t)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(\n\t\t\t\tfile,\n\t\t\t)}\", ${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 viewTypes = await getSupportedAppViewTypes(root);\n\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(\n\t\t\t0,\n\t\t)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform: \"web\",\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${\n\t\t\tbuild.id\n\t\t}\\n - view types: ${build.supported_app_view_types.join(\n\t\t\t\", \",\n\t\t)}\\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","Whop","fs","path","import_node_path","path","path","build","JSZip","import_promises","import_node_path","fs","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 { AI_PROMPT_ID, 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(\n\t\t\t\tfile,\n\t\t\t)});`,\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} (${(\n\t\t\tzipData.length / 1024\n\t\t).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform,\n\t\tai_prompt_id: AI_PROMPT_ID,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}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.supported_app_view_types.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 { APP_ID, oldWhopSdk } 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 oldWhopSdk.attachments.uploadAttachment({\n\t\tfile,\n\t\trecord: \"app\",\n\t\tid: APP_ID,\n\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 Whop from \"@whop/sdk\";\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 COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\nexport const AI_PROMPT_ID = process.env.AI_PROMPT_ID;\n\nexport const oldWhopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n});\n\nexport const whopSdk = new Whop({ appID: APP_ID });\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 { AI_PROMPT_ID, 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(\n\t\t\t\tfile,\n\t\t\t)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(\n\t\t\t\tfile,\n\t\t\t)}\", ${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 viewTypes = await getSupportedAppViewTypes(root);\n\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(\n\t\t\t0,\n\t\t)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform: \"web\",\n\t\tai_prompt_id: AI_PROMPT_ID,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${\n\t\t\tbuild.id\n\t\t}\\n - view types: ${build.supported_app_view_types.join(\n\t\t\t\", \",\n\t\t)}\\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\";\nimport * as path from \"node:path\";\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\t// Only process react-native core files that contain Flow\n\t\t\t\tif (!args.path.includes(`${path.sep}react-native${path.sep}`)) {\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 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// Use Hermes parser to handle modern Flow syntax (as casts, type predicates, mapped types, etc.)\n\t\t\t\t\t\t\"babel-plugin-syntax-hermes-parser\",\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\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","Whop","fs","path","import_node_path","path","path","build","JSZip","import_promises","import_node_path","fs","path","fs","path","babel","path","buildAndPublish","build","buildAndPublish","path","qrcode"]}
@@ -5,7 +5,7 @@ import {
5
5
 
6
6
  // src/cli/index.ts
7
7
  import { existsSync as existsSync2 } from "fs";
8
- import path6 from "path";
8
+ import path7 from "path";
9
9
  import { parseArgs } from "util";
10
10
  import { findUp as findUp2 } from "find-up";
11
11
  import qrcode from "qrcode-terminal";
@@ -39,6 +39,7 @@ function env(key) {
39
39
  }
40
40
  var COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;
41
41
  var APP_ID = env("NEXT_PUBLIC_WHOP_APP_ID");
42
+ var AI_PROMPT_ID = process.env.AI_PROMPT_ID;
42
43
  var oldWhopSdk = WhopServerSdk({
43
44
  appApiKey: env("WHOP_API_KEY"),
44
45
  appId: APP_ID
@@ -225,6 +226,7 @@ async function createMobileBuild(root, platform) {
225
226
  checksum,
226
227
  app_id: APP_ID,
227
228
  platform,
229
+ ai_prompt_id: AI_PROMPT_ID,
228
230
  supported_app_view_types: viewTypes.map(
229
231
  (view) => ({
230
232
  "experience-view": "hub",
@@ -273,7 +275,7 @@ var CustomReporter = class {
273
275
 
274
276
  // src/cli/web.ts
275
277
  import { mkdir as mkdir2, readFile as readFile3, writeFile as writeFile2 } from "fs/promises";
276
- import path5 from "path";
278
+ import path6 from "path";
277
279
  import { build } from "esbuild";
278
280
 
279
281
  // src/cli/reanimated-bable.ts
@@ -344,6 +346,7 @@ function pickLoader(file) {
344
346
 
345
347
  // src/cli/strip-flow.ts
346
348
  import * as fs3 from "fs/promises";
349
+ import * as path5 from "path";
347
350
  import * as babel2 from "@babel/core";
348
351
  function stripFlowWithBabel() {
349
352
  const filter = /\.(m|c)?jsx?$/;
@@ -352,18 +355,22 @@ function stripFlowWithBabel() {
352
355
  // biome-ignore lint/suspicious/noExplicitAny: <explanation>
353
356
  setup(b) {
354
357
  b.onLoad({ filter }, async (args) => {
358
+ if (!args.path.includes(`${path5.sep}react-native${path5.sep}`)) {
359
+ return null;
360
+ }
355
361
  const code = await fs3.readFile(args.path, "utf8");
356
362
  const out = await babel2.transformAsync(code, {
357
363
  filename: args.path,
358
364
  babelrc: false,
359
365
  configFile: false,
360
366
  plugins: [
367
+ // Use Hermes parser to handle modern Flow syntax (as casts, type predicates, mapped types, etc.)
368
+ "babel-plugin-syntax-hermes-parser",
361
369
  [
362
370
  "@babel/plugin-transform-flow-strip-types",
363
371
  { allowDeclareFields: true }
364
372
  ]
365
373
  ],
366
- parserOpts: { plugins: ["jsx", "flow"] },
367
374
  sourceMaps: false
368
375
  });
369
376
  return { contents: out.code, loader: "jsx" };
@@ -404,7 +411,7 @@ function toPascalCase(str) {
404
411
  }
405
412
  async function makeWebEntrypoint(root) {
406
413
  const files = await getSupportedAppViewTypes(root);
407
- const packageJsonPath = path5.join(root, "package.json");
414
+ const packageJsonPath = path6.join(root, "package.json");
408
415
  const packageJson = JSON.parse(await readFile3(packageJsonPath, "utf-8"));
409
416
  const hasReactNativeReanimated = packageJson.dependencies?.["react-native-reanimated"];
410
417
  const imports = files.map(
@@ -438,18 +445,18 @@ const root = document.getElementById("root") || (() => {
438
445
  })();
439
446
  AppRegistry.runApplication(viewType, { rootTag: root });
440
447
  `;
441
- const entryFile = path5.join(root, "build", "entrypoints", "web", "index.tsx");
442
- await mkdir2(path5.dirname(entryFile), { recursive: true });
448
+ const entryFile = path6.join(root, "build", "entrypoints", "web", "index.tsx");
449
+ await mkdir2(path6.dirname(entryFile), { recursive: true });
443
450
  await writeFile2(entryFile, entry, "utf-8");
444
451
  return entryFile;
445
452
  }
446
453
  async function bundleWeb(root) {
447
454
  const entry = await makeWebEntrypoint(root);
448
- const outDir = path5.join(root, "build", "output", "web");
455
+ const outDir = path6.join(root, "build", "output", "web");
449
456
  await mkdir2(outDir, { recursive: true });
450
457
  await build({
451
458
  entryPoints: [entry],
452
- outfile: path5.join(outDir, "main.js"),
459
+ outfile: path6.join(outDir, "main.js"),
453
460
  bundle: true,
454
461
  minify: false,
455
462
  format: "esm",
@@ -497,7 +504,7 @@ async function bundleWeb(root) {
497
504
  setup(b) {
498
505
  b.onResolve({ filter: /^\.\/native-whop-core$/ }, (args) => {
499
506
  return {
500
- path: path5.join(args.resolveDir, "native-whop-core"),
507
+ path: path6.join(args.resolveDir, "native-whop-core"),
501
508
  namespace: "file"
502
509
  };
503
510
  });
@@ -530,7 +537,7 @@ async function bundleWeb(root) {
530
537
  <script type="module" src="./main.js"></script>
531
538
  </body>
532
539
  </html>`;
533
- await writeFile2(path5.join(outDir, "index.html"), html, "utf-8");
540
+ await writeFile2(path6.join(outDir, "index.html"), html, "utf-8");
534
541
  console.log(" \u2714\uFE0E [web] bundle created at build/output/web/main.js");
535
542
  }
536
543
  async function buildAndPublish2(root, {
@@ -549,8 +556,8 @@ async function buildAndPublish2(root, {
549
556
  }
550
557
  async function createWebBuild(root) {
551
558
  const viewTypes = await getSupportedAppViewTypes(root);
552
- const fullDirectory = path5.join(root, "build", "output", "web");
553
- const mainJsFile = path5.join(fullDirectory, "main.js");
559
+ const fullDirectory = path6.join(root, "build", "output", "web");
560
+ const mainJsFile = path6.join(fullDirectory, "main.js");
554
561
  try {
555
562
  await readFile3(mainJsFile);
556
563
  } catch {
@@ -575,6 +582,7 @@ async function createWebBuild(root) {
575
582
  checksum,
576
583
  app_id: APP_ID,
577
584
  platform: "web",
585
+ ai_prompt_id: AI_PROMPT_ID,
578
586
  supported_app_view_types: viewTypes.map(
579
587
  (view) => ({
580
588
  "experience-view": "hub",
@@ -667,7 +675,7 @@ async function main() {
667
675
  await Promise.all(promises);
668
676
  }
669
677
  async function cleanBuildDirectory(root) {
670
- const buildDirectory = path6.join(root, "build");
678
+ const buildDirectory = path7.join(root, "build");
671
679
  if (existsSync2(buildDirectory)) {
672
680
  await rimraf(buildDirectory);
673
681
  }
@@ -680,7 +688,7 @@ async function getRootProjectDirectory() {
680
688
  "please run this command inside a whop react native project"
681
689
  );
682
690
  }
683
- const root = path6.dirname(file);
691
+ const root = path7.dirname(file);
684
692
  return root;
685
693
  }
686
694
  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/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(\n\t\t\t\tfile,\n\t\t\t)});`,\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} (${(\n\t\t\tzipData.length / 1024\n\t\t).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}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.supported_app_view_types.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 { APP_ID, oldWhopSdk } 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 oldWhopSdk.attachments.uploadAttachment({\n\t\tfile,\n\t\trecord: \"app\",\n\t\tid: APP_ID,\n\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 Whop from \"@whop/sdk\";\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 COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\n\nexport const oldWhopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n});\n\nexport const whopSdk = new Whop({ appID: APP_ID });\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(\n\t\t\t\tfile,\n\t\t\t)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(\n\t\t\t\tfile,\n\t\t\t)}\", ${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 viewTypes = await getSupportedAppViewTypes(root);\n\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(\n\t\t\t0,\n\t\t)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform: \"web\",\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${\n\t\t\tbuild.id\n\t\t}\\n - view types: ${build.supported_app_view_types.join(\n\t\t\t\", \",\n\t\t)}\\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":["existsSync","path","findUp","path","path","path","build","mkdir","readFile","writeFile","path","fs","path","fs","babel","path","readFile","mkdir","writeFile","buildAndPublish","build","buildAndPublish","path","existsSync","findUp"]}
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 { AI_PROMPT_ID, 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(\n\t\t\t\tfile,\n\t\t\t)});`,\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} (${(\n\t\t\tzipData.length / 1024\n\t\t).toFixed(0)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform,\n\t\tai_prompt_id: AI_PROMPT_ID,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}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.supported_app_view_types.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 { APP_ID, oldWhopSdk } 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 oldWhopSdk.attachments.uploadAttachment({\n\t\tfile,\n\t\trecord: \"app\",\n\t\tid: APP_ID,\n\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 Whop from \"@whop/sdk\";\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 COMPANY_ID = process.env.NEXT_PUBLIC_WHOP_COMPANY_ID;\nexport const APP_ID = env(\"NEXT_PUBLIC_WHOP_APP_ID\");\nexport const AI_PROMPT_ID = process.env.AI_PROMPT_ID;\n\nexport const oldWhopSdk: WhopServerSdk = WhopServerSdk({\n\tappApiKey: env(\"WHOP_API_KEY\"),\n\tappId: APP_ID,\n});\n\nexport const whopSdk = new Whop({ appID: APP_ID });\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 { AI_PROMPT_ID, 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(\n\t\t\t\tfile,\n\t\t\t)}\", () => WhopNavigationWrapper(React, \"${toPascalCase(\n\t\t\t\tfile,\n\t\t\t)}\", ${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 viewTypes = await getSupportedAppViewTypes(root);\n\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(\n\t\t\t0,\n\t\t)} KB)`,\n\t);\n\n\tconst build = await whopSdk.appBuilds.create({\n\t\tattachment: { direct_upload_id: uploadedFile.directUploadId },\n\t\tchecksum,\n\t\tapp_id: APP_ID,\n\t\tplatform: \"web\",\n\t\tai_prompt_id: AI_PROMPT_ID,\n\t\tsupported_app_view_types: 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 companyPart = COMPANY_ID ? `${COMPANY_ID}/` : \"\";\n\tconst dashboardUrl = `https://whop.com/dashboard/${companyPart}developer/apps/${APP_ID}/builds/?platform=web`;\n\n\tconsole.log(\n\t\t`\\n ✔︎ [web] deployed as development build ✔︎\\n - build id: ${\n\t\t\tbuild.id\n\t\t}\\n - view types: ${build.supported_app_view_types.join(\n\t\t\t\", \",\n\t\t)}\\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\";\nimport * as path from \"node:path\";\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\t// Only process react-native core files that contain Flow\n\t\t\t\tif (!args.path.includes(`${path.sep}react-native${path.sep}`)) {\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 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// Use Hermes parser to handle modern Flow syntax (as casts, type predicates, mapped types, etc.)\n\t\t\t\t\t\t\"babel-plugin-syntax-hermes-parser\",\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\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":["existsSync","path","findUp","path","path","path","build","mkdir","readFile","writeFile","path","fs","path","fs","path","babel","path","readFile","mkdir","writeFile","buildAndPublish","build","buildAndPublish","path","existsSync","findUp"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@whop/react-native",
3
3
  "description": "React Native SDK for building embedded apps on Whop",
4
- "version": "0.1.3",
4
+ "version": "0.1.5",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/whopio/whop-sdk-ts",
@@ -45,7 +45,7 @@
45
45
  "@babel/runtime": "7.27.6",
46
46
  "@react-native/babel-preset": "0.80.1",
47
47
  "@react-native/metro-config": "0.80.1",
48
- "@whop/sdk": "0.0.8",
48
+ "@whop/sdk": "0.0.11",
49
49
  "dotenv": "16.5.0",
50
50
  "esbuild": "0.25.9",
51
51
  "events": "3.3.0",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "engines": {
73
73
  "node": "22.x",
74
- "pnpm": "9.15.9"
74
+ "pnpm": "10.23.0"
75
75
  },
76
76
  "publishConfig": {
77
77
  "access": "public"