@resiliojs/next 0.1.0 → 0.1.1

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/client.cjs CHANGED
@@ -32,6 +32,7 @@ __export(client_exports, {
32
32
  captureAsync: () => import_react5.captureAsync,
33
33
  createCompositeSink: () => import_core2.createCompositeSink,
34
34
  createConsoleSink: () => import_core2.createConsoleSink,
35
+ createExceptionReporter: () => import_core2.createExceptionReporter,
35
36
  createPresentationEvaluator: () => import_core2.createPresentationEvaluator,
36
37
  createPublicError: () => import_core2.createPublicError,
37
38
  createResilioRootHandlers: () => import_react5.createResilioRootHandlers,
@@ -153,6 +154,7 @@ function useResilioRouteError(error, reset, options = {}) {
153
154
  captureAsync,
154
155
  createCompositeSink,
155
156
  createConsoleSink,
157
+ createExceptionReporter,
156
158
  createPresentationEvaluator,
157
159
  createPublicError,
158
160
  createResilioRootHandlers,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/index.ts","../src/action-state.ts","../src/client/useResilioState.ts","../src/client/useResilioRouteError.ts"],"sourcesContent":["'use client';\n\n// Re-export all React client components from @resiliojs/react\nexport {\n ResilioProvider,\n ResilioErrorBoundary,\n ResilioPresentationHost,\n ResilioPresentationProvider,\n usePresentError,\n useOptionalPresentError,\n useResilioInline,\n useResilioAlert,\n createResilioRootHandlers,\n capture,\n captureAsync,\n useResilioHandler,\n installResilioBrowserErrorBridge,\n useResilioBrowserErrorBridge,\n} from '@resiliojs/react';\nexport type {\n ActivePresentation,\n FeedbackAdapter,\n PresentationRenderer,\n PresentationRendererInput,\n RendererRegistry,\n ResilioContextValue,\n ResilioErrorBoundaryProps,\n ResilioErrorFallbackProps,\n ResilioPresentationHostProps,\n ResilioPresentationProviderProps,\n ResilioProviderProps,\n} from '@resiliojs/react';\n\nexport { useResilio, useReportError } from '@resiliojs/react';\nexport { useOptionalReportError } from '@resiliojs/react';\n\n// Re-export client-safe utilities from core\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n defineErrorPolicy, \n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n ErrorCatalog, \n PublicError, \n FeedbackType, \n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\n// Re-export Next.js client helpers\nexport { toActionState } from '../action-state.js';\n// Export new useResilioState hook\nexport * from './useResilioState.js';\nexport * from './useResilioRouteError.js';\nexport * from '../types.js';\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","'use client';\n\nimport { useActionState } from 'react';\nimport { useOptionalPresentError, useOptionalReportError } from '@resiliojs/react';\nimport { decodePublicError } from '@resiliojs/core';\nimport type {\n DecodeFailureReason,\n ErrorCatalog,\n PresentationContext,\n PublicError,\n} from '@resiliojs/core';\nimport type { PublicActionResult } from '../types.js';\n\nexport interface UseResilioStateOptions<TData, TCatalog extends ErrorCatalog> {\n catalog: TCatalog;\n initialData?: TData | null;\n onSuccess?: (data: TData) => void;\n onError?: (error: PublicError<TCatalog>) => void;\n onInvalidPublicError?: (reason: DecodeFailureReason) => void;\n presentation?: Omit<PresentationContext, 'source'>;\n}\n\nexport type ResilioActionState<TData, TCatalog extends ErrorCatalog> =\n PublicActionResult<TData | null, TCatalog>;\n\n/**\n * Next.js Server Action의 에러 핸들링과 UI 바인딩을 자동화하는 React 19 훅입니다.\n * React 19 useActionState와 동일한 시그니처를 제공하면서, 실패 상태(ok === false) 리턴 시\n * 전역 ResilioProvider에 자동으로 예상 오류를 전달하고 UI 정책을 평가합니다.\n */\nexport function useResilioState<Payload, TData, TCatalog extends ErrorCatalog>(\n action: (\n state: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ) => Promise<ResilioActionState<TData, TCatalog>>,\n options: UseResilioStateOptions<TData, TCatalog>\n) {\n const report = useOptionalReportError();\n const present = useOptionalPresentError();\n\n const initialState: ResilioActionState<TData, TCatalog> = {\n ok: true,\n data: options.initialData ?? null,\n };\n\n const [state, execute, isPending] = useActionState(async (\n prevState: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ): Promise<ResilioActionState<TData, TCatalog>> => {\n const res = await action(prevState, payload);\n \n if (res && typeof res === 'object' && 'ok' in res) {\n if (!res.ok && res.error) {\n const decoded = await decodePublicError(options.catalog, res.error);\n if (!decoded.ok) {\n report?.invalidPublic(decoded.reason, { source: 'next.action' });\n options.onInvalidPublicError?.(decoded.reason);\n return res;\n }\n\n report?.public(decoded.value, { source: 'next.action' });\n await present?.(decoded.value, {\n ...options.presentation,\n source: 'next.action',\n });\n options.onError?.(decoded.value);\n } else if (res.ok && res.data != null) {\n options.onSuccess?.(res.data);\n }\n }\n return res;\n }, initialState);\n\n return [state, execute, isPending] as const;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useOptionalReportError } from '@resiliojs/react';\n\nexport interface UseResilioRouteErrorOptions {\n maxResets?: number;\n resetWindowMs?: number;\n}\n\nexport interface ResilioRouteErrorState {\n reset(): void;\n resetBlocked: boolean;\n}\n\nexport function useResilioRouteError(\n error: Error & { digest?: string },\n reset: () => void,\n options: UseResilioRouteErrorOptions = {},\n): ResilioRouteErrorState {\n const report = useOptionalReportError();\n const reported = useRef<Error | null>(null);\n const resetTimestamps = useRef<number[]>([]);\n const [resetBlocked, setResetBlocked] = useState(false);\n\n useEffect(() => {\n if (reported.current === error) return;\n reported.current = error;\n report?.exception(error, {\n source: 'next.route',\n correlationId: error.digest,\n context: { digest: error.digest },\n });\n }, [error, report]);\n\n const guardedReset = useCallback(() => {\n const now = Date.now();\n const windowMs = options.resetWindowMs ?? 1_000;\n const maxResets = options.maxResets ?? 3;\n resetTimestamps.current = resetTimestamps.current.filter(\n (timestamp) => now - timestamp < windowMs,\n );\n if (resetTimestamps.current.length >= maxResets) {\n setResetBlocked(true);\n return;\n }\n resetTimestamps.current.push(now);\n reset();\n }, [options.maxResets, options.resetWindowMs, reset]);\n\n return { reset: guardedReset, resetBlocked };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAAA,gBAeO;AAeP,IAAAA,gBAA2C;AAC3C,IAAAA,gBAAuC;AAGvC,IAAAC,eAmBO;;;ACnDA,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACPA,mBAA+B;AAC/B,IAAAC,gBAAgE;AAChE,kBAAkC;AA0B3B,SAAS,gBACd,QAIA,SACA;AACA,QAAM,aAAS,sCAAuB;AACtC,QAAM,cAAU,uCAAwB;AAExC,QAAM,eAAoD;AAAA,IACxD,IAAI;AAAA,IACJ,MAAM,QAAQ,eAAe;AAAA,EAC/B;AAEA,QAAM,CAAC,OAAO,SAAS,SAAS,QAAI,6BAAe,OACjD,WACA,YACiD;AACjD,UAAM,MAAM,MAAM,OAAO,WAAW,OAAO;AAE3C,QAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,KAAK;AACjD,UAAI,CAAC,IAAI,MAAM,IAAI,OAAO;AACxB,cAAM,UAAU,UAAM,+BAAkB,QAAQ,SAAS,IAAI,KAAK;AAClE,YAAI,CAAC,QAAQ,IAAI;AACf,kBAAQ,cAAc,QAAQ,QAAQ,EAAE,QAAQ,cAAc,CAAC;AAC/D,kBAAQ,uBAAuB,QAAQ,MAAM;AAC7C,iBAAO;AAAA,QACT;AAEA,gBAAQ,OAAO,QAAQ,OAAO,EAAE,QAAQ,cAAc,CAAC;AACvD,cAAM,UAAU,QAAQ,OAAO;AAAA,UAC7B,GAAG,QAAQ;AAAA,UACX,QAAQ;AAAA,QACV,CAAC;AACD,gBAAQ,UAAU,QAAQ,KAAK;AAAA,MACjC,WAAW,IAAI,MAAM,IAAI,QAAQ,MAAM;AACrC,gBAAQ,YAAY,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,YAAY;AAEf,SAAO,CAAC,OAAO,SAAS,SAAS;AACnC;;;ACxEA,IAAAC,gBAAyD;AACzD,IAAAA,gBAAuC;AAYhC,SAAS,qBACd,OACA,OACA,UAAuC,CAAC,GAChB;AACxB,QAAM,aAAS,sCAAuB;AACtC,QAAM,eAAW,sBAAqB,IAAI;AAC1C,QAAM,sBAAkB,sBAAiB,CAAC,CAAC;AAC3C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AAEtD,+BAAU,MAAM;AACd,QAAI,SAAS,YAAY,MAAO;AAChC,aAAS,UAAU;AACnB,YAAQ,UAAU,OAAO;AAAA,MACvB,QAAQ;AAAA,MACR,eAAe,MAAM;AAAA,MACrB,SAAS,EAAE,QAAQ,MAAM,OAAO;AAAA,IAClC,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,QAAQ,iBAAiB;AAC1C,UAAM,YAAY,QAAQ,aAAa;AACvC,oBAAgB,UAAU,gBAAgB,QAAQ;AAAA,MAChD,CAAC,cAAc,MAAM,YAAY;AAAA,IACnC;AACA,QAAI,gBAAgB,QAAQ,UAAU,WAAW;AAC/C,sBAAgB,IAAI;AACpB;AAAA,IACF;AACA,oBAAgB,QAAQ,KAAK,GAAG;AAChC,UAAM;AAAA,EACR,GAAG,CAAC,QAAQ,WAAW,QAAQ,eAAe,KAAK,CAAC;AAEpD,SAAO,EAAE,OAAO,cAAc,aAAa;AAC7C;","names":["import_react","import_core","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/client/index.ts","../src/action-state.ts","../src/client/useResilioState.ts","../src/client/useResilioRouteError.ts"],"sourcesContent":["'use client';\n\n// Re-export all React client components from @resiliojs/react\nexport {\n ResilioProvider,\n ResilioErrorBoundary,\n ResilioPresentationHost,\n ResilioPresentationProvider,\n usePresentError,\n useOptionalPresentError,\n useResilioInline,\n useResilioAlert,\n createResilioRootHandlers,\n capture,\n captureAsync,\n useResilioHandler,\n installResilioBrowserErrorBridge,\n useResilioBrowserErrorBridge,\n} from '@resiliojs/react';\nexport type {\n ActivePresentation,\n FeedbackAdapter,\n PresentationRenderer,\n PresentationRendererInput,\n RendererRegistry,\n ResilioContextValue,\n ResilioErrorBoundaryProps,\n ResilioErrorFallbackProps,\n ResilioPresentationHostProps,\n ResilioPresentationProviderProps,\n ResilioProviderProps,\n} from '@resiliojs/react';\n\nexport { useResilio, useReportError } from '@resiliojs/react';\nexport { useOptionalReportError } from '@resiliojs/react';\n\n// Re-export client-safe utilities from core\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n defineErrorPolicy, \n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n createExceptionReporter,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n ErrorCatalog, \n PublicError, \n FeedbackType, \n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n ExceptionReporter,\n ExceptionReporterOptions,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\n// Re-export Next.js client helpers\nexport { toActionState } from '../action-state.js';\n// Export new useResilioState hook\nexport * from './useResilioState.js';\nexport * from './useResilioRouteError.js';\nexport * from '../types.js';\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","'use client';\n\nimport { useActionState } from 'react';\nimport { useOptionalPresentError, useOptionalReportError } from '@resiliojs/react';\nimport { decodePublicError } from '@resiliojs/core';\nimport type {\n DecodeFailureReason,\n ErrorCatalog,\n PresentationContext,\n PublicError,\n} from '@resiliojs/core';\nimport type { PublicActionResult } from '../types.js';\n\nexport interface UseResilioStateOptions<TData, TCatalog extends ErrorCatalog> {\n catalog: TCatalog;\n initialData?: TData | null;\n onSuccess?: (data: TData) => void;\n onError?: (error: PublicError<TCatalog>) => void;\n onInvalidPublicError?: (reason: DecodeFailureReason) => void;\n presentation?: Omit<PresentationContext, 'source'>;\n}\n\nexport type ResilioActionState<TData, TCatalog extends ErrorCatalog> =\n PublicActionResult<TData | null, TCatalog>;\n\n/**\n * Next.js Server Action의 에러 핸들링과 UI 바인딩을 자동화하는 React 19 훅입니다.\n * React 19 useActionState와 동일한 시그니처를 제공하면서, 실패 상태(ok === false) 리턴 시\n * 전역 ResilioProvider에 자동으로 예상 오류를 전달하고 UI 정책을 평가합니다.\n */\nexport function useResilioState<Payload, TData, TCatalog extends ErrorCatalog>(\n action: (\n state: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ) => Promise<ResilioActionState<TData, TCatalog>>,\n options: UseResilioStateOptions<TData, TCatalog>\n) {\n const report = useOptionalReportError();\n const present = useOptionalPresentError();\n\n const initialState: ResilioActionState<TData, TCatalog> = {\n ok: true,\n data: options.initialData ?? null,\n };\n\n const [state, execute, isPending] = useActionState(async (\n prevState: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ): Promise<ResilioActionState<TData, TCatalog>> => {\n const res = await action(prevState, payload);\n \n if (res && typeof res === 'object' && 'ok' in res) {\n if (!res.ok && res.error) {\n const decoded = await decodePublicError(options.catalog, res.error);\n if (!decoded.ok) {\n report?.invalidPublic(decoded.reason, { source: 'next.action' });\n options.onInvalidPublicError?.(decoded.reason);\n return res;\n }\n\n report?.public(decoded.value, { source: 'next.action' });\n await present?.(decoded.value, {\n ...options.presentation,\n source: 'next.action',\n });\n options.onError?.(decoded.value);\n } else if (res.ok && res.data != null) {\n options.onSuccess?.(res.data);\n }\n }\n return res;\n }, initialState);\n\n return [state, execute, isPending] as const;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useOptionalReportError } from '@resiliojs/react';\n\nexport interface UseResilioRouteErrorOptions {\n maxResets?: number;\n resetWindowMs?: number;\n}\n\nexport interface ResilioRouteErrorState {\n reset(): void;\n resetBlocked: boolean;\n}\n\nexport function useResilioRouteError(\n error: Error & { digest?: string },\n reset: () => void,\n options: UseResilioRouteErrorOptions = {},\n): ResilioRouteErrorState {\n const report = useOptionalReportError();\n const reported = useRef<Error | null>(null);\n const resetTimestamps = useRef<number[]>([]);\n const [resetBlocked, setResetBlocked] = useState(false);\n\n useEffect(() => {\n if (reported.current === error) return;\n reported.current = error;\n report?.exception(error, {\n source: 'next.route',\n correlationId: error.digest,\n context: { digest: error.digest },\n });\n }, [error, report]);\n\n const guardedReset = useCallback(() => {\n const now = Date.now();\n const windowMs = options.resetWindowMs ?? 1_000;\n const maxResets = options.maxResets ?? 3;\n resetTimestamps.current = resetTimestamps.current.filter(\n (timestamp) => now - timestamp < windowMs,\n );\n if (resetTimestamps.current.length >= maxResets) {\n setResetBlocked(true);\n return;\n }\n resetTimestamps.current.push(now);\n reset();\n }, [options.maxResets, options.resetWindowMs, reset]);\n\n return { reset: guardedReset, resetBlocked };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAAA,gBAeO;AAeP,IAAAA,gBAA2C;AAC3C,IAAAA,gBAAuC;AAGvC,IAAAC,eAoBO;;;ACpDA,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACPA,mBAA+B;AAC/B,IAAAC,gBAAgE;AAChE,kBAAkC;AA0B3B,SAAS,gBACd,QAIA,SACA;AACA,QAAM,aAAS,sCAAuB;AACtC,QAAM,cAAU,uCAAwB;AAExC,QAAM,eAAoD;AAAA,IACxD,IAAI;AAAA,IACJ,MAAM,QAAQ,eAAe;AAAA,EAC/B;AAEA,QAAM,CAAC,OAAO,SAAS,SAAS,QAAI,6BAAe,OACjD,WACA,YACiD;AACjD,UAAM,MAAM,MAAM,OAAO,WAAW,OAAO;AAE3C,QAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,KAAK;AACjD,UAAI,CAAC,IAAI,MAAM,IAAI,OAAO;AACxB,cAAM,UAAU,UAAM,+BAAkB,QAAQ,SAAS,IAAI,KAAK;AAClE,YAAI,CAAC,QAAQ,IAAI;AACf,kBAAQ,cAAc,QAAQ,QAAQ,EAAE,QAAQ,cAAc,CAAC;AAC/D,kBAAQ,uBAAuB,QAAQ,MAAM;AAC7C,iBAAO;AAAA,QACT;AAEA,gBAAQ,OAAO,QAAQ,OAAO,EAAE,QAAQ,cAAc,CAAC;AACvD,cAAM,UAAU,QAAQ,OAAO;AAAA,UAC7B,GAAG,QAAQ;AAAA,UACX,QAAQ;AAAA,QACV,CAAC;AACD,gBAAQ,UAAU,QAAQ,KAAK;AAAA,MACjC,WAAW,IAAI,MAAM,IAAI,QAAQ,MAAM;AACrC,gBAAQ,YAAY,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,YAAY;AAEf,SAAO,CAAC,OAAO,SAAS,SAAS;AACnC;;;ACxEA,IAAAC,gBAAyD;AACzD,IAAAA,gBAAuC;AAYhC,SAAS,qBACd,OACA,OACA,UAAuC,CAAC,GAChB;AACxB,QAAM,aAAS,sCAAuB;AACtC,QAAM,eAAW,sBAAqB,IAAI;AAC1C,QAAM,sBAAkB,sBAAiB,CAAC,CAAC;AAC3C,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AAEtD,+BAAU,MAAM;AACd,QAAI,SAAS,YAAY,MAAO;AAChC,aAAS,UAAU;AACnB,YAAQ,UAAU,OAAO;AAAA,MACvB,QAAQ;AAAA,MACR,eAAe,MAAM;AAAA,MACrB,SAAS,EAAE,QAAQ,MAAM,OAAO;AAAA,IAClC,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,QAAQ,iBAAiB;AAC1C,UAAM,YAAY,QAAQ,aAAa;AACvC,oBAAgB,UAAU,gBAAgB,QAAQ;AAAA,MAChD,CAAC,cAAc,MAAM,YAAY;AAAA,IACnC;AACA,QAAI,gBAAgB,QAAQ,UAAU,WAAW;AAC/C,sBAAgB,IAAI;AACpB;AAAA,IACF;AACA,oBAAgB,QAAQ,KAAK,GAAG;AAChC,UAAM;AAAA,EACR,GAAG,CAAC,QAAQ,WAAW,QAAQ,eAAe,KAAK,CAAC;AAEpD,SAAO,EAAE,OAAO,cAAc,aAAa;AAC7C;","names":["import_react","import_core","import_react","import_react"]}
package/dist/client.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { ActivePresentation, FeedbackAdapter, PresentationRenderer, PresentationRendererInput, RendererRegistry, ResilioContextValue, ResilioErrorBoundary, ResilioErrorBoundaryProps, ResilioErrorFallbackProps, ResilioPresentationHost, ResilioPresentationHostProps, ResilioPresentationProvider, ResilioPresentationProviderProps, ResilioProvider, ResilioProviderProps, capture, captureAsync, createResilioRootHandlers, installResilioBrowserErrorBridge, useOptionalPresentError, useOptionalReportError, usePresentError, useReportError, useResilio, useResilioAlert, useResilioBrowserErrorBridge, useResilioHandler, useResilioInline } from '@resiliojs/react';
2
2
  import { ErrorCatalog, PublicError, DecodeFailureReason, PresentationContext } from '@resiliojs/core';
3
- export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, FeedbackType, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioError, ResilioErrorKind, Result, canonicalStringify, createCompositeSink, createConsoleSink, createPresentationEvaluator, createPublicError, decodePublicError, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, isErr, isOk, isPublicResult, ok, shouldSuppress, stringHash } from '@resiliojs/core';
3
+ export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, ExceptionReporter, ExceptionReporterOptions, FeedbackType, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioError, ResilioErrorKind, Result, canonicalStringify, createCompositeSink, createConsoleSink, createExceptionReporter, createPresentationEvaluator, createPublicError, decodePublicError, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, isErr, isOk, isPublicResult, ok, shouldSuppress, stringHash } from '@resiliojs/core';
4
4
  import { P as PublicActionResult } from './types-kEvjOn-F.cjs';
5
5
  export { t as toActionState } from './types-kEvjOn-F.cjs';
6
6
 
package/dist/client.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { ActivePresentation, FeedbackAdapter, PresentationRenderer, PresentationRendererInput, RendererRegistry, ResilioContextValue, ResilioErrorBoundary, ResilioErrorBoundaryProps, ResilioErrorFallbackProps, ResilioPresentationHost, ResilioPresentationHostProps, ResilioPresentationProvider, ResilioPresentationProviderProps, ResilioProvider, ResilioProviderProps, capture, captureAsync, createResilioRootHandlers, installResilioBrowserErrorBridge, useOptionalPresentError, useOptionalReportError, usePresentError, useReportError, useResilio, useResilioAlert, useResilioBrowserErrorBridge, useResilioHandler, useResilioInline } from '@resiliojs/react';
2
2
  import { ErrorCatalog, PublicError, DecodeFailureReason, PresentationContext } from '@resiliojs/core';
3
- export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, FeedbackType, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioError, ResilioErrorKind, Result, canonicalStringify, createCompositeSink, createConsoleSink, createPresentationEvaluator, createPublicError, decodePublicError, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, isErr, isOk, isPublicResult, ok, shouldSuppress, stringHash } from '@resiliojs/core';
3
+ export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, ExceptionReporter, ExceptionReporterOptions, FeedbackType, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioError, ResilioErrorKind, Result, canonicalStringify, createCompositeSink, createConsoleSink, createExceptionReporter, createPresentationEvaluator, createPublicError, decodePublicError, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, isErr, isOk, isPublicResult, ok, shouldSuppress, stringHash } from '@resiliojs/core';
4
4
  import { P as PublicActionResult } from './types-kEvjOn-F.js';
5
5
  export { t as toActionState } from './types-kEvjOn-F.js';
6
6
 
package/dist/client.js CHANGED
@@ -32,6 +32,7 @@ import {
32
32
  decodePublicError as decodePublicError2,
33
33
  createConsoleSink,
34
34
  createCompositeSink,
35
+ createExceptionReporter,
35
36
  PolicyEngine,
36
37
  canonicalStringify,
37
38
  stringHash,
@@ -126,6 +127,7 @@ export {
126
127
  captureAsync,
127
128
  createCompositeSink,
128
129
  createConsoleSink,
130
+ createExceptionReporter,
129
131
  createPresentationEvaluator,
130
132
  createPublicError,
131
133
  createResilioRootHandlers,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/index.ts","../src/action-state.ts","../src/client/useResilioState.ts","../src/client/useResilioRouteError.ts"],"sourcesContent":["'use client';\n\n// Re-export all React client components from @resiliojs/react\nexport {\n ResilioProvider,\n ResilioErrorBoundary,\n ResilioPresentationHost,\n ResilioPresentationProvider,\n usePresentError,\n useOptionalPresentError,\n useResilioInline,\n useResilioAlert,\n createResilioRootHandlers,\n capture,\n captureAsync,\n useResilioHandler,\n installResilioBrowserErrorBridge,\n useResilioBrowserErrorBridge,\n} from '@resiliojs/react';\nexport type {\n ActivePresentation,\n FeedbackAdapter,\n PresentationRenderer,\n PresentationRendererInput,\n RendererRegistry,\n ResilioContextValue,\n ResilioErrorBoundaryProps,\n ResilioErrorFallbackProps,\n ResilioPresentationHostProps,\n ResilioPresentationProviderProps,\n ResilioProviderProps,\n} from '@resiliojs/react';\n\nexport { useResilio, useReportError } from '@resiliojs/react';\nexport { useOptionalReportError } from '@resiliojs/react';\n\n// Re-export client-safe utilities from core\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n defineErrorPolicy, \n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n ErrorCatalog, \n PublicError, \n FeedbackType, \n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\n// Re-export Next.js client helpers\nexport { toActionState } from '../action-state.js';\n// Export new useResilioState hook\nexport * from './useResilioState.js';\nexport * from './useResilioRouteError.js';\nexport * from '../types.js';\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","'use client';\n\nimport { useActionState } from 'react';\nimport { useOptionalPresentError, useOptionalReportError } from '@resiliojs/react';\nimport { decodePublicError } from '@resiliojs/core';\nimport type {\n DecodeFailureReason,\n ErrorCatalog,\n PresentationContext,\n PublicError,\n} from '@resiliojs/core';\nimport type { PublicActionResult } from '../types.js';\n\nexport interface UseResilioStateOptions<TData, TCatalog extends ErrorCatalog> {\n catalog: TCatalog;\n initialData?: TData | null;\n onSuccess?: (data: TData) => void;\n onError?: (error: PublicError<TCatalog>) => void;\n onInvalidPublicError?: (reason: DecodeFailureReason) => void;\n presentation?: Omit<PresentationContext, 'source'>;\n}\n\nexport type ResilioActionState<TData, TCatalog extends ErrorCatalog> =\n PublicActionResult<TData | null, TCatalog>;\n\n/**\n * Next.js Server Action의 에러 핸들링과 UI 바인딩을 자동화하는 React 19 훅입니다.\n * React 19 useActionState와 동일한 시그니처를 제공하면서, 실패 상태(ok === false) 리턴 시\n * 전역 ResilioProvider에 자동으로 예상 오류를 전달하고 UI 정책을 평가합니다.\n */\nexport function useResilioState<Payload, TData, TCatalog extends ErrorCatalog>(\n action: (\n state: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ) => Promise<ResilioActionState<TData, TCatalog>>,\n options: UseResilioStateOptions<TData, TCatalog>\n) {\n const report = useOptionalReportError();\n const present = useOptionalPresentError();\n\n const initialState: ResilioActionState<TData, TCatalog> = {\n ok: true,\n data: options.initialData ?? null,\n };\n\n const [state, execute, isPending] = useActionState(async (\n prevState: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ): Promise<ResilioActionState<TData, TCatalog>> => {\n const res = await action(prevState, payload);\n \n if (res && typeof res === 'object' && 'ok' in res) {\n if (!res.ok && res.error) {\n const decoded = await decodePublicError(options.catalog, res.error);\n if (!decoded.ok) {\n report?.invalidPublic(decoded.reason, { source: 'next.action' });\n options.onInvalidPublicError?.(decoded.reason);\n return res;\n }\n\n report?.public(decoded.value, { source: 'next.action' });\n await present?.(decoded.value, {\n ...options.presentation,\n source: 'next.action',\n });\n options.onError?.(decoded.value);\n } else if (res.ok && res.data != null) {\n options.onSuccess?.(res.data);\n }\n }\n return res;\n }, initialState);\n\n return [state, execute, isPending] as const;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useOptionalReportError } from '@resiliojs/react';\n\nexport interface UseResilioRouteErrorOptions {\n maxResets?: number;\n resetWindowMs?: number;\n}\n\nexport interface ResilioRouteErrorState {\n reset(): void;\n resetBlocked: boolean;\n}\n\nexport function useResilioRouteError(\n error: Error & { digest?: string },\n reset: () => void,\n options: UseResilioRouteErrorOptions = {},\n): ResilioRouteErrorState {\n const report = useOptionalReportError();\n const reported = useRef<Error | null>(null);\n const resetTimestamps = useRef<number[]>([]);\n const [resetBlocked, setResetBlocked] = useState(false);\n\n useEffect(() => {\n if (reported.current === error) return;\n reported.current = error;\n report?.exception(error, {\n source: 'next.route',\n correlationId: error.digest,\n context: { digest: error.digest },\n });\n }, [error, report]);\n\n const guardedReset = useCallback(() => {\n const now = Date.now();\n const windowMs = options.resetWindowMs ?? 1_000;\n const maxResets = options.maxResets ?? 3;\n resetTimestamps.current = resetTimestamps.current.filter(\n (timestamp) => now - timestamp < windowMs,\n );\n if (resetTimestamps.current.length >= maxResets) {\n setResetBlocked(true);\n return;\n }\n resetTimestamps.current.push(now);\n reset();\n }, [options.maxResets, options.resetWindowMs, reset]);\n\n return { reset: guardedReset, resetBlocked };\n}\n"],"mappings":"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","names":["useOptionalPresentError","useOptionalReportError","decodePublicError","useOptionalReportError"]}
1
+ {"version":3,"sources":["../src/client/index.ts","../src/action-state.ts","../src/client/useResilioState.ts","../src/client/useResilioRouteError.ts"],"sourcesContent":["'use client';\n\n// Re-export all React client components from @resiliojs/react\nexport {\n ResilioProvider,\n ResilioErrorBoundary,\n ResilioPresentationHost,\n ResilioPresentationProvider,\n usePresentError,\n useOptionalPresentError,\n useResilioInline,\n useResilioAlert,\n createResilioRootHandlers,\n capture,\n captureAsync,\n useResilioHandler,\n installResilioBrowserErrorBridge,\n useResilioBrowserErrorBridge,\n} from '@resiliojs/react';\nexport type {\n ActivePresentation,\n FeedbackAdapter,\n PresentationRenderer,\n PresentationRendererInput,\n RendererRegistry,\n ResilioContextValue,\n ResilioErrorBoundaryProps,\n ResilioErrorFallbackProps,\n ResilioPresentationHostProps,\n ResilioPresentationProviderProps,\n ResilioProviderProps,\n} from '@resiliojs/react';\n\nexport { useResilio, useReportError } from '@resiliojs/react';\nexport { useOptionalReportError } from '@resiliojs/react';\n\n// Re-export client-safe utilities from core\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n defineErrorPolicy, \n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n createExceptionReporter,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n ErrorCatalog, \n PublicError, \n FeedbackType, \n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n ExceptionReporter,\n ExceptionReporterOptions,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\n// Re-export Next.js client helpers\nexport { toActionState } from '../action-state.js';\n// Export new useResilioState hook\nexport * from './useResilioState.js';\nexport * from './useResilioRouteError.js';\nexport * from '../types.js';\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","'use client';\n\nimport { useActionState } from 'react';\nimport { useOptionalPresentError, useOptionalReportError } from '@resiliojs/react';\nimport { decodePublicError } from '@resiliojs/core';\nimport type {\n DecodeFailureReason,\n ErrorCatalog,\n PresentationContext,\n PublicError,\n} from '@resiliojs/core';\nimport type { PublicActionResult } from '../types.js';\n\nexport interface UseResilioStateOptions<TData, TCatalog extends ErrorCatalog> {\n catalog: TCatalog;\n initialData?: TData | null;\n onSuccess?: (data: TData) => void;\n onError?: (error: PublicError<TCatalog>) => void;\n onInvalidPublicError?: (reason: DecodeFailureReason) => void;\n presentation?: Omit<PresentationContext, 'source'>;\n}\n\nexport type ResilioActionState<TData, TCatalog extends ErrorCatalog> =\n PublicActionResult<TData | null, TCatalog>;\n\n/**\n * Next.js Server Action의 에러 핸들링과 UI 바인딩을 자동화하는 React 19 훅입니다.\n * React 19 useActionState와 동일한 시그니처를 제공하면서, 실패 상태(ok === false) 리턴 시\n * 전역 ResilioProvider에 자동으로 예상 오류를 전달하고 UI 정책을 평가합니다.\n */\nexport function useResilioState<Payload, TData, TCatalog extends ErrorCatalog>(\n action: (\n state: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ) => Promise<ResilioActionState<TData, TCatalog>>,\n options: UseResilioStateOptions<TData, TCatalog>\n) {\n const report = useOptionalReportError();\n const present = useOptionalPresentError();\n\n const initialState: ResilioActionState<TData, TCatalog> = {\n ok: true,\n data: options.initialData ?? null,\n };\n\n const [state, execute, isPending] = useActionState(async (\n prevState: ResilioActionState<TData, TCatalog>,\n payload: Payload,\n ): Promise<ResilioActionState<TData, TCatalog>> => {\n const res = await action(prevState, payload);\n \n if (res && typeof res === 'object' && 'ok' in res) {\n if (!res.ok && res.error) {\n const decoded = await decodePublicError(options.catalog, res.error);\n if (!decoded.ok) {\n report?.invalidPublic(decoded.reason, { source: 'next.action' });\n options.onInvalidPublicError?.(decoded.reason);\n return res;\n }\n\n report?.public(decoded.value, { source: 'next.action' });\n await present?.(decoded.value, {\n ...options.presentation,\n source: 'next.action',\n });\n options.onError?.(decoded.value);\n } else if (res.ok && res.data != null) {\n options.onSuccess?.(res.data);\n }\n }\n return res;\n }, initialState);\n\n return [state, execute, isPending] as const;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useOptionalReportError } from '@resiliojs/react';\n\nexport interface UseResilioRouteErrorOptions {\n maxResets?: number;\n resetWindowMs?: number;\n}\n\nexport interface ResilioRouteErrorState {\n reset(): void;\n resetBlocked: boolean;\n}\n\nexport function useResilioRouteError(\n error: Error & { digest?: string },\n reset: () => void,\n options: UseResilioRouteErrorOptions = {},\n): ResilioRouteErrorState {\n const report = useOptionalReportError();\n const reported = useRef<Error | null>(null);\n const resetTimestamps = useRef<number[]>([]);\n const [resetBlocked, setResetBlocked] = useState(false);\n\n useEffect(() => {\n if (reported.current === error) return;\n reported.current = error;\n report?.exception(error, {\n source: 'next.route',\n correlationId: error.digest,\n context: { digest: error.digest },\n });\n }, [error, report]);\n\n const guardedReset = useCallback(() => {\n const now = Date.now();\n const windowMs = options.resetWindowMs ?? 1_000;\n const maxResets = options.maxResets ?? 3;\n resetTimestamps.current = resetTimestamps.current.filter(\n (timestamp) => now - timestamp < windowMs,\n );\n if (resetTimestamps.current.length >= maxResets) {\n setResetBlocked(true);\n return;\n }\n resetTimestamps.current.push(now);\n reset();\n }, [options.maxResets, options.resetWindowMs, reset]);\n\n return { reset: guardedReset, resetBlocked };\n}\n"],"mappings":"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","names":["useOptionalPresentError","useOptionalReportError","decodePublicError","useOptionalReportError"]}
package/dist/index.cjs CHANGED
@@ -27,6 +27,7 @@ __export(src_exports, {
27
27
  canonicalStringify: () => import_core4.canonicalStringify,
28
28
  createCompositeSink: () => import_core4.createCompositeSink,
29
29
  createConsoleSink: () => import_core4.createConsoleSink,
30
+ createExceptionReporter: () => import_core4.createExceptionReporter,
30
31
  createPresentationEvaluator: () => import_core4.createPresentationEvaluator,
31
32
  createPublicError: () => import_core4.createPublicError,
32
33
  createResilioAction: () => createResilioAction,
@@ -137,6 +138,7 @@ var import_core5 = require("@resiliojs/core");
137
138
  canonicalStringify,
138
139
  createCompositeSink,
139
140
  createConsoleSink,
141
+ createExceptionReporter,
140
142
  createPresentationEvaluator,
141
143
  createPublicError,
142
144
  createResilioAction,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/action.ts","../src/action-state.ts","../src/serializer.ts","../src/route-error.ts"],"sourcesContent":["// Server-safe exports (safe to import in Server Components & Server Actions)\nexport * from './action.js';\nexport * from './action-state.js';\nexport * from './serializer.js';\nexport * from './route-error.js';\nexport * from './types.js';\n\n// Re-export core types and utilities for single-package DX\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n normalizeError, \n serializeError, \n isRetryableError, \n withRetry,\n defineErrorPolicy,\n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n RetryPolicy, \n NormalizeOptions, \n LoggerAdapter,\n ErrorCatalog,\n PublicError,\n FeedbackType,\n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\nexport { ResilioEmitter, globalResilioEmitter, ResilioLogger, resilioLogger, defaultConsoleLogger } from '@resiliojs/core';\n","import type { ErrorCatalog, ErrorCode } from '@resiliojs/core';\nimport type { PublicActionResult } from './types.js';\n\n/**\n * @deprecated Server Action 전체를 감싸는 래핑 방식은 권장되지 않습니다.\n * 대신 개별 Action에서 직접 `PublicActionResult`를 반환하십시오.\n * 이 호환 helper는 예외를 가로채지 않으며 unexpected exception과 Next.js 제어 흐름을 그대로 전파합니다.\n */\nexport function createResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n TArgs extends unknown[] = unknown[],\n>(\n handler: (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>>,\n): (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>> {\n return handler;\n}\n\n/**\n * 이미 decode된 Server Action 결과가 성공인지 타입 안전하게 확인합니다.\n */\nexport function isSuccessfulResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n>(\n result: PublicActionResult<TData, TCatalog, TCodes>\n): result is { ok: true; data: TData } {\n return result.ok === true;\n}\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","import { ResilioError, serializeError } from '@resiliojs/core';\n\nexport function sanitizeErrorForClient(\n error: ResilioError,\n): ResilioError {\n if (error.kind === 'server' || error.kind === 'unknown') {\n throw new Error('Unexpected server errors must be thrown and handled by the Next.js error boundary.');\n }\n return serializeError(error);\n}\n","import type { Instrumentation } from 'next';\nimport type { ErrorCatalog, ErrorSink } from '@resiliojs/core';\nimport { reportToSinkBestEffort } from '@resiliojs/core';\n\n/**\n * Next.js 15+ instrumentation.ts의 onRequestError 규격에 맞는 오류 관측성 핸들러를 생성합니다.\n * request headers와 query string은 보안을 위해 기본적으로 전달하지 않습니다.\n */\nexport function createResilioOnRequestError<T extends ErrorCatalog>(\n sink: ErrorSink<T>\n): Instrumentation.onRequestError {\n return async (error, request, context) => {\n const safePath = request.path ? request.path.split('?')[0] : '';\n const digest = getErrorDigest(error);\n const occurrenceId = Math.random().toString(36).substring(2, 15);\n const timestamp = Date.now();\n\n await reportToSinkBestEffort(sink, {\n occurrenceId,\n timestamp,\n source: 'next.request',\n kind: 'exception',\n error,\n correlationId: digest,\n context: {\n path: safePath,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n revalidateReason: context.revalidateReason,\n digest,\n },\n });\n };\n}\n\nfunction getErrorDigest(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('digest' in error)) {\n return undefined;\n }\n return typeof error.digest === 'string' ? error.digest : undefined;\n}\n\n// 기존 하위 호환을 위한 레거시 헬퍼\nimport { normalizeError, globalResilioEmitter, ResilioError } from '@resiliojs/core';\n\nexport interface RouteErrorOptions {\n digest?: string;\n}\n\n/**\n * @deprecated Use createResilioOnRequestError instead.\n */\nexport function reportRouteError(\n error: unknown,\n options: RouteErrorOptions = {}\n): ResilioError {\n const normalized = normalizeError(error, {\n defaultKind: 'server',\n defaultPresentation: 'boundary',\n });\n\n if (options.digest) {\n normalized.code = options.digest;\n }\n\n globalResilioEmitter.emit(normalized);\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,oBAMd,SAC0E;AAC1E,SAAO;AACT;AAKO,SAAS,0BAKd,QACqC;AACrC,SAAO,OAAO,OAAO;AACvB;;;ACzBO,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACTA,kBAA6C;AAEtC,SAAS,uBACd,OACc;AACd,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW;AACvD,UAAM,IAAI,MAAM,oFAAoF;AAAA,EACtG;AACA,aAAO,4BAAe,KAAK;AAC7B;;;ACPA,IAAAA,eAAuC;AA4CvC,IAAAA,eAAmE;AAtC5D,SAAS,4BACd,MACgC;AAChC,SAAO,OAAO,OAAO,SAAS,YAAY;AACxC,UAAM,WAAW,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAC7D,UAAM,SAAS,eAAe,KAAK;AACnC,UAAM,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,YAAY,KAAK,IAAI;AAE3B,cAAM,qCAAuB,MAAM;AAAA,MACjC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,kBAAkB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,YAAY,QAAQ;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAC3D;AAYO,SAAS,iBACd,OACA,UAA6B,CAAC,GAChB;AACd,QAAM,iBAAa,6BAAe,OAAO;AAAA,IACvC,aAAa;AAAA,IACb,qBAAqB;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,eAAW,OAAO,QAAQ;AAAA,EAC5B;AAEA,oCAAqB,KAAK,UAAU;AAEpC,SAAO;AACT;;;AJ/DA,IAAAC,eAuBO;AA2CP,IAAAA,eAAyG;","names":["import_core","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/action.ts","../src/action-state.ts","../src/serializer.ts","../src/route-error.ts"],"sourcesContent":["// Server-safe exports (safe to import in Server Components & Server Actions)\nexport * from './action.js';\nexport * from './action-state.js';\nexport * from './serializer.js';\nexport * from './route-error.js';\nexport * from './types.js';\n\n// Re-export core types and utilities for single-package DX\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n normalizeError, \n serializeError, \n isRetryableError, \n withRetry,\n defineErrorPolicy,\n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n createExceptionReporter,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n RetryPolicy, \n NormalizeOptions, \n LoggerAdapter,\n ErrorCatalog,\n PublicError,\n FeedbackType,\n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n ExceptionReporter,\n ExceptionReporterOptions,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\nexport { ResilioEmitter, globalResilioEmitter, ResilioLogger, resilioLogger, defaultConsoleLogger } from '@resiliojs/core';\n","import type { ErrorCatalog, ErrorCode } from '@resiliojs/core';\nimport type { PublicActionResult } from './types.js';\n\n/**\n * @deprecated Server Action 전체를 감싸는 래핑 방식은 권장되지 않습니다.\n * 대신 개별 Action에서 직접 `PublicActionResult`를 반환하십시오.\n * 이 호환 helper는 예외를 가로채지 않으며 unexpected exception과 Next.js 제어 흐름을 그대로 전파합니다.\n */\nexport function createResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n TArgs extends unknown[] = unknown[],\n>(\n handler: (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>>,\n): (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>> {\n return handler;\n}\n\n/**\n * 이미 decode된 Server Action 결과가 성공인지 타입 안전하게 확인합니다.\n */\nexport function isSuccessfulResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n>(\n result: PublicActionResult<TData, TCatalog, TCodes>\n): result is { ok: true; data: TData } {\n return result.ok === true;\n}\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","import { ResilioError, serializeError } from '@resiliojs/core';\n\n/**\n * @deprecated This legacy helper preserves expected-error messages and is not a\n * general-purpose secret scrubber. Return catalog-backed `PublicActionResult`\n * values created with `createPublicError` instead.\n */\nexport function sanitizeErrorForClient(\n error: ResilioError,\n): ResilioError {\n if (error.kind === 'server' || error.kind === 'unknown') {\n throw new Error('Unexpected server errors must be thrown and handled by the Next.js error boundary.');\n }\n return serializeError(error);\n}\n","import type { Instrumentation } from 'next';\nimport type { ErrorCatalog, ErrorSink } from '@resiliojs/core';\nimport { reportToSinkBestEffort } from '@resiliojs/core';\n\n/**\n * Next.js 15+ instrumentation.ts의 onRequestError 규격에 맞는 오류 관측성 핸들러를 생성합니다.\n * request headers와 query string은 보안을 위해 기본적으로 전달하지 않습니다.\n */\nexport function createResilioOnRequestError<T extends ErrorCatalog>(\n sink: ErrorSink<T>\n): Instrumentation.onRequestError {\n return async (error, request, context) => {\n const safePath = request.path ? request.path.split('?')[0] : '';\n const digest = getErrorDigest(error);\n const occurrenceId = Math.random().toString(36).substring(2, 15);\n const timestamp = Date.now();\n\n await reportToSinkBestEffort(sink, {\n occurrenceId,\n timestamp,\n source: 'next.request',\n kind: 'exception',\n error,\n correlationId: digest,\n context: {\n path: safePath,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n revalidateReason: context.revalidateReason,\n digest,\n },\n });\n };\n}\n\nfunction getErrorDigest(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('digest' in error)) {\n return undefined;\n }\n return typeof error.digest === 'string' ? error.digest : undefined;\n}\n\n// 기존 하위 호환을 위한 레거시 헬퍼\nimport { normalizeError, globalResilioEmitter, ResilioError } from '@resiliojs/core';\n\nexport interface RouteErrorOptions {\n digest?: string;\n}\n\n/**\n * @deprecated Use createResilioOnRequestError instead.\n */\nexport function reportRouteError(\n error: unknown,\n options: RouteErrorOptions = {}\n): ResilioError {\n const normalized = normalizeError(error, {\n defaultKind: 'server',\n defaultPresentation: 'boundary',\n });\n\n if (options.digest) {\n normalized.code = options.digest;\n }\n\n globalResilioEmitter.emit(normalized);\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,oBAMd,SAC0E;AAC1E,SAAO;AACT;AAKO,SAAS,0BAKd,QACqC;AACrC,SAAO,OAAO,OAAO;AACvB;;;ACzBO,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACTA,kBAA6C;AAOtC,SAAS,uBACd,OACc;AACd,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW;AACvD,UAAM,IAAI,MAAM,oFAAoF;AAAA,EACtG;AACA,aAAO,4BAAe,KAAK;AAC7B;;;ACZA,IAAAA,eAAuC;AA4CvC,IAAAA,eAAmE;AAtC5D,SAAS,4BACd,MACgC;AAChC,SAAO,OAAO,OAAO,SAAS,YAAY;AACxC,UAAM,WAAW,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAC7D,UAAM,SAAS,eAAe,KAAK;AACnC,UAAM,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,YAAY,KAAK,IAAI;AAE3B,cAAM,qCAAuB,MAAM;AAAA,MACjC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,kBAAkB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,YAAY,QAAQ;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAC3D;AAYO,SAAS,iBACd,OACA,UAA6B,CAAC,GAChB;AACd,QAAM,iBAAa,6BAAe,OAAO;AAAA,IACvC,aAAa;AAAA,IACb,qBAAqB;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,eAAW,OAAO,QAAQ;AAAA,EAC5B;AAEA,oCAAqB,KAAK,UAAU;AAEpC,SAAO;AACT;;;AJ/DA,IAAAC,eAwBO;AA6CP,IAAAA,eAAyG;","names":["import_core","import_core"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ErrorCatalog, ErrorCode, ResilioError, ErrorSink } from '@resiliojs/core';
2
- export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, FeedbackType, LoggerAdapter, NormalizeOptions, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioEmitter, ResilioError, ResilioErrorKind, ResilioLogger, Result, RetryPolicy, canonicalStringify, createCompositeSink, createConsoleSink, createPresentationEvaluator, createPublicError, decodePublicError, defaultConsoleLogger, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, globalResilioEmitter, isErr, isOk, isPublicResult, isRetryableError, normalizeError, ok, resilioLogger, serializeError, shouldSuppress, stringHash, withRetry } from '@resiliojs/core';
2
+ export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, ExceptionReporter, ExceptionReporterOptions, FeedbackType, LoggerAdapter, NormalizeOptions, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioEmitter, ResilioError, ResilioErrorKind, ResilioLogger, Result, RetryPolicy, canonicalStringify, createCompositeSink, createConsoleSink, createExceptionReporter, createPresentationEvaluator, createPublicError, decodePublicError, defaultConsoleLogger, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, globalResilioEmitter, isErr, isOk, isPublicResult, isRetryableError, normalizeError, ok, resilioLogger, serializeError, shouldSuppress, stringHash, withRetry } from '@resiliojs/core';
3
3
  import { P as PublicActionResult } from './types-kEvjOn-F.cjs';
4
4
  export { t as toActionState } from './types-kEvjOn-F.cjs';
5
5
  import { Instrumentation } from 'next';
@@ -18,6 +18,11 @@ declare function isSuccessfulResilioAction<TData, TCatalog extends ErrorCatalog,
18
18
  data: TData;
19
19
  };
20
20
 
21
+ /**
22
+ * @deprecated This legacy helper preserves expected-error messages and is not a
23
+ * general-purpose secret scrubber. Return catalog-backed `PublicActionResult`
24
+ * values created with `createPublicError` instead.
25
+ */
21
26
  declare function sanitizeErrorForClient(error: ResilioError): ResilioError;
22
27
 
23
28
  /**
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ErrorCatalog, ErrorCode, ResilioError, ErrorSink } from '@resiliojs/core';
2
- export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, FeedbackType, LoggerAdapter, NormalizeOptions, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioEmitter, ResilioError, ResilioErrorKind, ResilioLogger, Result, RetryPolicy, canonicalStringify, createCompositeSink, createConsoleSink, createPresentationEvaluator, createPublicError, decodePublicError, defaultConsoleLogger, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, globalResilioEmitter, isErr, isOk, isPublicResult, isRetryableError, normalizeError, ok, resilioLogger, serializeError, shouldSuppress, stringHash, withRetry } from '@resiliojs/core';
2
+ export { BoundedDedupeStore, BuiltInChannel, DecodeResult, DedupeContext, DedupePolicy, ErrorCatalog, ErrorCode, ErrorDefinition, ErrorEvent, ErrorPolicyConfig, ErrorSink, ErrorSource, EvaluatedPresentationDecision, ExceptionReporter, ExceptionReporterOptions, FeedbackType, LoggerAdapter, NormalizeOptions, PolicyDecision, PolicyEngine, PolicyEngineOptions, PolicyEntry, PresentationContext, PresentationDecision, PresentationEvaluationResult, PresentationEvaluator, PresentationEvaluatorOptions, PresentationInvalidReason, PresentationObservationEvent, PresentationObserver, PresentationPlan, PresentationPlanInput, PresentationPolicyConfig, PresentationRule, PublicError, PublicErrorArgs, PublicErrorFor, PublicResult, ResilioEmitter, ResilioError, ResilioErrorKind, ResilioLogger, Result, RetryPolicy, canonicalStringify, createCompositeSink, createConsoleSink, createExceptionReporter, createPresentationEvaluator, createPublicError, decodePublicError, defaultConsoleLogger, defineErrorCatalog, defineErrorPolicy, definePresentationPolicy, err, globalResilioEmitter, isErr, isOk, isPublicResult, isRetryableError, normalizeError, ok, resilioLogger, serializeError, shouldSuppress, stringHash, withRetry } from '@resiliojs/core';
3
3
  import { P as PublicActionResult } from './types-kEvjOn-F.js';
4
4
  export { t as toActionState } from './types-kEvjOn-F.js';
5
5
  import { Instrumentation } from 'next';
@@ -18,6 +18,11 @@ declare function isSuccessfulResilioAction<TData, TCatalog extends ErrorCatalog,
18
18
  data: TData;
19
19
  };
20
20
 
21
+ /**
22
+ * @deprecated This legacy helper preserves expected-error messages and is not a
23
+ * general-purpose secret scrubber. Return catalog-backed `PublicActionResult`
24
+ * values created with `createPublicError` instead.
25
+ */
21
26
  declare function sanitizeErrorForClient(error: ResilioError): ResilioError;
22
27
 
23
28
  /**
package/dist/index.js CHANGED
@@ -85,6 +85,7 @@ import {
85
85
  decodePublicError,
86
86
  createConsoleSink,
87
87
  createCompositeSink,
88
+ createExceptionReporter,
88
89
  PolicyEngine,
89
90
  canonicalStringify,
90
91
  stringHash,
@@ -101,6 +102,7 @@ export {
101
102
  canonicalStringify,
102
103
  createCompositeSink,
103
104
  createConsoleSink,
105
+ createExceptionReporter,
104
106
  createPresentationEvaluator,
105
107
  createPublicError,
106
108
  createResilioAction,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/action.ts","../src/action-state.ts","../src/serializer.ts","../src/route-error.ts","../src/index.ts"],"sourcesContent":["import type { ErrorCatalog, ErrorCode } from '@resiliojs/core';\nimport type { PublicActionResult } from './types.js';\n\n/**\n * @deprecated Server Action 전체를 감싸는 래핑 방식은 권장되지 않습니다.\n * 대신 개별 Action에서 직접 `PublicActionResult`를 반환하십시오.\n * 이 호환 helper는 예외를 가로채지 않으며 unexpected exception과 Next.js 제어 흐름을 그대로 전파합니다.\n */\nexport function createResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n TArgs extends unknown[] = unknown[],\n>(\n handler: (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>>,\n): (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>> {\n return handler;\n}\n\n/**\n * 이미 decode된 Server Action 결과가 성공인지 타입 안전하게 확인합니다.\n */\nexport function isSuccessfulResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n>(\n result: PublicActionResult<TData, TCatalog, TCodes>\n): result is { ok: true; data: TData } {\n return result.ok === true;\n}\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","import { ResilioError, serializeError } from '@resiliojs/core';\n\nexport function sanitizeErrorForClient(\n error: ResilioError,\n): ResilioError {\n if (error.kind === 'server' || error.kind === 'unknown') {\n throw new Error('Unexpected server errors must be thrown and handled by the Next.js error boundary.');\n }\n return serializeError(error);\n}\n","import type { Instrumentation } from 'next';\nimport type { ErrorCatalog, ErrorSink } from '@resiliojs/core';\nimport { reportToSinkBestEffort } from '@resiliojs/core';\n\n/**\n * Next.js 15+ instrumentation.ts의 onRequestError 규격에 맞는 오류 관측성 핸들러를 생성합니다.\n * request headers와 query string은 보안을 위해 기본적으로 전달하지 않습니다.\n */\nexport function createResilioOnRequestError<T extends ErrorCatalog>(\n sink: ErrorSink<T>\n): Instrumentation.onRequestError {\n return async (error, request, context) => {\n const safePath = request.path ? request.path.split('?')[0] : '';\n const digest = getErrorDigest(error);\n const occurrenceId = Math.random().toString(36).substring(2, 15);\n const timestamp = Date.now();\n\n await reportToSinkBestEffort(sink, {\n occurrenceId,\n timestamp,\n source: 'next.request',\n kind: 'exception',\n error,\n correlationId: digest,\n context: {\n path: safePath,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n revalidateReason: context.revalidateReason,\n digest,\n },\n });\n };\n}\n\nfunction getErrorDigest(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('digest' in error)) {\n return undefined;\n }\n return typeof error.digest === 'string' ? error.digest : undefined;\n}\n\n// 기존 하위 호환을 위한 레거시 헬퍼\nimport { normalizeError, globalResilioEmitter, ResilioError } from '@resiliojs/core';\n\nexport interface RouteErrorOptions {\n digest?: string;\n}\n\n/**\n * @deprecated Use createResilioOnRequestError instead.\n */\nexport function reportRouteError(\n error: unknown,\n options: RouteErrorOptions = {}\n): ResilioError {\n const normalized = normalizeError(error, {\n defaultKind: 'server',\n defaultPresentation: 'boundary',\n });\n\n if (options.digest) {\n normalized.code = options.digest;\n }\n\n globalResilioEmitter.emit(normalized);\n\n return normalized;\n}\n","// Server-safe exports (safe to import in Server Components & Server Actions)\nexport * from './action.js';\nexport * from './action-state.js';\nexport * from './serializer.js';\nexport * from './route-error.js';\nexport * from './types.js';\n\n// Re-export core types and utilities for single-package DX\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n normalizeError, \n serializeError, \n isRetryableError, \n withRetry,\n defineErrorPolicy,\n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n RetryPolicy, \n NormalizeOptions, \n LoggerAdapter,\n ErrorCatalog,\n PublicError,\n FeedbackType,\n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\nexport { ResilioEmitter, globalResilioEmitter, ResilioLogger, resilioLogger, defaultConsoleLogger } from '@resiliojs/core';\n"],"mappings":";AAQO,SAAS,oBAMd,SAC0E;AAC1E,SAAO;AACT;AAKO,SAAS,0BAKd,QACqC;AACrC,SAAO,OAAO,OAAO;AACvB;;;ACzBO,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACTA,SAAuB,sBAAsB;AAEtC,SAAS,uBACd,OACc;AACd,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW;AACvD,UAAM,IAAI,MAAM,oFAAoF;AAAA,EACtG;AACA,SAAO,eAAe,KAAK;AAC7B;;;ACPA,SAAS,8BAA8B;AA4CvC,SAAS,gBAAgB,4BAA0C;AAtC5D,SAAS,4BACd,MACgC;AAChC,SAAO,OAAO,OAAO,SAAS,YAAY;AACxC,UAAM,WAAW,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAC7D,UAAM,SAAS,eAAe,KAAK;AACnC,UAAM,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,uBAAuB,MAAM;AAAA,MACjC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,kBAAkB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,YAAY,QAAQ;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAC3D;AAYO,SAAS,iBACd,OACA,UAA6B,CAAC,GAChB;AACd,QAAM,aAAa,eAAe,OAAO;AAAA,IACvC,aAAa;AAAA,IACb,qBAAqB;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,eAAW,OAAO,QAAQ;AAAA,EAC5B;AAEA,uBAAqB,KAAK,UAAU;AAEpC,SAAO;AACT;;;AC/DA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA2CP,SAAS,gBAAgB,wBAAAC,uBAAsB,eAAe,eAAe,4BAA4B;","names":["normalizeError","serializeError","globalResilioEmitter"]}
1
+ {"version":3,"sources":["../src/action.ts","../src/action-state.ts","../src/serializer.ts","../src/route-error.ts","../src/index.ts"],"sourcesContent":["import type { ErrorCatalog, ErrorCode } from '@resiliojs/core';\nimport type { PublicActionResult } from './types.js';\n\n/**\n * @deprecated Server Action 전체를 감싸는 래핑 방식은 권장되지 않습니다.\n * 대신 개별 Action에서 직접 `PublicActionResult`를 반환하십시오.\n * 이 호환 helper는 예외를 가로채지 않으며 unexpected exception과 Next.js 제어 흐름을 그대로 전파합니다.\n */\nexport function createResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n TArgs extends unknown[] = unknown[],\n>(\n handler: (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>>,\n): (...args: TArgs) => Promise<PublicActionResult<TData, TCatalog, TCodes>> {\n return handler;\n}\n\n/**\n * 이미 decode된 Server Action 결과가 성공인지 타입 안전하게 확인합니다.\n */\nexport function isSuccessfulResilioAction<\n TData,\n TCatalog extends ErrorCatalog,\n TCodes extends ErrorCode<TCatalog> = ErrorCode<TCatalog>,\n>(\n result: PublicActionResult<TData, TCatalog, TCodes>\n): result is { ok: true; data: TData } {\n return result.ok === true;\n}\n","import { Result } from '@resiliojs/core';\n\n/**\n * React 19 useActionState 초기화 시그니처에 적합한 성공 상태(Result)의 액션 초기값을 생성합니다.\n */\nexport function toActionState<T, E = unknown>(\n initialData: T | null = null\n): Result<T | null, E> {\n return { ok: true, data: initialData };\n}\n","import { ResilioError, serializeError } from '@resiliojs/core';\n\n/**\n * @deprecated This legacy helper preserves expected-error messages and is not a\n * general-purpose secret scrubber. Return catalog-backed `PublicActionResult`\n * values created with `createPublicError` instead.\n */\nexport function sanitizeErrorForClient(\n error: ResilioError,\n): ResilioError {\n if (error.kind === 'server' || error.kind === 'unknown') {\n throw new Error('Unexpected server errors must be thrown and handled by the Next.js error boundary.');\n }\n return serializeError(error);\n}\n","import type { Instrumentation } from 'next';\nimport type { ErrorCatalog, ErrorSink } from '@resiliojs/core';\nimport { reportToSinkBestEffort } from '@resiliojs/core';\n\n/**\n * Next.js 15+ instrumentation.ts의 onRequestError 규격에 맞는 오류 관측성 핸들러를 생성합니다.\n * request headers와 query string은 보안을 위해 기본적으로 전달하지 않습니다.\n */\nexport function createResilioOnRequestError<T extends ErrorCatalog>(\n sink: ErrorSink<T>\n): Instrumentation.onRequestError {\n return async (error, request, context) => {\n const safePath = request.path ? request.path.split('?')[0] : '';\n const digest = getErrorDigest(error);\n const occurrenceId = Math.random().toString(36).substring(2, 15);\n const timestamp = Date.now();\n\n await reportToSinkBestEffort(sink, {\n occurrenceId,\n timestamp,\n source: 'next.request',\n kind: 'exception',\n error,\n correlationId: digest,\n context: {\n path: safePath,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n revalidateReason: context.revalidateReason,\n digest,\n },\n });\n };\n}\n\nfunction getErrorDigest(error: unknown): string | undefined {\n if (!error || typeof error !== 'object' || !('digest' in error)) {\n return undefined;\n }\n return typeof error.digest === 'string' ? error.digest : undefined;\n}\n\n// 기존 하위 호환을 위한 레거시 헬퍼\nimport { normalizeError, globalResilioEmitter, ResilioError } from '@resiliojs/core';\n\nexport interface RouteErrorOptions {\n digest?: string;\n}\n\n/**\n * @deprecated Use createResilioOnRequestError instead.\n */\nexport function reportRouteError(\n error: unknown,\n options: RouteErrorOptions = {}\n): ResilioError {\n const normalized = normalizeError(error, {\n defaultKind: 'server',\n defaultPresentation: 'boundary',\n });\n\n if (options.digest) {\n normalized.code = options.digest;\n }\n\n globalResilioEmitter.emit(normalized);\n\n return normalized;\n}\n","// Server-safe exports (safe to import in Server Components & Server Actions)\nexport * from './action.js';\nexport * from './action-state.js';\nexport * from './serializer.js';\nexport * from './route-error.js';\nexport * from './types.js';\n\n// Re-export core types and utilities for single-package DX\nexport { \n ok, \n err, \n isOk, \n isErr, \n isPublicResult,\n normalizeError, \n serializeError, \n isRetryableError, \n withRetry,\n defineErrorPolicy,\n shouldSuppress,\n defineErrorCatalog,\n createPublicError,\n decodePublicError,\n createConsoleSink,\n createCompositeSink,\n createExceptionReporter,\n PolicyEngine,\n canonicalStringify,\n stringHash,\n BoundedDedupeStore,\n definePresentationPolicy,\n createPresentationEvaluator\n} from '@resiliojs/core';\n\nexport type { \n Result, \n PublicResult,\n ResilioError, \n ResilioErrorKind, \n RetryPolicy, \n NormalizeOptions, \n LoggerAdapter,\n ErrorCatalog,\n PublicError,\n FeedbackType,\n ErrorPolicyConfig,\n ErrorDefinition,\n ErrorCode,\n PublicErrorFor,\n PublicErrorArgs,\n DecodeResult,\n ErrorSource,\n ErrorEvent,\n ErrorSink,\n ExceptionReporter,\n ExceptionReporterOptions,\n PolicyEntry,\n PolicyDecision,\n DedupeContext,\n DedupePolicy,\n PolicyEngineOptions,\n BuiltInChannel,\n PresentationContext,\n PresentationDecision,\n PresentationPlan,\n PresentationPlanInput,\n PresentationRule,\n PresentationPolicyConfig,\n EvaluatedPresentationDecision,\n PresentationInvalidReason,\n PresentationEvaluationResult,\n PresentationEvaluator,\n PresentationEvaluatorOptions,\n PresentationObservationEvent,\n PresentationObserver\n} from '@resiliojs/core';\n\nexport { ResilioEmitter, globalResilioEmitter, ResilioLogger, resilioLogger, defaultConsoleLogger } from '@resiliojs/core';\n"],"mappings":";AAQO,SAAS,oBAMd,SAC0E;AAC1E,SAAO;AACT;AAKO,SAAS,0BAKd,QACqC;AACrC,SAAO,OAAO,OAAO;AACvB;;;ACzBO,SAAS,cACd,cAAwB,MACH;AACrB,SAAO,EAAE,IAAI,MAAM,MAAM,YAAY;AACvC;;;ACTA,SAAuB,sBAAsB;AAOtC,SAAS,uBACd,OACc;AACd,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW;AACvD,UAAM,IAAI,MAAM,oFAAoF;AAAA,EACtG;AACA,SAAO,eAAe,KAAK;AAC7B;;;ACZA,SAAS,8BAA8B;AA4CvC,SAAS,gBAAgB,4BAA0C;AAtC5D,SAAS,4BACd,MACgC;AAChC,SAAO,OAAO,OAAO,SAAS,YAAY;AACxC,UAAM,WAAW,QAAQ,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAC7D,UAAM,SAAS,eAAe,KAAK;AACnC,UAAM,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,uBAAuB,MAAM;AAAA,MACjC;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,MACf,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,cAAc,QAAQ;AAAA,QACtB,kBAAkB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,YAAY,QAAQ;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAC3D;AAYO,SAAS,iBACd,OACA,UAA6B,CAAC,GAChB;AACd,QAAM,aAAa,eAAe,OAAO;AAAA,IACvC,aAAa;AAAA,IACb,qBAAqB;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,QAAQ;AAClB,eAAW,OAAO,QAAQ;AAAA,EAC5B;AAEA,uBAAqB,KAAK,UAAU;AAEpC,SAAO;AACT;;;AC/DA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA6CP,SAAS,gBAAgB,wBAAAC,uBAAsB,eAAe,eAAe,4BAA4B;","names":["normalizeError","serializeError","globalResilioEmitter"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resiliojs/next",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Next.js facade for typed public errors and presentation policies",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -44,8 +44,8 @@
44
44
  ],
45
45
  "sideEffects": false,
46
46
  "dependencies": {
47
- "@resiliojs/core": "^0.1.0",
48
- "@resiliojs/react": "^0.1.0"
47
+ "@resiliojs/core": "^0.1.1",
48
+ "@resiliojs/react": "^0.1.1"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "next": ">=15 <17",