@whop/react-native 0.1.8 → 0.1.10
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 +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +4 -2
- package/dist/cli/index.mjs.map +1 -1
- package/dist/lib/index.js +60 -11
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +60 -11
- package/dist/lib/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/cli/index.js
CHANGED
|
@@ -525,7 +525,8 @@ async function bundleWeb(root) {
|
|
|
525
525
|
".tsx",
|
|
526
526
|
".ts",
|
|
527
527
|
".jsx",
|
|
528
|
-
".js"
|
|
528
|
+
".js",
|
|
529
|
+
".mjs"
|
|
529
530
|
],
|
|
530
531
|
loader: {
|
|
531
532
|
".png": "dataurl",
|
|
@@ -536,7 +537,8 @@ async function bundleWeb(root) {
|
|
|
536
537
|
".woff": "dataurl",
|
|
537
538
|
".woff2": "dataurl",
|
|
538
539
|
".js": "jsx",
|
|
539
|
-
".jsx": "jsx"
|
|
540
|
+
".jsx": "jsx",
|
|
541
|
+
".mjs": "jsx"
|
|
540
542
|
},
|
|
541
543
|
plugins: [
|
|
542
544
|
forceSingleReact(),
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/env-bool.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 { envBool } from \"./env-bool\";\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\tif (envBool(\"WRN_FULL_CLEAN\")) {\n\t\t\tawait cleanBuildDirectory(root);\n\t\t} else {\n\t\t\tawait cleanEntrypointsDirectory(root);\n\t\t}\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 cleanEntrypointsDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\", \"entrypoints\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build entrypoints 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","/**\n * Check if an environment variable is set to a truthy value.\n * Accepts: \"1\", \"true\", \"yes\" (case-insensitive)\n */\nexport function envBool(name: string): boolean {\n\tconst value = process.env[name]?.toLowerCase();\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\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 { envBool } from \"./env-bool\";\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\tconst cacheDir =\n\t\tprocess.env.WRN_METRO_CACHE_DIRECTORY || path.join(root, \"build\", \"cache\");\n\tconst isCacheDisabled = envBool(\"WRN_DISABLE_METRO_CACHE\");\n\tconst remoteCacheUrl = process.env.WRN_REMOTE_METRO_CACHE_URL;\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: ({ FileStore, HttpStore }) => {\n\t\t\tif (isCacheDisabled) return [];\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: types are cooked here\n\t\t\tconst caches: any[] = [\n\t\t\t\tnew FileStore({\n\t\t\t\t\troot: cacheDir,\n\t\t\t\t}),\n\t\t\t];\n\t\t\tif (remoteCacheUrl) {\n\t\t\t\tcaches.push(new HttpStore({ endpoint: remoteCacheUrl }));\n\t\t\t}\n\t\t\treturn caches;\n\t\t},\n\t\tcacheVersion: process.env.WRN_METRO_CACHE_VERSION,\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\nconst BASE_URL = process.env.WHOP_BASE_URL;\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\tapiOrigin: BASE_URL ? new URL(BASE_URL).origin : undefined,\n});\n\nexport const whopSdk = new Whop({\n\tappID: APP_ID,\n\tbaseURL: BASE_URL ? new URL(\"/api/v1\", BASE_URL).href : undefined,\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"metro\";\n\nexport async function loadMetroConfig(projectRoot: string) {\n\tconst file = fs.existsSync(path.join(projectRoot, \"metro.config.js\"));\n\tif (!file) return {};\n\treturn await loadConfig({ cwd: projectRoot }, {});\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/env-bool.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 { envBool } from \"./env-bool\";\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\tif (envBool(\"WRN_FULL_CLEAN\")) {\n\t\t\tawait cleanBuildDirectory(root);\n\t\t} else {\n\t\t\tawait cleanEntrypointsDirectory(root);\n\t\t}\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 cleanEntrypointsDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\", \"entrypoints\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build entrypoints 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","/**\n * Check if an environment variable is set to a truthy value.\n * Accepts: \"1\", \"true\", \"yes\" (case-insensitive)\n */\nexport function envBool(name: string): boolean {\n\tconst value = process.env[name]?.toLowerCase();\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\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 { envBool } from \"./env-bool\";\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\tconst cacheDir =\n\t\tprocess.env.WRN_METRO_CACHE_DIRECTORY || path.join(root, \"build\", \"cache\");\n\tconst isCacheDisabled = envBool(\"WRN_DISABLE_METRO_CACHE\");\n\tconst remoteCacheUrl = process.env.WRN_REMOTE_METRO_CACHE_URL;\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: ({ FileStore, HttpStore }) => {\n\t\t\tif (isCacheDisabled) return [];\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: types are cooked here\n\t\t\tconst caches: any[] = [\n\t\t\t\tnew FileStore({\n\t\t\t\t\troot: cacheDir,\n\t\t\t\t}),\n\t\t\t];\n\t\t\tif (remoteCacheUrl) {\n\t\t\t\tcaches.push(new HttpStore({ endpoint: remoteCacheUrl }));\n\t\t\t}\n\t\t\treturn caches;\n\t\t},\n\t\tcacheVersion: process.env.WRN_METRO_CACHE_VERSION,\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\nconst BASE_URL = process.env.WHOP_BASE_URL;\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\tapiOrigin: BASE_URL ? new URL(BASE_URL).origin : undefined,\n});\n\nexport const whopSdk = new Whop({\n\tappID: APP_ID,\n\tbaseURL: BASE_URL ? new URL(\"/api/v1\", BASE_URL).href : undefined,\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"metro\";\n\nexport async function loadMetroConfig(projectRoot: string) {\n\tconst file = fs.existsSync(path.join(projectRoot, \"metro.config.js\"));\n\tif (!file) return {};\n\treturn await loadConfig({ cwd: projectRoot }, {});\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { 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\t\".mjs\",\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\t\".mjs\": \"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"]}
|
package/dist/cli/index.mjs
CHANGED
|
@@ -507,7 +507,8 @@ async function bundleWeb(root) {
|
|
|
507
507
|
".tsx",
|
|
508
508
|
".ts",
|
|
509
509
|
".jsx",
|
|
510
|
-
".js"
|
|
510
|
+
".js",
|
|
511
|
+
".mjs"
|
|
511
512
|
],
|
|
512
513
|
loader: {
|
|
513
514
|
".png": "dataurl",
|
|
@@ -518,7 +519,8 @@ async function bundleWeb(root) {
|
|
|
518
519
|
".woff": "dataurl",
|
|
519
520
|
".woff2": "dataurl",
|
|
520
521
|
".js": "jsx",
|
|
521
|
-
".jsx": "jsx"
|
|
522
|
+
".jsx": "jsx",
|
|
523
|
+
".mjs": "jsx"
|
|
522
524
|
},
|
|
523
525
|
plugins: [
|
|
524
526
|
forceSingleReact(),
|
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/env-bool.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 { envBool } from \"./env-bool\";\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\tif (envBool(\"WRN_FULL_CLEAN\")) {\n\t\t\tawait cleanBuildDirectory(root);\n\t\t} else {\n\t\t\tawait cleanEntrypointsDirectory(root);\n\t\t}\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 cleanEntrypointsDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\", \"entrypoints\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build entrypoints 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","/**\n * Check if an environment variable is set to a truthy value.\n * Accepts: \"1\", \"true\", \"yes\" (case-insensitive)\n */\nexport function envBool(name: string): boolean {\n\tconst value = process.env[name]?.toLowerCase();\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\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 { envBool } from \"./env-bool\";\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\tconst cacheDir =\n\t\tprocess.env.WRN_METRO_CACHE_DIRECTORY || path.join(root, \"build\", \"cache\");\n\tconst isCacheDisabled = envBool(\"WRN_DISABLE_METRO_CACHE\");\n\tconst remoteCacheUrl = process.env.WRN_REMOTE_METRO_CACHE_URL;\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: ({ FileStore, HttpStore }) => {\n\t\t\tif (isCacheDisabled) return [];\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: types are cooked here\n\t\t\tconst caches: any[] = [\n\t\t\t\tnew FileStore({\n\t\t\t\t\troot: cacheDir,\n\t\t\t\t}),\n\t\t\t];\n\t\t\tif (remoteCacheUrl) {\n\t\t\t\tcaches.push(new HttpStore({ endpoint: remoteCacheUrl }));\n\t\t\t}\n\t\t\treturn caches;\n\t\t},\n\t\tcacheVersion: process.env.WRN_METRO_CACHE_VERSION,\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\nconst BASE_URL = process.env.WHOP_BASE_URL;\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\tapiOrigin: BASE_URL ? new URL(BASE_URL).origin : undefined,\n});\n\nexport const whopSdk = new Whop({\n\tappID: APP_ID,\n\tbaseURL: BASE_URL ? new URL(\"/api/v1\", BASE_URL).href : undefined,\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"metro\";\n\nexport async function loadMetroConfig(projectRoot: string) {\n\tconst file = fs.existsSync(path.join(projectRoot, \"metro.config.js\"));\n\tif (!file) return {};\n\treturn await loadConfig({ cwd: projectRoot }, {});\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/env-bool.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 { envBool } from \"./env-bool\";\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\tif (envBool(\"WRN_FULL_CLEAN\")) {\n\t\t\tawait cleanBuildDirectory(root);\n\t\t} else {\n\t\t\tawait cleanEntrypointsDirectory(root);\n\t\t}\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 cleanEntrypointsDirectory(root: string) {\n\tconst buildDirectory = path.join(root, \"build\", \"entrypoints\");\n\tif (existsSync(buildDirectory)) {\n\t\tawait rimraf(buildDirectory);\n\t}\n\tconsole.log(\" ✔︎ cleaned build entrypoints 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","/**\n * Check if an environment variable is set to a truthy value.\n * Accepts: \"1\", \"true\", \"yes\" (case-insensitive)\n */\nexport function envBool(name: string): boolean {\n\tconst value = process.env[name]?.toLowerCase();\n\treturn value === \"1\" || value === \"true\" || value === \"yes\";\n}\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 { envBool } from \"./env-bool\";\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\tconst cacheDir =\n\t\tprocess.env.WRN_METRO_CACHE_DIRECTORY || path.join(root, \"build\", \"cache\");\n\tconst isCacheDisabled = envBool(\"WRN_DISABLE_METRO_CACHE\");\n\tconst remoteCacheUrl = process.env.WRN_REMOTE_METRO_CACHE_URL;\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: ({ FileStore, HttpStore }) => {\n\t\t\tif (isCacheDisabled) return [];\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: types are cooked here\n\t\t\tconst caches: any[] = [\n\t\t\t\tnew FileStore({\n\t\t\t\t\troot: cacheDir,\n\t\t\t\t}),\n\t\t\t];\n\t\t\tif (remoteCacheUrl) {\n\t\t\t\tcaches.push(new HttpStore({ endpoint: remoteCacheUrl }));\n\t\t\t}\n\t\t\treturn caches;\n\t\t},\n\t\tcacheVersion: process.env.WRN_METRO_CACHE_VERSION,\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\nconst BASE_URL = process.env.WHOP_BASE_URL;\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\tapiOrigin: BASE_URL ? new URL(BASE_URL).origin : undefined,\n});\n\nexport const whopSdk = new Whop({\n\tappID: APP_ID,\n\tbaseURL: BASE_URL ? new URL(\"/api/v1\", BASE_URL).href : undefined,\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { loadConfig } from \"metro\";\n\nexport async function loadMetroConfig(projectRoot: string) {\n\tconst file = fs.existsSync(path.join(projectRoot, \"metro.config.js\"));\n\tif (!file) return {};\n\treturn await loadConfig({ cwd: projectRoot }, {});\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const VALID_VIEW_TYPES = [\n\t\"experience-view\",\n\t\"discover-view\",\n\t\"dashboard-view\",\n] as const;\n\nexport async function getSupportedAppViewTypes(\n\troot: string,\n): Promise<(typeof VALID_VIEW_TYPES)[number][]> {\n\tconst views = await readdir(path.join(root, \"src\", \"views\"), {\n\t\twithFileTypes: true,\n\t\trecursive: false,\n\t});\n\tconst files = views\n\t\t.filter((file) => file.isFile())\n\t\t.map((file) => file.name.split(\".\")[0])\n\t\t.filter((file) => !!file);\n\n\tconst validViews = files.filter((file) =>\n\t\tVALID_VIEW_TYPES.includes(file as (typeof VALID_VIEW_TYPES)[number]),\n\t) as (typeof VALID_VIEW_TYPES)[number][];\n\n\tif (validViews.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No valid views found, please create a view in the src/views folder and name it with a valid view type: ${VALID_VIEW_TYPES.join(\", \")}`,\n\t\t);\n\t}\n\n\treturn validViews;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { build } from \"esbuild\";\nimport { getChecksum, uploadFile } from \"./file\";\nimport { reanimatedBabelPlugin } from \"./reanimated-bable\";\nimport { 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\t\".mjs\",\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\t\".mjs\": \"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/dist/lib/index.js
CHANGED
|
@@ -75,25 +75,39 @@ var WhopCoreObservable = class {
|
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
77
|
var WhopCoreNavigation = class {
|
|
78
|
-
path = new WhopCoreObservable(
|
|
78
|
+
path = new WhopCoreObservable({
|
|
79
|
+
stack: [],
|
|
80
|
+
currentIndex: 0
|
|
81
|
+
});
|
|
79
82
|
sheet = new WhopCoreObservable(null);
|
|
80
83
|
constructor() {
|
|
81
84
|
this.getFullStack = this.getFullStack.bind(this);
|
|
82
85
|
this.getCurrentSheet = this.getCurrentSheet.bind(this);
|
|
83
86
|
this.subscribeToPath = this.subscribeToPath.bind(this);
|
|
84
87
|
this.subscribeToSheet = this.subscribeToSheet.bind(this);
|
|
88
|
+
this.path.subscribe((value) => {
|
|
89
|
+
loadIframeSdk().then(
|
|
90
|
+
(sdk) => sdk.onNavigationStackChange({
|
|
91
|
+
stack: value.stack,
|
|
92
|
+
currentIndex: value.currentIndex
|
|
93
|
+
})
|
|
94
|
+
).catch(() => {
|
|
95
|
+
});
|
|
96
|
+
});
|
|
85
97
|
}
|
|
86
98
|
push(route) {
|
|
87
99
|
if (this.getCurrent().path.join("/") === route.path.join("/")) {
|
|
88
100
|
return;
|
|
89
101
|
}
|
|
90
|
-
this.path.
|
|
102
|
+
const { stack } = this.path.getValue();
|
|
103
|
+
const newStack = [...stack, route];
|
|
104
|
+
this.path.setValue({ stack: newStack, currentIndex: newStack.length - 1 });
|
|
91
105
|
if (typeof window !== "undefined" && window.history) {
|
|
92
106
|
try {
|
|
93
107
|
const pathBits = route.path.join("/");
|
|
94
108
|
const paramsBits = Object.entries(route.params).map(([key, value]) => `${key}=${value}`).join("&");
|
|
95
109
|
window.history.pushState(
|
|
96
|
-
{ route, index:
|
|
110
|
+
{ route, index: newStack.length },
|
|
97
111
|
"",
|
|
98
112
|
`#${pathBits}?${paramsBits}`
|
|
99
113
|
);
|
|
@@ -102,18 +116,26 @@ var WhopCoreNavigation = class {
|
|
|
102
116
|
}
|
|
103
117
|
}
|
|
104
118
|
pop() {
|
|
119
|
+
if (!this.canPop()) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
105
122
|
if (typeof window !== "undefined" && window.history) {
|
|
106
123
|
try {
|
|
107
124
|
window.history.back();
|
|
108
125
|
} catch {
|
|
109
126
|
}
|
|
110
127
|
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
canPop() {
|
|
131
|
+
return this.path.getValue().stack.length > 1;
|
|
111
132
|
}
|
|
112
133
|
getFullStack() {
|
|
113
|
-
return this.path.getValue();
|
|
134
|
+
return this.path.getValue().stack;
|
|
114
135
|
}
|
|
115
136
|
getCurrent() {
|
|
116
|
-
|
|
137
|
+
const { stack } = this.path.getValue();
|
|
138
|
+
return stack[stack.length - 1] ?? {
|
|
117
139
|
path: [],
|
|
118
140
|
params: {}
|
|
119
141
|
};
|
|
@@ -128,7 +150,7 @@ var WhopCoreNavigation = class {
|
|
|
128
150
|
return this.sheet.getValue() ?? null;
|
|
129
151
|
}
|
|
130
152
|
subscribeToPath(callback) {
|
|
131
|
-
return this.path.subscribe(callback);
|
|
153
|
+
return this.path.subscribe((value) => callback(value.stack));
|
|
132
154
|
}
|
|
133
155
|
subscribeToSheet(callback) {
|
|
134
156
|
return this.sheet.subscribe(callback);
|
|
@@ -138,17 +160,30 @@ var navigation = new WhopCoreNavigation();
|
|
|
138
160
|
if (typeof window !== "undefined" && import_react_native.Platform.OS === "web") {
|
|
139
161
|
window.whopCoreNavigation = navigation;
|
|
140
162
|
window.addEventListener("popstate", (e) => {
|
|
141
|
-
const
|
|
163
|
+
const { stack: currentStack, currentIndex } = navigation.path.getValue();
|
|
164
|
+
const currentLength = currentStack.length;
|
|
142
165
|
if (!e.state) {
|
|
143
|
-
|
|
166
|
+
const newStack = currentStack.slice(0, -1);
|
|
167
|
+
navigation.path.setValue({
|
|
168
|
+
stack: newStack,
|
|
169
|
+
currentIndex: Math.max(0, currentIndex - 1)
|
|
170
|
+
});
|
|
144
171
|
return;
|
|
145
172
|
}
|
|
146
173
|
const index = e.state.index;
|
|
147
174
|
const route = e.state.route;
|
|
148
175
|
if (index < currentLength) {
|
|
149
|
-
|
|
176
|
+
const newStack = currentStack.slice(0, -1);
|
|
177
|
+
navigation.path.setValue({
|
|
178
|
+
stack: newStack,
|
|
179
|
+
currentIndex: Math.max(0, currentIndex - 1)
|
|
180
|
+
});
|
|
150
181
|
} else {
|
|
151
|
-
|
|
182
|
+
const newStack = [...currentStack, route];
|
|
183
|
+
navigation.path.setValue({
|
|
184
|
+
stack: newStack,
|
|
185
|
+
currentIndex: newStack.length - 1
|
|
186
|
+
});
|
|
152
187
|
}
|
|
153
188
|
});
|
|
154
189
|
}
|
|
@@ -256,8 +291,22 @@ async function loadIframeSdk() {
|
|
|
256
291
|
const module2 = await loadIframeModule();
|
|
257
292
|
iframeSdk = module2.createSdk({
|
|
258
293
|
appId: process.env.NEXT_PUBLIC_WHOP_APP_ID,
|
|
259
|
-
overrideParentOrigins: ["https://whop.com", "http://localhost:8004"]
|
|
294
|
+
overrideParentOrigins: ["https://whop.com", "http://localhost:8004"],
|
|
295
|
+
onMessage: {
|
|
296
|
+
navigateBack: () => {
|
|
297
|
+
navigation.pop();
|
|
298
|
+
return "ok";
|
|
299
|
+
}
|
|
300
|
+
}
|
|
260
301
|
});
|
|
302
|
+
const { stack, currentIndex } = navigation.path.getValue();
|
|
303
|
+
if (stack.length > 0) {
|
|
304
|
+
iframeSdk.onNavigationStackChange({
|
|
305
|
+
stack,
|
|
306
|
+
currentIndex
|
|
307
|
+
}).catch(() => {
|
|
308
|
+
});
|
|
309
|
+
}
|
|
261
310
|
}
|
|
262
311
|
return iframeSdk;
|
|
263
312
|
}
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/index.ts","../../src/lib/client-sdk.ts","../../src/lib/native-whop-core.ts","../../src/lib/native-whop-core-stub.ts","../../src/lib/native-whop-core-wrapper.ts","../../src/lib/haptics.ts"],"sourcesContent":["export * from \"./client-sdk\";\nexport * from \"./native-whop-core-wrapper\";\nexport * from \"./props\";\nimport Haptics from \"./haptics\";\n\nexport { Haptics };\n","import Whop from \"@whop/sdk\";\nimport { Platform } from \"react-native\";\nimport { __internal_execSync } from \"./native-whop-core-wrapper\";\n\nfunction getAppOrigin() {\n\tif (Platform.OS === \"android\" || Platform.OS === \"ios\") {\n\t\treturn __internal_execSync(\"getAppApiOrigin\", {}).apiOrigin;\n\t}\n\n\tif (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n\t\treturn window.location.origin;\n\t}\n\n\tthrow new Error(`Unsupported platform: ${Platform.OS}`);\n}\n\nconst appOrigin = getAppOrigin();\n\nexport const whopSdk = new Whop({\n\tapiKey: \"client\",\n\tappID: \"client\",\n\tbaseURL: new URL(\"/_whop/api/v1/\", appOrigin).href,\n});\n\nexport * from \"@whop/sdk\";\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\nimport stub from \"./native-whop-core-stub\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\nexport interface Spec extends TurboModule {\n\texecSync(name: string, paramsJson: string): FunctionCallResult;\n\texecAsync(name: string, paramsJson: string): Promise<FunctionCallResult>;\n}\n\nfunction resolveNative(): Spec | null {\n\ttry {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tconst registry: any = TurboModuleRegistry as any;\n\t\tconst get = registry?.getEnforcing ?? registry?.get;\n\t\tif (typeof get === \"function\") {\n\t\t\treturn get.call(registry, \"NativeWhopCore\") as Spec;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst native = resolveNative();\n\nexport default native ?? (stub as Spec);\n","import { Platform } from \"react-native\";\nimport type { ExecAsyncApi, ExecSyncApi } from \"./native-whop-core-wrapper\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\ntype Route = { path: string[]; params: Record<string, string> };\n\nclass WhopCoreObservable<T> {\n\tprivate subscribers: Set<(value: T) => void> = new Set();\n\tprivate value: T;\n\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tsetValue(value: T) {\n\t\tthis.value = value;\n\t\tfor (const callback of this.subscribers) {\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\tgetValue() {\n\t\treturn this.value;\n\t}\n\n\tsubscribe(callback: (value: T) => void) {\n\t\tthis.subscribers.add(callback);\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(callback);\n\t\t};\n\t}\n}\n\nclass WhopCoreNavigation {\n\tpublic path = new WhopCoreObservable<Route[]>([]);\n\tpublic sheet = new WhopCoreObservable<Route | null>(null);\n\n\tconstructor() {\n\t\tthis.getFullStack = this.getFullStack.bind(this);\n\t\tthis.getCurrentSheet = this.getCurrentSheet.bind(this);\n\t\tthis.subscribeToPath = this.subscribeToPath.bind(this);\n\t\tthis.subscribeToSheet = this.subscribeToSheet.bind(this);\n\t}\n\n\tpush(route: Route) {\n\t\tif (this.getCurrent().path.join(\"/\") === route.path.join(\"/\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.path.setValue([...this.path.getValue(), route]);\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\tconst pathBits = route.path.join(\"/\");\n\t\t\t\tconst paramsBits = Object.entries(route.params)\n\t\t\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t\t\t.join(\"&\");\n\t\t\t\twindow.history.pushState(\n\t\t\t\t\t{ route, index: this.path.getValue().length },\n\t\t\t\t\t\"\",\n\t\t\t\t\t`#${pathBits}?${paramsBits}`,\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tpop() {\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\twindow.history.back();\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tgetFullStack() {\n\t\treturn this.path.getValue();\n\t}\n\n\tgetCurrent() {\n\t\treturn (\n\t\t\tthis.path.getValue()[this.path.getValue().length - 1] ?? {\n\t\t\t\tpath: [],\n\t\t\t\tparams: {},\n\t\t\t}\n\t\t);\n\t}\n\n\tpresentSheet(route: Route) {\n\t\tthis.sheet.setValue(route);\n\t}\n\n\tdismissSheet() {\n\t\tthis.sheet.setValue(null);\n\t}\n\n\tgetCurrentSheet() {\n\t\treturn this.sheet.getValue() ?? null;\n\t}\n\n\tsubscribeToPath(callback: (route: Route[]) => void) {\n\t\treturn this.path.subscribe(callback);\n\t}\n\n\tsubscribeToSheet(callback: (route: Route | null) => void) {\n\t\treturn this.sheet.subscribe(callback);\n\t}\n}\n\nexport type TWhopCoreNavigation = WhopCoreNavigation;\n\nconst navigation = new WhopCoreNavigation();\nif (typeof window !== \"undefined\" && Platform.OS === \"web\") {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t(window as any).whopCoreNavigation = navigation;\n\n\twindow.addEventListener(\"popstate\", (e) => {\n\t\tconst currentLength = navigation.path.getValue().length;\n\t\tif (!e.state) {\n\t\t\tnavigation.path.setValue(navigation.path.getValue().slice(0, -1));\n\t\t\treturn;\n\t\t}\n\t\tconst index = e.state.index;\n\t\tconst route = e.state.route;\n\t\tif (index < currentLength) {\n\t\t\tnavigation.path.setValue(navigation.path.getValue().slice(0, -1));\n\t\t} else {\n\t\t\tnavigation.path.setValue([...navigation.path.getValue(), route]);\n\t\t}\n\t});\n}\n\nfunction ok(data: unknown): FunctionCallResult {\n\treturn { isOk: true, data: JSON.stringify(data), errorMessage: null };\n}\n\nfunction err(message: string): FunctionCallResult {\n\treturn { isOk: false, data: null, errorMessage: message };\n}\n\nfunction getOrigin(): string {\n\tif (typeof window !== \"undefined\" && window.location) {\n\t\treturn window.location.origin;\n\t}\n\treturn \"\";\n}\n\nconst syncHandlers: ExecSyncApi = {\n\tgetAppApiOrigin() {\n\t\treturn { apiOrigin: getOrigin() };\n\t},\n\tcacheGet({ key }: { key?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key) {\n\t\t\t\treturn { data: window.localStorage.getItem(key) };\n\t\t\t}\n\t\t\treturn { data: null };\n\t\t} catch {\n\t\t\treturn { data: null };\n\t\t}\n\t},\n\tcacheSet({ key, data }: { key?: string | null; data?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key != null) {\n\t\t\t\tif (data == null) {\n\t\t\t\t\twindow.localStorage.removeItem(key);\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(key, data);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t},\n\trouterPush(route) {\n\t\tif (route.origin) {\n\t\t\tconst path = `/${route.path.join(\"/\")}`;\n\t\t\tconst url = new URL(path, route.origin);\n\t\t\tfor (const [k, v] of Object.entries(route.params ?? {})) {\n\t\t\t\turl.searchParams.set(k, v);\n\t\t\t}\n\t\t\tloadIframeSdk().then((sdk) => sdk.openExternalUrl({ url: url.href }));\n\t\t} else {\n\t\t\tnavigation.push(route);\n\t\t}\n\t\treturn {};\n\t},\n\trouterPop() {\n\t\tnavigation.pop();\n\t\treturn {};\n\t},\n\trouterGetCurrent() {\n\t\treturn navigation.getCurrent();\n\t},\n\tsetNavigationBarData() {\n\t\treturn {};\n\t},\n\trouterPresentSheet({ path, params }: Route) {\n\t\tnavigation.presentSheet({\n\t\t\tpath: Array.from(path ?? []),\n\t\t\tparams: params ?? {},\n\t\t});\n\t\treturn {};\n\t},\n\trouterDismissSheet() {\n\t\tnavigation.dismissSheet();\n\t\treturn {};\n\t},\n\trouterGetCurrentSheet() {\n\t\treturn navigation.getCurrentSheet() ?? null;\n\t},\n\tdowngradeToWebView() {\n\t\treturn {};\n\t},\n\tgetHostAppDetails() {\n\t\treturn {\n\t\t\tbuild: \"web\",\n\t\t\tversion: \"0.0.0\",\n\t\t\tplatform: \"web\",\n\t\t\tbuildType: \"appstore\",\n\t\t};\n\t},\n\tsetScreenOrientationMode() {\n\t\treturn {};\n\t},\n};\n\nlet iframeModulePromise: Promise<typeof import(\"@whop/iframe\")> | null = null;\n\nasync function loadIframeModule() {\n\tif (!iframeModulePromise) {\n\t\tiframeModulePromise = import(\"@whop/iframe\");\n\t}\n\treturn await iframeModulePromise;\n}\n\nlet iframeSdk: ReturnType<typeof import(\"@whop/iframe\").createSdk> | null =\n\tnull;\n\nasync function loadIframeSdk() {\n\tif (!iframeSdk) {\n\t\tconst module = await loadIframeModule();\n\t\tiframeSdk = module.createSdk({\n\t\t\tappId: process.env.NEXT_PUBLIC_WHOP_APP_ID,\n\t\t\toverrideParentOrigins: [\"https://whop.com\", \"http://localhost:8004\"],\n\t\t});\n\t}\n\treturn iframeSdk;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype MakeAsync<T extends Record<string, any>> = {\n\t[K in keyof T]: (params: Parameters<T[K]>[0]) => Promise<ReturnType<T[K]>>;\n};\n\nconst asyncHandlers: MakeAsync<Pick<ExecAsyncApi, \"inAppPurchase\">> = {\n\tinAppPurchase: async ({ planId, id }) => {\n\t\tconst sdk = await loadIframeSdk();\n\t\tconst result = await sdk.inAppPurchase({ planId, id: id ?? undefined });\n\t\tif (result.status === \"ok\") {\n\t\t\treturn {\n\t\t\t\tsessionId: result.data.sessionId,\n\t\t\t\treceiptId: result.data.receiptId,\n\t\t\t};\n\t\t}\n\t\tthrow new Error(result.error);\n\t},\n};\n\nconst nativeWhopCoreStub = {\n\texecSync(name: string, paramsJson: string): FunctionCallResult {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = syncHandlers[name as keyof typeof syncHandlers];\n\t\t\tif (!handler) return err(`Unknown sync method: ${name}`);\n\t\t\tconst result = handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n\tasync execAsync(\n\t\tname: string,\n\t\tparamsJson: string,\n\t): Promise<FunctionCallResult> {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = (\n\t\t\t\tasyncHandlers as Record<string, (p: unknown) => Promise<unknown>>\n\t\t\t)[name];\n\t\t\tif (!handler) return err(`Unknown async method: ${name}`);\n\t\t\tconst result = await handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n};\n\nexport default nativeWhopCoreStub;\n","import nativeWhopCore from \"./native-whop-core\";\nimport type { PathParams, PathParamsWithOrigin } from \"./props\";\n\n// biome-ignore lint/complexity/noBannedTypes: allow here\ntype EmptyObject = {};\n\nexport interface ExecSyncApi {\n\tgetAppApiOrigin(params: EmptyObject): { apiOrigin: string };\n\tcacheGet(params: { key?: string | null }): { data?: string | null };\n\tcacheSet(params: { key?: string | null; data?: string | null }): EmptyObject;\n\trouterPush(params: PathParamsWithOrigin): EmptyObject;\n\trouterPop(params: EmptyObject): EmptyObject;\n\trouterGetCurrent(params: EmptyObject): PathParams;\n\tsetNavigationBarData(params: {\n\t\ttitle?: string | null;\n\t\tdescription?: string | null;\n\t}): EmptyObject;\n\trouterPresentSheet(params: PathParams): EmptyObject;\n\trouterDismissSheet(params: EmptyObject): EmptyObject;\n\trouterGetCurrentSheet(params: EmptyObject): PathParams | null | undefined;\n\tdowngradeToWebView(params: EmptyObject): EmptyObject;\n\tgetHostAppDetails(params: EmptyObject): {\n\t\tbuild: string;\n\t\tversion: string;\n\t\tplatform: \"ios\" | \"android\" | \"web\";\n\t\tbuildType: \"appstore\" | \"testflight\" | \"debug\";\n\t};\n\tsetScreenOrientationMode(params: {\n\t\ttargetScreenOrientationMode: \"portrait\" | \"landscape\" | \"rotate\";\n\t}): EmptyObject;\n}\n\nexport interface ExecAsyncApi extends ExecSyncApi {\n\tinAppPurchase(params: { id?: string | null; planId: string }): {\n\t\tsessionId: string;\n\t\treceiptId: string;\n\t};\n}\n\nexport function __internal_execSync<F extends keyof ExecSyncApi>(\n\tname: F,\n\tparams: Parameters<ExecSyncApi[F]>[0],\n): ReturnType<ExecSyncApi[F]> {\n\tconst resultJson = nativeWhopCore.execSync(name, JSON.stringify(params));\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecSyncApi[F]>;\n}\n\nexport async function __internal_execAsync<F extends keyof ExecAsyncApi>(\n\tname: F,\n\tparams: Parameters<ExecAsyncApi[F]>[0],\n): Promise<ReturnType<ExecAsyncApi[F]>> {\n\tconst resultJson = await nativeWhopCore.execAsync(\n\t\tname,\n\t\tJSON.stringify(params),\n\t);\n\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecAsyncApi[F]>;\n}\n","/**\n * Web-safe wrapper for react-native-haptic-feedback.\n * - Lazily imports the native module only in native environments.\n * - Provides a no-op fallback on web to avoid runtime crashes.\n */\n\ntype HapticType =\n\t| \"selection\"\n\t| \"impactLight\"\n\t| \"impactMedium\"\n\t| \"impactHeavy\"\n\t| \"notificationSuccess\"\n\t| \"notificationWarning\"\n\t| \"notificationError\";\n\ntype HapticOptions = {\n\tenableVibrateFallback?: boolean;\n\tignoreAndroidSystemSettings?: boolean;\n};\n\n// Singleton holder for the native module once loaded\nlet nativeModule: {\n\ttrigger: (type: HapticType, options?: HapticOptions) => void;\n} | null = null;\nlet loadingPromise: Promise<void> | null = null;\n\nasync function ensureNativeLoaded(): Promise<void> {\n\t// If on web, skip loading entirely\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore - process may not be typed in RN web builds\n\tconst isWeb =\n\t\ttypeof document !== \"undefined\" && typeof window !== \"undefined\";\n\tif (isWeb) return;\n\n\tif (nativeModule || loadingPromise) {\n\t\treturn loadingPromise ?? Promise.resolve();\n\t}\n\n\tloadingPromise = import(\"react-native-haptic-feedback\")\n\t\t.then((mod) => {\n\t\t\tnativeModule = { trigger: mod.default.trigger };\n\t\t})\n\t\t.catch(() => {\n\t\t\t// Keep nativeModule null; fall back to noop\n\t\t})\n\t\t.finally(() => {\n\t\t\tloadingPromise = null;\n\t\t});\n\n\treturn loadingPromise;\n}\n\nconst HAPTIC_NOOP = {\n\ttrigger: (_type: HapticType, _options?: HapticOptions) => {\n\t\t// no-op on web\n\t},\n};\n\nconst Haptics = {\n\tasync trigger(type: HapticType, options?: HapticOptions): Promise<void> {\n\t\tawait ensureNativeLoaded();\n\t\tif (nativeModule) {\n\t\t\ttry {\n\t\t\t\tnativeModule.trigger(type, options);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tHAPTIC_NOOP.trigger(type, options);\n\t},\n};\n\nexport default Haptics;\n"],"mappings":"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","names":["import_react_native","import_react_native","module","Whop"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts","../../src/lib/client-sdk.ts","../../src/lib/native-whop-core.ts","../../src/lib/native-whop-core-stub.ts","../../src/lib/native-whop-core-wrapper.ts","../../src/lib/haptics.ts"],"sourcesContent":["export * from \"./client-sdk\";\nexport * from \"./native-whop-core-wrapper\";\nexport * from \"./props\";\nimport Haptics from \"./haptics\";\n\nexport { Haptics };\n","import Whop from \"@whop/sdk\";\nimport { Platform } from \"react-native\";\nimport { __internal_execSync } from \"./native-whop-core-wrapper\";\n\nfunction getAppOrigin() {\n\tif (Platform.OS === \"android\" || Platform.OS === \"ios\") {\n\t\treturn __internal_execSync(\"getAppApiOrigin\", {}).apiOrigin;\n\t}\n\n\tif (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n\t\treturn window.location.origin;\n\t}\n\n\tthrow new Error(`Unsupported platform: ${Platform.OS}`);\n}\n\nconst appOrigin = getAppOrigin();\n\nexport const whopSdk = new Whop({\n\tapiKey: \"client\",\n\tappID: \"client\",\n\tbaseURL: new URL(\"/_whop/api/v1/\", appOrigin).href,\n});\n\nexport * from \"@whop/sdk\";\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\nimport stub from \"./native-whop-core-stub\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\nexport interface Spec extends TurboModule {\n\texecSync(name: string, paramsJson: string): FunctionCallResult;\n\texecAsync(name: string, paramsJson: string): Promise<FunctionCallResult>;\n}\n\nfunction resolveNative(): Spec | null {\n\ttry {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tconst registry: any = TurboModuleRegistry as any;\n\t\tconst get = registry?.getEnforcing ?? registry?.get;\n\t\tif (typeof get === \"function\") {\n\t\t\treturn get.call(registry, \"NativeWhopCore\") as Spec;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst native = resolveNative();\n\nexport default native ?? (stub as Spec);\n","import { Platform } from \"react-native\";\nimport type { ExecAsyncApi, ExecSyncApi } from \"./native-whop-core-wrapper\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\ntype Route = { path: string[]; params: Record<string, string> };\n\nclass WhopCoreObservable<T> {\n\tprivate subscribers: Set<(value: T) => void> = new Set();\n\tprivate value: T;\n\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tsetValue(value: T) {\n\t\tthis.value = value;\n\t\tfor (const callback of this.subscribers) {\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\tgetValue() {\n\t\treturn this.value;\n\t}\n\n\tsubscribe(callback: (value: T) => void) {\n\t\tthis.subscribers.add(callback);\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(callback);\n\t\t};\n\t}\n}\n\nclass WhopCoreNavigation {\n\tpublic path = new WhopCoreObservable<{\n\t\tstack: Route[];\n\t\tcurrentIndex: number;\n\t}>({\n\t\tstack: [],\n\t\tcurrentIndex: 0,\n\t});\n\tpublic sheet = new WhopCoreObservable<Route | null>(null);\n\n\tconstructor() {\n\t\tthis.getFullStack = this.getFullStack.bind(this);\n\t\tthis.getCurrentSheet = this.getCurrentSheet.bind(this);\n\t\tthis.subscribeToPath = this.subscribeToPath.bind(this);\n\t\tthis.subscribeToSheet = this.subscribeToSheet.bind(this);\n\n\t\t// Subscribe to path changes and emit to SDK\n\t\tthis.path.subscribe((value) => {\n\t\t\tloadIframeSdk()\n\t\t\t\t.then((sdk) =>\n\t\t\t\t\tsdk.onNavigationStackChange({\n\t\t\t\t\t\tstack: value.stack,\n\t\t\t\t\t\tcurrentIndex: value.currentIndex,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.catch(() => {});\n\t\t});\n\t}\n\n\tpush(route: Route) {\n\t\tif (this.getCurrent().path.join(\"/\") === route.path.join(\"/\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { stack } = this.path.getValue();\n\t\tconst newStack = [...stack, route];\n\t\tthis.path.setValue({ stack: newStack, currentIndex: newStack.length - 1 });\n\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\tconst pathBits = route.path.join(\"/\");\n\t\t\t\tconst paramsBits = Object.entries(route.params)\n\t\t\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t\t\t.join(\"&\");\n\t\t\t\twindow.history.pushState(\n\t\t\t\t\t{ route, index: newStack.length },\n\t\t\t\t\t\"\",\n\t\t\t\t\t`#${pathBits}?${paramsBits}`,\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tpop(): boolean {\n\t\tif (!this.canPop()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\twindow.history.back();\n\t\t\t} catch {}\n\t\t}\n\t\treturn true;\n\t}\n\n\tcanPop(): boolean {\n\t\treturn this.path.getValue().stack.length > 1;\n\t}\n\n\tgetFullStack() {\n\t\treturn this.path.getValue().stack;\n\t}\n\n\tgetCurrent() {\n\t\tconst { stack } = this.path.getValue();\n\t\treturn (\n\t\t\tstack[stack.length - 1] ?? {\n\t\t\t\tpath: [],\n\t\t\t\tparams: {},\n\t\t\t}\n\t\t);\n\t}\n\n\tpresentSheet(route: Route) {\n\t\tthis.sheet.setValue(route);\n\t}\n\n\tdismissSheet() {\n\t\tthis.sheet.setValue(null);\n\t}\n\n\tgetCurrentSheet() {\n\t\treturn this.sheet.getValue() ?? null;\n\t}\n\n\tsubscribeToPath(callback: (route: Route[]) => void) {\n\t\treturn this.path.subscribe((value) => callback(value.stack));\n\t}\n\n\tsubscribeToSheet(callback: (route: Route | null) => void) {\n\t\treturn this.sheet.subscribe(callback);\n\t}\n}\n\nexport type TWhopCoreNavigation = WhopCoreNavigation;\n\nconst navigation = new WhopCoreNavigation();\nif (typeof window !== \"undefined\" && Platform.OS === \"web\") {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t(window as any).whopCoreNavigation = navigation;\n\n\twindow.addEventListener(\"popstate\", (e) => {\n\t\tconst { stack: currentStack, currentIndex } = navigation.path.getValue();\n\t\tconst currentLength = currentStack.length;\n\n\t\tif (!e.state) {\n\t\t\t// Browser back with no state - pop from stack\n\t\t\tconst newStack = currentStack.slice(0, -1);\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: Math.max(0, currentIndex - 1),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst index = e.state.index;\n\t\tconst route = e.state.route;\n\n\t\tif (index < currentLength) {\n\t\t\t// Going back\n\t\t\tconst newStack = currentStack.slice(0, -1);\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: Math.max(0, currentIndex - 1),\n\t\t\t});\n\t\t} else {\n\t\t\t// Going forward\n\t\t\tconst newStack = [...currentStack, route];\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: newStack.length - 1,\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction ok(data: unknown): FunctionCallResult {\n\treturn { isOk: true, data: JSON.stringify(data), errorMessage: null };\n}\n\nfunction err(message: string): FunctionCallResult {\n\treturn { isOk: false, data: null, errorMessage: message };\n}\n\nfunction getOrigin(): string {\n\tif (typeof window !== \"undefined\" && window.location) {\n\t\treturn window.location.origin;\n\t}\n\treturn \"\";\n}\n\nconst syncHandlers: ExecSyncApi = {\n\tgetAppApiOrigin() {\n\t\treturn { apiOrigin: getOrigin() };\n\t},\n\tcacheGet({ key }: { key?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key) {\n\t\t\t\treturn { data: window.localStorage.getItem(key) };\n\t\t\t}\n\t\t\treturn { data: null };\n\t\t} catch {\n\t\t\treturn { data: null };\n\t\t}\n\t},\n\tcacheSet({ key, data }: { key?: string | null; data?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key != null) {\n\t\t\t\tif (data == null) {\n\t\t\t\t\twindow.localStorage.removeItem(key);\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(key, data);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t},\n\trouterPush(route) {\n\t\tif (route.origin) {\n\t\t\tconst path = `/${route.path.join(\"/\")}`;\n\t\t\tconst url = new URL(path, route.origin);\n\t\t\tfor (const [k, v] of Object.entries(route.params ?? {})) {\n\t\t\t\turl.searchParams.set(k, v);\n\t\t\t}\n\t\t\tloadIframeSdk().then((sdk) => sdk.openExternalUrl({ url: url.href }));\n\t\t} else {\n\t\t\tnavigation.push(route);\n\t\t}\n\t\treturn {};\n\t},\n\trouterPop() {\n\t\tnavigation.pop();\n\t\treturn {};\n\t},\n\trouterGetCurrent() {\n\t\treturn navigation.getCurrent();\n\t},\n\tsetNavigationBarData() {\n\t\treturn {};\n\t},\n\trouterPresentSheet({ path, params }: Route) {\n\t\tnavigation.presentSheet({\n\t\t\tpath: Array.from(path ?? []),\n\t\t\tparams: params ?? {},\n\t\t});\n\t\treturn {};\n\t},\n\trouterDismissSheet() {\n\t\tnavigation.dismissSheet();\n\t\treturn {};\n\t},\n\trouterGetCurrentSheet() {\n\t\treturn navigation.getCurrentSheet() ?? null;\n\t},\n\tdowngradeToWebView() {\n\t\treturn {};\n\t},\n\tgetHostAppDetails() {\n\t\treturn {\n\t\t\tbuild: \"web\",\n\t\t\tversion: \"0.0.0\",\n\t\t\tplatform: \"web\",\n\t\t\tbuildType: \"appstore\",\n\t\t};\n\t},\n\tsetScreenOrientationMode() {\n\t\treturn {};\n\t},\n};\n\nlet iframeModulePromise: Promise<typeof import(\"@whop/iframe\")> | null = null;\n\nasync function loadIframeModule() {\n\tif (!iframeModulePromise) {\n\t\tiframeModulePromise = import(\"@whop/iframe\");\n\t}\n\treturn await iframeModulePromise;\n}\n\nlet iframeSdk: ReturnType<typeof import(\"@whop/iframe\").createSdk> | null =\n\tnull;\n\nasync function loadIframeSdk() {\n\tif (!iframeSdk) {\n\t\tconst module = await loadIframeModule();\n\t\tiframeSdk = module.createSdk({\n\t\t\tappId: process.env.NEXT_PUBLIC_WHOP_APP_ID,\n\t\t\toverrideParentOrigins: [\"https://whop.com\", \"http://localhost:8004\"],\n\t\t\tonMessage: {\n\t\t\t\tnavigateBack: () => {\n\t\t\t\t\tnavigation.pop();\n\t\t\t\t\treturn \"ok\" as const;\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// Emit initial stack state after SDK is ready\n\t\tconst { stack, currentIndex } = navigation.path.getValue();\n\t\tif (stack.length > 0) {\n\t\t\tiframeSdk\n\t\t\t\t.onNavigationStackChange({\n\t\t\t\t\tstack,\n\t\t\t\t\tcurrentIndex,\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t}\n\t}\n\treturn iframeSdk;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype MakeAsync<T extends Record<string, any>> = {\n\t[K in keyof T]: (params: Parameters<T[K]>[0]) => Promise<ReturnType<T[K]>>;\n};\n\nconst asyncHandlers: MakeAsync<Pick<ExecAsyncApi, \"inAppPurchase\">> = {\n\tinAppPurchase: async ({ planId, id }) => {\n\t\tconst sdk = await loadIframeSdk();\n\t\tconst result = await sdk.inAppPurchase({ planId, id: id ?? undefined });\n\t\tif (result.status === \"ok\") {\n\t\t\treturn {\n\t\t\t\tsessionId: result.data.sessionId,\n\t\t\t\treceiptId: result.data.receiptId,\n\t\t\t};\n\t\t}\n\t\tthrow new Error(result.error);\n\t},\n};\n\nconst nativeWhopCoreStub = {\n\texecSync(name: string, paramsJson: string): FunctionCallResult {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = syncHandlers[name as keyof typeof syncHandlers];\n\t\t\tif (!handler) return err(`Unknown sync method: ${name}`);\n\t\t\tconst result = handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n\tasync execAsync(\n\t\tname: string,\n\t\tparamsJson: string,\n\t): Promise<FunctionCallResult> {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = (\n\t\t\t\tasyncHandlers as Record<string, (p: unknown) => Promise<unknown>>\n\t\t\t)[name];\n\t\t\tif (!handler) return err(`Unknown async method: ${name}`);\n\t\t\tconst result = await handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n};\n\nexport default nativeWhopCoreStub;\n","import nativeWhopCore from \"./native-whop-core\";\nimport type { PathParams, PathParamsWithOrigin } from \"./props\";\n\n// biome-ignore lint/complexity/noBannedTypes: allow here\ntype EmptyObject = {};\n\nexport interface ExecSyncApi {\n\tgetAppApiOrigin(params: EmptyObject): { apiOrigin: string };\n\tcacheGet(params: { key?: string | null }): { data?: string | null };\n\tcacheSet(params: { key?: string | null; data?: string | null }): EmptyObject;\n\trouterPush(params: PathParamsWithOrigin): EmptyObject;\n\trouterPop(params: EmptyObject): EmptyObject;\n\trouterGetCurrent(params: EmptyObject): PathParams;\n\tsetNavigationBarData(params: {\n\t\ttitle?: string | null;\n\t\tdescription?: string | null;\n\t}): EmptyObject;\n\trouterPresentSheet(params: PathParams): EmptyObject;\n\trouterDismissSheet(params: EmptyObject): EmptyObject;\n\trouterGetCurrentSheet(params: EmptyObject): PathParams | null | undefined;\n\tdowngradeToWebView(params: EmptyObject): EmptyObject;\n\tgetHostAppDetails(params: EmptyObject): {\n\t\tbuild: string;\n\t\tversion: string;\n\t\tplatform: \"ios\" | \"android\" | \"web\";\n\t\tbuildType: \"appstore\" | \"testflight\" | \"debug\";\n\t};\n\tsetScreenOrientationMode(params: {\n\t\ttargetScreenOrientationMode: \"portrait\" | \"landscape\" | \"rotate\";\n\t}): EmptyObject;\n}\n\nexport interface ExecAsyncApi extends ExecSyncApi {\n\tinAppPurchase(params: { id?: string | null; planId: string }): {\n\t\tsessionId: string;\n\t\treceiptId: string;\n\t};\n}\n\nexport function __internal_execSync<F extends keyof ExecSyncApi>(\n\tname: F,\n\tparams: Parameters<ExecSyncApi[F]>[0],\n): ReturnType<ExecSyncApi[F]> {\n\tconst resultJson = nativeWhopCore.execSync(name, JSON.stringify(params));\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecSyncApi[F]>;\n}\n\nexport async function __internal_execAsync<F extends keyof ExecAsyncApi>(\n\tname: F,\n\tparams: Parameters<ExecAsyncApi[F]>[0],\n): Promise<ReturnType<ExecAsyncApi[F]>> {\n\tconst resultJson = await nativeWhopCore.execAsync(\n\t\tname,\n\t\tJSON.stringify(params),\n\t);\n\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecAsyncApi[F]>;\n}\n","/**\n * Web-safe wrapper for react-native-haptic-feedback.\n * - Lazily imports the native module only in native environments.\n * - Provides a no-op fallback on web to avoid runtime crashes.\n */\n\ntype HapticType =\n\t| \"selection\"\n\t| \"impactLight\"\n\t| \"impactMedium\"\n\t| \"impactHeavy\"\n\t| \"notificationSuccess\"\n\t| \"notificationWarning\"\n\t| \"notificationError\";\n\ntype HapticOptions = {\n\tenableVibrateFallback?: boolean;\n\tignoreAndroidSystemSettings?: boolean;\n};\n\n// Singleton holder for the native module once loaded\nlet nativeModule: {\n\ttrigger: (type: HapticType, options?: HapticOptions) => void;\n} | null = null;\nlet loadingPromise: Promise<void> | null = null;\n\nasync function ensureNativeLoaded(): Promise<void> {\n\t// If on web, skip loading entirely\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore - process may not be typed in RN web builds\n\tconst isWeb =\n\t\ttypeof document !== \"undefined\" && typeof window !== \"undefined\";\n\tif (isWeb) return;\n\n\tif (nativeModule || loadingPromise) {\n\t\treturn loadingPromise ?? Promise.resolve();\n\t}\n\n\tloadingPromise = import(\"react-native-haptic-feedback\")\n\t\t.then((mod) => {\n\t\t\tnativeModule = { trigger: mod.default.trigger };\n\t\t})\n\t\t.catch(() => {\n\t\t\t// Keep nativeModule null; fall back to noop\n\t\t})\n\t\t.finally(() => {\n\t\t\tloadingPromise = null;\n\t\t});\n\n\treturn loadingPromise;\n}\n\nconst HAPTIC_NOOP = {\n\ttrigger: (_type: HapticType, _options?: HapticOptions) => {\n\t\t// no-op on web\n\t},\n};\n\nconst Haptics = {\n\tasync trigger(type: HapticType, options?: HapticOptions): Promise<void> {\n\t\tawait ensureNativeLoaded();\n\t\tif (nativeModule) {\n\t\t\ttry {\n\t\t\t\tnativeModule.trigger(type, options);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tHAPTIC_NOOP.trigger(type, options);\n\t},\n};\n\nexport default Haptics;\n"],"mappings":"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","names":["import_react_native","import_react_native","module","Whop"]}
|
package/dist/lib/index.mjs
CHANGED
|
@@ -49,25 +49,39 @@ var WhopCoreObservable = class {
|
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
51
|
var WhopCoreNavigation = class {
|
|
52
|
-
path = new WhopCoreObservable(
|
|
52
|
+
path = new WhopCoreObservable({
|
|
53
|
+
stack: [],
|
|
54
|
+
currentIndex: 0
|
|
55
|
+
});
|
|
53
56
|
sheet = new WhopCoreObservable(null);
|
|
54
57
|
constructor() {
|
|
55
58
|
this.getFullStack = this.getFullStack.bind(this);
|
|
56
59
|
this.getCurrentSheet = this.getCurrentSheet.bind(this);
|
|
57
60
|
this.subscribeToPath = this.subscribeToPath.bind(this);
|
|
58
61
|
this.subscribeToSheet = this.subscribeToSheet.bind(this);
|
|
62
|
+
this.path.subscribe((value) => {
|
|
63
|
+
loadIframeSdk().then(
|
|
64
|
+
(sdk) => sdk.onNavigationStackChange({
|
|
65
|
+
stack: value.stack,
|
|
66
|
+
currentIndex: value.currentIndex
|
|
67
|
+
})
|
|
68
|
+
).catch(() => {
|
|
69
|
+
});
|
|
70
|
+
});
|
|
59
71
|
}
|
|
60
72
|
push(route) {
|
|
61
73
|
if (this.getCurrent().path.join("/") === route.path.join("/")) {
|
|
62
74
|
return;
|
|
63
75
|
}
|
|
64
|
-
this.path.
|
|
76
|
+
const { stack } = this.path.getValue();
|
|
77
|
+
const newStack = [...stack, route];
|
|
78
|
+
this.path.setValue({ stack: newStack, currentIndex: newStack.length - 1 });
|
|
65
79
|
if (typeof window !== "undefined" && window.history) {
|
|
66
80
|
try {
|
|
67
81
|
const pathBits = route.path.join("/");
|
|
68
82
|
const paramsBits = Object.entries(route.params).map(([key, value]) => `${key}=${value}`).join("&");
|
|
69
83
|
window.history.pushState(
|
|
70
|
-
{ route, index:
|
|
84
|
+
{ route, index: newStack.length },
|
|
71
85
|
"",
|
|
72
86
|
`#${pathBits}?${paramsBits}`
|
|
73
87
|
);
|
|
@@ -76,18 +90,26 @@ var WhopCoreNavigation = class {
|
|
|
76
90
|
}
|
|
77
91
|
}
|
|
78
92
|
pop() {
|
|
93
|
+
if (!this.canPop()) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
79
96
|
if (typeof window !== "undefined" && window.history) {
|
|
80
97
|
try {
|
|
81
98
|
window.history.back();
|
|
82
99
|
} catch {
|
|
83
100
|
}
|
|
84
101
|
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
canPop() {
|
|
105
|
+
return this.path.getValue().stack.length > 1;
|
|
85
106
|
}
|
|
86
107
|
getFullStack() {
|
|
87
|
-
return this.path.getValue();
|
|
108
|
+
return this.path.getValue().stack;
|
|
88
109
|
}
|
|
89
110
|
getCurrent() {
|
|
90
|
-
|
|
111
|
+
const { stack } = this.path.getValue();
|
|
112
|
+
return stack[stack.length - 1] ?? {
|
|
91
113
|
path: [],
|
|
92
114
|
params: {}
|
|
93
115
|
};
|
|
@@ -102,7 +124,7 @@ var WhopCoreNavigation = class {
|
|
|
102
124
|
return this.sheet.getValue() ?? null;
|
|
103
125
|
}
|
|
104
126
|
subscribeToPath(callback) {
|
|
105
|
-
return this.path.subscribe(callback);
|
|
127
|
+
return this.path.subscribe((value) => callback(value.stack));
|
|
106
128
|
}
|
|
107
129
|
subscribeToSheet(callback) {
|
|
108
130
|
return this.sheet.subscribe(callback);
|
|
@@ -112,17 +134,30 @@ var navigation = new WhopCoreNavigation();
|
|
|
112
134
|
if (typeof window !== "undefined" && Platform.OS === "web") {
|
|
113
135
|
window.whopCoreNavigation = navigation;
|
|
114
136
|
window.addEventListener("popstate", (e) => {
|
|
115
|
-
const
|
|
137
|
+
const { stack: currentStack, currentIndex } = navigation.path.getValue();
|
|
138
|
+
const currentLength = currentStack.length;
|
|
116
139
|
if (!e.state) {
|
|
117
|
-
|
|
140
|
+
const newStack = currentStack.slice(0, -1);
|
|
141
|
+
navigation.path.setValue({
|
|
142
|
+
stack: newStack,
|
|
143
|
+
currentIndex: Math.max(0, currentIndex - 1)
|
|
144
|
+
});
|
|
118
145
|
return;
|
|
119
146
|
}
|
|
120
147
|
const index = e.state.index;
|
|
121
148
|
const route = e.state.route;
|
|
122
149
|
if (index < currentLength) {
|
|
123
|
-
|
|
150
|
+
const newStack = currentStack.slice(0, -1);
|
|
151
|
+
navigation.path.setValue({
|
|
152
|
+
stack: newStack,
|
|
153
|
+
currentIndex: Math.max(0, currentIndex - 1)
|
|
154
|
+
});
|
|
124
155
|
} else {
|
|
125
|
-
|
|
156
|
+
const newStack = [...currentStack, route];
|
|
157
|
+
navigation.path.setValue({
|
|
158
|
+
stack: newStack,
|
|
159
|
+
currentIndex: newStack.length - 1
|
|
160
|
+
});
|
|
126
161
|
}
|
|
127
162
|
});
|
|
128
163
|
}
|
|
@@ -230,8 +265,22 @@ async function loadIframeSdk() {
|
|
|
230
265
|
const module = await loadIframeModule();
|
|
231
266
|
iframeSdk = module.createSdk({
|
|
232
267
|
appId: process.env.NEXT_PUBLIC_WHOP_APP_ID,
|
|
233
|
-
overrideParentOrigins: ["https://whop.com", "http://localhost:8004"]
|
|
268
|
+
overrideParentOrigins: ["https://whop.com", "http://localhost:8004"],
|
|
269
|
+
onMessage: {
|
|
270
|
+
navigateBack: () => {
|
|
271
|
+
navigation.pop();
|
|
272
|
+
return "ok";
|
|
273
|
+
}
|
|
274
|
+
}
|
|
234
275
|
});
|
|
276
|
+
const { stack, currentIndex } = navigation.path.getValue();
|
|
277
|
+
if (stack.length > 0) {
|
|
278
|
+
iframeSdk.onNavigationStackChange({
|
|
279
|
+
stack,
|
|
280
|
+
currentIndex
|
|
281
|
+
}).catch(() => {
|
|
282
|
+
});
|
|
283
|
+
}
|
|
235
284
|
}
|
|
236
285
|
return iframeSdk;
|
|
237
286
|
}
|
package/dist/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/index.ts","../../src/lib/client-sdk.ts","../../src/lib/native-whop-core.ts","../../src/lib/native-whop-core-stub.ts","../../src/lib/native-whop-core-wrapper.ts","../../src/lib/haptics.ts"],"sourcesContent":["export * from \"./client-sdk\";\nexport * from \"./native-whop-core-wrapper\";\nexport * from \"./props\";\nimport Haptics from \"./haptics\";\n\nexport { Haptics };\n","import Whop from \"@whop/sdk\";\nimport { Platform } from \"react-native\";\nimport { __internal_execSync } from \"./native-whop-core-wrapper\";\n\nfunction getAppOrigin() {\n\tif (Platform.OS === \"android\" || Platform.OS === \"ios\") {\n\t\treturn __internal_execSync(\"getAppApiOrigin\", {}).apiOrigin;\n\t}\n\n\tif (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n\t\treturn window.location.origin;\n\t}\n\n\tthrow new Error(`Unsupported platform: ${Platform.OS}`);\n}\n\nconst appOrigin = getAppOrigin();\n\nexport const whopSdk = new Whop({\n\tapiKey: \"client\",\n\tappID: \"client\",\n\tbaseURL: new URL(\"/_whop/api/v1/\", appOrigin).href,\n});\n\nexport * from \"@whop/sdk\";\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\nimport stub from \"./native-whop-core-stub\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\nexport interface Spec extends TurboModule {\n\texecSync(name: string, paramsJson: string): FunctionCallResult;\n\texecAsync(name: string, paramsJson: string): Promise<FunctionCallResult>;\n}\n\nfunction resolveNative(): Spec | null {\n\ttry {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tconst registry: any = TurboModuleRegistry as any;\n\t\tconst get = registry?.getEnforcing ?? registry?.get;\n\t\tif (typeof get === \"function\") {\n\t\t\treturn get.call(registry, \"NativeWhopCore\") as Spec;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst native = resolveNative();\n\nexport default native ?? (stub as Spec);\n","import { Platform } from \"react-native\";\nimport type { ExecAsyncApi, ExecSyncApi } from \"./native-whop-core-wrapper\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\ntype Route = { path: string[]; params: Record<string, string> };\n\nclass WhopCoreObservable<T> {\n\tprivate subscribers: Set<(value: T) => void> = new Set();\n\tprivate value: T;\n\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tsetValue(value: T) {\n\t\tthis.value = value;\n\t\tfor (const callback of this.subscribers) {\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\tgetValue() {\n\t\treturn this.value;\n\t}\n\n\tsubscribe(callback: (value: T) => void) {\n\t\tthis.subscribers.add(callback);\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(callback);\n\t\t};\n\t}\n}\n\nclass WhopCoreNavigation {\n\tpublic path = new WhopCoreObservable<Route[]>([]);\n\tpublic sheet = new WhopCoreObservable<Route | null>(null);\n\n\tconstructor() {\n\t\tthis.getFullStack = this.getFullStack.bind(this);\n\t\tthis.getCurrentSheet = this.getCurrentSheet.bind(this);\n\t\tthis.subscribeToPath = this.subscribeToPath.bind(this);\n\t\tthis.subscribeToSheet = this.subscribeToSheet.bind(this);\n\t}\n\n\tpush(route: Route) {\n\t\tif (this.getCurrent().path.join(\"/\") === route.path.join(\"/\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.path.setValue([...this.path.getValue(), route]);\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\tconst pathBits = route.path.join(\"/\");\n\t\t\t\tconst paramsBits = Object.entries(route.params)\n\t\t\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t\t\t.join(\"&\");\n\t\t\t\twindow.history.pushState(\n\t\t\t\t\t{ route, index: this.path.getValue().length },\n\t\t\t\t\t\"\",\n\t\t\t\t\t`#${pathBits}?${paramsBits}`,\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tpop() {\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\twindow.history.back();\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tgetFullStack() {\n\t\treturn this.path.getValue();\n\t}\n\n\tgetCurrent() {\n\t\treturn (\n\t\t\tthis.path.getValue()[this.path.getValue().length - 1] ?? {\n\t\t\t\tpath: [],\n\t\t\t\tparams: {},\n\t\t\t}\n\t\t);\n\t}\n\n\tpresentSheet(route: Route) {\n\t\tthis.sheet.setValue(route);\n\t}\n\n\tdismissSheet() {\n\t\tthis.sheet.setValue(null);\n\t}\n\n\tgetCurrentSheet() {\n\t\treturn this.sheet.getValue() ?? null;\n\t}\n\n\tsubscribeToPath(callback: (route: Route[]) => void) {\n\t\treturn this.path.subscribe(callback);\n\t}\n\n\tsubscribeToSheet(callback: (route: Route | null) => void) {\n\t\treturn this.sheet.subscribe(callback);\n\t}\n}\n\nexport type TWhopCoreNavigation = WhopCoreNavigation;\n\nconst navigation = new WhopCoreNavigation();\nif (typeof window !== \"undefined\" && Platform.OS === \"web\") {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t(window as any).whopCoreNavigation = navigation;\n\n\twindow.addEventListener(\"popstate\", (e) => {\n\t\tconst currentLength = navigation.path.getValue().length;\n\t\tif (!e.state) {\n\t\t\tnavigation.path.setValue(navigation.path.getValue().slice(0, -1));\n\t\t\treturn;\n\t\t}\n\t\tconst index = e.state.index;\n\t\tconst route = e.state.route;\n\t\tif (index < currentLength) {\n\t\t\tnavigation.path.setValue(navigation.path.getValue().slice(0, -1));\n\t\t} else {\n\t\t\tnavigation.path.setValue([...navigation.path.getValue(), route]);\n\t\t}\n\t});\n}\n\nfunction ok(data: unknown): FunctionCallResult {\n\treturn { isOk: true, data: JSON.stringify(data), errorMessage: null };\n}\n\nfunction err(message: string): FunctionCallResult {\n\treturn { isOk: false, data: null, errorMessage: message };\n}\n\nfunction getOrigin(): string {\n\tif (typeof window !== \"undefined\" && window.location) {\n\t\treturn window.location.origin;\n\t}\n\treturn \"\";\n}\n\nconst syncHandlers: ExecSyncApi = {\n\tgetAppApiOrigin() {\n\t\treturn { apiOrigin: getOrigin() };\n\t},\n\tcacheGet({ key }: { key?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key) {\n\t\t\t\treturn { data: window.localStorage.getItem(key) };\n\t\t\t}\n\t\t\treturn { data: null };\n\t\t} catch {\n\t\t\treturn { data: null };\n\t\t}\n\t},\n\tcacheSet({ key, data }: { key?: string | null; data?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key != null) {\n\t\t\t\tif (data == null) {\n\t\t\t\t\twindow.localStorage.removeItem(key);\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(key, data);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t},\n\trouterPush(route) {\n\t\tif (route.origin) {\n\t\t\tconst path = `/${route.path.join(\"/\")}`;\n\t\t\tconst url = new URL(path, route.origin);\n\t\t\tfor (const [k, v] of Object.entries(route.params ?? {})) {\n\t\t\t\turl.searchParams.set(k, v);\n\t\t\t}\n\t\t\tloadIframeSdk().then((sdk) => sdk.openExternalUrl({ url: url.href }));\n\t\t} else {\n\t\t\tnavigation.push(route);\n\t\t}\n\t\treturn {};\n\t},\n\trouterPop() {\n\t\tnavigation.pop();\n\t\treturn {};\n\t},\n\trouterGetCurrent() {\n\t\treturn navigation.getCurrent();\n\t},\n\tsetNavigationBarData() {\n\t\treturn {};\n\t},\n\trouterPresentSheet({ path, params }: Route) {\n\t\tnavigation.presentSheet({\n\t\t\tpath: Array.from(path ?? []),\n\t\t\tparams: params ?? {},\n\t\t});\n\t\treturn {};\n\t},\n\trouterDismissSheet() {\n\t\tnavigation.dismissSheet();\n\t\treturn {};\n\t},\n\trouterGetCurrentSheet() {\n\t\treturn navigation.getCurrentSheet() ?? null;\n\t},\n\tdowngradeToWebView() {\n\t\treturn {};\n\t},\n\tgetHostAppDetails() {\n\t\treturn {\n\t\t\tbuild: \"web\",\n\t\t\tversion: \"0.0.0\",\n\t\t\tplatform: \"web\",\n\t\t\tbuildType: \"appstore\",\n\t\t};\n\t},\n\tsetScreenOrientationMode() {\n\t\treturn {};\n\t},\n};\n\nlet iframeModulePromise: Promise<typeof import(\"@whop/iframe\")> | null = null;\n\nasync function loadIframeModule() {\n\tif (!iframeModulePromise) {\n\t\tiframeModulePromise = import(\"@whop/iframe\");\n\t}\n\treturn await iframeModulePromise;\n}\n\nlet iframeSdk: ReturnType<typeof import(\"@whop/iframe\").createSdk> | null =\n\tnull;\n\nasync function loadIframeSdk() {\n\tif (!iframeSdk) {\n\t\tconst module = await loadIframeModule();\n\t\tiframeSdk = module.createSdk({\n\t\t\tappId: process.env.NEXT_PUBLIC_WHOP_APP_ID,\n\t\t\toverrideParentOrigins: [\"https://whop.com\", \"http://localhost:8004\"],\n\t\t});\n\t}\n\treturn iframeSdk;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype MakeAsync<T extends Record<string, any>> = {\n\t[K in keyof T]: (params: Parameters<T[K]>[0]) => Promise<ReturnType<T[K]>>;\n};\n\nconst asyncHandlers: MakeAsync<Pick<ExecAsyncApi, \"inAppPurchase\">> = {\n\tinAppPurchase: async ({ planId, id }) => {\n\t\tconst sdk = await loadIframeSdk();\n\t\tconst result = await sdk.inAppPurchase({ planId, id: id ?? undefined });\n\t\tif (result.status === \"ok\") {\n\t\t\treturn {\n\t\t\t\tsessionId: result.data.sessionId,\n\t\t\t\treceiptId: result.data.receiptId,\n\t\t\t};\n\t\t}\n\t\tthrow new Error(result.error);\n\t},\n};\n\nconst nativeWhopCoreStub = {\n\texecSync(name: string, paramsJson: string): FunctionCallResult {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = syncHandlers[name as keyof typeof syncHandlers];\n\t\t\tif (!handler) return err(`Unknown sync method: ${name}`);\n\t\t\tconst result = handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n\tasync execAsync(\n\t\tname: string,\n\t\tparamsJson: string,\n\t): Promise<FunctionCallResult> {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = (\n\t\t\t\tasyncHandlers as Record<string, (p: unknown) => Promise<unknown>>\n\t\t\t)[name];\n\t\t\tif (!handler) return err(`Unknown async method: ${name}`);\n\t\t\tconst result = await handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n};\n\nexport default nativeWhopCoreStub;\n","import nativeWhopCore from \"./native-whop-core\";\nimport type { PathParams, PathParamsWithOrigin } from \"./props\";\n\n// biome-ignore lint/complexity/noBannedTypes: allow here\ntype EmptyObject = {};\n\nexport interface ExecSyncApi {\n\tgetAppApiOrigin(params: EmptyObject): { apiOrigin: string };\n\tcacheGet(params: { key?: string | null }): { data?: string | null };\n\tcacheSet(params: { key?: string | null; data?: string | null }): EmptyObject;\n\trouterPush(params: PathParamsWithOrigin): EmptyObject;\n\trouterPop(params: EmptyObject): EmptyObject;\n\trouterGetCurrent(params: EmptyObject): PathParams;\n\tsetNavigationBarData(params: {\n\t\ttitle?: string | null;\n\t\tdescription?: string | null;\n\t}): EmptyObject;\n\trouterPresentSheet(params: PathParams): EmptyObject;\n\trouterDismissSheet(params: EmptyObject): EmptyObject;\n\trouterGetCurrentSheet(params: EmptyObject): PathParams | null | undefined;\n\tdowngradeToWebView(params: EmptyObject): EmptyObject;\n\tgetHostAppDetails(params: EmptyObject): {\n\t\tbuild: string;\n\t\tversion: string;\n\t\tplatform: \"ios\" | \"android\" | \"web\";\n\t\tbuildType: \"appstore\" | \"testflight\" | \"debug\";\n\t};\n\tsetScreenOrientationMode(params: {\n\t\ttargetScreenOrientationMode: \"portrait\" | \"landscape\" | \"rotate\";\n\t}): EmptyObject;\n}\n\nexport interface ExecAsyncApi extends ExecSyncApi {\n\tinAppPurchase(params: { id?: string | null; planId: string }): {\n\t\tsessionId: string;\n\t\treceiptId: string;\n\t};\n}\n\nexport function __internal_execSync<F extends keyof ExecSyncApi>(\n\tname: F,\n\tparams: Parameters<ExecSyncApi[F]>[0],\n): ReturnType<ExecSyncApi[F]> {\n\tconst resultJson = nativeWhopCore.execSync(name, JSON.stringify(params));\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecSyncApi[F]>;\n}\n\nexport async function __internal_execAsync<F extends keyof ExecAsyncApi>(\n\tname: F,\n\tparams: Parameters<ExecAsyncApi[F]>[0],\n): Promise<ReturnType<ExecAsyncApi[F]>> {\n\tconst resultJson = await nativeWhopCore.execAsync(\n\t\tname,\n\t\tJSON.stringify(params),\n\t);\n\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecAsyncApi[F]>;\n}\n","/**\n * Web-safe wrapper for react-native-haptic-feedback.\n * - Lazily imports the native module only in native environments.\n * - Provides a no-op fallback on web to avoid runtime crashes.\n */\n\ntype HapticType =\n\t| \"selection\"\n\t| \"impactLight\"\n\t| \"impactMedium\"\n\t| \"impactHeavy\"\n\t| \"notificationSuccess\"\n\t| \"notificationWarning\"\n\t| \"notificationError\";\n\ntype HapticOptions = {\n\tenableVibrateFallback?: boolean;\n\tignoreAndroidSystemSettings?: boolean;\n};\n\n// Singleton holder for the native module once loaded\nlet nativeModule: {\n\ttrigger: (type: HapticType, options?: HapticOptions) => void;\n} | null = null;\nlet loadingPromise: Promise<void> | null = null;\n\nasync function ensureNativeLoaded(): Promise<void> {\n\t// If on web, skip loading entirely\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore - process may not be typed in RN web builds\n\tconst isWeb =\n\t\ttypeof document !== \"undefined\" && typeof window !== \"undefined\";\n\tif (isWeb) return;\n\n\tif (nativeModule || loadingPromise) {\n\t\treturn loadingPromise ?? Promise.resolve();\n\t}\n\n\tloadingPromise = import(\"react-native-haptic-feedback\")\n\t\t.then((mod) => {\n\t\t\tnativeModule = { trigger: mod.default.trigger };\n\t\t})\n\t\t.catch(() => {\n\t\t\t// Keep nativeModule null; fall back to noop\n\t\t})\n\t\t.finally(() => {\n\t\t\tloadingPromise = null;\n\t\t});\n\n\treturn loadingPromise;\n}\n\nconst HAPTIC_NOOP = {\n\ttrigger: (_type: HapticType, _options?: HapticOptions) => {\n\t\t// no-op on web\n\t},\n};\n\nconst Haptics = {\n\tasync trigger(type: HapticType, options?: HapticOptions): Promise<void> {\n\t\tawait ensureNativeLoaded();\n\t\tif (nativeModule) {\n\t\t\ttry {\n\t\t\t\tnativeModule.trigger(type, options);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tHAPTIC_NOOP.trigger(type, options);\n\t},\n};\n\nexport default Haptics;\n"],"mappings":"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","names":["Platform","Platform"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts","../../src/lib/client-sdk.ts","../../src/lib/native-whop-core.ts","../../src/lib/native-whop-core-stub.ts","../../src/lib/native-whop-core-wrapper.ts","../../src/lib/haptics.ts"],"sourcesContent":["export * from \"./client-sdk\";\nexport * from \"./native-whop-core-wrapper\";\nexport * from \"./props\";\nimport Haptics from \"./haptics\";\n\nexport { Haptics };\n","import Whop from \"@whop/sdk\";\nimport { Platform } from \"react-native\";\nimport { __internal_execSync } from \"./native-whop-core-wrapper\";\n\nfunction getAppOrigin() {\n\tif (Platform.OS === \"android\" || Platform.OS === \"ios\") {\n\t\treturn __internal_execSync(\"getAppApiOrigin\", {}).apiOrigin;\n\t}\n\n\tif (Platform.OS === \"web\" && typeof window !== \"undefined\") {\n\t\treturn window.location.origin;\n\t}\n\n\tthrow new Error(`Unsupported platform: ${Platform.OS}`);\n}\n\nconst appOrigin = getAppOrigin();\n\nexport const whopSdk = new Whop({\n\tapiKey: \"client\",\n\tappID: \"client\",\n\tbaseURL: new URL(\"/_whop/api/v1/\", appOrigin).href,\n});\n\nexport * from \"@whop/sdk\";\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\nimport stub from \"./native-whop-core-stub\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\nexport interface Spec extends TurboModule {\n\texecSync(name: string, paramsJson: string): FunctionCallResult;\n\texecAsync(name: string, paramsJson: string): Promise<FunctionCallResult>;\n}\n\nfunction resolveNative(): Spec | null {\n\ttry {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t\tconst registry: any = TurboModuleRegistry as any;\n\t\tconst get = registry?.getEnforcing ?? registry?.get;\n\t\tif (typeof get === \"function\") {\n\t\t\treturn get.call(registry, \"NativeWhopCore\") as Spec;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nconst native = resolveNative();\n\nexport default native ?? (stub as Spec);\n","import { Platform } from \"react-native\";\nimport type { ExecAsyncApi, ExecSyncApi } from \"./native-whop-core-wrapper\";\n\nexport type FunctionCallResult = {\n\tisOk: boolean;\n\tdata: string | null;\n\terrorMessage: string | null;\n};\n\ntype Route = { path: string[]; params: Record<string, string> };\n\nclass WhopCoreObservable<T> {\n\tprivate subscribers: Set<(value: T) => void> = new Set();\n\tprivate value: T;\n\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tsetValue(value: T) {\n\t\tthis.value = value;\n\t\tfor (const callback of this.subscribers) {\n\t\t\tcallback(value);\n\t\t}\n\t}\n\n\tgetValue() {\n\t\treturn this.value;\n\t}\n\n\tsubscribe(callback: (value: T) => void) {\n\t\tthis.subscribers.add(callback);\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(callback);\n\t\t};\n\t}\n}\n\nclass WhopCoreNavigation {\n\tpublic path = new WhopCoreObservable<{\n\t\tstack: Route[];\n\t\tcurrentIndex: number;\n\t}>({\n\t\tstack: [],\n\t\tcurrentIndex: 0,\n\t});\n\tpublic sheet = new WhopCoreObservable<Route | null>(null);\n\n\tconstructor() {\n\t\tthis.getFullStack = this.getFullStack.bind(this);\n\t\tthis.getCurrentSheet = this.getCurrentSheet.bind(this);\n\t\tthis.subscribeToPath = this.subscribeToPath.bind(this);\n\t\tthis.subscribeToSheet = this.subscribeToSheet.bind(this);\n\n\t\t// Subscribe to path changes and emit to SDK\n\t\tthis.path.subscribe((value) => {\n\t\t\tloadIframeSdk()\n\t\t\t\t.then((sdk) =>\n\t\t\t\t\tsdk.onNavigationStackChange({\n\t\t\t\t\t\tstack: value.stack,\n\t\t\t\t\t\tcurrentIndex: value.currentIndex,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.catch(() => {});\n\t\t});\n\t}\n\n\tpush(route: Route) {\n\t\tif (this.getCurrent().path.join(\"/\") === route.path.join(\"/\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { stack } = this.path.getValue();\n\t\tconst newStack = [...stack, route];\n\t\tthis.path.setValue({ stack: newStack, currentIndex: newStack.length - 1 });\n\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\tconst pathBits = route.path.join(\"/\");\n\t\t\t\tconst paramsBits = Object.entries(route.params)\n\t\t\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t\t\t.join(\"&\");\n\t\t\t\twindow.history.pushState(\n\t\t\t\t\t{ route, index: newStack.length },\n\t\t\t\t\t\"\",\n\t\t\t\t\t`#${pathBits}?${paramsBits}`,\n\t\t\t\t);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tpop(): boolean {\n\t\tif (!this.canPop()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof window !== \"undefined\" && window.history) {\n\t\t\ttry {\n\t\t\t\twindow.history.back();\n\t\t\t} catch {}\n\t\t}\n\t\treturn true;\n\t}\n\n\tcanPop(): boolean {\n\t\treturn this.path.getValue().stack.length > 1;\n\t}\n\n\tgetFullStack() {\n\t\treturn this.path.getValue().stack;\n\t}\n\n\tgetCurrent() {\n\t\tconst { stack } = this.path.getValue();\n\t\treturn (\n\t\t\tstack[stack.length - 1] ?? {\n\t\t\t\tpath: [],\n\t\t\t\tparams: {},\n\t\t\t}\n\t\t);\n\t}\n\n\tpresentSheet(route: Route) {\n\t\tthis.sheet.setValue(route);\n\t}\n\n\tdismissSheet() {\n\t\tthis.sheet.setValue(null);\n\t}\n\n\tgetCurrentSheet() {\n\t\treturn this.sheet.getValue() ?? null;\n\t}\n\n\tsubscribeToPath(callback: (route: Route[]) => void) {\n\t\treturn this.path.subscribe((value) => callback(value.stack));\n\t}\n\n\tsubscribeToSheet(callback: (route: Route | null) => void) {\n\t\treturn this.sheet.subscribe(callback);\n\t}\n}\n\nexport type TWhopCoreNavigation = WhopCoreNavigation;\n\nconst navigation = new WhopCoreNavigation();\nif (typeof window !== \"undefined\" && Platform.OS === \"web\") {\n\t// biome-ignore lint/suspicious/noExplicitAny: <explanation>\n\t(window as any).whopCoreNavigation = navigation;\n\n\twindow.addEventListener(\"popstate\", (e) => {\n\t\tconst { stack: currentStack, currentIndex } = navigation.path.getValue();\n\t\tconst currentLength = currentStack.length;\n\n\t\tif (!e.state) {\n\t\t\t// Browser back with no state - pop from stack\n\t\t\tconst newStack = currentStack.slice(0, -1);\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: Math.max(0, currentIndex - 1),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst index = e.state.index;\n\t\tconst route = e.state.route;\n\n\t\tif (index < currentLength) {\n\t\t\t// Going back\n\t\t\tconst newStack = currentStack.slice(0, -1);\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: Math.max(0, currentIndex - 1),\n\t\t\t});\n\t\t} else {\n\t\t\t// Going forward\n\t\t\tconst newStack = [...currentStack, route];\n\t\t\tnavigation.path.setValue({\n\t\t\t\tstack: newStack,\n\t\t\t\tcurrentIndex: newStack.length - 1,\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction ok(data: unknown): FunctionCallResult {\n\treturn { isOk: true, data: JSON.stringify(data), errorMessage: null };\n}\n\nfunction err(message: string): FunctionCallResult {\n\treturn { isOk: false, data: null, errorMessage: message };\n}\n\nfunction getOrigin(): string {\n\tif (typeof window !== \"undefined\" && window.location) {\n\t\treturn window.location.origin;\n\t}\n\treturn \"\";\n}\n\nconst syncHandlers: ExecSyncApi = {\n\tgetAppApiOrigin() {\n\t\treturn { apiOrigin: getOrigin() };\n\t},\n\tcacheGet({ key }: { key?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key) {\n\t\t\t\treturn { data: window.localStorage.getItem(key) };\n\t\t\t}\n\t\t\treturn { data: null };\n\t\t} catch {\n\t\t\treturn { data: null };\n\t\t}\n\t},\n\tcacheSet({ key, data }: { key?: string | null; data?: string | null }) {\n\t\ttry {\n\t\t\tif (typeof window !== \"undefined\" && window.localStorage && key != null) {\n\t\t\t\tif (data == null) {\n\t\t\t\t\twindow.localStorage.removeItem(key);\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.setItem(key, data);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t},\n\trouterPush(route) {\n\t\tif (route.origin) {\n\t\t\tconst path = `/${route.path.join(\"/\")}`;\n\t\t\tconst url = new URL(path, route.origin);\n\t\t\tfor (const [k, v] of Object.entries(route.params ?? {})) {\n\t\t\t\turl.searchParams.set(k, v);\n\t\t\t}\n\t\t\tloadIframeSdk().then((sdk) => sdk.openExternalUrl({ url: url.href }));\n\t\t} else {\n\t\t\tnavigation.push(route);\n\t\t}\n\t\treturn {};\n\t},\n\trouterPop() {\n\t\tnavigation.pop();\n\t\treturn {};\n\t},\n\trouterGetCurrent() {\n\t\treturn navigation.getCurrent();\n\t},\n\tsetNavigationBarData() {\n\t\treturn {};\n\t},\n\trouterPresentSheet({ path, params }: Route) {\n\t\tnavigation.presentSheet({\n\t\t\tpath: Array.from(path ?? []),\n\t\t\tparams: params ?? {},\n\t\t});\n\t\treturn {};\n\t},\n\trouterDismissSheet() {\n\t\tnavigation.dismissSheet();\n\t\treturn {};\n\t},\n\trouterGetCurrentSheet() {\n\t\treturn navigation.getCurrentSheet() ?? null;\n\t},\n\tdowngradeToWebView() {\n\t\treturn {};\n\t},\n\tgetHostAppDetails() {\n\t\treturn {\n\t\t\tbuild: \"web\",\n\t\t\tversion: \"0.0.0\",\n\t\t\tplatform: \"web\",\n\t\t\tbuildType: \"appstore\",\n\t\t};\n\t},\n\tsetScreenOrientationMode() {\n\t\treturn {};\n\t},\n};\n\nlet iframeModulePromise: Promise<typeof import(\"@whop/iframe\")> | null = null;\n\nasync function loadIframeModule() {\n\tif (!iframeModulePromise) {\n\t\tiframeModulePromise = import(\"@whop/iframe\");\n\t}\n\treturn await iframeModulePromise;\n}\n\nlet iframeSdk: ReturnType<typeof import(\"@whop/iframe\").createSdk> | null =\n\tnull;\n\nasync function loadIframeSdk() {\n\tif (!iframeSdk) {\n\t\tconst module = await loadIframeModule();\n\t\tiframeSdk = module.createSdk({\n\t\t\tappId: process.env.NEXT_PUBLIC_WHOP_APP_ID,\n\t\t\toverrideParentOrigins: [\"https://whop.com\", \"http://localhost:8004\"],\n\t\t\tonMessage: {\n\t\t\t\tnavigateBack: () => {\n\t\t\t\t\tnavigation.pop();\n\t\t\t\t\treturn \"ok\" as const;\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\t// Emit initial stack state after SDK is ready\n\t\tconst { stack, currentIndex } = navigation.path.getValue();\n\t\tif (stack.length > 0) {\n\t\t\tiframeSdk\n\t\t\t\t.onNavigationStackChange({\n\t\t\t\t\tstack,\n\t\t\t\t\tcurrentIndex,\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t}\n\t}\n\treturn iframeSdk;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\ntype MakeAsync<T extends Record<string, any>> = {\n\t[K in keyof T]: (params: Parameters<T[K]>[0]) => Promise<ReturnType<T[K]>>;\n};\n\nconst asyncHandlers: MakeAsync<Pick<ExecAsyncApi, \"inAppPurchase\">> = {\n\tinAppPurchase: async ({ planId, id }) => {\n\t\tconst sdk = await loadIframeSdk();\n\t\tconst result = await sdk.inAppPurchase({ planId, id: id ?? undefined });\n\t\tif (result.status === \"ok\") {\n\t\t\treturn {\n\t\t\t\tsessionId: result.data.sessionId,\n\t\t\t\treceiptId: result.data.receiptId,\n\t\t\t};\n\t\t}\n\t\tthrow new Error(result.error);\n\t},\n};\n\nconst nativeWhopCoreStub = {\n\texecSync(name: string, paramsJson: string): FunctionCallResult {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = syncHandlers[name as keyof typeof syncHandlers];\n\t\t\tif (!handler) return err(`Unknown sync method: ${name}`);\n\t\t\tconst result = handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n\tasync execAsync(\n\t\tname: string,\n\t\tparamsJson: string,\n\t): Promise<FunctionCallResult> {\n\t\ttry {\n\t\t\tconst params = paramsJson ? JSON.parse(paramsJson) : {};\n\t\t\tconst handler = (\n\t\t\t\tasyncHandlers as Record<string, (p: unknown) => Promise<unknown>>\n\t\t\t)[name];\n\t\t\tif (!handler) return err(`Unknown async method: ${name}`);\n\t\t\tconst result = await handler(params);\n\t\t\treturn ok(result);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e.message : \"Unknown error\");\n\t\t}\n\t},\n};\n\nexport default nativeWhopCoreStub;\n","import nativeWhopCore from \"./native-whop-core\";\nimport type { PathParams, PathParamsWithOrigin } from \"./props\";\n\n// biome-ignore lint/complexity/noBannedTypes: allow here\ntype EmptyObject = {};\n\nexport interface ExecSyncApi {\n\tgetAppApiOrigin(params: EmptyObject): { apiOrigin: string };\n\tcacheGet(params: { key?: string | null }): { data?: string | null };\n\tcacheSet(params: { key?: string | null; data?: string | null }): EmptyObject;\n\trouterPush(params: PathParamsWithOrigin): EmptyObject;\n\trouterPop(params: EmptyObject): EmptyObject;\n\trouterGetCurrent(params: EmptyObject): PathParams;\n\tsetNavigationBarData(params: {\n\t\ttitle?: string | null;\n\t\tdescription?: string | null;\n\t}): EmptyObject;\n\trouterPresentSheet(params: PathParams): EmptyObject;\n\trouterDismissSheet(params: EmptyObject): EmptyObject;\n\trouterGetCurrentSheet(params: EmptyObject): PathParams | null | undefined;\n\tdowngradeToWebView(params: EmptyObject): EmptyObject;\n\tgetHostAppDetails(params: EmptyObject): {\n\t\tbuild: string;\n\t\tversion: string;\n\t\tplatform: \"ios\" | \"android\" | \"web\";\n\t\tbuildType: \"appstore\" | \"testflight\" | \"debug\";\n\t};\n\tsetScreenOrientationMode(params: {\n\t\ttargetScreenOrientationMode: \"portrait\" | \"landscape\" | \"rotate\";\n\t}): EmptyObject;\n}\n\nexport interface ExecAsyncApi extends ExecSyncApi {\n\tinAppPurchase(params: { id?: string | null; planId: string }): {\n\t\tsessionId: string;\n\t\treceiptId: string;\n\t};\n}\n\nexport function __internal_execSync<F extends keyof ExecSyncApi>(\n\tname: F,\n\tparams: Parameters<ExecSyncApi[F]>[0],\n): ReturnType<ExecSyncApi[F]> {\n\tconst resultJson = nativeWhopCore.execSync(name, JSON.stringify(params));\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecSyncApi[F]>;\n}\n\nexport async function __internal_execAsync<F extends keyof ExecAsyncApi>(\n\tname: F,\n\tparams: Parameters<ExecAsyncApi[F]>[0],\n): Promise<ReturnType<ExecAsyncApi[F]>> {\n\tconst resultJson = await nativeWhopCore.execAsync(\n\t\tname,\n\t\tJSON.stringify(params),\n\t);\n\n\tif (!resultJson.isOk) {\n\t\tthrow new Error(`Failed to execute ${name}: ${resultJson.errorMessage}`);\n\t}\n\n\treturn JSON.parse(resultJson.data || \"{}\") as ReturnType<ExecAsyncApi[F]>;\n}\n","/**\n * Web-safe wrapper for react-native-haptic-feedback.\n * - Lazily imports the native module only in native environments.\n * - Provides a no-op fallback on web to avoid runtime crashes.\n */\n\ntype HapticType =\n\t| \"selection\"\n\t| \"impactLight\"\n\t| \"impactMedium\"\n\t| \"impactHeavy\"\n\t| \"notificationSuccess\"\n\t| \"notificationWarning\"\n\t| \"notificationError\";\n\ntype HapticOptions = {\n\tenableVibrateFallback?: boolean;\n\tignoreAndroidSystemSettings?: boolean;\n};\n\n// Singleton holder for the native module once loaded\nlet nativeModule: {\n\ttrigger: (type: HapticType, options?: HapticOptions) => void;\n} | null = null;\nlet loadingPromise: Promise<void> | null = null;\n\nasync function ensureNativeLoaded(): Promise<void> {\n\t// If on web, skip loading entirely\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore - process may not be typed in RN web builds\n\tconst isWeb =\n\t\ttypeof document !== \"undefined\" && typeof window !== \"undefined\";\n\tif (isWeb) return;\n\n\tif (nativeModule || loadingPromise) {\n\t\treturn loadingPromise ?? Promise.resolve();\n\t}\n\n\tloadingPromise = import(\"react-native-haptic-feedback\")\n\t\t.then((mod) => {\n\t\t\tnativeModule = { trigger: mod.default.trigger };\n\t\t})\n\t\t.catch(() => {\n\t\t\t// Keep nativeModule null; fall back to noop\n\t\t})\n\t\t.finally(() => {\n\t\t\tloadingPromise = null;\n\t\t});\n\n\treturn loadingPromise;\n}\n\nconst HAPTIC_NOOP = {\n\ttrigger: (_type: HapticType, _options?: HapticOptions) => {\n\t\t// no-op on web\n\t},\n};\n\nconst Haptics = {\n\tasync trigger(type: HapticType, options?: HapticOptions): Promise<void> {\n\t\tawait ensureNativeLoaded();\n\t\tif (nativeModule) {\n\t\t\ttry {\n\t\t\t\tnativeModule.trigger(type, options);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tHAPTIC_NOOP.trigger(type, options);\n\t},\n};\n\nexport default Haptics;\n"],"mappings":"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","names":["Platform","Platform"]}
|
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.
|
|
4
|
+
"version": "0.1.10",
|
|
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.
|
|
48
|
+
"@whop/sdk": "0.0.20",
|
|
49
49
|
"dotenv": "16.5.0",
|
|
50
50
|
"esbuild": "0.25.9",
|
|
51
51
|
"events": "3.3.0",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"qrcode-terminal": "0.12.0",
|
|
57
57
|
"rimraf": "6.0.1",
|
|
58
58
|
"@whop/api": "0.0.51",
|
|
59
|
-
"@whop/iframe": "0.0.
|
|
59
|
+
"@whop/iframe": "0.0.4"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/babel__core": "7.20.5",
|