From 0bfc8321cee0b67b1c62413ae0b11258a18fa955 Mon Sep 17 00:00:00 2001 From: Justin Hernandez Date: Sun, 10 Aug 2025 19:27:46 -0700 Subject: [PATCH 1/2] Add tsup config and postbuild shims --- packages/mobile-sdk-alpha/package.json | 26 ++++++---- .../mobile-sdk-alpha/scripts/postBuild.mjs | 50 +++++++++++++++++++ .../mobile-sdk-alpha/scripts/shimConfigs.js | 2 + packages/mobile-sdk-alpha/tsconfig.cjs.json | 10 ++++ packages/mobile-sdk-alpha/tsup.config.ts | 32 ++++++++++++ 5 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 packages/mobile-sdk-alpha/scripts/postBuild.mjs create mode 100644 packages/mobile-sdk-alpha/scripts/shimConfigs.js create mode 100644 packages/mobile-sdk-alpha/tsconfig.cjs.json create mode 100644 packages/mobile-sdk-alpha/tsup.config.ts diff --git a/packages/mobile-sdk-alpha/package.json b/packages/mobile-sdk-alpha/package.json index 34f755f4f..f1e36f2da 100644 --- a/packages/mobile-sdk-alpha/package.json +++ b/packages/mobile-sdk-alpha/package.json @@ -13,22 +13,28 @@ "type": "module", "exports": { ".": { - "types": "./dist/index.d.ts", - "react-native": "./dist/index.js", - "browser": "./dist/browser.js", - "import": "./dist/index.js", - "require": "./dist/index.cjs", - "default": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "react-native": "./dist/esm/index.js", + "browser": "./dist/esm/browser.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.cjs", + "default": "./dist/esm/index.js" + }, + "./browser": { + "types": "./dist/esm/browser.d.ts", + "import": "./dist/esm/browser.js", + "require": "./dist/cjs/browser.cjs" } }, - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "files": [ "dist" ], "scripts": { - "build": "tsup src/index.ts src/browser.ts --dts --format esm,cjs --clean --out-dir dist", + "build": "rm -rf dist && tsup && yarn postbuild", + "postbuild": "node ./scripts/postBuild.mjs", "fmt": "prettier --check .", "fmt:fix": "prettier --write .", "format": "yarn nice", diff --git a/packages/mobile-sdk-alpha/scripts/postBuild.mjs b/packages/mobile-sdk-alpha/scripts/postBuild.mjs new file mode 100644 index 000000000..a1215689a --- /dev/null +++ b/packages/mobile-sdk-alpha/scripts/postBuild.mjs @@ -0,0 +1,50 @@ +import { writeFileSync, mkdirSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { shimConfigs } from './shimConfigs.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const DIST = path.resolve(__dirname, '..', 'dist'); + +// Read version from package.json +const packageJsonPath = path.resolve(__dirname, '..', 'package.json'); +const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')); + +// Write package.json files for module type resolution +writeFileSync(path.join(DIST, 'esm', 'package.json'), JSON.stringify({ type: 'module' }, null, 4)); +writeFileSync(path.join(DIST, 'cjs', 'package.json'), JSON.stringify({ type: 'commonjs' }, null, 4)); + +// Create a package.json in dist root for Metro +const distPackageJson = { + name: '@selfxyz/mobile-sdk-alpha', + version: packageJson.version, + type: 'module', + exports: { + '.': './esm/index.js', + './browser': './esm/browser.js', + }, +}; +writeFileSync(path.join(DIST, 'package.json'), JSON.stringify(distPackageJson, null, 4)); + +// Helper to create shims for Metro +function createShim(shimPath, targetPath, name) { + const shimDir = path.join(DIST, shimPath); + mkdirSync(shimDir, { recursive: true }); + + const cjsTargetPath = targetPath.replace('/esm/', '/cjs/').replace('.js', '.cjs'); + const dtsTarget = targetPath.replace('.js', ''); + + writeFileSync( + path.join(shimDir, 'index.js'), + `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name}\nmodule.exports = require('${cjsTargetPath}');`, + ); + writeFileSync( + path.join(shimDir, 'index.d.ts'), + `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name} types\nexport * from "${dtsTarget}";`, + ); +} + +// Create all shims from configuration +shimConfigs.forEach(({ shimPath, targetPath, name }) => { + createShim(shimPath, targetPath, name); +}); diff --git a/packages/mobile-sdk-alpha/scripts/shimConfigs.js b/packages/mobile-sdk-alpha/scripts/shimConfigs.js new file mode 100644 index 000000000..a31089472 --- /dev/null +++ b/packages/mobile-sdk-alpha/scripts/shimConfigs.js @@ -0,0 +1,2 @@ +// Shim configurations for Metro compatibility +export const shimConfigs = [{ shimPath: 'browser', targetPath: '../esm/browser.js', name: 'browser' }]; diff --git a/packages/mobile-sdk-alpha/tsconfig.cjs.json b/packages/mobile-sdk-alpha/tsconfig.cjs.json new file mode 100644 index 000000000..619b709d1 --- /dev/null +++ b/packages/mobile-sdk-alpha/tsconfig.cjs.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "./dist/cjs", + "declarationDir": "./dist/cjs", + "esModuleInterop": true + } +} diff --git a/packages/mobile-sdk-alpha/tsup.config.ts b/packages/mobile-sdk-alpha/tsup.config.ts new file mode 100644 index 000000000..f102fed53 --- /dev/null +++ b/packages/mobile-sdk-alpha/tsup.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig([ + { + entry: { + index: 'src/index.ts', + browser: 'src/browser.ts', + }, + format: ['esm'], + dts: true, + sourcemap: true, + splitting: false, + clean: true, + outDir: 'dist/esm', + tsconfig: './tsconfig.json', + target: 'es2020', + }, + { + entry: { + index: 'src/index.ts', + browser: 'src/browser.ts', + }, + format: ['cjs'], + dts: false, + sourcemap: true, + splitting: false, + clean: false, + outDir: 'dist/cjs', + tsconfig: './tsconfig.cjs.json', + target: 'es2020', + }, +]); From c4077b6409716493e05d5b8131bf11d38519012e Mon Sep 17 00:00:00 2001 From: Justin Hernandez Date: Sun, 10 Aug 2025 22:38:46 -0700 Subject: [PATCH 2/2] cr feedback --- .../mobile-sdk-alpha/scripts/postBuild.mjs | 62 +++++++++++++------ packages/mobile-sdk-alpha/tsup.config.ts | 1 + 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/packages/mobile-sdk-alpha/scripts/postBuild.mjs b/packages/mobile-sdk-alpha/scripts/postBuild.mjs index a1215689a..e35706389 100644 --- a/packages/mobile-sdk-alpha/scripts/postBuild.mjs +++ b/packages/mobile-sdk-alpha/scripts/postBuild.mjs @@ -1,6 +1,7 @@ -import { writeFileSync, mkdirSync, readFileSync } from 'node:fs'; +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; + import { shimConfigs } from './shimConfigs.js'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -11,8 +12,21 @@ const packageJsonPath = path.resolve(__dirname, '..', 'package.json'); const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')); // Write package.json files for module type resolution -writeFileSync(path.join(DIST, 'esm', 'package.json'), JSON.stringify({ type: 'module' }, null, 4)); -writeFileSync(path.join(DIST, 'cjs', 'package.json'), JSON.stringify({ type: 'commonjs' }, null, 4)); +try { + // Ensure directories exist before writing files + mkdirSync(path.join(DIST, 'esm'), { recursive: true }); + mkdirSync(path.join(DIST, 'cjs'), { recursive: true }); + + writeFileSync(path.join(DIST, 'esm', 'package.json'), JSON.stringify({ type: 'module' }, null, 4)); + writeFileSync(path.join(DIST, 'cjs', 'package.json'), JSON.stringify({ type: 'commonjs' }, null, 4)); +} catch (error) { + console.error('Failed to write module type package.json files:', error.message); + console.error('Target paths:', { + esm: path.join(DIST, 'esm', 'package.json'), + cjs: path.join(DIST, 'cjs', 'package.json'), + }); + process.exit(1); +} // Create a package.json in dist root for Metro const distPackageJson = { @@ -24,24 +38,36 @@ const distPackageJson = { './browser': './esm/browser.js', }, }; -writeFileSync(path.join(DIST, 'package.json'), JSON.stringify(distPackageJson, null, 4)); +try { + writeFileSync(path.join(DIST, 'package.json'), JSON.stringify(distPackageJson, null, 4)); +} catch (error) { + console.error('Failed to write dist package.json:', error.message); + console.error('Target path:', path.join(DIST, 'package.json')); + process.exit(1); +} // Helper to create shims for Metro function createShim(shimPath, targetPath, name) { - const shimDir = path.join(DIST, shimPath); - mkdirSync(shimDir, { recursive: true }); - - const cjsTargetPath = targetPath.replace('/esm/', '/cjs/').replace('.js', '.cjs'); - const dtsTarget = targetPath.replace('.js', ''); - - writeFileSync( - path.join(shimDir, 'index.js'), - `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name}\nmodule.exports = require('${cjsTargetPath}');`, - ); - writeFileSync( - path.join(shimDir, 'index.d.ts'), - `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name} types\nexport * from "${dtsTarget}";`, - ); + try { + const shimDir = path.join(DIST, shimPath); + mkdirSync(shimDir, { recursive: true }); + + const cjsTargetPath = targetPath.replace('/esm/', '/cjs/').replace('.js', '.cjs'); + const dtsTarget = targetPath.replace('.js', ''); + + writeFileSync( + path.join(shimDir, 'index.js'), + `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name}\nmodule.exports = require('${cjsTargetPath}');`, + ); + writeFileSync( + path.join(shimDir, 'index.d.ts'), + `// Shim file to help Metro resolve @selfxyz/mobile-sdk-alpha/${name} types\nexport * from "${dtsTarget}";`, + ); + } catch (error) { + console.error(`Failed to create shim for ${name}:`, error.message); + console.error('Shim path:', path.join(DIST, shimPath)); + process.exit(1); + } } // Create all shims from configuration diff --git a/packages/mobile-sdk-alpha/tsup.config.ts b/packages/mobile-sdk-alpha/tsup.config.ts index f102fed53..bbb388742 100644 --- a/packages/mobile-sdk-alpha/tsup.config.ts +++ b/packages/mobile-sdk-alpha/tsup.config.ts @@ -28,5 +28,6 @@ export default defineConfig([ outDir: 'dist/cjs', tsconfig: './tsconfig.cjs.json', target: 'es2020', + outExtension: ({ format }) => ({ js: format === 'cjs' ? '.cjs' : '.js' }), }, ]);