mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-05 10:36:06 -06:00
Compare commits
12 Commits
chore/upgr
...
vaxi/mobil
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
413e9575b6 | ||
|
|
712c3a0aaf | ||
|
|
55eb43f94e | ||
|
|
302c6a90c0 | ||
|
|
0982813fa7 | ||
|
|
403e337793 | ||
|
|
a8a299e4b8 | ||
|
|
18e597d8a3 | ||
|
|
e1a39d4ed9 | ||
|
|
959e46d5a9 | ||
|
|
7b0efc21b9 | ||
|
|
74d24f80d4 |
44
.github/dependabot.yml
vendored
44
.github/dependabot.yml
vendored
@@ -7,56 +7,76 @@ version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # For pnpm monorepos, use npm ecosystem
|
||||
directory: "/" # Root package.json
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
versioning-strategy: increase
|
||||
|
||||
# Apps directory packages
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/apps/demo"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/apps/demo-react-native"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/apps/storybook"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/apps/web"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
# Packages directory
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/database"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/lib"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/types"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/config-eslint"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/config-prettier"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/config-typescript"
|
||||
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/js-core"
|
||||
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/surveys"
|
||||
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/logger"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/js"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/react-native"
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/packages/vite-plugins"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -72,3 +72,4 @@ infra/terraform/.terraform/
|
||||
# IntelliJ IDEA
|
||||
/.idea/
|
||||
/*.iml
|
||||
packages/ios/FormbricksSDK/FormbricksSDK.xcodeproj/project.xcworkspace/xcuserdata
|
||||
|
||||
@@ -35,6 +35,6 @@
|
||||
"prop-types": "15.8.1",
|
||||
"storybook": "8.6.12",
|
||||
"tsup": "8.4.0",
|
||||
"vite": "6.3.2"
|
||||
"vite": "6.2.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ vi.mock("@formbricks/lib/crypto", () => ({
|
||||
// Mock constants
|
||||
vi.mock("@formbricks/lib/constants", () => ({
|
||||
ENCRYPTION_KEY: "test-encryption-key",
|
||||
FORMBRICKS_ENCRYPTION_KEY: "test-formbricks-encryption-key",
|
||||
}));
|
||||
|
||||
// Mock cuid2
|
||||
@@ -81,7 +80,6 @@ describe("generateSurveySingleUseId", () => {
|
||||
// Temporarily mock ENCRYPTION_KEY as undefined
|
||||
vi.doMock("@formbricks/lib/constants", () => ({
|
||||
ENCRYPTION_KEY: undefined,
|
||||
FORMBRICKS_ENCRYPTION_KEY: "test-formbricks-encryption-key",
|
||||
}));
|
||||
|
||||
// Re-import to get the new mock values
|
||||
@@ -94,7 +92,6 @@ describe("generateSurveySingleUseId", () => {
|
||||
// Temporarily mock ENCRYPTION_KEY as undefined
|
||||
vi.doMock("@formbricks/lib/constants", () => ({
|
||||
ENCRYPTION_KEY: undefined,
|
||||
FORMBRICKS_ENCRYPTION_KEY: "test-formbricks-encryption-key",
|
||||
}));
|
||||
|
||||
// Re-import to get the new mock values
|
||||
@@ -102,19 +99,4 @@ describe("generateSurveySingleUseId", () => {
|
||||
|
||||
expect(() => validateSurveySingleUseIdNoKey(mockEncryptedCuid)).toThrow("ENCRYPTION_KEY is not set");
|
||||
});
|
||||
|
||||
test("throws error when FORMBRICKS_ENCRYPTION_KEY is not set in validateSurveySingleUseId for AES128", async () => {
|
||||
// Temporarily mock FORMBRICKS_ENCRYPTION_KEY as undefined
|
||||
vi.doMock("@formbricks/lib/constants", () => ({
|
||||
ENCRYPTION_KEY: "test-encryption-key",
|
||||
FORMBRICKS_ENCRYPTION_KEY: undefined,
|
||||
}));
|
||||
|
||||
// Re-import to get the new mock values
|
||||
const { validateSurveySingleUseId: validateSurveySingleUseIdNoKey } = await import("./singleUseSurveys");
|
||||
|
||||
expect(() =>
|
||||
validateSurveySingleUseIdNoKey("M(.Bob=dS1!wUSH2lb,E7hxO=He1cnnitmXrG|Su/DKYZrPy~zgS)u?dgI53sfs/")
|
||||
).toThrow("FORMBRICKS_ENCRYPTION_KEY is not defined");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import cuid2 from "@paralleldrive/cuid2";
|
||||
import { ENCRYPTION_KEY, FORMBRICKS_ENCRYPTION_KEY } from "@formbricks/lib/constants";
|
||||
import { decryptAES128, symmetricDecrypt, symmetricEncrypt } from "@formbricks/lib/crypto";
|
||||
import { ENCRYPTION_KEY } from "@formbricks/lib/constants";
|
||||
import { symmetricDecrypt, symmetricEncrypt } from "@formbricks/lib/crypto";
|
||||
|
||||
// generate encrypted single use id for the survey
|
||||
export const generateSurveySingleUseId = (isEncrypted: boolean): string => {
|
||||
@@ -21,25 +21,13 @@ export const generateSurveySingleUseId = (isEncrypted: boolean): string => {
|
||||
export const validateSurveySingleUseId = (surveySingleUseId: string): string | undefined => {
|
||||
let decryptedCuid: string | null = null;
|
||||
|
||||
if (surveySingleUseId.length === 64) {
|
||||
if (!FORMBRICKS_ENCRYPTION_KEY) {
|
||||
throw new Error("FORMBRICKS_ENCRYPTION_KEY is not defined");
|
||||
}
|
||||
|
||||
try {
|
||||
decryptedCuid = decryptAES128(FORMBRICKS_ENCRYPTION_KEY, surveySingleUseId);
|
||||
} catch (error) {
|
||||
return undefined;
|
||||
}
|
||||
} else {
|
||||
if (!ENCRYPTION_KEY) {
|
||||
throw new Error("ENCRYPTION_KEY is not set");
|
||||
}
|
||||
try {
|
||||
decryptedCuid = symmetricDecrypt(surveySingleUseId, ENCRYPTION_KEY);
|
||||
} catch (error) {
|
||||
return undefined;
|
||||
}
|
||||
if (!ENCRYPTION_KEY) {
|
||||
throw new Error("ENCRYPTION_KEY is not set");
|
||||
}
|
||||
try {
|
||||
decryptedCuid = symmetricDecrypt(surveySingleUseId, ENCRYPTION_KEY);
|
||||
} catch (error) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (cuid2.isCuid(decryptedCuid)) {
|
||||
|
||||
@@ -12,7 +12,6 @@ vi.mock("@formbricks/lib/constants", () => ({
|
||||
FORMBRICKS_API_HOST: "http://localhost:3000",
|
||||
FORMBRICKS_ENVIRONMENT_ID: "test-env-id",
|
||||
ENCRYPTION_KEY: "test-encryption-key",
|
||||
FORMBRICKS_ENCRYPTION_KEY: "test-fb-encryption-key",
|
||||
WEBAPP_URL: "http://localhost:3000",
|
||||
DEFAULT_BRAND_COLOR: "#64748b",
|
||||
AVAILABLE_LOCALES: ["en-US", "de-DE", "pt-BR", "fr-FR", "zh-Hant-TW", "pt-PT"],
|
||||
@@ -49,7 +48,6 @@ vi.mock("@formbricks/lib/env", () => ({
|
||||
FORMBRICKS_API_HOST: "http://localhost:3000",
|
||||
FORMBRICKS_ENVIRONMENT_ID: "test-env-id",
|
||||
ENCRYPTION_KEY: "test-encryption-key",
|
||||
FORMBRICKS_ENCRYPTION_KEY: "test-fb-encryption-key",
|
||||
NODE_ENV: "test",
|
||||
ENTERPRISE_LICENSE_KEY: "test-license-key",
|
||||
},
|
||||
|
||||
@@ -127,7 +127,7 @@ const nextConfig = {
|
||||
},
|
||||
{
|
||||
// matching all API routes
|
||||
source: "/api/v1/client/:path*",
|
||||
source: "/api/(v1|v2)/client/:path*",
|
||||
headers: [
|
||||
{ key: "Access-Control-Allow-Credentials", value: "true" },
|
||||
{ key: "Access-Control-Allow-Origin", value: "*" },
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
"@types/qrcode": "1.5.5",
|
||||
"@types/testing-library__react": "10.2.0",
|
||||
"@vitest/coverage-v8": "3.1.1",
|
||||
"vite": "6.3.2",
|
||||
"vite": "6.2.5",
|
||||
"resize-observer-polyfill": "1.5.1",
|
||||
"vite-tsconfig-paths": "5.1.4",
|
||||
"vitest": "3.1.1",
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package com.formbricks.demo
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.widget.Button
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import com.formbricks.formbrickssdk.Formbricks
|
||||
import com.formbricks.formbrickssdk.FormbricksCallback
|
||||
import com.formbricks.formbrickssdk.helper.FormbricksConfig
|
||||
import java.util.UUID
|
||||
|
||||
@@ -15,6 +17,25 @@ class MainActivity : AppCompatActivity() {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
|
||||
Formbricks.callback = object: FormbricksCallback {
|
||||
override fun onSurveyStarted() {
|
||||
Log.d("FormbricksCallback", "onSurveyStarted")
|
||||
}
|
||||
|
||||
override fun onSurveyFinished() {
|
||||
Log.d("FormbricksCallback", "onSurveyFinished")
|
||||
}
|
||||
|
||||
override fun onSurveyClosed() {
|
||||
Log.d("FormbricksCallback", "onSurveyClosed")
|
||||
}
|
||||
|
||||
override fun onError(error: Exception) {
|
||||
Log.d("FormbricksCallback", "onError: ${error.localizedMessage}")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val config = FormbricksConfig.Builder("[appUrl]","[environmentId]")
|
||||
.setLoggingEnabled(true)
|
||||
.setFragmentManager(supportFragmentManager)
|
||||
@@ -35,4 +56,4 @@ class MainActivity : AppCompatActivity() {
|
||||
Formbricks.track("click_demo_button")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,10 +17,10 @@ struct SetupView: View {
|
||||
let config = FormbricksConfig.Builder(appUrl: "[appUrl]", environmentId: "[environmentId]")
|
||||
.setLogLevel(.debug)
|
||||
.build()
|
||||
|
||||
// Simulate async setup delay
|
||||
DispatchQueue.global().async {
|
||||
Formbricks.setup(with: config)
|
||||
Formbricks.setUserId(UUID().uuidString)
|
||||
|
||||
DispatchQueue.main.async {
|
||||
isSetup = true
|
||||
@@ -31,6 +31,10 @@ struct SetupView: View {
|
||||
.padding()
|
||||
}
|
||||
} else {
|
||||
Button("Call Formbricks.setUserId with a random userId") {
|
||||
Formbricks.setUserId(UUID().uuidString)
|
||||
}.padding()
|
||||
|
||||
Button("Call Formbricks.track") {
|
||||
Formbricks.track("click_demo_button")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"originHash" : "92c0230fb0adc404299bb05aba6c51a76f86c388fdfb9f4e9bed3a757f80fc07",
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "anycodable",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/Flight-School/AnyCodable",
|
||||
"state" : {
|
||||
"revision" : "862808b2070cd908cb04f9aafe7de83d35f81b05",
|
||||
"version" : "0.6.7"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 3
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
4D7D8DD62DB14F18002C453E /* AnyCodable in Frameworks */ = {isa = PBXBuildFile; productRef = 4D7D8DD52DB14F18002C453E /* AnyCodable */; };
|
||||
4DDAED692D50D49B00A19B1F /* FormbricksSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DDAED602D50D49A00A19B1F /* FormbricksSDK.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@@ -108,6 +109,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4D7D8DD62DB14F18002C453E /* AnyCodable in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -122,11 +124,19 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
4D7D8DD42DB14F18002C453E /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4DDAED562D50D49A00A19B1F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4DDAED622D50D49A00A19B1F /* FormbricksSDK */,
|
||||
4DDAED6C2D50D49B00A19B1F /* FormbricksSDKTests */,
|
||||
4D7D8DD42DB14F18002C453E /* Frameworks */,
|
||||
4DDAED612D50D49A00A19B1F /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
@@ -171,6 +181,7 @@
|
||||
);
|
||||
name = FormbricksSDK;
|
||||
packageProductDependencies = (
|
||||
4D7D8DD52DB14F18002C453E /* AnyCodable */,
|
||||
);
|
||||
productName = FormbricksSDK;
|
||||
productReference = 4DDAED602D50D49A00A19B1F /* FormbricksSDK.framework */;
|
||||
@@ -227,6 +238,9 @@
|
||||
);
|
||||
mainGroup = 4DDAED562D50D49A00A19B1F;
|
||||
minimizedProjectReferenceProxies = 1;
|
||||
packageReferences = (
|
||||
4DA4A0952DB14E67007299C0 /* XCRemoteSwiftPackageReference "AnyCodable" */,
|
||||
);
|
||||
preferredProjectObjectVersion = 77;
|
||||
productRefGroup = 4DDAED612D50D49A00A19B1F /* Products */;
|
||||
projectDirPath = "";
|
||||
@@ -536,6 +550,25 @@
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
|
||||
/* Begin XCRemoteSwiftPackageReference section */
|
||||
4DA4A0952DB14E67007299C0 /* XCRemoteSwiftPackageReference "AnyCodable" */ = {
|
||||
isa = XCRemoteSwiftPackageReference;
|
||||
repositoryURL = "https://github.com/Flight-School/AnyCodable";
|
||||
requirement = {
|
||||
kind = exactVersion;
|
||||
version = 0.6.7;
|
||||
};
|
||||
};
|
||||
/* End XCRemoteSwiftPackageReference section */
|
||||
|
||||
/* Begin XCSwiftPackageProductDependency section */
|
||||
4D7D8DD52DB14F18002C453E /* AnyCodable */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
package = 4DA4A0952DB14E67007299C0 /* XCRemoteSwiftPackageReference "AnyCodable" */;
|
||||
productName = AnyCodable;
|
||||
};
|
||||
/* End XCSwiftPackageProductDependency section */
|
||||
};
|
||||
rootObject = 4DDAED572D50D49A00A19B1F /* Project object */;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ import Network
|
||||
if let userId = config.userId {
|
||||
userManager?.set(userId: userId)
|
||||
}
|
||||
if let attributes = config.attributes {
|
||||
if let attributes = config.attributes, !attributes.isEmpty {
|
||||
userManager?.set(attributes: attributes)
|
||||
}
|
||||
if let language = config.attributes?["language"] {
|
||||
@@ -91,6 +91,11 @@ import Network
|
||||
return
|
||||
}
|
||||
|
||||
if let existing = userManager?.userId, !existing.isEmpty {
|
||||
logger?.error("A userId is already set (\"\(existing)\") – please call Formbricks.logout() before setting a new one.")
|
||||
return
|
||||
}
|
||||
|
||||
userManager?.set(userId: userId)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
// https://github.com/Flight-School/AnyCodable/blob/master/Sources/AnyCodable/AnyCodable.swift
|
||||
|
||||
import Foundation
|
||||
/**
|
||||
A type-erased `Codable` value.
|
||||
|
||||
The `AnyCodable` type forwards encoding and decoding responsibilities
|
||||
to an underlying value, hiding its specific underlying type.
|
||||
|
||||
You can encode or decode mixed-type values in dictionaries
|
||||
and other collections that require `Encodable` or `Decodable` conformance
|
||||
by declaring their contained type to be `AnyCodable`.
|
||||
|
||||
- SeeAlso: `AnyEncodable`
|
||||
- SeeAlso: `AnyDecodable`
|
||||
*/
|
||||
struct AnyCodable: Codable {
|
||||
public let value: Any
|
||||
|
||||
public init<T>(_ value: T?) {
|
||||
self.value = value ?? ()
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyCodable: AnyEncodableProtocol, AnyDecodableProtocol {}
|
||||
|
||||
extension AnyCodable: Equatable {
|
||||
public static func == (lhs: AnyCodable, rhs: AnyCodable) -> Bool {
|
||||
switch (lhs.value, rhs.value) {
|
||||
case is (Void, Void):
|
||||
return true
|
||||
case let (lhs as Bool, rhs as Bool):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int, rhs as Int):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int8, rhs as Int8):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int16, rhs as Int16):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int32, rhs as Int32):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int64, rhs as Int64):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt, rhs as UInt):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt8, rhs as UInt8):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt16, rhs as UInt16):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt32, rhs as UInt32):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt64, rhs as UInt64):
|
||||
return lhs == rhs
|
||||
case let (lhs as Float, rhs as Float):
|
||||
return lhs == rhs
|
||||
case let (lhs as Double, rhs as Double):
|
||||
return lhs == rhs
|
||||
case let (lhs as String, rhs as String):
|
||||
return lhs == rhs
|
||||
case let (lhs as [String: AnyCodable], rhs as [String: AnyCodable]):
|
||||
return lhs == rhs
|
||||
case let (lhs as [AnyCodable], rhs as [AnyCodable]):
|
||||
return lhs == rhs
|
||||
case let (lhs as [String: Any], rhs as [String: Any]):
|
||||
return NSDictionary(dictionary: lhs) == NSDictionary(dictionary: rhs)
|
||||
case let (lhs as [Any], rhs as [Any]):
|
||||
return NSArray(array: lhs) == NSArray(array: rhs)
|
||||
case is (NSNull, NSNull):
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyCodable: CustomStringConvertible {
|
||||
public var description: String {
|
||||
switch value {
|
||||
case is Void:
|
||||
return String(describing: nil as Any?)
|
||||
case let value as CustomStringConvertible:
|
||||
return value.description
|
||||
default:
|
||||
return String(describing: value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyCodable: CustomDebugStringConvertible {
|
||||
public var debugDescription: String {
|
||||
if let value = value as? CustomDebugStringConvertible {
|
||||
return "AnyCodable(\(value.debugDescription))"
|
||||
}
|
||||
return "AnyCodable(\(description))"
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyCodable: ExpressibleByNilLiteral {}
|
||||
extension AnyCodable: ExpressibleByBooleanLiteral {}
|
||||
extension AnyCodable: ExpressibleByIntegerLiteral {}
|
||||
extension AnyCodable: ExpressibleByFloatLiteral {}
|
||||
extension AnyCodable: ExpressibleByStringLiteral {}
|
||||
extension AnyCodable: ExpressibleByStringInterpolation {}
|
||||
extension AnyCodable: ExpressibleByArrayLiteral {}
|
||||
extension AnyCodable: ExpressibleByDictionaryLiteral {}
|
||||
|
||||
|
||||
extension AnyCodable: Hashable {
|
||||
public func hash(into hasher: inout Hasher) {
|
||||
switch value {
|
||||
case let value as Bool:
|
||||
hasher.combine(value)
|
||||
case let value as Int:
|
||||
hasher.combine(value)
|
||||
case let value as Int8:
|
||||
hasher.combine(value)
|
||||
case let value as Int16:
|
||||
hasher.combine(value)
|
||||
case let value as Int32:
|
||||
hasher.combine(value)
|
||||
case let value as Int64:
|
||||
hasher.combine(value)
|
||||
case let value as UInt:
|
||||
hasher.combine(value)
|
||||
case let value as UInt8:
|
||||
hasher.combine(value)
|
||||
case let value as UInt16:
|
||||
hasher.combine(value)
|
||||
case let value as UInt32:
|
||||
hasher.combine(value)
|
||||
case let value as UInt64:
|
||||
hasher.combine(value)
|
||||
case let value as Float:
|
||||
hasher.combine(value)
|
||||
case let value as Double:
|
||||
hasher.combine(value)
|
||||
case let value as String:
|
||||
hasher.combine(value)
|
||||
case let value as [String: AnyCodable]:
|
||||
hasher.combine(value)
|
||||
case let value as [AnyCodable]:
|
||||
hasher.combine(value)
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,189 +0,0 @@
|
||||
// https://github.com/Flight-School/AnyCodable/blob/master/Sources/AnyCodable/AnyCodable.swift
|
||||
|
||||
#if canImport(Foundation)
|
||||
import Foundation
|
||||
#endif
|
||||
|
||||
/**
|
||||
A type-erased `Decodable` value.
|
||||
|
||||
The `AnyDecodable` type forwards decoding responsibilities
|
||||
to an underlying value, hiding its specific underlying type.
|
||||
|
||||
You can decode mixed-type values in dictionaries
|
||||
and other collections that require `Decodable` conformance
|
||||
by declaring their contained type to be `AnyDecodable`:
|
||||
|
||||
let json = """
|
||||
{
|
||||
"boolean": true,
|
||||
"integer": 42,
|
||||
"double": 3.141592653589793,
|
||||
"string": "string",
|
||||
"array": [1, 2, 3],
|
||||
"nested": {
|
||||
"a": "alpha",
|
||||
"b": "bravo",
|
||||
"c": "charlie"
|
||||
},
|
||||
"null": null
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
|
||||
let decoder = JSONDecoder()
|
||||
let dictionary = try! decoder.decode([String: AnyDecodable].self, from: json)
|
||||
*/
|
||||
struct AnyDecodable: Decodable {
|
||||
public let value: Any
|
||||
|
||||
public init<T>(_ value: T?) {
|
||||
self.value = value ?? ()
|
||||
}
|
||||
}
|
||||
|
||||
@usableFromInline
|
||||
protocol AnyDecodableProtocol {
|
||||
var value: Any { get }
|
||||
init<T>(_ value: T?)
|
||||
}
|
||||
|
||||
extension AnyDecodable: AnyDecodableProtocol {}
|
||||
|
||||
extension AnyDecodableProtocol {
|
||||
public init(from decoder: Decoder) throws {
|
||||
let container = try decoder.singleValueContainer()
|
||||
|
||||
if container.decodeNil() {
|
||||
#if canImport(Foundation)
|
||||
self.init(NSNull())
|
||||
#else
|
||||
self.init(Optional<Self>.none)
|
||||
#endif
|
||||
} else if let bool = try? container.decode(Bool.self) {
|
||||
self.init(bool)
|
||||
} else if let int = try? container.decode(Int.self) {
|
||||
self.init(int)
|
||||
} else if let uint = try? container.decode(UInt.self) {
|
||||
self.init(uint)
|
||||
} else if let double = try? container.decode(Double.self) {
|
||||
self.init(double)
|
||||
} else if let string = try? container.decode(String.self) {
|
||||
self.init(string)
|
||||
} else if let array = try? container.decode([AnyDecodable].self) {
|
||||
self.init(array.map { $0.value })
|
||||
} else if let dictionary = try? container.decode([String: AnyDecodable].self) {
|
||||
self.init(dictionary.mapValues { $0.value })
|
||||
} else {
|
||||
throw DecodingError.dataCorruptedError(in: container, debugDescription: "AnyDecodable value cannot be decoded")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyDecodable: Equatable {
|
||||
public static func == (lhs: AnyDecodable, rhs: AnyDecodable) -> Bool {
|
||||
switch (lhs.value, rhs.value) {
|
||||
#if canImport(Foundation)
|
||||
case is (NSNull, NSNull), is (Void, Void):
|
||||
return true
|
||||
#endif
|
||||
case let (lhs as Bool, rhs as Bool):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int, rhs as Int):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int8, rhs as Int8):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int16, rhs as Int16):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int32, rhs as Int32):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int64, rhs as Int64):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt, rhs as UInt):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt8, rhs as UInt8):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt16, rhs as UInt16):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt32, rhs as UInt32):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt64, rhs as UInt64):
|
||||
return lhs == rhs
|
||||
case let (lhs as Float, rhs as Float):
|
||||
return lhs == rhs
|
||||
case let (lhs as Double, rhs as Double):
|
||||
return lhs == rhs
|
||||
case let (lhs as String, rhs as String):
|
||||
return lhs == rhs
|
||||
case let (lhs as [String: AnyDecodable], rhs as [String: AnyDecodable]):
|
||||
return lhs == rhs
|
||||
case let (lhs as [AnyDecodable], rhs as [AnyDecodable]):
|
||||
return lhs == rhs
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyDecodable: CustomStringConvertible {
|
||||
public var description: String {
|
||||
switch value {
|
||||
case is Void:
|
||||
return String(describing: nil as Any?)
|
||||
case let value as CustomStringConvertible:
|
||||
return value.description
|
||||
default:
|
||||
return String(describing: value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyDecodable: CustomDebugStringConvertible {
|
||||
public var debugDescription: String {
|
||||
if let value = value as? CustomDebugStringConvertible {
|
||||
return "AnyDecodable(\(value.debugDescription))"
|
||||
} else {
|
||||
return "AnyDecodable(\(description))"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyDecodable: Hashable {
|
||||
public func hash(into hasher: inout Hasher) {
|
||||
switch value {
|
||||
case let value as Bool:
|
||||
hasher.combine(value)
|
||||
case let value as Int:
|
||||
hasher.combine(value)
|
||||
case let value as Int8:
|
||||
hasher.combine(value)
|
||||
case let value as Int16:
|
||||
hasher.combine(value)
|
||||
case let value as Int32:
|
||||
hasher.combine(value)
|
||||
case let value as Int64:
|
||||
hasher.combine(value)
|
||||
case let value as UInt:
|
||||
hasher.combine(value)
|
||||
case let value as UInt8:
|
||||
hasher.combine(value)
|
||||
case let value as UInt16:
|
||||
hasher.combine(value)
|
||||
case let value as UInt32:
|
||||
hasher.combine(value)
|
||||
case let value as UInt64:
|
||||
hasher.combine(value)
|
||||
case let value as Float:
|
||||
hasher.combine(value)
|
||||
case let value as Double:
|
||||
hasher.combine(value)
|
||||
case let value as String:
|
||||
hasher.combine(value)
|
||||
case let value as [String: AnyDecodable]:
|
||||
hasher.combine(value)
|
||||
case let value as [AnyDecodable]:
|
||||
hasher.combine(value)
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,292 +0,0 @@
|
||||
// https://github.com/Flight-School/AnyCodable/blob/master/Sources/AnyCodable/AnyCodable.swift
|
||||
|
||||
#if canImport(Foundation)
|
||||
import Foundation
|
||||
#endif
|
||||
|
||||
/**
|
||||
A type-erased `Encodable` value.
|
||||
|
||||
The `AnyEncodable` type forwards encoding responsibilities
|
||||
to an underlying value, hiding its specific underlying type.
|
||||
|
||||
You can encode mixed-type values in dictionaries
|
||||
and other collections that require `Encodable` conformance
|
||||
by declaring their contained type to be `AnyEncodable`:
|
||||
|
||||
let dictionary: [String: AnyEncodable] = [
|
||||
"boolean": true,
|
||||
"integer": 42,
|
||||
"double": 3.141592653589793,
|
||||
"string": "string",
|
||||
"array": [1, 2, 3],
|
||||
"nested": [
|
||||
"a": "alpha",
|
||||
"b": "bravo",
|
||||
"c": "charlie"
|
||||
],
|
||||
"null": nil
|
||||
]
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
let json = try! encoder.encode(dictionary)
|
||||
*/
|
||||
struct AnyEncodable: Encodable {
|
||||
public let value: Any
|
||||
|
||||
public init<T>(_ value: T?) {
|
||||
self.value = value ?? ()
|
||||
}
|
||||
}
|
||||
|
||||
@usableFromInline
|
||||
protocol AnyEncodableProtocol {
|
||||
var value: Any { get }
|
||||
init<T>(_ value: T?)
|
||||
}
|
||||
|
||||
extension AnyEncodable: AnyEncodableProtocol {}
|
||||
|
||||
// MARK: - Encodable
|
||||
|
||||
extension AnyEncodableProtocol {
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.singleValueContainer()
|
||||
|
||||
switch value {
|
||||
#if canImport(Foundation)
|
||||
case is NSNull:
|
||||
try container.encodeNil()
|
||||
#endif
|
||||
case is Void:
|
||||
try container.encodeNil()
|
||||
case let bool as Bool:
|
||||
try container.encode(bool)
|
||||
case let int as Int:
|
||||
try container.encode(int)
|
||||
case let int8 as Int8:
|
||||
try container.encode(int8)
|
||||
case let int16 as Int16:
|
||||
try container.encode(int16)
|
||||
case let int32 as Int32:
|
||||
try container.encode(int32)
|
||||
case let int64 as Int64:
|
||||
try container.encode(int64)
|
||||
case let uint as UInt:
|
||||
try container.encode(uint)
|
||||
case let uint8 as UInt8:
|
||||
try container.encode(uint8)
|
||||
case let uint16 as UInt16:
|
||||
try container.encode(uint16)
|
||||
case let uint32 as UInt32:
|
||||
try container.encode(uint32)
|
||||
case let uint64 as UInt64:
|
||||
try container.encode(uint64)
|
||||
case let float as Float:
|
||||
try container.encode(float)
|
||||
case let double as Double:
|
||||
try container.encode(double)
|
||||
case let string as String:
|
||||
try container.encode(string)
|
||||
#if canImport(Foundation)
|
||||
case let number as NSNumber:
|
||||
try encode(nsnumber: number, into: &container)
|
||||
case let date as Date:
|
||||
try container.encode(date)
|
||||
case let url as URL:
|
||||
try container.encode(url)
|
||||
#endif
|
||||
case let array as [Any?]:
|
||||
try container.encode(array.map { AnyEncodable($0) })
|
||||
case let dictionary as [String: Any?]:
|
||||
try container.encode(dictionary.mapValues { AnyEncodable($0) })
|
||||
case let encodable as Encodable:
|
||||
try encodable.encode(to: encoder)
|
||||
default:
|
||||
let context = EncodingError.Context(codingPath: container.codingPath, debugDescription: "AnyEncodable value cannot be encoded")
|
||||
throw EncodingError.invalidValue(value, context)
|
||||
}
|
||||
}
|
||||
|
||||
#if canImport(Foundation)
|
||||
private func encode(nsnumber: NSNumber, into container: inout SingleValueEncodingContainer) throws {
|
||||
switch Character(Unicode.Scalar(UInt8(nsnumber.objCType.pointee))) {
|
||||
case "B":
|
||||
try container.encode(nsnumber.boolValue)
|
||||
case "c":
|
||||
try container.encode(nsnumber.int8Value)
|
||||
case "s":
|
||||
try container.encode(nsnumber.int16Value)
|
||||
case "i", "l":
|
||||
try container.encode(nsnumber.int32Value)
|
||||
case "q":
|
||||
try container.encode(nsnumber.int64Value)
|
||||
case "C":
|
||||
try container.encode(nsnumber.uint8Value)
|
||||
case "S":
|
||||
try container.encode(nsnumber.uint16Value)
|
||||
case "I", "L":
|
||||
try container.encode(nsnumber.uint32Value)
|
||||
case "Q":
|
||||
try container.encode(nsnumber.uint64Value)
|
||||
case "f":
|
||||
try container.encode(nsnumber.floatValue)
|
||||
case "d":
|
||||
try container.encode(nsnumber.doubleValue)
|
||||
default:
|
||||
let context = EncodingError.Context(codingPath: container.codingPath, debugDescription: "NSNumber cannot be encoded because its type is not handled")
|
||||
throw EncodingError.invalidValue(nsnumber, context)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
extension AnyEncodable: Equatable {
|
||||
public static func == (lhs: AnyEncodable, rhs: AnyEncodable) -> Bool {
|
||||
switch (lhs.value, rhs.value) {
|
||||
case is (Void, Void):
|
||||
return true
|
||||
case let (lhs as Bool, rhs as Bool):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int, rhs as Int):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int8, rhs as Int8):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int16, rhs as Int16):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int32, rhs as Int32):
|
||||
return lhs == rhs
|
||||
case let (lhs as Int64, rhs as Int64):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt, rhs as UInt):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt8, rhs as UInt8):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt16, rhs as UInt16):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt32, rhs as UInt32):
|
||||
return lhs == rhs
|
||||
case let (lhs as UInt64, rhs as UInt64):
|
||||
return lhs == rhs
|
||||
case let (lhs as Float, rhs as Float):
|
||||
return lhs == rhs
|
||||
case let (lhs as Double, rhs as Double):
|
||||
return lhs == rhs
|
||||
case let (lhs as String, rhs as String):
|
||||
return lhs == rhs
|
||||
case let (lhs as [String: AnyEncodable], rhs as [String: AnyEncodable]):
|
||||
return lhs == rhs
|
||||
case let (lhs as [AnyEncodable], rhs as [AnyEncodable]):
|
||||
return lhs == rhs
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyEncodable: CustomStringConvertible {
|
||||
public var description: String {
|
||||
switch value {
|
||||
case is Void:
|
||||
return String(describing: nil as Any?)
|
||||
case let value as CustomStringConvertible:
|
||||
return value.description
|
||||
default:
|
||||
return String(describing: value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyEncodable: CustomDebugStringConvertible {
|
||||
public var debugDescription: String {
|
||||
if let value = value as? CustomDebugStringConvertible {
|
||||
return "AnyEncodable(\(value.debugDescription))"
|
||||
} else {
|
||||
return "AnyEncodable(\(description))"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyEncodable: ExpressibleByNilLiteral {}
|
||||
extension AnyEncodable: ExpressibleByBooleanLiteral {}
|
||||
extension AnyEncodable: ExpressibleByIntegerLiteral {}
|
||||
extension AnyEncodable: ExpressibleByFloatLiteral {}
|
||||
extension AnyEncodable: ExpressibleByStringLiteral {}
|
||||
extension AnyEncodable: ExpressibleByStringInterpolation {}
|
||||
extension AnyEncodable: ExpressibleByArrayLiteral {}
|
||||
extension AnyEncodable: ExpressibleByDictionaryLiteral {}
|
||||
|
||||
extension AnyEncodableProtocol {
|
||||
public init(nilLiteral _: ()) {
|
||||
self.init(nil as Any?)
|
||||
}
|
||||
|
||||
public init(booleanLiteral value: Bool) {
|
||||
self.init(value)
|
||||
}
|
||||
|
||||
public init(integerLiteral value: Int) {
|
||||
self.init(value)
|
||||
}
|
||||
|
||||
public init(floatLiteral value: Double) {
|
||||
self.init(value)
|
||||
}
|
||||
|
||||
public init(extendedGraphemeClusterLiteral value: String) {
|
||||
self.init(value)
|
||||
}
|
||||
|
||||
public init(stringLiteral value: String) {
|
||||
self.init(value)
|
||||
}
|
||||
|
||||
public init(arrayLiteral elements: Any...) {
|
||||
self.init(elements)
|
||||
}
|
||||
|
||||
public init(dictionaryLiteral elements: (AnyHashable, Any)...) {
|
||||
self.init([AnyHashable: Any](elements, uniquingKeysWith: { first, _ in first }))
|
||||
}
|
||||
}
|
||||
|
||||
extension AnyEncodable: Hashable {
|
||||
public func hash(into hasher: inout Hasher) {
|
||||
switch value {
|
||||
case let value as Bool:
|
||||
hasher.combine(value)
|
||||
case let value as Int:
|
||||
hasher.combine(value)
|
||||
case let value as Int8:
|
||||
hasher.combine(value)
|
||||
case let value as Int16:
|
||||
hasher.combine(value)
|
||||
case let value as Int32:
|
||||
hasher.combine(value)
|
||||
case let value as Int64:
|
||||
hasher.combine(value)
|
||||
case let value as UInt:
|
||||
hasher.combine(value)
|
||||
case let value as UInt8:
|
||||
hasher.combine(value)
|
||||
case let value as UInt16:
|
||||
hasher.combine(value)
|
||||
case let value as UInt32:
|
||||
hasher.combine(value)
|
||||
case let value as UInt64:
|
||||
hasher.combine(value)
|
||||
case let value as Float:
|
||||
hasher.combine(value)
|
||||
case let value as Double:
|
||||
hasher.combine(value)
|
||||
case let value as String:
|
||||
hasher.combine(value)
|
||||
case let value as [String: AnyEncodable]:
|
||||
hasher.combine(value)
|
||||
case let value as [AnyEncodable]:
|
||||
hasher.combine(value)
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -95,6 +95,9 @@ final class UserManager: UserManagerSyncable {
|
||||
self?.lastDisplayedAt = userResponse.data.state?.data?.lastDisplayAt
|
||||
self?.expiresAt = userResponse.data.state?.expiresAt
|
||||
|
||||
let serverLanguage = userResponse.data.state?.data?.language
|
||||
Formbricks.language = serverLanguage ?? "default"
|
||||
|
||||
self?.updateQueue?.reset()
|
||||
self?.surveyManager?.filterSurveys()
|
||||
self?.startSyncTimer()
|
||||
@@ -106,6 +109,14 @@ final class UserManager: UserManagerSyncable {
|
||||
|
||||
/// Logs out the user and clears the user state.
|
||||
func logout() {
|
||||
var isUserIdDefined = false
|
||||
|
||||
if userId != nil {
|
||||
isUserIdDefined = true
|
||||
} else {
|
||||
Formbricks.logger?.error("no userId is set, please set a userId first using the setUserId function")
|
||||
}
|
||||
|
||||
UserDefaults.standard.removeObject(forKey: UserManager.userIdKey)
|
||||
UserDefaults.standard.removeObject(forKey: UserManager.contactIdKey)
|
||||
UserDefaults.standard.removeObject(forKey: UserManager.segmentsKey)
|
||||
@@ -120,9 +131,13 @@ final class UserManager: UserManagerSyncable {
|
||||
backingResponses = nil
|
||||
backingLastDisplayedAt = nil
|
||||
backingExpiresAt = nil
|
||||
Formbricks.language = "default"
|
||||
updateQueue?.reset()
|
||||
|
||||
Formbricks.logger?.debug("Successfully logged out user and reset the user state.")
|
||||
if isUserIdDefined {
|
||||
Formbricks.logger?.debug("Successfully logged out user and reset the user state.")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func cleanupUpdateQueue() {
|
||||
|
||||
@@ -7,4 +7,5 @@ struct UserStateDetails: Codable {
|
||||
let displays: [Display]?
|
||||
let responses: [String]?
|
||||
let lastDisplayAt: Date?
|
||||
let language: String?
|
||||
}
|
||||
|
||||
@@ -12,131 +12,124 @@ class APIClient<Request: CodableRequest>: Operation, @unchecked Sendable {
|
||||
}
|
||||
|
||||
override func main() {
|
||||
guard let apiURL = request.baseURL, var baseUrlComponents = URLComponents(string: apiURL) else {
|
||||
guard let finalURL = buildFinalURL() else {
|
||||
completion?(.failure(FormbricksSDKError(type: .sdkIsNotInitialized)))
|
||||
return
|
||||
}
|
||||
|
||||
baseUrlComponents.queryItems = request.queryParams?.map { URLQueryItem(name: $0.key, value: $0.value) }
|
||||
|
||||
guard var finalURL = baseUrlComponents.url else {
|
||||
completion?(.failure(FormbricksSDKError(type: .invalidAppUrl)))
|
||||
return
|
||||
}
|
||||
|
||||
guard let requestEndPoint = setPathParams(request.requestEndPoint) else {
|
||||
completion?(.failure(FormbricksSDKError(type: .sdkIsNotInitialized)))
|
||||
return
|
||||
}
|
||||
|
||||
finalURL.appendPathComponent(requestEndPoint)
|
||||
|
||||
let urlRequest = createURLRequest(forURL: finalURL)
|
||||
logRequest(urlRequest)
|
||||
|
||||
// LOG
|
||||
var requestLogMessage = "\(request.requestType.rawValue) >>> "
|
||||
if let urlString = urlRequest.url?.absoluteString {
|
||||
requestLogMessage.append(urlString)
|
||||
}
|
||||
if let headers = urlRequest.allHTTPHeaderFields {
|
||||
requestLogMessage.append("\nHeaders: \(headers)")
|
||||
}
|
||||
if let body = urlRequest.httpBody {
|
||||
requestLogMessage.append("\nBody: \(String(data: body, encoding: .utf8) ?? "")")
|
||||
}
|
||||
|
||||
Formbricks.logger?.info(requestLogMessage)
|
||||
|
||||
session.dataTask(with: urlRequest) { (data, response, error) in
|
||||
if let httpStatus = (response as? HTTPURLResponse)?.status {
|
||||
var responseLogMessage = "\(httpStatus.rawValue) <<< "
|
||||
if let urlString = response?.url?.absoluteString {
|
||||
responseLogMessage.append(urlString)
|
||||
}
|
||||
|
||||
if httpStatus.responseType == .success {
|
||||
guard let data = data else {
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
return
|
||||
}
|
||||
if let responseString = String(data: data, encoding: .utf8) {
|
||||
responseLogMessage.append("\n\(responseString)\n")
|
||||
}
|
||||
|
||||
do {
|
||||
if Request.Response.self == VoidResponse.self {
|
||||
Formbricks.logger?.info(responseLogMessage)
|
||||
|
||||
if let response = VoidResponse() as? Request.Response {
|
||||
self.completion?(.success(response))
|
||||
} else {
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse)))
|
||||
}
|
||||
} else {
|
||||
var body = try self.request.decoder.decode(Request.Response.self, from: data)
|
||||
Formbricks.logger?.info(responseLogMessage)
|
||||
|
||||
// We want to save the entire response dictionary for the environment response
|
||||
if var environmentResponse = body as? EnvironmentResponse,
|
||||
let jsonString = String(data: data, encoding: .utf8) {
|
||||
environmentResponse.responseString = jsonString
|
||||
body = environmentResponse as! Request.Response
|
||||
}
|
||||
|
||||
|
||||
self.completion?(.success(body))
|
||||
}
|
||||
}
|
||||
catch let DecodingError.dataCorrupted(context) {
|
||||
responseLogMessage.append("Data corrupted \(context)\n")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
}
|
||||
catch let DecodingError.keyNotFound(key, context) {
|
||||
responseLogMessage.append("Key '\(key)' not found: \(context.debugDescription)\n")
|
||||
responseLogMessage.append("codingPath: \(context.codingPath)")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
}
|
||||
catch let DecodingError.valueNotFound(value, context) {
|
||||
responseLogMessage.append("Value '\(value)' not found: \(context.debugDescription)\n")
|
||||
responseLogMessage.append("codingPath: \(context.codingPath)")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
}
|
||||
catch let DecodingError.typeMismatch(type, context) {
|
||||
responseLogMessage.append("Type '\(type)' mismatch: \(context.debugDescription)\n")
|
||||
responseLogMessage.append("codingPath: \(context.codingPath)")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
}
|
||||
catch {
|
||||
responseLogMessage.append("error: \(error.message)")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: httpStatus.rawValue)))
|
||||
}
|
||||
} else {
|
||||
if let error = error {
|
||||
responseLogMessage.append("\nError: \(error.localizedDescription)")
|
||||
Formbricks.logger?.error(responseLogMessage)
|
||||
self.completion?(.failure(error))
|
||||
} else if let data = data, let apiError = try? self.request.decoder.decode(FormbricksAPIError.self, from: data) {
|
||||
Formbricks.logger?.error("\(responseLogMessage)\n\(apiError.getDetailedErrorMessage())")
|
||||
self.completion?(.failure(apiError))
|
||||
} else {
|
||||
let error = FormbricksAPIClientError(type: .responseError, statusCode: httpStatus.rawValue)
|
||||
Formbricks.logger?.error("\(responseLogMessage)\n\(error.message)")
|
||||
self.completion?(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
let error = FormbricksAPIClientError(type: .invalidResponse)
|
||||
Formbricks.logger?.error("ERROR \(error.message)")
|
||||
self.completion?(.failure(error))
|
||||
}
|
||||
session.dataTask(with: urlRequest) { data, response, error in
|
||||
self.processResponse(data: data, response: response, error: error)
|
||||
}.resume()
|
||||
}
|
||||
|
||||
private func buildFinalURL() -> URL? {
|
||||
guard let apiURL = request.baseURL, var components = URLComponents(string: apiURL) else { return nil }
|
||||
|
||||
components.queryItems = request.queryParams?.map { URLQueryItem(name: $0.key, value: $0.value) }
|
||||
|
||||
guard var url = components.url, let path = setPathParams(request.requestEndPoint) else { return nil }
|
||||
|
||||
url.appendPathComponent(path)
|
||||
return url
|
||||
}
|
||||
|
||||
private func processResponse(data: Data?, response: URLResponse?, error: Error?) {
|
||||
guard let httpStatus = (response as? HTTPURLResponse)?.status else {
|
||||
let error = FormbricksAPIClientError(type: .invalidResponse)
|
||||
Formbricks.logger?.error("ERROR \(error.message)")
|
||||
completion?(.failure(error))
|
||||
return
|
||||
}
|
||||
|
||||
var message = "\(httpStatus.rawValue) <<< \(response?.url?.absoluteString ?? "")"
|
||||
|
||||
if httpStatus.responseType == .success {
|
||||
handleSuccessResponse(data: data, statusCode: httpStatus.rawValue, message: &message)
|
||||
} else {
|
||||
handleFailureResponse(data: data, error: error, statusCode: httpStatus.rawValue, message: message)
|
||||
}
|
||||
}
|
||||
|
||||
private func handleSuccessResponse(data: Data?, statusCode: Int, message: inout String) {
|
||||
guard let data = data else {
|
||||
completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: statusCode)))
|
||||
return
|
||||
}
|
||||
|
||||
if let responseString = String(data: data, encoding: .utf8) {
|
||||
message.append("\n\(responseString)\n")
|
||||
}
|
||||
|
||||
do {
|
||||
if Request.Response.self == VoidResponse.self {
|
||||
Formbricks.logger?.info(message)
|
||||
completion?(.success(VoidResponse() as! Request.Response))
|
||||
} else {
|
||||
var body = try request.decoder.decode(Request.Response.self, from: data)
|
||||
if var env = body as? EnvironmentResponse, let jsonString = String(data: data, encoding: .utf8) {
|
||||
env.responseString = jsonString
|
||||
body = env as! Request.Response
|
||||
}
|
||||
Formbricks.logger?.info(message)
|
||||
completion?(.success(body))
|
||||
}
|
||||
} catch {
|
||||
handleDecodingError(error, message: &message, statusCode: statusCode)
|
||||
}
|
||||
}
|
||||
|
||||
private func handleFailureResponse(data: Data?, error: Error?, statusCode: Int, message: String) {
|
||||
var log = message
|
||||
|
||||
if let error = error {
|
||||
log.append("\nError: \(error.localizedDescription)")
|
||||
Formbricks.logger?.error(log)
|
||||
completion?(.failure(error))
|
||||
} else if let data = data, let apiError = try? request.decoder.decode(FormbricksAPIError.self, from: data) {
|
||||
Formbricks.logger?.error("\(log)\n\(apiError.getDetailedErrorMessage())")
|
||||
completion?(.failure(apiError))
|
||||
} else {
|
||||
let error = FormbricksAPIClientError(type: .responseError, statusCode: statusCode)
|
||||
Formbricks.logger?.error("\(log)\n\(error.message)")
|
||||
completion?(.failure(error))
|
||||
}
|
||||
}
|
||||
|
||||
private func handleDecodingError(_ error: Error, message: inout String, statusCode: Int) {
|
||||
switch error {
|
||||
case let DecodingError.dataCorrupted(context):
|
||||
message.append("Data corrupted: \(context)")
|
||||
case let DecodingError.keyNotFound(key, context):
|
||||
message.append("Key '\(key)' not found: \(context.debugDescription)\ncodingPath: \(context.codingPath)")
|
||||
case let DecodingError.valueNotFound(value, context):
|
||||
message.append("Value '\(value)' not found: \(context.debugDescription)\ncodingPath: \(context.codingPath)")
|
||||
case let DecodingError.typeMismatch(type, context):
|
||||
message.append("Type '\(type)' mismatch: \(context.debugDescription)\ncodingPath: \(context.codingPath)")
|
||||
default:
|
||||
message.append("Error: \(error.localizedDescription)")
|
||||
}
|
||||
|
||||
Formbricks.logger?.error(message)
|
||||
completion?(.failure(FormbricksAPIClientError(type: .invalidResponse, statusCode: statusCode)))
|
||||
}
|
||||
|
||||
private func logRequest(_ request: URLRequest) {
|
||||
var message = "\(request.httpMethod ?? "") >>> \(request.url?.absoluteString ?? "")"
|
||||
|
||||
if let headers = request.allHTTPHeaderFields {
|
||||
message.append("\nHeaders: \(headers)")
|
||||
}
|
||||
|
||||
if let body = request.httpBody, let bodyString = String(data: body, encoding: .utf8) {
|
||||
message.append("\nBody: \(bodyString)")
|
||||
}
|
||||
|
||||
Formbricks.logger?.info(message)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private extension APIClient {
|
||||
|
||||
@@ -61,6 +61,7 @@ final class UpdateQueue {
|
||||
} else {
|
||||
// If no userId, just update locally without API call
|
||||
Formbricks.logger?.debug("UpdateQueue - updating language locally: \(language)")
|
||||
return
|
||||
}
|
||||
|
||||
startDebounceTimer()
|
||||
|
||||
@@ -54,15 +54,19 @@ struct SurveyWebView: UIViewRepresentable {
|
||||
func clean() {
|
||||
HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
|
||||
WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
|
||||
records.forEach { record in
|
||||
WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {
|
||||
/*
|
||||
This completion handler is intentionally empty since we only need to
|
||||
ensure the data is removed. No additional actions are required after
|
||||
the website data has been cleared.
|
||||
*/
|
||||
})
|
||||
}
|
||||
self.remove(records)
|
||||
}
|
||||
}
|
||||
|
||||
private func remove(_ records: [WKWebsiteDataRecord]) {
|
||||
records.forEach { record in
|
||||
WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {
|
||||
/*
|
||||
This completion handler is intentionally empty since we only need to
|
||||
ensure the data is removed. No additional actions are required after
|
||||
the website data has been cleared.
|
||||
*/
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
"@formbricks/eslint-config": "workspace:*",
|
||||
"@vitest/coverage-v8": "3.1.1",
|
||||
"terser": "5.39.0",
|
||||
"vite": "6.3.2",
|
||||
"vite": "6.2.5",
|
||||
"vite-plugin-dts": "4.5.3",
|
||||
"vitest": "3.1.1"
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"@formbricks/config-typescript": "workspace:*",
|
||||
"@formbricks/eslint-config": "workspace:*",
|
||||
"terser": "5.39.0",
|
||||
"vite": "6.3.2",
|
||||
"vite": "6.2.5",
|
||||
"vite-plugin-dts": "4.5.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ export const WEBAPP_URL =
|
||||
export const SURVEY_URL = env.SURVEY_URL;
|
||||
|
||||
// encryption keys
|
||||
export const FORMBRICKS_ENCRYPTION_KEY = env.FORMBRICKS_ENCRYPTION_KEY || undefined;
|
||||
export const ENCRYPTION_KEY = env.ENCRYPTION_KEY;
|
||||
|
||||
// Other
|
||||
|
||||
@@ -30,7 +30,6 @@ export const env = createEnv({
|
||||
EMAIL_VERIFICATION_DISABLED: z.enum(["1", "0"]).optional(),
|
||||
ENCRYPTION_KEY: z.string(),
|
||||
ENTERPRISE_LICENSE_KEY: z.string().optional(),
|
||||
FORMBRICKS_ENCRYPTION_KEY: z.string().length(24).or(z.string().length(0)).optional(),
|
||||
FORMBRICKS_API_HOST: z
|
||||
.string()
|
||||
.url()
|
||||
@@ -155,7 +154,6 @@ export const env = createEnv({
|
||||
EMAIL_VERIFICATION_DISABLED: process.env.EMAIL_VERIFICATION_DISABLED,
|
||||
ENCRYPTION_KEY: process.env.ENCRYPTION_KEY,
|
||||
ENTERPRISE_LICENSE_KEY: process.env.ENTERPRISE_LICENSE_KEY,
|
||||
FORMBRICKS_ENCRYPTION_KEY: process.env.FORMBRICKS_ENCRYPTION_KEY,
|
||||
FORMBRICKS_API_HOST: process.env.FORMBRICKS_API_HOST,
|
||||
FORMBRICKS_ENVIRONMENT_ID: process.env.FORMBRICKS_ENVIRONMENT_ID,
|
||||
GITHUB_ID: process.env.GITHUB_ID,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import cuid2 from "@paralleldrive/cuid2";
|
||||
import { decryptAES128, symmetricDecrypt, symmetricEncrypt } from "../../lib/crypto";
|
||||
import { symmetricDecrypt, symmetricEncrypt } from "../../lib/crypto";
|
||||
import { env } from "../../lib/env";
|
||||
|
||||
// generate encrypted single use id for the survey
|
||||
@@ -36,15 +36,7 @@ export const validateSurveySingleUseId = (surveySingleUseId: string): string | u
|
||||
throw new Error("ENCRYPTION_KEY is not set");
|
||||
}
|
||||
|
||||
if (surveySingleUseId.length === 64) {
|
||||
if (!env.FORMBRICKS_ENCRYPTION_KEY) {
|
||||
throw new Error("FORMBRICKS_ENCRYPTION_KEY is not defined");
|
||||
}
|
||||
|
||||
decryptedCuid = decryptAES128(env.FORMBRICKS_ENCRYPTION_KEY!, surveySingleUseId);
|
||||
} else {
|
||||
decryptedCuid = symmetricDecrypt(surveySingleUseId, env.ENCRYPTION_KEY);
|
||||
}
|
||||
decryptedCuid = symmetricDecrypt(surveySingleUseId, env.ENCRYPTION_KEY);
|
||||
|
||||
if (cuid2.isCuid(decryptedCuid)) {
|
||||
return decryptedCuid;
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"pino-pretty": "^13.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vite": "6.3.2",
|
||||
"vite": "^6.2.4",
|
||||
"@formbricks/config-typescript": "workspace:*",
|
||||
"vitest": "3.1.1",
|
||||
"@formbricks/eslint-config": "workspace:*",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"react": "18.3.1",
|
||||
"react-native": "0.74.5",
|
||||
"terser": "5.37.0",
|
||||
"vite": "6.3.2",
|
||||
"vite": "6.2.5",
|
||||
"vite-plugin-dts": "4.5.3",
|
||||
"vitest": "3.1.1"
|
||||
},
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"serve": "14.2.4",
|
||||
"tailwindcss": "3.4.16",
|
||||
"terser": "5.39.0",
|
||||
"vite": "6.3.2",
|
||||
"vite": "6.2.5",
|
||||
"vite-plugin-dts": "4.5.3",
|
||||
"vite-tsconfig-paths": "5.1.4"
|
||||
},
|
||||
|
||||
@@ -17,6 +17,6 @@
|
||||
"devDependencies": {
|
||||
"@formbricks/config-typescript": "workspace:*",
|
||||
"@formbricks/eslint-config": "workspace:*",
|
||||
"vite": "6.3.2"
|
||||
"vite": "6.2.5"
|
||||
}
|
||||
}
|
||||
|
||||
128
pnpm-lock.yaml
generated
128
pnpm-lock.yaml
generated
@@ -158,7 +158,7 @@ importers:
|
||||
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)
|
||||
'@storybook/react-vite':
|
||||
specifier: 8.6.12
|
||||
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@storybook/test':
|
||||
specifier: 8.6.12
|
||||
version: 8.6.12(storybook@8.6.12(prettier@3.5.3))
|
||||
@@ -170,7 +170,7 @@ importers:
|
||||
version: 8.29.1(eslint@8.57.0)(typescript@5.8.3)
|
||||
'@vitejs/plugin-react':
|
||||
specifier: 4.3.4
|
||||
version: 4.3.4(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
esbuild:
|
||||
specifier: 0.25.2
|
||||
version: 0.25.2
|
||||
@@ -187,8 +187,8 @@ importers:
|
||||
specifier: 8.4.0
|
||||
version: 8.4.0(@microsoft/api-extractor@7.52.3(@types/node@22.14.0))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1)
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
|
||||
apps/web:
|
||||
dependencies:
|
||||
@@ -602,11 +602,11 @@ importers:
|
||||
specifier: 1.5.1
|
||||
version: 1.5.1
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-tsconfig-paths:
|
||||
specifier: 5.1.4
|
||||
version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
vitest:
|
||||
specifier: 3.1.1
|
||||
version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
@@ -741,11 +741,11 @@ importers:
|
||||
specifier: 5.39.0
|
||||
version: 5.39.0
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-plugin-dts:
|
||||
specifier: 4.5.3
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
|
||||
packages/js-core:
|
||||
devDependencies:
|
||||
@@ -762,11 +762,11 @@ importers:
|
||||
specifier: 5.39.0
|
||||
version: 5.39.0
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-plugin-dts:
|
||||
specifier: 4.5.3
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
vitest:
|
||||
specifier: 3.1.1
|
||||
version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
@@ -887,11 +887,11 @@ importers:
|
||||
specifier: workspace:*
|
||||
version: link:../config-eslint
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: ^6.2.4
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-plugin-dts:
|
||||
specifier: 4.5.3
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
vitest:
|
||||
specifier: 3.1.1
|
||||
version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
@@ -930,11 +930,11 @@ importers:
|
||||
specifier: 5.37.0
|
||||
version: 5.37.0
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-plugin-dts:
|
||||
specifier: 4.5.3
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
vitest:
|
||||
specifier: 3.1.1
|
||||
version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
@@ -965,7 +965,7 @@ importers:
|
||||
version: link:../types
|
||||
'@preact/preset-vite':
|
||||
specifier: 2.10.1
|
||||
version: 2.10.1(@babel/core@7.26.0)(preact@10.26.5)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 2.10.1(@babel/core@7.26.0)(preact@10.26.5)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@testing-library/preact':
|
||||
specifier: 3.2.4
|
||||
version: 3.2.4(preact@10.26.5)
|
||||
@@ -1000,14 +1000,14 @@ importers:
|
||||
specifier: 5.39.0
|
||||
version: 5.39.0
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-plugin-dts:
|
||||
specifier: 4.5.3
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
vite-tsconfig-paths:
|
||||
specifier: 5.1.4
|
||||
version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
version: 5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
|
||||
packages/types:
|
||||
dependencies:
|
||||
@@ -1037,8 +1037,8 @@ importers:
|
||||
specifier: workspace:*
|
||||
version: link:../config-eslint
|
||||
vite:
|
||||
specifier: 6.3.2
|
||||
version: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
specifier: 6.2.5
|
||||
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
|
||||
packages:
|
||||
|
||||
@@ -13131,8 +13131,8 @@ packages:
|
||||
vite:
|
||||
optional: true
|
||||
|
||||
vite@6.3.2:
|
||||
resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==}
|
||||
vite@6.2.5:
|
||||
resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==}
|
||||
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@@ -16425,12 +16425,12 @@ snapshots:
|
||||
'@types/yargs': 17.0.33
|
||||
chalk: 4.1.2
|
||||
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
glob: 10.4.5
|
||||
magic-string: 0.27.0
|
||||
react-docgen-typescript: 2.2.2(typescript@5.8.3)
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
optionalDependencies:
|
||||
typescript: 5.8.3
|
||||
|
||||
@@ -17227,17 +17227,17 @@ snapshots:
|
||||
dependencies:
|
||||
playwright: 1.51.1
|
||||
|
||||
'@preact/preset-vite@2.10.1(@babel/core@7.26.0)(preact@10.26.5)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@preact/preset-vite@2.10.1(@babel/core@7.26.0)(preact@10.26.5)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
|
||||
'@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0)
|
||||
'@prefresh/vite': 2.4.7(preact@10.26.5)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@prefresh/vite': 2.4.7(preact@10.26.5)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@rollup/pluginutils': 4.2.1
|
||||
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.26.0)
|
||||
debug: 4.4.0
|
||||
kolorist: 1.8.0
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-prerender-plugin: 0.5.7
|
||||
transitivePeerDependencies:
|
||||
- preact
|
||||
@@ -17251,7 +17251,7 @@ snapshots:
|
||||
|
||||
'@prefresh/utils@1.2.0': {}
|
||||
|
||||
'@prefresh/vite@2.4.7(preact@10.26.5)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@prefresh/vite@2.4.7(preact@10.26.5)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@prefresh/babel-plugin': 0.5.1
|
||||
@@ -17259,7 +17259,7 @@ snapshots:
|
||||
'@prefresh/utils': 1.2.0
|
||||
'@rollup/pluginutils': 4.2.1
|
||||
preact: 10.26.5
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -19463,13 +19463,13 @@ snapshots:
|
||||
react: 19.1.0
|
||||
react-dom: 19.1.0(react@19.1.0)
|
||||
|
||||
'@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@storybook/csf-plugin': 8.6.12(storybook@8.6.12(prettier@3.5.3))
|
||||
browser-assert: 1.2.1
|
||||
storybook: 8.6.12(prettier@3.5.3)
|
||||
ts-dedent: 2.2.0
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
|
||||
'@storybook/components@8.6.12(storybook@8.6.12(prettier@3.5.3))':
|
||||
dependencies:
|
||||
@@ -19532,11 +19532,11 @@ snapshots:
|
||||
react-dom: 19.1.0(react@19.1.0)
|
||||
storybook: 8.6.12(prettier@3.5.3)
|
||||
|
||||
'@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.39.0)
|
||||
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)
|
||||
find-up: 5.0.0
|
||||
magic-string: 0.30.17
|
||||
@@ -19546,7 +19546,7 @@ snapshots:
|
||||
resolve: 1.22.10
|
||||
storybook: 8.6.12(prettier@3.5.3)
|
||||
tsconfig-paths: 4.2.0
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
optionalDependencies:
|
||||
'@storybook/test': 8.6.12(storybook@8.6.12(prettier@3.5.3))
|
||||
transitivePeerDependencies:
|
||||
@@ -20394,14 +20394,14 @@ snapshots:
|
||||
- supports-color
|
||||
- vitest
|
||||
|
||||
'@vitejs/plugin-react@4.3.4(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@vitejs/plugin-react@4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
|
||||
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
|
||||
'@types/babel__core': 7.20.5
|
||||
react-refresh: 0.14.2
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -20463,21 +20463,21 @@ snapshots:
|
||||
chai: 5.2.0
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
'@vitest/mocker@3.1.1(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@vitest/spy': 3.1.1
|
||||
estree-walker: 3.0.3
|
||||
magic-string: 0.30.17
|
||||
optionalDependencies:
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
|
||||
'@vitest/mocker@3.1.1(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
'@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))':
|
||||
dependencies:
|
||||
'@vitest/spy': 3.1.1
|
||||
estree-walker: 3.0.3
|
||||
magic-string: 0.30.17
|
||||
optionalDependencies:
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
|
||||
'@vitest/pretty-format@2.0.5':
|
||||
dependencies:
|
||||
@@ -28666,7 +28666,7 @@ snapshots:
|
||||
debug: 4.4.0
|
||||
es-module-lexer: 1.6.0
|
||||
pathe: 2.0.3
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- jiti
|
||||
@@ -28687,7 +28687,7 @@ snapshots:
|
||||
debug: 4.4.0
|
||||
es-module-lexer: 1.6.0
|
||||
pathe: 2.0.3
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- jiti
|
||||
@@ -28702,7 +28702,7 @@ snapshots:
|
||||
- tsx
|
||||
- yaml
|
||||
|
||||
vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
dependencies:
|
||||
'@microsoft/api-extractor': 7.52.3(@types/node@22.14.0)
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.39.0)
|
||||
@@ -28715,13 +28715,13 @@ snapshots:
|
||||
magic-string: 0.30.17
|
||||
typescript: 5.8.3
|
||||
optionalDependencies:
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
dependencies:
|
||||
'@microsoft/api-extractor': 7.52.3(@types/node@22.14.0)
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.39.0)
|
||||
@@ -28734,7 +28734,7 @@ snapshots:
|
||||
magic-string: 0.30.17
|
||||
typescript: 5.8.3
|
||||
optionalDependencies:
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- rollup
|
||||
@@ -28749,25 +28749,22 @@ snapshots:
|
||||
source-map: 0.7.4
|
||||
stack-trace: 1.0.0-pre2
|
||||
|
||||
vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)):
|
||||
dependencies:
|
||||
debug: 4.4.0
|
||||
globrex: 0.1.2
|
||||
tsconfck: 3.1.5(typescript@5.8.3)
|
||||
optionalDependencies:
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
dependencies:
|
||||
esbuild: 0.25.2
|
||||
fdir: 6.4.3(picomatch@4.0.2)
|
||||
picomatch: 4.0.2
|
||||
postcss: 8.5.3
|
||||
rollup: 4.39.0
|
||||
tinyglobby: 0.2.12
|
||||
optionalDependencies:
|
||||
'@types/node': 22.14.0
|
||||
fsevents: 2.3.3
|
||||
@@ -28777,14 +28774,11 @@ snapshots:
|
||||
tsx: 4.19.3
|
||||
yaml: 2.7.1
|
||||
|
||||
vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
dependencies:
|
||||
esbuild: 0.25.2
|
||||
fdir: 6.4.3(picomatch@4.0.2)
|
||||
picomatch: 4.0.2
|
||||
postcss: 8.5.3
|
||||
rollup: 4.39.0
|
||||
tinyglobby: 0.2.12
|
||||
optionalDependencies:
|
||||
'@types/node': 22.14.0
|
||||
fsevents: 2.3.3
|
||||
@@ -28809,7 +28803,7 @@ snapshots:
|
||||
vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
dependencies:
|
||||
'@vitest/expect': 3.1.1
|
||||
'@vitest/mocker': 3.1.1(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@vitest/pretty-format': 3.1.1
|
||||
'@vitest/runner': 3.1.1
|
||||
'@vitest/snapshot': 3.1.1
|
||||
@@ -28825,7 +28819,7 @@ snapshots:
|
||||
tinyexec: 0.3.2
|
||||
tinypool: 1.0.2
|
||||
tinyrainbow: 2.0.0
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-node: 3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
why-is-node-running: 2.3.0
|
||||
optionalDependencies:
|
||||
@@ -28849,7 +28843,7 @@ snapshots:
|
||||
vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1):
|
||||
dependencies:
|
||||
'@vitest/expect': 3.1.1
|
||||
'@vitest/mocker': 3.1.1(vite@6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))
|
||||
'@vitest/pretty-format': 3.1.1
|
||||
'@vitest/runner': 3.1.1
|
||||
'@vitest/snapshot': 3.1.1
|
||||
@@ -28865,7 +28859,7 @@ snapshots:
|
||||
tinyexec: 0.3.2
|
||||
tinypool: 1.0.2
|
||||
tinyrainbow: 2.0.0
|
||||
vite: 6.3.2(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
vite-node: 3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)
|
||||
why-is-node-running: 2.3.0
|
||||
optionalDependencies:
|
||||
|
||||
@@ -114,7 +114,6 @@
|
||||
"EMAIL_VERIFICATION_DISABLED",
|
||||
"ENCRYPTION_KEY",
|
||||
"ENTERPRISE_LICENSE_KEY",
|
||||
"FORMBRICKS_ENCRYPTION_KEY",
|
||||
"FORMBRICKS_API_HOST",
|
||||
"FORMBRICKS_ENVIRONMENT_ID",
|
||||
"GITHUB_ID",
|
||||
|
||||
Reference in New Issue
Block a user