diff --git a/.changeset/wise-houses-shop.md b/.changeset/wise-houses-shop.md new file mode 100644 index 0000000000..f9844cabd2 --- /dev/null +++ b/.changeset/wise-houses-shop.md @@ -0,0 +1,5 @@ +--- +"@clerk/shared": patch +--- + +Improve compatibility with Expo diff --git a/packages/shared/.gitignore b/packages/shared/.gitignore new file mode 100644 index 0000000000..45af1b0ba8 --- /dev/null +++ b/packages/shared/.gitignore @@ -0,0 +1,19 @@ +browser +callWithRetry +color +cookie +date +deprecated +error +file +globs +handleValueOrFn +isomorphicAtob +keys +loadScript +localStorageBroadcastChannel +poller +proxy +underscore +url +react \ No newline at end of file diff --git a/packages/shared/package.json b/packages/shared/package.json index 11a2a911c8..ce76bcf815 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -7,7 +7,6 @@ "dist" ], "main": "./dist/index.js", - "module": "./dist/index.mjs", "exports": { ".": { "import": { @@ -45,6 +44,7 @@ "dev": "tsup --watch", "dev:publish": "npm run dev -- --env.publish", "publish:local": "npx yalc push --replace --sig", + "postbuild": "node ../../scripts/subpath-workaround.mjs shared", "clean": "rimraf ./dist", "lint": "eslint src/", "lint:publint": "publint", diff --git a/packages/shared/subpaths.mjs b/packages/shared/subpaths.mjs new file mode 100644 index 0000000000..6a1c22d8ec --- /dev/null +++ b/packages/shared/subpaths.mjs @@ -0,0 +1,25 @@ +// This file is a helper for the "subpath-workaround.mjs" script +// We have to polyfill our "exports" subpaths :cry: + +export const subpathNames = [ + 'browser', + 'callWithRetry', + 'color', + 'cookie', + 'date', + 'deprecated', + 'error', + 'file', + 'globs', + 'handleValueOrFn', + 'isomorphicAtob', + 'keys', + 'loadScript', + 'localStorageBroadcastChannel', + 'poller', + 'proxy', + 'underscore', + 'url', +]; + +export const subpathFoldersBarrel = ['react']; diff --git a/scripts/subpath-workaround.mjs b/scripts/subpath-workaround.mjs new file mode 100644 index 0000000000..8c3c507256 --- /dev/null +++ b/scripts/subpath-workaround.mjs @@ -0,0 +1,57 @@ +#!/usr/bin/env zx + +import 'zx/globals'; + +import fs from 'fs'; + +const loadJSON = path => JSON.parse(fs.readFileSync(new URL(path, import.meta.url))); +const writeJSON = (path, contents) => + fs.writeFileSync(new URL(path, import.meta.url), JSON.stringify(contents, null, 2)); + +const pkgJsonPlaceholder = name => ({ + main: `../dist/${name}.js`, +}); +const pkgJsonBarrelPlaceholder = name => ({ + main: `../dist/${name}/index.js`, +}); + +async function run() { + const pkgName = argv._[0]; + console.log(`Loading package.json for ${pkgName}`); + const pkgFile = loadJSON(`../packages/${pkgName}/package.json`); + const subpathHelperFile = await import(`../packages/${pkgName}/subpaths.mjs`); + + console.log( + `Found ${subpathHelperFile.subpathNames.length} subpaths and ${subpathHelperFile.subpathFoldersBarrel.length} subpath barrels`, + ); + + // Check if pkgFile.files already contains the subpaths. This means that the script has already been run and we should exit early + const subpathsAlreadyAdded = subpathHelperFile.subpathNames.some(name => pkgFile.files.includes(name)); + + if (subpathsAlreadyAdded) { + return console.log(`Subpaths already added to ${pkgName} package.json. Exiting early`); + } + + // Add all subpaths to the "files" property on package.json + pkgFile.files = [...pkgFile.files, ...subpathHelperFile.subpathNames, ...subpathHelperFile.subpathFoldersBarrel]; + + writeJSON(`../packages/${pkgName}/package.json`, pkgFile); + + console.log(`Overwrote package.json for ${pkgName} with subpaths`); + + // Create directories for each subpath name using the pkgJsonPlaceholder + subpathHelperFile.subpathNames.forEach(name => { + fs.mkdirSync(new URL(`../packages/${pkgName}/${name}`, import.meta.url)); + writeJSON(`../packages/${pkgName}/${name}/package.json`, pkgJsonPlaceholder(name)); + }); + + // Create directories for each subpath barrel file using the pkgJsonBarrelPlaceholder + subpathHelperFile.subpathFoldersBarrel.forEach(name => { + fs.mkdirSync(new URL(`../packages/${pkgName}/${name}`, import.meta.url)); + writeJSON(`../packages/${pkgName}/${name}/package.json`, pkgJsonBarrelPlaceholder(name)); + }); + + console.log('Successfully created subpath directories with placeholder files'); +} + +await run();