{"version":3,"file":"server.es.min.mjs","sources":["../.build/logger/ReactLogger.js","../.build/logger/createLogger.js","../.build/client/createInstance.js","../.build/utils/helpers.js"],"sourcesContent":["/**\n * Copyright 2026, Optimizely\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LogLevel } from '@optimizely/optimizely-sdk';\nconst LOG_PREFIX = '[OPTIMIZELY - REACT]';\nconst defaultLogHandler = {\n    log(level, message) {\n        switch (level) {\n            case LogLevel.Debug:\n                console.debug(message);\n                break;\n            case LogLevel.Info:\n                console.info(message);\n                break;\n            case LogLevel.Warn:\n                console.warn(message);\n                break;\n            case LogLevel.Error:\n                console.error(message);\n                break;\n        }\n    },\n};\nexport function createReactLogger(config) {\n    var _a;\n    const handler = (_a = config.logHandler) !== null && _a !== void 0 ? _a : defaultLogHandler;\n    const level = config.logLevel;\n    return {\n        debug: (msg) => {\n            if (level <= LogLevel.Debug)\n                handler.log(LogLevel.Debug, `${LOG_PREFIX} - DEBUG ${msg}`);\n        },\n        info: (msg) => {\n            if (level <= LogLevel.Info)\n                handler.log(LogLevel.Info, `${LOG_PREFIX} - INFO ${msg}`);\n        },\n        warn: (msg) => {\n            if (level <= LogLevel.Warn)\n                handler.log(LogLevel.Warn, `${LOG_PREFIX} - WARN ${msg}`);\n        },\n        error: (msg) => {\n            if (level <= LogLevel.Error)\n                handler.log(LogLevel.Error, `${LOG_PREFIX} - ERROR ${msg}`);\n        },\n    };\n}\n//# sourceMappingURL=ReactLogger.js.map","/**\n * Copyright 2026, Optimizely\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createLogger as jsCreateLogger, LogLevel, DEBUG, INFO, WARN, ERROR } from '@optimizely/optimizely-sdk';\nimport { createReactLogger } from './ReactLogger';\nexport const REACT_LOGGER = Symbol('react-logger');\nfunction resolveLogLevel(preset) {\n    if (preset === DEBUG)\n        return LogLevel.Debug;\n    if (preset === INFO)\n        return LogLevel.Info;\n    if (preset === WARN)\n        return LogLevel.Warn;\n    if (preset === ERROR)\n        return LogLevel.Error;\n    return LogLevel.Error;\n}\nexport function createLogger(config) {\n    const opaqueLogger = jsCreateLogger(config);\n    const reactLogger = createReactLogger({\n        logLevel: resolveLogLevel(config.level),\n        logHandler: config.logHandler,\n    });\n    opaqueLogger[REACT_LOGGER] = reactLogger;\n    return opaqueLogger;\n}\n//# sourceMappingURL=createLogger.js.map","/**\n * Copyright 2026, Optimizely\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createInstance as jsCreateInstance } from '@optimizely/optimizely-sdk';\nimport { REACT_LOGGER } from '../logger/createLogger';\nexport const CLIENT_ENGINE = 'react-sdk';\nexport const CLIENT_VERSION = '4.0.0';\nexport const REACT_CLIENT_META = Symbol('react-client-meta');\n/**\n * Creates an Optimizely client instance for use with React SDK.\n *\n * Uses prototype delegation so the returned object inherits all methods\n * from the JS SDK client while carrying React-specific metadata.\n *\n * @param config - Configuration object for the Optimizely client\n * @returns An OptimizelyClient instance with React SDK metadata\n */\nexport function createInstance(config) {\n    let reactLogger;\n    if (config.logger) {\n        reactLogger = config.logger[REACT_LOGGER];\n        delete config.logger[REACT_LOGGER];\n    }\n    const jsClient = jsCreateInstance(Object.assign(Object.assign({}, config), { clientEngine: CLIENT_ENGINE, clientVersion: CLIENT_VERSION }));\n    const reactClient = Object.create(jsClient);\n    reactClient[REACT_CLIENT_META] = {\n        hasOdpManager: !!config.odpManager,\n        hasVuidManager: !!config.vuidManager,\n        logger: reactLogger,\n    };\n    return reactClient;\n}\n//# sourceMappingURL=createInstance.js.map","/**\n * Copyright 2026, Optimizely\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { __awaiter } from \"tslib\";\n/**\n * Compares two string arrays for value equality (order-insensitive).\n * Used to prevent redundant user context creation when the segments prop\n * is referentially different but value-equal.\n */\nexport function areSegmentsEqual(a, b) {\n    if (a === b)\n        return true;\n    if (!a || !b)\n        return false;\n    if (a.length !== b.length)\n        return false;\n    const sortedA = [...a].sort();\n    const sortedB = [...b].sort();\n    return sortedA.every((val, i) => val === sortedB[i]);\n}\n/**\n * Compares two UserInfo objects for value equality.\n * Used to prevent redundant user context creation when the user prop\n * is referentially different but value-equal.\n */\nexport function areUsersEqual(user1, user2) {\n    if (user1 === user2)\n        return true;\n    if (!user1 && !user2)\n        return true;\n    if (!user1 || !user2)\n        return false;\n    if (user1.id !== user2.id)\n        return false;\n    const attrs1 = user1.attributes || {};\n    const attrs2 = user2.attributes || {};\n    const keys1 = Object.keys(attrs1);\n    const keys2 = Object.keys(attrs2);\n    if (keys1.length !== keys2.length)\n        return false;\n    for (const key of keys1) {\n        if (attrs1[key] !== attrs2[key])\n            return false;\n    }\n    return true;\n}\nconst QUALIFIED = 'qualified';\n/**\n * Extracts ODP segments from audience conditions in the datafile.\n * Looks for conditions with `match: 'qualified'` and collects their values.\n */\nfunction extractSegmentsFromConditions(condition) {\n    if (Array.isArray(condition)) {\n        return condition.flatMap(extractSegmentsFromConditions);\n    }\n    if (condition && typeof condition === 'object' && condition['match'] === QUALIFIED) {\n        const value = condition['value'];\n        return typeof value === 'string' && value.length > 0 ? [value] : [];\n    }\n    return [];\n}\n/**\n * Builds the GraphQL query payload for fetching audience segments from ODP.\n */\nfunction buildGraphQLQuery(userId, segmentsToCheck) {\n    const segmentsList = segmentsToCheck.map((s) => `\"${s}\"`).join(',');\n    const query = `query {customer(fs_user_id : \"${userId}\") {audiences(subset: [${segmentsList}]) {edges {node {name state}}}}}`;\n    return JSON.stringify({ query });\n}\n/**\n * Fetches qualified ODP segments for a user given a datafile and user ID.\n *\n * This is a standalone, self-contained utility that:\n * 1. Parses the datafile to extract ODP configuration (apiKey, apiHost)\n * 2. Collects all ODP segments referenced in audience conditions\n * 3. Queries the ODP GraphQL API\n * 4. Returns only the segments where the user is qualified\n *\n * @param userId - The user ID to fetch qualified segments for\n * @param datafile - The Optimizely datafile (JSON object or string)\n * @returns Object with `segments` (qualified segment names) and `error` (null on success).\n *\n * @example\n * ```ts\n * const { segments, error } = await getQualifiedSegments('user-123', datafile);\n * if (!error) {\n *   console.log('Qualified segments:', segments);\n * }\n * ```\n */\nexport function getQualifiedSegments(userId, datafile) {\n    return __awaiter(this, void 0, void 0, function* () {\n        var _a, _b, _c, _d;\n        let datafileObj;\n        if (typeof datafile === 'string') {\n            try {\n                datafileObj = JSON.parse(datafile);\n            }\n            catch (_e) {\n                return { segments: [], error: new Error('Invalid datafile: failed to parse JSON string') };\n            }\n        }\n        else if (typeof datafile === 'object' && datafile !== null) {\n            datafileObj = datafile;\n        }\n        else {\n            return { segments: [], error: new Error('Invalid datafile: expected a JSON string or object') };\n        }\n        // Extract ODP integration config from datafile\n        const odpIntegration = Array.isArray(datafileObj.integrations)\n            ? datafileObj.integrations.find((i) => i.key === 'odp')\n            : undefined;\n        const apiKey = odpIntegration === null || odpIntegration === void 0 ? void 0 : odpIntegration.publicKey;\n        const apiHost = odpIntegration === null || odpIntegration === void 0 ? void 0 : odpIntegration.host;\n        if (!apiKey || !apiHost) {\n            return { segments: [], error: new Error('ODP integration not found or missing publicKey/host') };\n        }\n        // Collect all ODP segments from audience conditions\n        const allSegments = new Set();\n        const audiences = [...(datafileObj.audiences || []), ...(datafileObj.typedAudiences || [])];\n        for (const audience of audiences) {\n            if (audience.conditions) {\n                let conditions = audience.conditions;\n                if (typeof conditions === 'string') {\n                    try {\n                        conditions = JSON.parse(conditions);\n                    }\n                    catch (_f) {\n                        continue;\n                    }\n                }\n                extractSegmentsFromConditions(conditions).forEach((s) => allSegments.add(s));\n            }\n        }\n        const segmentsToCheck = Array.from(allSegments);\n        if (segmentsToCheck.length === 0) {\n            return { segments: [], error: null };\n        }\n        const endpoint = `${apiHost}/v3/graphql`;\n        const query = buildGraphQLQuery(userId, segmentsToCheck);\n        try {\n            const response = yield fetch(endpoint, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'x-api-key': apiKey,\n                },\n                body: query,\n            });\n            if (!response.ok) {\n                return { segments: [], error: new Error(`ODP request failed with status ${response.status}`) };\n            }\n            const json = yield response.json();\n            if (((_a = json.errors) === null || _a === void 0 ? void 0 : _a.length) > 0) {\n                return { segments: [], error: new Error(`ODP GraphQL error: ${json.errors[0].message}`) };\n            }\n            const edges = (_d = (_c = (_b = json === null || json === void 0 ? void 0 : json.data) === null || _b === void 0 ? void 0 : _b.customer) === null || _c === void 0 ? void 0 : _c.audiences) === null || _d === void 0 ? void 0 : _d.edges;\n            if (!edges) {\n                return { segments: [], error: new Error('ODP response missing audience edges') };\n            }\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            const segments = edges.filter((edge) => edge.node.state === QUALIFIED).map((edge) => edge.node.name);\n            return { segments, error: null };\n        }\n        catch (e) {\n            return { segments: [], error: e instanceof Error ? e : new Error('ODP request failed') };\n        }\n    });\n}\n//# sourceMappingURL=helpers.js.map"],"names":["LOG_PREFIX","defaultLogHandler","log","level","message","LogLevel","Debug","console","debug","Info","info","Warn","warn","Error","error","REACT_LOGGER","Symbol","createLogger","config","opaqueLogger","jsCreateLogger","reactLogger","_a","handler","logHandler","logLevel","msg","createReactLogger","preset","DEBUG","INFO","WARN","REACT_CLIENT_META","createInstance","logger","jsClient","jsCreateInstance","Object","assign","clientEngine","clientVersion","reactClient","create","hasOdpManager","odpManager","hasVuidManager","vuidManager","QUALIFIED","extractSegmentsFromConditions","condition","Array","isArray","flatMap","value","length","getQualifiedSegments","userId","datafile","__awaiter","this","_b","_c","_d","datafileObj","JSON","parse","_e","segments","odpIntegration","integrations","find","i","key","undefined","apiKey","publicKey","apiHost","host","allSegments","Set","audiences","typedAudiences","audience","conditions","_f","forEach","s","add","segmentsToCheck","from","endpoint","query","map","join","stringify","buildGraphQLQuery","response","fetch","method","headers","body","ok","status","json","errors","edges","data","customer","filter","edge","node","state","name","e"],"mappings":"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"}