diff --git a/package.json b/package.json index f6c2520..1539a1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@agicash/opensecret-sdk", - "version": "0.1.0", + "version": "0.2.0", "publishConfig": { "access": "public" }, @@ -13,14 +13,19 @@ "files": [ "dist" ], - "main": "./dist/opensecret-react.umd.js", - "module": "./dist/opensecret-react.es.js", + "main": "./dist/opensecret-core.cjs.js", + "module": "./dist/opensecret-core.es.js", "types": "./dist/index.d.ts", "exports": { ".": { - "import": "./dist/opensecret-react.es.js", - "require": "./dist/opensecret-react.umd.js", + "import": "./dist/opensecret-core.es.js", + "require": "./dist/opensecret-core.cjs.js", "types": "./dist/index.d.ts" + }, + "./react": { + "import": "./dist/opensecret-react.es.js", + "require": "./dist/opensecret-react.cjs.js", + "types": "./dist/react.d.ts" } }, "scripts": { @@ -39,6 +44,14 @@ "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + }, "dependencies": { "@peculiar/x509": "^1.12.2", "@stablelib/base64": "^2.0.0", diff --git a/src/AI.tsx b/src/AI.tsx index f28e552..0709057 100644 --- a/src/AI.tsx +++ b/src/AI.tsx @@ -1,4 +1,4 @@ -import { useOpenSecret } from "./lib"; +import { useOpenSecret } from "./lib/react"; import { useState, FormEvent } from "react"; import OpenAI from "openai"; diff --git a/src/App.tsx b/src/App.tsx index e110afd..22b34bd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import "./App.css"; import { useState } from "react"; import React from "react"; -import { useOpenSecret } from "./lib"; +import { useOpenSecret } from "./lib/react"; import type { KVListItem } from "./lib"; import { schnorr, secp256k1 } from "@noble/curves/secp256k1"; import { AI } from "./AI"; diff --git a/src/lib/index.ts b/src/lib/index.ts index f74da29..8a87d60 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -127,24 +127,12 @@ export { EXPECTED_ROOT_CERT_HASH as expectedRootCertHash } from "./attestationForView"; -// Export the provider and context -export { OpenSecretProvider, OpenSecretContext } from "./main"; -export { OpenSecretDeveloper, OpenSecretDeveloperContext } from "./developer"; +// NOTE: The React provider, contexts, and hooks are intentionally NOT exported +// from the default barrel — importing the default package entry must pull ZERO +// react into the module graph. They are available via the "/react" subpath +// (see src/lib/react.ts). This keeps the core surface react-free. -// Export the hooks -export { useOpenSecret } from "./context"; -export { useOpenSecretDeveloper } from "./developerContext"; - -// Export types needed by consumers -export type { OpenSecretAuthState, OpenSecretContextType } from "./main"; -export type { - OpenSecretDeveloperAuthState, - OpenSecretDeveloperContextType, - DeveloperRole, - OrganizationDetails, - ProjectDetails, - ProjectSettings -} from "./developer"; +// Export core types needed by consumers export type { AttestationDocument } from "./attestation"; export type { ParsedAttestationView } from "./attestationForView"; export type { PcrConfig, Pcr0ValidationResult } from "./pcr"; diff --git a/src/lib/react.ts b/src/lib/react.ts new file mode 100644 index 0000000..d04cd8e --- /dev/null +++ b/src/lib/react.ts @@ -0,0 +1,20 @@ +// Opt-in React surface — import from "/react". +// Re-export the full core so /react remains a drop-in for the old single barrel. +export * from "./index"; + +// React provider, contexts, hooks +export { OpenSecretProvider, OpenSecretContext } from "./main"; +export { OpenSecretDeveloper, OpenSecretDeveloperContext } from "./developer"; +export { useOpenSecret } from "./context"; +export { useOpenSecretDeveloper } from "./developerContext"; + +// React-surface types +export type { OpenSecretAuthState, OpenSecretContextType } from "./main"; +export type { + OpenSecretDeveloperAuthState, + OpenSecretDeveloperContextType, + DeveloperRole, + OrganizationDetails, + ProjectDetails, + ProjectSettings +} from "./developer"; diff --git a/src/lib/util.ts b/src/lib/util.ts deleted file mode 100644 index fb1ede1..0000000 --- a/src/lib/util.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useEffect, useRef } from "react"; - -// Implementation that ensures callback only runs once, even in React strict mode -export function useOnMount(callback: () => void) { - const hasRun = useRef(false); - - // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => { - if (!hasRun.current) { - hasRun.current = true; - callback(); - } - }, []); -} - -// Helper function to sleep for a specified duration -export function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); -} diff --git a/src/main.tsx b/src/main.tsx index f8e8d12..689eea4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,7 +2,7 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import "./index.css"; import App from "./App.tsx"; -import { OpenSecretProvider } from "./lib"; +import { OpenSecretProvider } from "./lib/react"; createRoot(document.getElementById("root")!).render( diff --git a/vite.config.ts b/vite.config.ts index 34fefba..b25890a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -46,27 +46,28 @@ export default defineConfig({ }, build: { lib: { - entry: path.resolve(__dirname, "src/lib/index.ts"), - name: "OpenSecretReact", - fileName: (format) => `opensecret-react.${format}.js` + // Two entries: the default core barrel (react-free) and the opt-in react barrel. + // Multi-entry lib mode cannot emit UMD, so we emit ES + CJS only. + entry: { + index: path.resolve(__dirname, "src/lib/index.ts"), + react: path.resolve(__dirname, "src/lib/react.ts") + }, + formats: ["es", "cjs"], + // index -> opensecret-core.{es,cjs}.js ; react -> opensecret-react.{es,cjs}.js + fileName: (format, entryName) => { + const base = entryName === "index" ? "opensecret-core" : "opensecret-react"; + return `${base}.${format}.js`; + } }, rollupOptions: { // Externalize React and React DOM along with their internals external: [ - "react", + "react", "react-dom", "react/jsx-runtime", /^react\/.*/, /^react-dom\/.*/ - ], - output: { - // Provide global variables to use in the UMD build - globals: { - react: "React", - "react-dom": "ReactDOM", - "react/jsx-runtime": "React" - } - } + ] } } });