@hexclave/shared 1.0.3 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/unified-prompts/reminders.js +4 -3
- package/dist/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +3 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +216 -29
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +1 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +18 -6
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +23 -8
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/config/schema.d.ts +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +5 -5
- package/dist/config/schema.js.map +1 -1
- package/dist/config-authoring.d.ts +4 -4
- package/dist/config-authoring.d.ts.map +1 -1
- package/dist/config-authoring.js +2 -2
- package/dist/config-authoring.js.map +1 -1
- package/dist/config-rendering.d.ts +4 -4
- package/dist/config-rendering.d.ts.map +1 -1
- package/dist/config-rendering.js +19 -18
- package/dist/config-rendering.js.map +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js +4 -3
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +3 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +215 -30
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +1 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +18 -6
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +23 -8
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
- package/dist/esm/config/schema.d.ts +1 -1
- package/dist/esm/config/schema.d.ts.map +1 -1
- package/dist/esm/config/schema.js +5 -5
- package/dist/esm/config/schema.js.map +1 -1
- package/dist/esm/config-authoring.d.ts +4 -4
- package/dist/esm/config-authoring.d.ts.map +1 -1
- package/dist/esm/config-authoring.js +2 -2
- package/dist/esm/config-authoring.js.map +1 -1
- package/dist/esm/config-rendering.d.ts +4 -4
- package/dist/esm/config-rendering.d.ts.map +1 -1
- package/dist/esm/config-rendering.js +15 -14
- package/dist/esm/config-rendering.js.map +1 -1
- package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/esm/helpers/vault/client-side.js.map +1 -1
- package/dist/esm/helpers/vault/server-side.d.ts.map +1 -1
- package/dist/esm/helpers/vault/server-side.js.map +1 -1
- package/dist/esm/hexclave-config-file.d.ts +15 -0
- package/dist/esm/hexclave-config-file.d.ts.map +1 -0
- package/dist/esm/{stack-config-file.js → hexclave-config-file.js} +7 -7
- package/dist/esm/hexclave-config-file.js.map +1 -0
- package/dist/esm/interface/admin-metrics.d.ts +2 -2
- package/dist/esm/interface/admin-metrics.js.map +1 -1
- package/dist/esm/interface/client-interface.js +2 -2
- package/dist/esm/interface/client-interface.js.map +1 -1
- package/dist/esm/interface/conversations.d.ts +32 -32
- package/dist/esm/interface/crud/current-user.d.ts +7 -7
- package/dist/esm/interface/crud/email-outbox.d.ts +42 -42
- package/dist/esm/interface/crud/project-permissions.js +5 -5
- package/dist/esm/interface/crud/project-permissions.js.map +1 -1
- package/dist/esm/interface/crud/team-member-profiles.d.ts +18 -18
- package/dist/esm/interface/crud/team-permissions.js +5 -5
- package/dist/esm/interface/crud/team-permissions.js.map +1 -1
- package/dist/esm/interface/crud/users.d.ts +10 -10
- package/dist/esm/interface/page-component-versions.js +107 -107
- package/dist/esm/interface/page-component-versions.js.map +1 -1
- package/dist/esm/interface/webhooks.d.ts +2 -2
- package/dist/esm/known-errors.d.ts +1 -1
- package/dist/esm/known-errors.d.ts.map +1 -1
- package/dist/esm/known-errors.js +9 -5
- package/dist/esm/known-errors.js.map +1 -1
- package/dist/esm/schema-fields.d.ts +15 -5
- package/dist/esm/schema-fields.d.ts.map +1 -1
- package/dist/esm/schema-fields.js +26 -16
- package/dist/esm/schema-fields.js.map +1 -1
- package/dist/esm/utils/crypto.d.ts.map +1 -1
- package/dist/esm/utils/crypto.js.map +1 -1
- package/dist/esm/utils/currency-constants.d.ts +6 -0
- package/dist/esm/utils/currency-constants.d.ts.map +1 -1
- package/dist/esm/utils/currency-constants.js.map +1 -1
- package/dist/esm/utils/dev-env-state-path.d.ts +3 -3
- package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/esm/utils/dev-env-state-path.js +4 -4
- package/dist/esm/utils/dev-env-state-path.js.map +1 -1
- package/dist/esm/utils/errors.js +2 -2
- package/dist/esm/utils/errors.js.map +1 -1
- package/dist/esm/utils/esbuild.d.ts.map +1 -1
- package/dist/esm/utils/esbuild.js +0 -1
- package/dist/esm/utils/esbuild.js.map +1 -1
- package/dist/esm/utils/featurebase.d.ts +3 -3
- package/dist/esm/utils/featurebase.d.ts.map +1 -1
- package/dist/esm/utils/featurebase.js +15 -15
- package/dist/esm/utils/featurebase.js.map +1 -1
- package/dist/esm/utils/fs.js +6 -6
- package/dist/esm/utils/fs.js.map +1 -1
- package/dist/esm/utils/globals.d.ts.map +1 -1
- package/dist/esm/utils/globals.js +10 -10
- package/dist/esm/utils/globals.js.map +1 -1
- package/dist/esm/utils/jwt.d.ts.map +1 -1
- package/dist/esm/utils/jwt.js +3 -3
- package/dist/esm/utils/jwt.js.map +1 -1
- package/dist/esm/utils/redirect-urls.d.ts +3 -3
- package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
- package/dist/esm/utils/redirect-urls.js +5 -5
- package/dist/esm/utils/redirect-urls.js.map +1 -1
- package/dist/esm/utils/urls.js.map +1 -1
- package/dist/helpers/vault/client-side.d.ts.map +1 -1
- package/dist/helpers/vault/client-side.js.map +1 -1
- package/dist/helpers/vault/server-side.d.ts.map +1 -1
- package/dist/helpers/vault/server-side.js.map +1 -1
- package/dist/hexclave-config-file.d.ts +15 -0
- package/dist/hexclave-config-file.d.ts.map +1 -0
- package/dist/{stack-config-file.js → hexclave-config-file.js} +8 -8
- package/dist/hexclave-config-file.js.map +1 -0
- package/dist/interface/admin-metrics.d.ts +12 -12
- package/dist/interface/admin-metrics.js.map +1 -1
- package/dist/interface/client-interface.js +2 -2
- package/dist/interface/client-interface.js.map +1 -1
- package/dist/interface/conversations.d.ts +32 -32
- package/dist/interface/crud/current-user.d.ts +7 -7
- package/dist/interface/crud/email-outbox.d.ts +42 -42
- package/dist/interface/crud/project-permissions.js +5 -5
- package/dist/interface/crud/project-permissions.js.map +1 -1
- package/dist/interface/crud/team-member-profiles.d.ts +18 -18
- package/dist/interface/crud/team-permissions.js +5 -5
- package/dist/interface/crud/team-permissions.js.map +1 -1
- package/dist/interface/crud/users.d.ts +10 -10
- package/dist/interface/page-component-versions.js +107 -107
- package/dist/interface/page-component-versions.js.map +1 -1
- package/dist/interface/webhooks.d.ts +2 -2
- package/dist/known-errors.d.ts +1 -1
- package/dist/known-errors.d.ts.map +1 -1
- package/dist/known-errors.js +9 -5
- package/dist/known-errors.js.map +1 -1
- package/dist/schema-fields.d.ts +15 -5
- package/dist/schema-fields.d.ts.map +1 -1
- package/dist/schema-fields.js +26 -16
- package/dist/schema-fields.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/currency-constants.d.ts +6 -0
- package/dist/utils/currency-constants.d.ts.map +1 -1
- package/dist/utils/currency-constants.js.map +1 -1
- package/dist/utils/dev-env-state-path.d.ts +3 -3
- package/dist/utils/dev-env-state-path.d.ts.map +1 -1
- package/dist/utils/dev-env-state-path.js +5 -5
- package/dist/utils/dev-env-state-path.js.map +1 -1
- package/dist/utils/errors.js +2 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/esbuild.d.ts.map +1 -1
- package/dist/utils/esbuild.js +0 -1
- package/dist/utils/esbuild.js.map +1 -1
- package/dist/utils/featurebase.d.ts +3 -3
- package/dist/utils/featurebase.d.ts.map +1 -1
- package/dist/utils/featurebase.js +15 -15
- package/dist/utils/featurebase.js.map +1 -1
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/globals.d.ts.map +1 -1
- package/dist/utils/globals.js +10 -10
- package/dist/utils/globals.js.map +1 -1
- package/dist/utils/jwt.d.ts.map +1 -1
- package/dist/utils/jwt.js +3 -3
- package/dist/utils/jwt.js.map +1 -1
- package/dist/utils/redirect-urls.d.ts +3 -3
- package/dist/utils/redirect-urls.d.ts.map +1 -1
- package/dist/utils/redirect-urls.js +5 -5
- package/dist/utils/redirect-urls.js.map +1 -1
- package/dist/utils/urls.js.map +1 -1
- package/package.json +2 -1
- package/src/ai/image-limits.ts +62 -0
- package/src/ai/llms/llms.ts +36 -0
- package/src/ai/unified-prompts/reminders.ts +27 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +1047 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/brain.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/cli-help.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/config-docs.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/docs-index.ts +80 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.ts +322 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.ts +5 -0
- package/src/ai/unified-prompts/skill-site-prompt.ts +72 -0
- package/src/apps/apps-config.ts +177 -0
- package/src/apps/apps-ui.tsx +112 -0
- package/src/config/README.md +154 -0
- package/src/config/db-sync-mappings.ts +2293 -0
- package/src/config/format.ts +388 -0
- package/src/config/migrate-catalogs-to-product-lines.ts +475 -0
- package/src/config/schema-fuzzer.test.ts +377 -0
- package/src/config/schema.ts +1507 -0
- package/src/config-authoring.test.ts +52 -0
- package/src/config-authoring.ts +37 -0
- package/src/config-rendering.ts +142 -0
- package/src/crud.tsx +275 -0
- package/src/global.d.ts +1 -0
- package/src/helpers/emails.ts +250 -0
- package/src/helpers/init-prompt.ts +39 -0
- package/src/helpers/password.ts +16 -0
- package/src/helpers/production-mode.ts +58 -0
- package/src/helpers/support-sla.test.ts +124 -0
- package/src/helpers/support-sla.ts +93 -0
- package/src/helpers/vault/client-side.ts +92 -0
- package/src/helpers/vault/server-side.ts +153 -0
- package/src/hexclave-config-file.ts +120 -0
- package/src/hooks/use-async-callback.tsx +43 -0
- package/src/hooks/use-async-external-store.tsx +24 -0
- package/src/hooks/use-hash.tsx +14 -0
- package/src/hooks/use-hover.tsx +88 -0
- package/src/hooks/use-strict-memo.tsx +157 -0
- package/src/index.ts +17 -0
- package/src/interface/admin-interface.ts +1043 -0
- package/src/interface/admin-metrics.ts +214 -0
- package/src/interface/client-interface.test.ts +765 -0
- package/src/interface/client-interface.ts +2586 -0
- package/src/interface/conversations.ts +109 -0
- package/src/interface/crud/analytics.ts +11 -0
- package/src/interface/crud/connected-accounts.ts +52 -0
- package/src/interface/crud/contact-channels.ts +74 -0
- package/src/interface/crud/current-user.ts +72 -0
- package/src/interface/crud/email-outbox.ts +263 -0
- package/src/interface/crud/email-templates.ts +50 -0
- package/src/interface/crud/emails.ts +22 -0
- package/src/interface/crud/internal-api-keys.ts +69 -0
- package/src/interface/crud/invoices.ts +36 -0
- package/src/interface/crud/items.ts +24 -0
- package/src/interface/crud/notification-preferences.ts +33 -0
- package/src/interface/crud/oauth-providers.ts +91 -0
- package/src/interface/crud/products.ts +42 -0
- package/src/interface/crud/project-api-keys.ts +100 -0
- package/src/interface/crud/project-permissions.ts +118 -0
- package/src/interface/crud/projects.ts +229 -0
- package/src/interface/crud/session-replays.ts +85 -0
- package/src/interface/crud/sessions.ts +66 -0
- package/src/interface/crud/sign-up-rules.ts +12 -0
- package/src/interface/crud/svix-token.ts +20 -0
- package/src/interface/crud/team-invitation-details.ts +22 -0
- package/src/interface/crud/team-invitation.ts +35 -0
- package/src/interface/crud/team-member-profiles.ts +61 -0
- package/src/interface/crud/team-memberships.ts +56 -0
- package/src/interface/crud/team-permissions.ts +119 -0
- package/src/interface/crud/teams.ts +142 -0
- package/src/interface/crud/transactions.ts +131 -0
- package/src/interface/crud/users.ts +185 -0
- package/src/interface/handler-urls.ts +74 -0
- package/src/interface/page-component-versions.ts +1702 -0
- package/src/interface/server-interface.ts +1146 -0
- package/src/interface/webhooks.ts +28 -0
- package/src/known-errors.tsx +2034 -0
- package/src/local-emulator.ts +5 -0
- package/src/payments/payment-methods.ts +167 -0
- package/src/payments/stripe-limits.ts +18 -0
- package/src/plans.ts +107 -0
- package/src/schema-fields.ts +944 -0
- package/src/sessions.ts +310 -0
- package/src/utils/api-keys.tsx +122 -0
- package/src/utils/arrays.tsx +248 -0
- package/src/utils/auth-methods.ts +8 -0
- package/src/utils/base64.tsx +24 -0
- package/src/utils/booleans.tsx +34 -0
- package/src/utils/browser-compat.tsx +17 -0
- package/src/utils/bytes.tsx +280 -0
- package/src/utils/caches.tsx +280 -0
- package/src/utils/cel-fields.ts +92 -0
- package/src/utils/cloud-hosts.tsx +92 -0
- package/src/utils/compile-time.tsx +11 -0
- package/src/utils/country-codes.ts +39 -0
- package/src/utils/crypto.tsx +174 -0
- package/src/utils/currencies.tsx +53 -0
- package/src/utils/currency-constants.tsx +51 -0
- package/src/utils/dates.tsx +246 -0
- package/src/utils/dev-env-state-path.ts +14 -0
- package/src/utils/dom.tsx +7 -0
- package/src/utils/env.tsx +117 -0
- package/src/utils/errors.tsx +284 -0
- package/src/utils/esbuild.tsx +235 -0
- package/src/utils/featurebase.tsx +247 -0
- package/src/utils/fs.tsx +33 -0
- package/src/utils/functions.tsx +22 -0
- package/src/utils/geo.tsx +16 -0
- package/src/utils/globals.tsx +48 -0
- package/src/utils/hashes.tsx +52 -0
- package/src/utils/html.tsx +60 -0
- package/src/utils/http.tsx +91 -0
- package/src/utils/ips.tsx +47 -0
- package/src/utils/json.tsx +200 -0
- package/src/utils/jsx-editable-transpiler.test.ts +156 -0
- package/src/utils/jsx-editable-transpiler.tsx +401 -0
- package/src/utils/jwt.tsx +170 -0
- package/src/utils/locks.tsx +71 -0
- package/src/utils/maps.tsx +407 -0
- package/src/utils/math.tsx +18 -0
- package/src/utils/monkey-patch.tsx +29 -0
- package/src/utils/node-http.tsx +47 -0
- package/src/utils/numbers.tsx +82 -0
- package/src/utils/oauth.tsx +9 -0
- package/src/utils/objects.tsx +581 -0
- package/src/utils/paginated-lists.test.ts +1039 -0
- package/src/utils/paginated-lists.tsx +479 -0
- package/src/utils/passkey.tsx +1 -0
- package/src/utils/promises.tsx +540 -0
- package/src/utils/proxies.tsx +212 -0
- package/src/utils/react.tsx +308 -0
- package/src/utils/redirect-urls.tsx +299 -0
- package/src/utils/regex.tsx +10 -0
- package/src/utils/results.tsx +411 -0
- package/src/utils/sentry.tsx +20 -0
- package/src/utils/stores.tsx +238 -0
- package/src/utils/strings.nicify.test.ts +253 -0
- package/src/utils/strings.tsx +723 -0
- package/src/utils/telemetry.tsx +37 -0
- package/src/utils/turnstile-browser.ts +106 -0
- package/src/utils/turnstile-flow.test.ts +101 -0
- package/src/utils/turnstile-flow.ts +266 -0
- package/src/utils/turnstile.ts +34 -0
- package/src/utils/typed-arrays.tsx +17 -0
- package/src/utils/types.tsx +208 -0
- package/src/utils/unicode.tsx +24 -0
- package/src/utils/urls.tsx +411 -0
- package/src/utils/uuids.tsx +47 -0
- package/dist/esm/stack-config-file.d.ts +0 -15
- package/dist/esm/stack-config-file.d.ts.map +0 -1
- package/dist/esm/stack-config-file.js.map +0 -1
- package/dist/stack-config-file.d.ts +0 -15
- package/dist/stack-config-file.d.ts.map +0 -1
- package/dist/stack-config-file.js.map +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { useId, useInsertionEffect, useMemo } from "react";
|
|
2
|
+
import { Result } from "../utils/results";
|
|
3
|
+
|
|
4
|
+
type CacheInner = Map<unknown, CacheInner> | WeakMap<WeakKey, CacheInner> | { isNotNestedMap: true, value: any };
|
|
5
|
+
|
|
6
|
+
const cached = new Map<string, CacheInner>();
|
|
7
|
+
|
|
8
|
+
function unwrapFromInner(dependencies: any[], inner: CacheInner): Result<any, void> {
|
|
9
|
+
if ((dependencies.length === 0) !== ("isNotNestedMap" in inner)) {
|
|
10
|
+
return Result.error(undefined);
|
|
11
|
+
}
|
|
12
|
+
if ("isNotNestedMap" in inner) {
|
|
13
|
+
if (dependencies.length === 0) {
|
|
14
|
+
return Result.ok(inner.value);
|
|
15
|
+
} else {
|
|
16
|
+
return Result.error(undefined);
|
|
17
|
+
}
|
|
18
|
+
} else {
|
|
19
|
+
if (dependencies.length === 0) {
|
|
20
|
+
return Result.error(undefined);
|
|
21
|
+
} else {
|
|
22
|
+
const [key, ...rest] = dependencies;
|
|
23
|
+
const newInner = inner.get(key);
|
|
24
|
+
if (!newInner) {
|
|
25
|
+
return Result.error(undefined);
|
|
26
|
+
}
|
|
27
|
+
return unwrapFromInner(rest, newInner);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
import.meta.vitest?.test("unwrapFromInner", ({ expect }) => {
|
|
32
|
+
// Test with empty dependencies and non-nested map
|
|
33
|
+
const nonNestedMap = { isNotNestedMap: true, value: "test" } as CacheInner;
|
|
34
|
+
const result1 = unwrapFromInner([], nonNestedMap);
|
|
35
|
+
expect(result1.status).toBe("ok");
|
|
36
|
+
if (result1.status === "ok") {
|
|
37
|
+
expect(result1.data).toBe("test");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Test with non-empty dependencies and non-nested map (should error)
|
|
41
|
+
expect(unwrapFromInner(["key"], nonNestedMap).status).toBe("error");
|
|
42
|
+
|
|
43
|
+
// Test with empty dependencies and nested map (should error)
|
|
44
|
+
const nestedMap = new Map([["key", { isNotNestedMap: true, value: "test" } as CacheInner]]) as CacheInner;
|
|
45
|
+
expect(unwrapFromInner([], nestedMap).status).toBe("error");
|
|
46
|
+
|
|
47
|
+
// Test with matching dependencies and nested map
|
|
48
|
+
const result2 = unwrapFromInner(["key"], nestedMap);
|
|
49
|
+
expect(result2.status).toBe("ok");
|
|
50
|
+
if (result2.status === "ok") {
|
|
51
|
+
expect(result2.data).toBe("test");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Test with non-matching dependencies and nested map
|
|
55
|
+
expect(unwrapFromInner(["wrongKey"], nestedMap).status).toBe("error");
|
|
56
|
+
|
|
57
|
+
// Test with deeply nested map
|
|
58
|
+
const deeplyNestedMap = new Map([
|
|
59
|
+
["key1", new Map([
|
|
60
|
+
["key2", { isNotNestedMap: true, value: "nested" } as CacheInner]
|
|
61
|
+
]) as CacheInner]
|
|
62
|
+
]) as CacheInner;
|
|
63
|
+
|
|
64
|
+
const result3 = unwrapFromInner(["key1", "key2"], deeplyNestedMap);
|
|
65
|
+
expect(result3.status).toBe("ok");
|
|
66
|
+
if (result3.status === "ok") {
|
|
67
|
+
expect(result3.data).toBe("nested");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Test with partial match in deeply nested map
|
|
71
|
+
expect(unwrapFromInner(["key1", "wrongKey"], deeplyNestedMap).status).toBe("error");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
function wrapToInner(dependencies: any[], value: any): CacheInner {
|
|
75
|
+
if (dependencies.length === 0) {
|
|
76
|
+
return { isNotNestedMap: true, value };
|
|
77
|
+
}
|
|
78
|
+
const [key, ...rest] = dependencies;
|
|
79
|
+
const inner = wrapToInner(rest, value);
|
|
80
|
+
|
|
81
|
+
const isObject = (typeof key === "object" && key !== null);
|
|
82
|
+
const isUnregisteredSymbol = (typeof key === "symbol" && Symbol.keyFor(key) === undefined);
|
|
83
|
+
const isWeak = isObject || isUnregisteredSymbol;
|
|
84
|
+
const mapType = isWeak ? WeakMap : Map;
|
|
85
|
+
|
|
86
|
+
return new mapType([[key, inner]]);
|
|
87
|
+
}
|
|
88
|
+
import.meta.vitest?.test("wrapToInner", ({ expect }) => {
|
|
89
|
+
// Test with empty dependencies
|
|
90
|
+
const emptyResult = wrapToInner([], "test");
|
|
91
|
+
expect(emptyResult).toEqual({ isNotNestedMap: true, value: "test" });
|
|
92
|
+
|
|
93
|
+
// Test with single string dependency
|
|
94
|
+
const singleResult = wrapToInner(["key"], "test");
|
|
95
|
+
expect(singleResult instanceof Map).toBe(true);
|
|
96
|
+
// Need to cast to access Map methods
|
|
97
|
+
const singleMap = singleResult as Map<unknown, CacheInner>;
|
|
98
|
+
expect(singleMap.get("key")).toEqual({ isNotNestedMap: true, value: "test" });
|
|
99
|
+
|
|
100
|
+
// Test with multiple string dependencies
|
|
101
|
+
const multiResult = wrapToInner(["key1", "key2"], "test");
|
|
102
|
+
expect(multiResult instanceof Map).toBe(true);
|
|
103
|
+
// Need to cast to access Map methods
|
|
104
|
+
const multiMap = multiResult as Map<unknown, CacheInner>;
|
|
105
|
+
const innerMap = multiMap.get("key1") as Map<unknown, CacheInner>;
|
|
106
|
+
expect(innerMap instanceof Map).toBe(true);
|
|
107
|
+
expect(innerMap.get("key2")).toEqual({ isNotNestedMap: true, value: "test" });
|
|
108
|
+
|
|
109
|
+
// Test with object dependency (should use WeakMap)
|
|
110
|
+
const obj = { test: true };
|
|
111
|
+
const objResult = wrapToInner([obj], "test");
|
|
112
|
+
expect(objResult instanceof WeakMap).toBe(true);
|
|
113
|
+
// Need to cast to access WeakMap methods
|
|
114
|
+
const objMap = objResult as WeakMap<WeakKey, CacheInner>;
|
|
115
|
+
expect(objMap.get(obj)).toEqual({ isNotNestedMap: true, value: "test" });
|
|
116
|
+
|
|
117
|
+
// Test with unregistered symbol dependency (should use WeakMap)
|
|
118
|
+
const symbolObj = Symbol("test");
|
|
119
|
+
const symbolResult = wrapToInner([symbolObj], "test");
|
|
120
|
+
expect(symbolResult instanceof WeakMap).toBe(true);
|
|
121
|
+
// Need to cast to access WeakMap methods
|
|
122
|
+
const symbolMap = symbolResult as WeakMap<WeakKey, CacheInner>;
|
|
123
|
+
expect(symbolMap.get(symbolObj as unknown as object)).toEqual({ isNotNestedMap: true, value: "test" });
|
|
124
|
+
|
|
125
|
+
// Test with registered symbol dependency (should use Map)
|
|
126
|
+
const registeredSymbol = Symbol.for("test");
|
|
127
|
+
const registeredSymbolResult = wrapToInner([registeredSymbol], "test");
|
|
128
|
+
expect(registeredSymbolResult instanceof Map).toBe(true);
|
|
129
|
+
// Need to cast to access Map methods
|
|
130
|
+
const registeredSymbolMap = registeredSymbolResult as Map<unknown, CacheInner>;
|
|
131
|
+
expect(registeredSymbolMap.get(registeredSymbol)).toEqual({ isNotNestedMap: true, value: "test" });
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Like memo, but minimizes recomputation of the value at all costs (instead of useMemo which recomputes whenever the renderer feels like it).
|
|
136
|
+
*
|
|
137
|
+
* The most recent value will be kept from garbage collection until one of the dependencies becomes unreachable. This may be true even after the component no longer renders. Be wary of memory leaks.
|
|
138
|
+
*/
|
|
139
|
+
export function useStrictMemo<T>(callback: () => T, dependencies: any[]): T {
|
|
140
|
+
const id = useId();
|
|
141
|
+
useInsertionEffect(() => {
|
|
142
|
+
return () => {
|
|
143
|
+
cached.delete(id);
|
|
144
|
+
};
|
|
145
|
+
}, [id]);
|
|
146
|
+
|
|
147
|
+
const c = cached.get(id);
|
|
148
|
+
if (c) {
|
|
149
|
+
const unwrapped = unwrapFromInner(dependencies, c);
|
|
150
|
+
if (unwrapped.status === "ok") {
|
|
151
|
+
return unwrapped.data;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const value = callback();
|
|
155
|
+
cached.set(id, wrapToInner(dependencies, value));
|
|
156
|
+
return value;
|
|
157
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Note: UI components (AppIcon, etc.) are exported via ./dist/apps/apps-ui
|
|
2
|
+
// They are not re-exported here to avoid requiring React for non-UI consumers
|
|
3
|
+
|
|
4
|
+
export {
|
|
5
|
+
HexclaveAdminInterface
|
|
6
|
+
} from "./interface/admin-interface";
|
|
7
|
+
export {
|
|
8
|
+
HexclaveClientInterface
|
|
9
|
+
} from "./interface/client-interface";
|
|
10
|
+
export {
|
|
11
|
+
HexclaveServerInterface
|
|
12
|
+
} from "./interface/server-interface";
|
|
13
|
+
export {
|
|
14
|
+
KnownError,
|
|
15
|
+
KnownErrors
|
|
16
|
+
} from "./known-errors";
|
|
17
|
+
|