mirror of
https://github.com/coollabsio/coolify-docs.git
synced 2026-06-19 07:35:55 +00:00
Base
This commit is contained in:
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
Vendored
+61
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"hash": "ee3878a8",
|
||||
"configHash": "8093d28a",
|
||||
"lockfileHash": "db4f9040",
|
||||
"browserHash": "555e3dac",
|
||||
"optimized": {
|
||||
"vue": {
|
||||
"src": "../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
|
||||
"file": "vue.js",
|
||||
"fileHash": "70517ae9",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > @vue/devtools-api": {
|
||||
"src": "../../../node_modules/@vue/devtools-api/dist/index.js",
|
||||
"file": "vitepress___@vue_devtools-api.js",
|
||||
"fileHash": "c6b3ef45",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > @vueuse/core": {
|
||||
"src": "../../../node_modules/@vueuse/core/index.mjs",
|
||||
"file": "vitepress___@vueuse_core.js",
|
||||
"fileHash": "d0b417ce",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > @vueuse/integrations/useFocusTrap": {
|
||||
"src": "../../../node_modules/@vueuse/integrations/useFocusTrap.mjs",
|
||||
"file": "vitepress___@vueuse_integrations_useFocusTrap.js",
|
||||
"fileHash": "f9b59168",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > mark.js/src/vanilla.js": {
|
||||
"src": "../../../node_modules/mark.js/src/vanilla.js",
|
||||
"file": "vitepress___mark__js_src_vanilla__js.js",
|
||||
"fileHash": "f20adf74",
|
||||
"needsInterop": false
|
||||
},
|
||||
"vitepress > minisearch": {
|
||||
"src": "../../../node_modules/minisearch/dist/es/index.js",
|
||||
"file": "vitepress___minisearch.js",
|
||||
"fileHash": "49c91931",
|
||||
"needsInterop": false
|
||||
},
|
||||
"lucide-vue-next": {
|
||||
"src": "../../../node_modules/lucide-vue-next/dist/esm/lucide-vue-next.js",
|
||||
"file": "lucide-vue-next.js",
|
||||
"fileHash": "e32d8d59",
|
||||
"needsInterop": false
|
||||
}
|
||||
},
|
||||
"chunks": {
|
||||
"chunk-A7UTJUSY": {
|
||||
"file": "chunk-A7UTJUSY.js"
|
||||
},
|
||||
"chunk-VJWGEPT5": {
|
||||
"file": "chunk-VJWGEPT5.js"
|
||||
},
|
||||
"chunk-PZ5AY32C": {
|
||||
"file": "chunk-PZ5AY32C.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
+9358
File diff suppressed because it is too large
Load Diff
+7
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
||||
var __defProp = Object.defineProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
|
||||
export {
|
||||
__export
|
||||
};
|
||||
//# sourceMappingURL=chunk-PZ5AY32C.js.map
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [],
|
||||
"sourcesContent": [],
|
||||
"mappings": "",
|
||||
"names": []
|
||||
}
|
||||
+12542
File diff suppressed because it is too large
Load Diff
+7
File diff suppressed because one or more lines are too long
+35077
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"type": "module"
|
||||
}
|
||||
+4514
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+570
@@ -0,0 +1,570 @@
|
||||
import {
|
||||
DefaultMagicKeysAliasMap,
|
||||
StorageSerializers,
|
||||
TransitionPresets,
|
||||
assert,
|
||||
breakpointsAntDesign,
|
||||
breakpointsBootstrapV5,
|
||||
breakpointsElement,
|
||||
breakpointsMasterCss,
|
||||
breakpointsPrimeFlex,
|
||||
breakpointsQuasar,
|
||||
breakpointsSematic,
|
||||
breakpointsTailwind,
|
||||
breakpointsVuetify,
|
||||
breakpointsVuetifyV2,
|
||||
breakpointsVuetifyV3,
|
||||
bypassFilter,
|
||||
camelize,
|
||||
clamp,
|
||||
cloneFnJSON,
|
||||
computedAsync,
|
||||
computedEager,
|
||||
computedInject,
|
||||
computedWithControl,
|
||||
containsProp,
|
||||
controlledRef,
|
||||
createEventHook,
|
||||
createFetch,
|
||||
createFilterWrapper,
|
||||
createGlobalState,
|
||||
createInjectionState,
|
||||
createReusableTemplate,
|
||||
createSharedComposable,
|
||||
createSingletonPromise,
|
||||
createTemplatePromise,
|
||||
createUnrefFn,
|
||||
customStorageEventName,
|
||||
debounceFilter,
|
||||
defaultDocument,
|
||||
defaultLocation,
|
||||
defaultNavigator,
|
||||
defaultWindow,
|
||||
directiveHooks,
|
||||
executeTransition,
|
||||
extendRef,
|
||||
formatDate,
|
||||
formatTimeAgo,
|
||||
get,
|
||||
getLifeCycleTarget,
|
||||
getSSRHandler,
|
||||
hasOwn,
|
||||
hyphenate,
|
||||
identity,
|
||||
increaseWithUnit,
|
||||
injectLocal,
|
||||
invoke,
|
||||
isClient,
|
||||
isDef,
|
||||
isDefined,
|
||||
isIOS,
|
||||
isObject,
|
||||
isWorker,
|
||||
makeDestructurable,
|
||||
mapGamepadToXbox360Controller,
|
||||
noop,
|
||||
normalizeDate,
|
||||
notNullish,
|
||||
now,
|
||||
objectEntries,
|
||||
objectOmit,
|
||||
objectPick,
|
||||
onClickOutside,
|
||||
onKeyDown,
|
||||
onKeyPressed,
|
||||
onKeyStroke,
|
||||
onKeyUp,
|
||||
onLongPress,
|
||||
onStartTyping,
|
||||
pausableFilter,
|
||||
promiseTimeout,
|
||||
provideLocal,
|
||||
rand,
|
||||
reactify,
|
||||
reactifyObject,
|
||||
reactiveComputed,
|
||||
reactiveOmit,
|
||||
reactivePick,
|
||||
refAutoReset,
|
||||
refDebounced,
|
||||
refDefault,
|
||||
refThrottled,
|
||||
refWithControl,
|
||||
resolveRef,
|
||||
resolveUnref,
|
||||
set,
|
||||
setSSRHandler,
|
||||
syncRef,
|
||||
syncRefs,
|
||||
templateRef,
|
||||
throttleFilter,
|
||||
timestamp,
|
||||
toReactive,
|
||||
toRef,
|
||||
toRefs,
|
||||
toValue,
|
||||
tryOnBeforeMount,
|
||||
tryOnBeforeUnmount,
|
||||
tryOnMounted,
|
||||
tryOnScopeDispose,
|
||||
tryOnUnmounted,
|
||||
unrefElement,
|
||||
until,
|
||||
useActiveElement,
|
||||
useAnimate,
|
||||
useArrayDifference,
|
||||
useArrayEvery,
|
||||
useArrayFilter,
|
||||
useArrayFind,
|
||||
useArrayFindIndex,
|
||||
useArrayFindLast,
|
||||
useArrayIncludes,
|
||||
useArrayJoin,
|
||||
useArrayMap,
|
||||
useArrayReduce,
|
||||
useArraySome,
|
||||
useArrayUnique,
|
||||
useAsyncQueue,
|
||||
useAsyncState,
|
||||
useBase64,
|
||||
useBattery,
|
||||
useBluetooth,
|
||||
useBreakpoints,
|
||||
useBroadcastChannel,
|
||||
useBrowserLocation,
|
||||
useCached,
|
||||
useClipboard,
|
||||
useClipboardItems,
|
||||
useCloned,
|
||||
useColorMode,
|
||||
useConfirmDialog,
|
||||
useCounter,
|
||||
useCssVar,
|
||||
useCurrentElement,
|
||||
useCycleList,
|
||||
useDark,
|
||||
useDateFormat,
|
||||
useDebounceFn,
|
||||
useDebouncedRefHistory,
|
||||
useDeviceMotion,
|
||||
useDeviceOrientation,
|
||||
useDevicePixelRatio,
|
||||
useDevicesList,
|
||||
useDisplayMedia,
|
||||
useDocumentVisibility,
|
||||
useDraggable,
|
||||
useDropZone,
|
||||
useElementBounding,
|
||||
useElementByPoint,
|
||||
useElementHover,
|
||||
useElementSize,
|
||||
useElementVisibility,
|
||||
useEventBus,
|
||||
useEventListener,
|
||||
useEventSource,
|
||||
useEyeDropper,
|
||||
useFavicon,
|
||||
useFetch,
|
||||
useFileDialog,
|
||||
useFileSystemAccess,
|
||||
useFocus,
|
||||
useFocusWithin,
|
||||
useFps,
|
||||
useFullscreen,
|
||||
useGamepad,
|
||||
useGeolocation,
|
||||
useIdle,
|
||||
useImage,
|
||||
useInfiniteScroll,
|
||||
useIntersectionObserver,
|
||||
useInterval,
|
||||
useIntervalFn,
|
||||
useKeyModifier,
|
||||
useLastChanged,
|
||||
useLocalStorage,
|
||||
useMagicKeys,
|
||||
useManualRefHistory,
|
||||
useMediaControls,
|
||||
useMediaQuery,
|
||||
useMemoize,
|
||||
useMemory,
|
||||
useMounted,
|
||||
useMouse,
|
||||
useMouseInElement,
|
||||
useMousePressed,
|
||||
useMutationObserver,
|
||||
useNavigatorLanguage,
|
||||
useNetwork,
|
||||
useNow,
|
||||
useObjectUrl,
|
||||
useOffsetPagination,
|
||||
useOnline,
|
||||
usePageLeave,
|
||||
useParallax,
|
||||
useParentElement,
|
||||
usePerformanceObserver,
|
||||
usePermission,
|
||||
usePointer,
|
||||
usePointerLock,
|
||||
usePointerSwipe,
|
||||
usePreferredColorScheme,
|
||||
usePreferredContrast,
|
||||
usePreferredDark,
|
||||
usePreferredLanguages,
|
||||
usePreferredReducedMotion,
|
||||
usePrevious,
|
||||
useRafFn,
|
||||
useRefHistory,
|
||||
useResizeObserver,
|
||||
useScreenOrientation,
|
||||
useScreenSafeArea,
|
||||
useScriptTag,
|
||||
useScroll,
|
||||
useScrollLock,
|
||||
useSessionStorage,
|
||||
useShare,
|
||||
useSorted,
|
||||
useSpeechRecognition,
|
||||
useSpeechSynthesis,
|
||||
useStepper,
|
||||
useStorage,
|
||||
useStorageAsync,
|
||||
useStyleTag,
|
||||
useSupported,
|
||||
useSwipe,
|
||||
useTemplateRefsList,
|
||||
useTextDirection,
|
||||
useTextSelection,
|
||||
useTextareaAutosize,
|
||||
useThrottleFn,
|
||||
useThrottledRefHistory,
|
||||
useTimeAgo,
|
||||
useTimeout,
|
||||
useTimeoutFn,
|
||||
useTimeoutPoll,
|
||||
useTimestamp,
|
||||
useTitle,
|
||||
useToNumber,
|
||||
useToString,
|
||||
useToggle,
|
||||
useTransition,
|
||||
useUrlSearchParams,
|
||||
useUserMedia,
|
||||
useVModel,
|
||||
useVModels,
|
||||
useVibrate,
|
||||
useVirtualList,
|
||||
useWakeLock,
|
||||
useWebNotification,
|
||||
useWebSocket,
|
||||
useWebWorker,
|
||||
useWebWorkerFn,
|
||||
useWindowFocus,
|
||||
useWindowScroll,
|
||||
useWindowSize,
|
||||
watchArray,
|
||||
watchAtMost,
|
||||
watchDebounced,
|
||||
watchDeep,
|
||||
watchIgnorable,
|
||||
watchImmediate,
|
||||
watchOnce,
|
||||
watchPausable,
|
||||
watchThrottled,
|
||||
watchTriggerable,
|
||||
watchWithFilter,
|
||||
whenever
|
||||
} from "./chunk-A7UTJUSY.js";
|
||||
import "./chunk-VJWGEPT5.js";
|
||||
import "./chunk-PZ5AY32C.js";
|
||||
export {
|
||||
DefaultMagicKeysAliasMap,
|
||||
StorageSerializers,
|
||||
TransitionPresets,
|
||||
assert,
|
||||
computedAsync as asyncComputed,
|
||||
refAutoReset as autoResetRef,
|
||||
breakpointsAntDesign,
|
||||
breakpointsBootstrapV5,
|
||||
breakpointsElement,
|
||||
breakpointsMasterCss,
|
||||
breakpointsPrimeFlex,
|
||||
breakpointsQuasar,
|
||||
breakpointsSematic,
|
||||
breakpointsTailwind,
|
||||
breakpointsVuetify,
|
||||
breakpointsVuetifyV2,
|
||||
breakpointsVuetifyV3,
|
||||
bypassFilter,
|
||||
camelize,
|
||||
clamp,
|
||||
cloneFnJSON,
|
||||
computedAsync,
|
||||
computedEager,
|
||||
computedInject,
|
||||
computedWithControl,
|
||||
containsProp,
|
||||
computedWithControl as controlledComputed,
|
||||
controlledRef,
|
||||
createEventHook,
|
||||
createFetch,
|
||||
createFilterWrapper,
|
||||
createGlobalState,
|
||||
createInjectionState,
|
||||
reactify as createReactiveFn,
|
||||
createReusableTemplate,
|
||||
createSharedComposable,
|
||||
createSingletonPromise,
|
||||
createTemplatePromise,
|
||||
createUnrefFn,
|
||||
customStorageEventName,
|
||||
debounceFilter,
|
||||
refDebounced as debouncedRef,
|
||||
watchDebounced as debouncedWatch,
|
||||
defaultDocument,
|
||||
defaultLocation,
|
||||
defaultNavigator,
|
||||
defaultWindow,
|
||||
directiveHooks,
|
||||
computedEager as eagerComputed,
|
||||
executeTransition,
|
||||
extendRef,
|
||||
formatDate,
|
||||
formatTimeAgo,
|
||||
get,
|
||||
getLifeCycleTarget,
|
||||
getSSRHandler,
|
||||
hasOwn,
|
||||
hyphenate,
|
||||
identity,
|
||||
watchIgnorable as ignorableWatch,
|
||||
increaseWithUnit,
|
||||
injectLocal,
|
||||
invoke,
|
||||
isClient,
|
||||
isDef,
|
||||
isDefined,
|
||||
isIOS,
|
||||
isObject,
|
||||
isWorker,
|
||||
makeDestructurable,
|
||||
mapGamepadToXbox360Controller,
|
||||
noop,
|
||||
normalizeDate,
|
||||
notNullish,
|
||||
now,
|
||||
objectEntries,
|
||||
objectOmit,
|
||||
objectPick,
|
||||
onClickOutside,
|
||||
onKeyDown,
|
||||
onKeyPressed,
|
||||
onKeyStroke,
|
||||
onKeyUp,
|
||||
onLongPress,
|
||||
onStartTyping,
|
||||
pausableFilter,
|
||||
watchPausable as pausableWatch,
|
||||
promiseTimeout,
|
||||
provideLocal,
|
||||
rand,
|
||||
reactify,
|
||||
reactifyObject,
|
||||
reactiveComputed,
|
||||
reactiveOmit,
|
||||
reactivePick,
|
||||
refAutoReset,
|
||||
refDebounced,
|
||||
refDefault,
|
||||
refThrottled,
|
||||
refWithControl,
|
||||
resolveRef,
|
||||
resolveUnref,
|
||||
set,
|
||||
setSSRHandler,
|
||||
syncRef,
|
||||
syncRefs,
|
||||
templateRef,
|
||||
throttleFilter,
|
||||
refThrottled as throttledRef,
|
||||
watchThrottled as throttledWatch,
|
||||
timestamp,
|
||||
toReactive,
|
||||
toRef,
|
||||
toRefs,
|
||||
toValue,
|
||||
tryOnBeforeMount,
|
||||
tryOnBeforeUnmount,
|
||||
tryOnMounted,
|
||||
tryOnScopeDispose,
|
||||
tryOnUnmounted,
|
||||
unrefElement,
|
||||
until,
|
||||
useActiveElement,
|
||||
useAnimate,
|
||||
useArrayDifference,
|
||||
useArrayEvery,
|
||||
useArrayFilter,
|
||||
useArrayFind,
|
||||
useArrayFindIndex,
|
||||
useArrayFindLast,
|
||||
useArrayIncludes,
|
||||
useArrayJoin,
|
||||
useArrayMap,
|
||||
useArrayReduce,
|
||||
useArraySome,
|
||||
useArrayUnique,
|
||||
useAsyncQueue,
|
||||
useAsyncState,
|
||||
useBase64,
|
||||
useBattery,
|
||||
useBluetooth,
|
||||
useBreakpoints,
|
||||
useBroadcastChannel,
|
||||
useBrowserLocation,
|
||||
useCached,
|
||||
useClipboard,
|
||||
useClipboardItems,
|
||||
useCloned,
|
||||
useColorMode,
|
||||
useConfirmDialog,
|
||||
useCounter,
|
||||
useCssVar,
|
||||
useCurrentElement,
|
||||
useCycleList,
|
||||
useDark,
|
||||
useDateFormat,
|
||||
refDebounced as useDebounce,
|
||||
useDebounceFn,
|
||||
useDebouncedRefHistory,
|
||||
useDeviceMotion,
|
||||
useDeviceOrientation,
|
||||
useDevicePixelRatio,
|
||||
useDevicesList,
|
||||
useDisplayMedia,
|
||||
useDocumentVisibility,
|
||||
useDraggable,
|
||||
useDropZone,
|
||||
useElementBounding,
|
||||
useElementByPoint,
|
||||
useElementHover,
|
||||
useElementSize,
|
||||
useElementVisibility,
|
||||
useEventBus,
|
||||
useEventListener,
|
||||
useEventSource,
|
||||
useEyeDropper,
|
||||
useFavicon,
|
||||
useFetch,
|
||||
useFileDialog,
|
||||
useFileSystemAccess,
|
||||
useFocus,
|
||||
useFocusWithin,
|
||||
useFps,
|
||||
useFullscreen,
|
||||
useGamepad,
|
||||
useGeolocation,
|
||||
useIdle,
|
||||
useImage,
|
||||
useInfiniteScroll,
|
||||
useIntersectionObserver,
|
||||
useInterval,
|
||||
useIntervalFn,
|
||||
useKeyModifier,
|
||||
useLastChanged,
|
||||
useLocalStorage,
|
||||
useMagicKeys,
|
||||
useManualRefHistory,
|
||||
useMediaControls,
|
||||
useMediaQuery,
|
||||
useMemoize,
|
||||
useMemory,
|
||||
useMounted,
|
||||
useMouse,
|
||||
useMouseInElement,
|
||||
useMousePressed,
|
||||
useMutationObserver,
|
||||
useNavigatorLanguage,
|
||||
useNetwork,
|
||||
useNow,
|
||||
useObjectUrl,
|
||||
useOffsetPagination,
|
||||
useOnline,
|
||||
usePageLeave,
|
||||
useParallax,
|
||||
useParentElement,
|
||||
usePerformanceObserver,
|
||||
usePermission,
|
||||
usePointer,
|
||||
usePointerLock,
|
||||
usePointerSwipe,
|
||||
usePreferredColorScheme,
|
||||
usePreferredContrast,
|
||||
usePreferredDark,
|
||||
usePreferredLanguages,
|
||||
usePreferredReducedMotion,
|
||||
usePrevious,
|
||||
useRafFn,
|
||||
useRefHistory,
|
||||
useResizeObserver,
|
||||
useScreenOrientation,
|
||||
useScreenSafeArea,
|
||||
useScriptTag,
|
||||
useScroll,
|
||||
useScrollLock,
|
||||
useSessionStorage,
|
||||
useShare,
|
||||
useSorted,
|
||||
useSpeechRecognition,
|
||||
useSpeechSynthesis,
|
||||
useStepper,
|
||||
useStorage,
|
||||
useStorageAsync,
|
||||
useStyleTag,
|
||||
useSupported,
|
||||
useSwipe,
|
||||
useTemplateRefsList,
|
||||
useTextDirection,
|
||||
useTextSelection,
|
||||
useTextareaAutosize,
|
||||
refThrottled as useThrottle,
|
||||
useThrottleFn,
|
||||
useThrottledRefHistory,
|
||||
useTimeAgo,
|
||||
useTimeout,
|
||||
useTimeoutFn,
|
||||
useTimeoutPoll,
|
||||
useTimestamp,
|
||||
useTitle,
|
||||
useToNumber,
|
||||
useToString,
|
||||
useToggle,
|
||||
useTransition,
|
||||
useUrlSearchParams,
|
||||
useUserMedia,
|
||||
useVModel,
|
||||
useVModels,
|
||||
useVibrate,
|
||||
useVirtualList,
|
||||
useWakeLock,
|
||||
useWebNotification,
|
||||
useWebSocket,
|
||||
useWebWorker,
|
||||
useWebWorkerFn,
|
||||
useWindowFocus,
|
||||
useWindowScroll,
|
||||
useWindowSize,
|
||||
watchArray,
|
||||
watchAtMost,
|
||||
watchDebounced,
|
||||
watchDeep,
|
||||
watchIgnorable,
|
||||
watchImmediate,
|
||||
watchOnce,
|
||||
watchPausable,
|
||||
watchThrottled,
|
||||
watchTriggerable,
|
||||
watchWithFilter,
|
||||
whenever
|
||||
};
|
||||
//# sourceMappingURL=vitepress___@vueuse_core.js.map
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [],
|
||||
"sourcesContent": [],
|
||||
"mappings": "",
|
||||
"names": []
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+1841
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Vendored
+344
@@ -0,0 +1,344 @@
|
||||
import {
|
||||
BaseTransition,
|
||||
BaseTransitionPropsValidators,
|
||||
Comment,
|
||||
DeprecationTypes,
|
||||
EffectScope,
|
||||
ErrorCodes,
|
||||
ErrorTypeStrings,
|
||||
Fragment,
|
||||
KeepAlive,
|
||||
ReactiveEffect,
|
||||
Static,
|
||||
Suspense,
|
||||
Teleport,
|
||||
Text,
|
||||
TrackOpTypes,
|
||||
Transition,
|
||||
TransitionGroup,
|
||||
TriggerOpTypes,
|
||||
VueElement,
|
||||
assertNumber,
|
||||
callWithAsyncErrorHandling,
|
||||
callWithErrorHandling,
|
||||
camelize,
|
||||
capitalize,
|
||||
cloneVNode,
|
||||
compatUtils,
|
||||
compile,
|
||||
computed,
|
||||
createApp,
|
||||
createBaseVNode,
|
||||
createBlock,
|
||||
createCommentVNode,
|
||||
createElementBlock,
|
||||
createHydrationRenderer,
|
||||
createPropsRestProxy,
|
||||
createRenderer,
|
||||
createSSRApp,
|
||||
createSlots,
|
||||
createStaticVNode,
|
||||
createTextVNode,
|
||||
createVNode,
|
||||
customRef,
|
||||
defineAsyncComponent,
|
||||
defineComponent,
|
||||
defineCustomElement,
|
||||
defineEmits,
|
||||
defineExpose,
|
||||
defineModel,
|
||||
defineOptions,
|
||||
defineProps,
|
||||
defineSSRCustomElement,
|
||||
defineSlots,
|
||||
devtools,
|
||||
effect,
|
||||
effectScope,
|
||||
getCurrentInstance,
|
||||
getCurrentScope,
|
||||
getCurrentWatcher,
|
||||
getTransitionRawChildren,
|
||||
guardReactiveProps,
|
||||
h,
|
||||
handleError,
|
||||
hasInjectionContext,
|
||||
hydrate,
|
||||
hydrateOnIdle,
|
||||
hydrateOnInteraction,
|
||||
hydrateOnMediaQuery,
|
||||
hydrateOnVisible,
|
||||
initCustomFormatter,
|
||||
initDirectivesForSSR,
|
||||
inject,
|
||||
isMemoSame,
|
||||
isProxy,
|
||||
isReactive,
|
||||
isReadonly,
|
||||
isRef,
|
||||
isRuntimeOnly,
|
||||
isShallow,
|
||||
isVNode,
|
||||
markRaw,
|
||||
mergeDefaults,
|
||||
mergeModels,
|
||||
mergeProps,
|
||||
nextTick,
|
||||
normalizeClass,
|
||||
normalizeProps,
|
||||
normalizeStyle,
|
||||
onActivated,
|
||||
onBeforeMount,
|
||||
onBeforeUnmount,
|
||||
onBeforeUpdate,
|
||||
onDeactivated,
|
||||
onErrorCaptured,
|
||||
onMounted,
|
||||
onRenderTracked,
|
||||
onRenderTriggered,
|
||||
onScopeDispose,
|
||||
onServerPrefetch,
|
||||
onUnmounted,
|
||||
onUpdated,
|
||||
onWatcherCleanup,
|
||||
openBlock,
|
||||
popScopeId,
|
||||
provide,
|
||||
proxyRefs,
|
||||
pushScopeId,
|
||||
queuePostFlushCb,
|
||||
reactive,
|
||||
readonly,
|
||||
ref,
|
||||
registerRuntimeCompiler,
|
||||
render,
|
||||
renderList,
|
||||
renderSlot,
|
||||
resolveComponent,
|
||||
resolveDirective,
|
||||
resolveDynamicComponent,
|
||||
resolveFilter,
|
||||
resolveTransitionHooks,
|
||||
setBlockTracking,
|
||||
setDevtoolsHook,
|
||||
setTransitionHooks,
|
||||
shallowReactive,
|
||||
shallowReadonly,
|
||||
shallowRef,
|
||||
ssrContextKey,
|
||||
ssrUtils,
|
||||
stop,
|
||||
toDisplayString,
|
||||
toHandlerKey,
|
||||
toHandlers,
|
||||
toRaw,
|
||||
toRef,
|
||||
toRefs,
|
||||
toValue,
|
||||
transformVNodeArgs,
|
||||
triggerRef,
|
||||
unref,
|
||||
useAttrs,
|
||||
useCssModule,
|
||||
useCssVars,
|
||||
useHost,
|
||||
useId,
|
||||
useModel,
|
||||
useSSRContext,
|
||||
useShadowRoot,
|
||||
useSlots,
|
||||
useTemplateRef,
|
||||
useTransitionState,
|
||||
vModelCheckbox,
|
||||
vModelDynamic,
|
||||
vModelRadio,
|
||||
vModelSelect,
|
||||
vModelText,
|
||||
vShow,
|
||||
version,
|
||||
warn,
|
||||
watch,
|
||||
watchEffect,
|
||||
watchPostEffect,
|
||||
watchSyncEffect,
|
||||
withAsyncContext,
|
||||
withCtx,
|
||||
withDefaults,
|
||||
withDirectives,
|
||||
withKeys,
|
||||
withMemo,
|
||||
withModifiers,
|
||||
withScopeId
|
||||
} from "./chunk-VJWGEPT5.js";
|
||||
import "./chunk-PZ5AY32C.js";
|
||||
export {
|
||||
BaseTransition,
|
||||
BaseTransitionPropsValidators,
|
||||
Comment,
|
||||
DeprecationTypes,
|
||||
EffectScope,
|
||||
ErrorCodes,
|
||||
ErrorTypeStrings,
|
||||
Fragment,
|
||||
KeepAlive,
|
||||
ReactiveEffect,
|
||||
Static,
|
||||
Suspense,
|
||||
Teleport,
|
||||
Text,
|
||||
TrackOpTypes,
|
||||
Transition,
|
||||
TransitionGroup,
|
||||
TriggerOpTypes,
|
||||
VueElement,
|
||||
assertNumber,
|
||||
callWithAsyncErrorHandling,
|
||||
callWithErrorHandling,
|
||||
camelize,
|
||||
capitalize,
|
||||
cloneVNode,
|
||||
compatUtils,
|
||||
compile,
|
||||
computed,
|
||||
createApp,
|
||||
createBlock,
|
||||
createCommentVNode,
|
||||
createElementBlock,
|
||||
createBaseVNode as createElementVNode,
|
||||
createHydrationRenderer,
|
||||
createPropsRestProxy,
|
||||
createRenderer,
|
||||
createSSRApp,
|
||||
createSlots,
|
||||
createStaticVNode,
|
||||
createTextVNode,
|
||||
createVNode,
|
||||
customRef,
|
||||
defineAsyncComponent,
|
||||
defineComponent,
|
||||
defineCustomElement,
|
||||
defineEmits,
|
||||
defineExpose,
|
||||
defineModel,
|
||||
defineOptions,
|
||||
defineProps,
|
||||
defineSSRCustomElement,
|
||||
defineSlots,
|
||||
devtools,
|
||||
effect,
|
||||
effectScope,
|
||||
getCurrentInstance,
|
||||
getCurrentScope,
|
||||
getCurrentWatcher,
|
||||
getTransitionRawChildren,
|
||||
guardReactiveProps,
|
||||
h,
|
||||
handleError,
|
||||
hasInjectionContext,
|
||||
hydrate,
|
||||
hydrateOnIdle,
|
||||
hydrateOnInteraction,
|
||||
hydrateOnMediaQuery,
|
||||
hydrateOnVisible,
|
||||
initCustomFormatter,
|
||||
initDirectivesForSSR,
|
||||
inject,
|
||||
isMemoSame,
|
||||
isProxy,
|
||||
isReactive,
|
||||
isReadonly,
|
||||
isRef,
|
||||
isRuntimeOnly,
|
||||
isShallow,
|
||||
isVNode,
|
||||
markRaw,
|
||||
mergeDefaults,
|
||||
mergeModels,
|
||||
mergeProps,
|
||||
nextTick,
|
||||
normalizeClass,
|
||||
normalizeProps,
|
||||
normalizeStyle,
|
||||
onActivated,
|
||||
onBeforeMount,
|
||||
onBeforeUnmount,
|
||||
onBeforeUpdate,
|
||||
onDeactivated,
|
||||
onErrorCaptured,
|
||||
onMounted,
|
||||
onRenderTracked,
|
||||
onRenderTriggered,
|
||||
onScopeDispose,
|
||||
onServerPrefetch,
|
||||
onUnmounted,
|
||||
onUpdated,
|
||||
onWatcherCleanup,
|
||||
openBlock,
|
||||
popScopeId,
|
||||
provide,
|
||||
proxyRefs,
|
||||
pushScopeId,
|
||||
queuePostFlushCb,
|
||||
reactive,
|
||||
readonly,
|
||||
ref,
|
||||
registerRuntimeCompiler,
|
||||
render,
|
||||
renderList,
|
||||
renderSlot,
|
||||
resolveComponent,
|
||||
resolveDirective,
|
||||
resolveDynamicComponent,
|
||||
resolveFilter,
|
||||
resolveTransitionHooks,
|
||||
setBlockTracking,
|
||||
setDevtoolsHook,
|
||||
setTransitionHooks,
|
||||
shallowReactive,
|
||||
shallowReadonly,
|
||||
shallowRef,
|
||||
ssrContextKey,
|
||||
ssrUtils,
|
||||
stop,
|
||||
toDisplayString,
|
||||
toHandlerKey,
|
||||
toHandlers,
|
||||
toRaw,
|
||||
toRef,
|
||||
toRefs,
|
||||
toValue,
|
||||
transformVNodeArgs,
|
||||
triggerRef,
|
||||
unref,
|
||||
useAttrs,
|
||||
useCssModule,
|
||||
useCssVars,
|
||||
useHost,
|
||||
useId,
|
||||
useModel,
|
||||
useSSRContext,
|
||||
useShadowRoot,
|
||||
useSlots,
|
||||
useTemplateRef,
|
||||
useTransitionState,
|
||||
vModelCheckbox,
|
||||
vModelDynamic,
|
||||
vModelRadio,
|
||||
vModelSelect,
|
||||
vModelText,
|
||||
vShow,
|
||||
version,
|
||||
warn,
|
||||
watch,
|
||||
watchEffect,
|
||||
watchPostEffect,
|
||||
watchSyncEffect,
|
||||
withAsyncContext,
|
||||
withCtx,
|
||||
withDefaults,
|
||||
withDirectives,
|
||||
withKeys,
|
||||
withMemo,
|
||||
withModifiers,
|
||||
withScopeId
|
||||
};
|
||||
//# sourceMappingURL=vue.js.map
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [],
|
||||
"sourcesContent": [],
|
||||
"mappings": "",
|
||||
"names": []
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
import { defineConfig } from 'vitepress'
|
||||
|
||||
// https://vitepress.dev/reference/site-config
|
||||
export default defineConfig({
|
||||
lang: 'en-US',
|
||||
title: "Coolify Docs",
|
||||
description: "Self hosting with super powers",
|
||||
themeConfig: {
|
||||
// https://vitepress.dev/reference/default-theme-config
|
||||
nav: [
|
||||
{ text: 'Coolify Cloud', link: 'https://coolify.io/pricing/' },
|
||||
{
|
||||
text: 'Resources',
|
||||
items: [
|
||||
{ text: 'Releases', link: 'https://github.com/coollabsio/coolify/releases' },
|
||||
{ text: 'Support', link: 'https://coolify.io/' },
|
||||
{ text: 'Sponsor us', link: 'https://coolify.io/sponsorships/' }
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
search: {
|
||||
provider: 'local'
|
||||
},
|
||||
editLink: {
|
||||
pattern: 'https://github.com/coollabsio/documentation-coolify/:path',
|
||||
text: 'Edit this page on GitHub'
|
||||
},
|
||||
socialLinks: [
|
||||
{ icon: 'github', link: 'https://github.com/coollabsio/coolify' },
|
||||
{ icon: 'discord', link: 'https://discord.gg/coolify' },
|
||||
{ icon: 'x', link: 'https://x.com/coolifyio' }
|
||||
],
|
||||
sidebar: [
|
||||
{
|
||||
text: 'Home',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: 'What is Coolify', link: '/home/what-is-coolify' },
|
||||
{ text: 'Quickstart', link: '/home/quickstart' },
|
||||
{ text: 'Installation', link: '/home/installation' },
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'About',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: 'Team', link: '/company/team' }
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,17 @@
|
||||
// https://vitepress.dev/guide/custom-theme
|
||||
import { h } from 'vue'
|
||||
import type { Theme } from 'vitepress'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import './style.css'
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
Layout: () => {
|
||||
return h(DefaultTheme.Layout, null, {
|
||||
// https://vitepress.dev/guide/extending-default-theme#layout-slots
|
||||
})
|
||||
},
|
||||
enhanceApp({ app, router, siteData }) {
|
||||
// ...
|
||||
}
|
||||
} satisfies Theme
|
||||
@@ -0,0 +1,149 @@
|
||||
/**
|
||||
* Customize default theme styling by overriding CSS variables:
|
||||
* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
|
||||
*/
|
||||
|
||||
/**
|
||||
* Colors
|
||||
*
|
||||
* Each colors have exact same color scale system with 3 levels of solid
|
||||
* colors with different brightness, and 1 soft color.
|
||||
*
|
||||
* - `XXX-1`: The most solid color used mainly for colored text. It must
|
||||
* satisfy the contrast ratio against when used on top of `XXX-soft`.
|
||||
*
|
||||
* - `XXX-2`: The color used mainly for hover state of the button.
|
||||
*
|
||||
* - `XXX-3`: The color for solid background, such as bg color of the button.
|
||||
* It must satisfy the contrast ratio with pure white (#ffffff) text on
|
||||
* top of it.
|
||||
*
|
||||
* - `XXX-soft`: The color used for subtle background such as custom container
|
||||
* or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
|
||||
* on top of it.
|
||||
*
|
||||
* The soft color must be semi transparent alpha channel. This is crucial
|
||||
* because it allows adding multiple "soft" colors on top of each other
|
||||
* to create a accent, such as when having inline code block inside
|
||||
* custom containers.
|
||||
*
|
||||
* - `default`: The color used purely for subtle indication without any
|
||||
* special meanings attached to it such as bg color for menu hover state.
|
||||
*
|
||||
* - `brand`: Used for primary brand colors, such as link text, button with
|
||||
* brand theme, etc.
|
||||
*
|
||||
* - `tip`: Used to indicate useful information. The default theme uses the
|
||||
* brand color for this by default.
|
||||
*
|
||||
* - `warning`: Used to indicate warning to the users. Used in custom
|
||||
* container, badges, etc.
|
||||
*
|
||||
* - `danger`: Used to show error, or dangerous message to the users. Used
|
||||
* in custom container, badges, etc.
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-c-default-1: var(--vp-c-gray-1);
|
||||
--vp-c-default-2: var(--vp-c-gray-2);
|
||||
--vp-c-default-3: var(--vp-c-gray-3);
|
||||
--vp-c-default-soft: var(--vp-c-gray-soft);
|
||||
|
||||
--vp-c-brand-1: #9A54FC;
|
||||
--vp-c-brand-2: #9A54FC;
|
||||
--vp-c-brand-3: #9A54FC;
|
||||
--vp-c-brand-soft: var(--vp-c-indigo-soft);
|
||||
|
||||
--vp-c-tip-1: var(--vp-c-brand-1);
|
||||
--vp-c-tip-2: var(--vp-c-brand-2);
|
||||
--vp-c-tip-3: var(--vp-c-brand-3);
|
||||
--vp-c-tip-soft: var(--vp-c-brand-soft);
|
||||
|
||||
--vp-c-warning-1: var(--vp-c-yellow-1);
|
||||
--vp-c-warning-2: var(--vp-c-yellow-2);
|
||||
--vp-c-warning-3: var(--vp-c-yellow-3);
|
||||
--vp-c-warning-soft: var(--vp-c-yellow-soft);
|
||||
|
||||
--vp-c-danger-1: var(--vp-c-red-1);
|
||||
--vp-c-danger-2: var(--vp-c-red-2);
|
||||
--vp-c-danger-3: var(--vp-c-red-3);
|
||||
--vp-c-danger-soft: var(--vp-c-red-soft);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Button
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-button-brand-border: transparent;
|
||||
--vp-button-brand-text: var(--vp-c-white);
|
||||
--vp-button-brand-bg: var(--vp-c-brand-3);
|
||||
--vp-button-brand-hover-border: transparent;
|
||||
--vp-button-brand-hover-text: var(--vp-c-white);
|
||||
--vp-button-brand-hover-bg: var(--vp-c-brand-2);
|
||||
--vp-button-brand-active-border: transparent;
|
||||
--vp-button-brand-active-text: var(--vp-c-white);
|
||||
--vp-button-brand-active-bg: var(--vp-c-brand-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Home
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
:root {
|
||||
--vp-home-hero-name-color: transparent;
|
||||
--vp-home-hero-name-background: -webkit-linear-gradient(
|
||||
120deg,
|
||||
#9A54FC 0%,
|
||||
#9A54FC
|
||||
);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(56px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(68px);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Custom Block
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
/**
|
||||
* Component: Algolia
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
.DocSearch {
|
||||
--docsearch-primary-color: var(--vp-c-brand-1) !important;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is to adjust he spacing at the top of Teams page
|
||||
* -------------------------------------------------------------------------- */
|
||||
.VPTeamPageTitle {
|
||||
margin-top: -90px !important;
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.dark {
|
||||
--vp-c-bg: #0D0B0F;
|
||||
--vp-c-bg-alt: #0D0B0F;
|
||||
--vp-c-bg-elv: #202127;
|
||||
--vp-c-bg-soft: #202127;
|
||||
--vp-c-text-1: #F2F2F2;
|
||||
--vp-c-text-2: #9A989D;
|
||||
--vp-c-text-3: #9A989D;
|
||||
--vp-custom-block-tip-border: #0C4C69;
|
||||
--vp-custom-block-tip-text: #A7D2E8;
|
||||
--vp-custom-block-tip-bg: #0B2029;
|
||||
--vp-custom-block-tip-code-bg: #000000;
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# Stage 1: Build Stage
|
||||
FROM oven/bun:alpine AS builder
|
||||
|
||||
# Set working directory and copy necessary files
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
COPY . .
|
||||
|
||||
# Install Git and dependencies, then build the project
|
||||
RUN apk update && apk add --no-cache git && \
|
||||
bun install && bun run build
|
||||
|
||||
# Stage 2: NGINX Setup
|
||||
FROM nginx:alpine
|
||||
|
||||
# Set working directory for NGINX and copy built files from the build stage
|
||||
WORKDIR /usr/share/nginx/html
|
||||
COPY --from=builder /app/.vitepress/dist .
|
||||
|
||||
# Ensure the nginx group and user exist, avoid errors if they already exist
|
||||
# Set ownership, permissions, and handle custom NGINX configuration
|
||||
RUN addgroup -S nginx || true && \
|
||||
adduser -S nginx -G nginx || true && \
|
||||
chown -R nginx:nginx /usr/share/nginx/html /var/cache/nginx /var/log/nginx /run && \
|
||||
sed -i 's/user nginx;/user nginx nginx;/g' /etc/nginx/nginx.conf && \
|
||||
mkdir -p /run/nginx && chown nginx:nginx /run/nginx
|
||||
|
||||
# Copy custom NGINX configuration
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
# Set permissions and use nginx user for security
|
||||
USER nginx
|
||||
|
||||
# Expose port 80
|
||||
EXPOSE 80
|
||||
|
||||
# Start NGINX
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [2024] [Andras Bacsai]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
+189
@@ -0,0 +1,189 @@
|
||||
---
|
||||
layout: page
|
||||
---
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
VPTeamPage,
|
||||
VPTeamPageTitle,
|
||||
VPTeamMembers,
|
||||
VPTeamPageSection
|
||||
} from 'vitepress/theme'
|
||||
|
||||
|
||||
const coreMembers = [
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/5845193?v=4',
|
||||
name: 'Andras Bacsai',
|
||||
title: 'Founder',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
{ icon: 'expedia', link: 'https://google.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/122374094?v=4',
|
||||
name: 'Peaklabs Dev',
|
||||
title: 'Core Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 3',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 4',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 5',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 6',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 6',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Member 6',
|
||||
title: 'Developer',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
const sponsors = [
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Hetzner',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Logto',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Tolgee',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'QuantCDN',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Arcjet',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'ubicloud',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'algora',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'comit.',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
},
|
||||
{
|
||||
avatar: 'https://avatars.githubusercontent.com/u/60715044?s=160&v=4',
|
||||
name: 'Syntax',
|
||||
links: [
|
||||
{ icon: 'github', link: 'https://github.com/' },
|
||||
{ icon: 'twitter', link: 'https://twitter.com/' },
|
||||
]
|
||||
}
|
||||
]
|
||||
</script>
|
||||
|
||||
<VPTeamPage>
|
||||
<VPTeamPageTitle>
|
||||
<template #title>
|
||||
CoolLabs Team
|
||||
</template>
|
||||
<template #lead>
|
||||
The development of Coolify is guided by an international team, some of whom have chosen to be featured below.
|
||||
</template>
|
||||
</VPTeamPageTitle>
|
||||
|
||||
<!-- Core Team Members Section -->
|
||||
<VPTeamMembers size="small" :members="coreMembers" />
|
||||
|
||||
<!-- sponsors Section -->
|
||||
<VPTeamPageSection>
|
||||
<template #title>Sponsors</template>
|
||||
<template #lead>
|
||||
We have amazing sponsors who support the development of Coolify.
|
||||
</template>
|
||||
<template #members>
|
||||
<VPTeamMembers size="small" :members="sponsors" />
|
||||
</template>
|
||||
</VPTeamPageSection>
|
||||
</VPTeamPage>
|
||||
@@ -0,0 +1,24 @@
|
||||
# Installation
|
||||
If you choose to use Coolify Cloud then you don't have to install coolify, just head to https://app.coolify.io/register to create a account and start using coolify within a minute.
|
||||
|
||||
The below instrcutions are to install Coolify if you decide to self host coolify
|
||||
|
||||
|
||||
## Self-hosted Installation
|
||||
::: tip ⚡️ Quick Installation (recommended):
|
||||
``` sh
|
||||
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
|
||||
```
|
||||
For detailed setup instructions, including firewall configuration and prerequisites, see the Quick Installation Guide below.
|
||||
:::
|
||||
|
||||
|
||||
## Prerequisites
|
||||
### Server Requirements
|
||||
You need a server with SSH access. This can be:
|
||||
|
||||
- A VPS
|
||||
- A Dedicated Server
|
||||
- A VM in Proxmox
|
||||
- A Raspberry Pi (for all compatible models read the Raspberry Pi OS Setup Guide prerequisites)
|
||||
- Any other server with SSH access
|
||||
@@ -0,0 +1,30 @@
|
||||
# Quickstart
|
||||
There are 2 ways to use coolify:
|
||||
- Coolify Cloud (starts at $5/mo)
|
||||
- Self Host Coolify (fully free forever)
|
||||
|
||||
## Coolify Cloud
|
||||
The cloud option is the easiest way to get started with Coolify.
|
||||
|
||||
It is a paid service, where you can bring your own servers to a hosted Coolify instance.
|
||||
|
||||
We will manage the coolify instance for you, so you can focus on shipping your apps.
|
||||
|
||||
|
||||
## Coolify Self-Hosted
|
||||
You get all the features of the cloud version in the self-hosted version, but you need to take care of the maintenance of Coolify, all related servers and services yourself.
|
||||
|
||||
We don't lock certain features only for cloud version like most open source projects do, all features of Coolify are avalible both Self Hosted and Cloud Version
|
||||
|
||||
|
||||
## Comparison
|
||||
|
||||
| Feature | Coolify Cloud | Coolify Self-Hosted |
|
||||
| :------------------------ | :------------------------------ | :------------------------------------ |
|
||||
| **Maintenance** | Near zero maintenance (managed) | Full maintenance responsibility on you |
|
||||
| **Support** | Enhanced priority support | Community support only |
|
||||
| **Email Notifications** | Included for free | Requires setup and management |
|
||||
| **Automatic Backups** | Enabled and secured | Manual backups required |
|
||||
| **High Availability** | Provided by managed infrastructure | Depends on self-setup |
|
||||
| **Stability** | Thoroughly tested updates | Test updates yourself before deploying |
|
||||
| **Cost** | Starts at $5/mo | Free forever |
|
||||
@@ -0,0 +1,18 @@
|
||||
# What is Coolify?
|
||||
|
||||
Coolify is an all-in-one PaaS that helps you self-host your applications, databases, or services (like Wordpress, Plausible Analytics, Ghost) without the hassle of managing servers.
|
||||
|
||||
It is an open-source, self-hostable alternative to platforms like Heroku, Netlify, and Vercel.
|
||||
|
||||
## Why Coolify?
|
||||
| | |
|
||||
| :--------------------- | :--------------------------------------------------------------------------------------------------------------------- |
|
||||
| **No Hidden Costs** | Unlike traditional cloud providers, Coolify keeps your expenses predictable with no unexpected costs. |
|
||||
| **Highly Cost-Efficient** | Save thousands monthly compared to traditional cloud platforms. Real examples can be found [here](https://twitter.com/heyandras/status/1742078215986860460), [here](https://twitter.com/heyandras/status/1752209429276086688), and [here](https://twitter.com/heyandras/status/1724510876256944244). |
|
||||
| **Complete Data Privacy** | Coolify ensures you maintain full control over your data and infrastructure. |
|
||||
| **No Feature Restrictions** | All features are included in the open-source version, with no premium features behind paywalls. |
|
||||
| **Unlimited Usage** | Deploy unlimited websites and applications across any number of servers without artificial restrictions. |
|
||||
| **Quick Setup** | Start hosting in minutes with minimal maintenance work required. |
|
||||
| **User-Friendly Interface** | Manage your entire infrastructure through a clean, simple UI designed for developers. |
|
||||
| **100% Open Source** | Review the code, contribute to development, and help shape the future of the platform. |
|
||||
| **Active Community** | Join a growing community of over 10,000 people on Discord and over 85,000 instances running Coolify. |
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
# https://vitepress.dev/reference/default-theme-home-page
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: "Coolify"
|
||||
text: "Open source PaaS for self-hosting apps"
|
||||
tagline: with tons of automations.
|
||||
actions:
|
||||
- theme: brand
|
||||
text: Get Started
|
||||
link: /home/what-is-coolify
|
||||
- theme: alt
|
||||
text: View Source Code
|
||||
link: https://github.com/coollabsio/coolify
|
||||
|
||||
|
||||
features:
|
||||
- title: Any Language
|
||||
details: Compatible with a wide range of programming languages and frameworks.
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><path fill="none" stroke="#91d7e3" stroke-linecap="round" stroke-linejoin="round" d="M1.5 5.5H6a2 2 0 1 0-2-2m-2.5 5H12A2.5 2.5 0 1 0 9.5 6m-2 7A1.5 1.5 0 1 0 9 11.5H5.5m-4 0h2"/></svg>
|
||||
- title: Any Server
|
||||
details: You can deploy your resources to any server, including your own servers, VPS, Raspberry Pi etc..
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><path fill="none" stroke="#eed49f" stroke-linecap="round" stroke-linejoin="round" d="M2.85 9.301a.644.65 0 0 1-.502-1.06L8.72 1.605a.322.325 0 0 1 .554.3L8.039 5.82a.644.65 0 0 0 .605.878h4.506a.644.65 0 0 1 .502 1.06L7.28 14.395a.322.325 0 0 1-.554-.3l1.236-3.916a.644.65 0 0 0-.605-.878Z"/></svg>
|
||||
- title: Containerization
|
||||
details: Resources are containerized for better performance and security
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><path fill="none" stroke="#8aadf4" stroke-linecap="round" stroke-linejoin="round" d="M.5 8.5H11l.75-.5a5.35 5.35 0 0 1 0-3.5c1 .6 1 1.88 1.74 2c.77-.09 1.23.01 2 .52c0 0-.97 1.77-2.5 1.98c-1.93 3.65-4.5 5.5-6.98 5.5C0 14.5.5 8.5.5 8.5m1 0v-2m0 0h8m-6 2v-4m0 0h4m-2-2h2m-2 6v-6m2 6v-6m2 6v-2"/></svg>
|
||||
- title: Notifications
|
||||
details: Configurable alerts for CPU, memory, disk and deployments.
|
||||
icon: <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#f5a97f" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/><path d="M4 2C2.8 3.7 2 5.7 2 8"/><path d="M22 8c0-2.3-.8-4.3-2-6"/></svg>
|
||||
- title: Collaborative
|
||||
details: Share your projects with your team members and work together on them
|
||||
icon: <svg width="32" height="32" viewBox="0 0 256 256"><path fill="#f5bde6" d="M244.8 150.4a8 8 0 0 1-11.2-1.6A51.6 51.6 0 0 0 192 128a8 8 0 0 1-7.4-4.9 8 8 0 0 1 0-6.2 8 8 0 0 1 7.4-4.9 24 24 0 1 0-23.2-30 8 8 0 1 1-15.5-4 40 40 0 1 1 65.7 39.5 68 68 0 0 1 27.4 21.7 8 8 0 0 1-1.6 11.2M190.9 212a8 8 0 1 1-13.8 8 57 57 0 0 0-98.2 0 8 8 0 1 1-13.8-8 72 72 0 0 1 33.7-30 48 48 0 1 1 58.4 0 72 72 0 0 1 33.7 30M128 176a32 32 0 1 0-32-32 32 32 0 0 0 32 32m-56-56a8 8 0 0 0-8-8 24 24 0 1 1 23.2-30 8 8 0 1 0 15.5-4A40 40 0 1 0 37 117.5a68 68 0 0 0-27.4 21.7 8 8 0 1 0 12.8 9.6A51.6 51.6 0 0 1 64 128a8 8 0 0 0 8-8"/></svg>
|
||||
- title: OAuth / OIDC
|
||||
details: Supports multiple OAuth2 providers.
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><g fill="none" stroke="#cad3f5" stroke-linecap="round" stroke-linejoin="round"><path d="M10 10.5a4.5 4.5 0 1 0-4.02-2.48L1.5 12.5v2h2v-2h2v-2h2l.48-.48c.6.3 1.3.48 2.02.48"/><path d="M12 5a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1a1 1 0 0 1 1 1"/></g></svg>
|
||||
- title: Automatic backups
|
||||
details: Data is automatically backed up to any S3 compatible solution
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><path fill="none" stroke="#a6da95" stroke-linecap="round" stroke-linejoin="round" d="M8 6.5c3.59 0 6.5-1.4 6.5-2.68S11.59 1.5 8 1.5S1.5 2.54 1.5 3.82S4.41 6.5 8 6.5M14.5 8c0 .83-1.24 1.79-3.25 2.2s-4.49.41-6.5 0S1.5 8.83 1.5 8m13 4.18c0 .83-1.24 1.6-3.25 2c-2.01.42-4.49.42-6.5 0c-2.01-.4-3.25-1.17-3.25-2m0-8.3v8.3m13-8.3v8.3"/></svg>
|
||||
- title: Powerful API
|
||||
details: Robust API to automate deployments, manage resources etc..
|
||||
icon: <svg width="32" height="32" viewBox="0 0 16 16"><path fill="none" stroke="#c6a0f6" stroke-linecap="round" stroke-linejoin="round" d="M5.5 12.5a2 2 0 1 1-4 0a2 2 0 0 1 4 0m9 0a2 2 0 1 1-4 0a2 2 0 0 1 4 0m-4.5-9a2 2 0 1 1-4 0a2 2 0 0 1 4 0m-6.5 7l3-5.5m3 0l3 5.5"/></svg>
|
||||
---
|
||||
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
worker_processes auto;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
# Security headers
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
add_header X-Frame-Options DENY;
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
|
||||
# Disable server tokens
|
||||
server_tokens off;
|
||||
|
||||
# Gzip compression
|
||||
gzip on;
|
||||
gzip_types
|
||||
text/plain
|
||||
application/json
|
||||
application/javascript
|
||||
text/css
|
||||
text/xml
|
||||
application/xml
|
||||
application/xml+rss
|
||||
text/javascript;
|
||||
|
||||
# Server block
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# Main location block
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# Remove .html extension from URLs (internally)
|
||||
location /guide/ {
|
||||
rewrite ^/guide/(.*)/$ /guide/$1.html break;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# Optionally, handle URLs with trailing slashes and map them to .html files
|
||||
location ~ ^/guide/(.*)/$ {
|
||||
try_files $uri.html $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
../esbuild/bin/esbuild
|
||||
+1
@@ -0,0 +1 @@
|
||||
../nanoid/bin/nanoid.cjs
|
||||
+1
@@ -0,0 +1 @@
|
||||
../@babel/parser/bin/babel-parser.js
|
||||
+1
@@ -0,0 +1 @@
|
||||
../rollup/dist/bin/rollup
|
||||
+1
@@ -0,0 +1 @@
|
||||
../vite/bin/vite.js
|
||||
+1
@@ -0,0 +1 @@
|
||||
../vitepress/bin/vitepress.js
|
||||
+1
@@ -0,0 +1 @@
|
||||
../vue-demi/bin/vue-demi-fix.js
|
||||
+1
@@ -0,0 +1 @@
|
||||
../vue-demi/bin/vue-demi-switch.js
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
// @ts-nocheck
|
||||
export {};
|
||||
|
||||
; declare module 'vue' {
|
||||
export interface GlobalComponents { }
|
||||
export interface GlobalDirectives { }
|
||||
}
|
||||
; declare global {
|
||||
const __VLS_intrinsicElements: __VLS_IntrinsicElements;
|
||||
const __VLS_directiveBindingRestFields: { instance: null, oldValue: null, modifiers: any, dir: any };
|
||||
const __VLS_unref: typeof import('vue').unref;
|
||||
const __VLS_placeholder: any;
|
||||
|
||||
const __VLS_nativeElements = {
|
||||
...{} as SVGElementTagNameMap,
|
||||
...{} as HTMLElementTagNameMap,
|
||||
};
|
||||
|
||||
type __VLS_IntrinsicElements = import('vue/jsx-runtime').JSX.IntrinsicElements;
|
||||
type __VLS_Element = import('vue/jsx-runtime').JSX.Element;
|
||||
type __VLS_GlobalComponents = import('vue').GlobalComponents & Pick<typeof import('vue'), 'Transition' | 'TransitionGroup' | 'KeepAlive' | 'Suspense' | 'Teleport'>;
|
||||
type __VLS_GlobalDirectives = import('vue').GlobalDirectives;
|
||||
type __VLS_IsAny<T> = 0 extends 1 & T ? true : false;
|
||||
type __VLS_PickNotAny<A, B> = __VLS_IsAny<A> extends true ? B : A;
|
||||
type __VLS_unknownDirective = (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void;
|
||||
type __VLS_WithComponent<N0 extends string, LocalComponents, N1 extends string, N2 extends string, N3 extends string> =
|
||||
N1 extends keyof LocalComponents ? N1 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N1] } :
|
||||
N2 extends keyof LocalComponents ? N2 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N2] } :
|
||||
N3 extends keyof LocalComponents ? N3 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N3] } :
|
||||
N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } :
|
||||
N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } :
|
||||
N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } :
|
||||
{ [K in N0]: unknown };
|
||||
type __VLS_FunctionalComponentProps<T, K> =
|
||||
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never
|
||||
: T extends (props: infer P, ...args: any) => any ? P :
|
||||
{};
|
||||
type __VLS_IsFunction<T, K> = K extends keyof T
|
||||
? __VLS_IsAny<T[K]> extends false
|
||||
? unknown extends T[K]
|
||||
? false
|
||||
: true
|
||||
: false
|
||||
: false;
|
||||
type __VLS_NormalizeComponentEvent<Props, Events, onEvent extends keyof Props, Event extends keyof Events, CamelizedEvent extends keyof Events> = (
|
||||
__VLS_IsFunction<Props, onEvent> extends true
|
||||
? Props
|
||||
: __VLS_IsFunction<Events, Event> extends true
|
||||
? { [K in onEvent]?: Events[Event] }
|
||||
: __VLS_IsFunction<Events, CamelizedEvent> extends true
|
||||
? { [K in onEvent]?: Events[CamelizedEvent] }
|
||||
: Props
|
||||
) & Record<string, unknown>;
|
||||
// fix https://github.com/vuejs/language-tools/issues/926
|
||||
type __VLS_UnionToIntersection<U> = (U extends unknown ? (arg: U) => unknown : never) extends ((arg: infer P) => unknown) ? P : never;
|
||||
type __VLS_OverloadUnionInner<T, U = unknown> = U & T extends (...args: infer A) => infer R
|
||||
? U extends T
|
||||
? never
|
||||
: __VLS_OverloadUnionInner<T, Pick<T, keyof T> & U & ((...args: A) => R)> | ((...args: A) => R)
|
||||
: never;
|
||||
type __VLS_OverloadUnion<T> = Exclude<
|
||||
__VLS_OverloadUnionInner<(() => never) & T>,
|
||||
T extends () => never ? never : () => never
|
||||
>;
|
||||
type __VLS_ConstructorOverloads<T> = __VLS_OverloadUnion<T> extends infer F
|
||||
? F extends (event: infer E, ...args: infer A) => any
|
||||
? { [K in E & string]: (...args: A) => void; }
|
||||
: never
|
||||
: never;
|
||||
type __VLS_NormalizeEmits<T> = __VLS_PrettifyGlobal<
|
||||
__VLS_UnionToIntersection<
|
||||
__VLS_ConstructorOverloads<T> & {
|
||||
[K in keyof T]: T[K] extends any[] ? { (...args: T[K]): void } : never
|
||||
}
|
||||
>
|
||||
>;
|
||||
type __VLS_PrettifyGlobal<T> = { [K in keyof T]: T[K]; } & {};
|
||||
type __VLS_PickFunctionalComponentCtx<T, K> = NonNullable<__VLS_PickNotAny<
|
||||
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: infer Ctx } ? Ctx : never : any
|
||||
, T extends (props: any, ctx: infer Ctx) => any ? Ctx : any
|
||||
>>;
|
||||
type __VLS_UseTemplateRef<T> = Readonly<import('vue').ShallowRef<T | null>>;
|
||||
|
||||
function __VLS_getVForSourceType(source: number): [number, number, number][];
|
||||
function __VLS_getVForSourceType(source: string): [string, number, number][];
|
||||
function __VLS_getVForSourceType<T extends any[]>(source: T): [
|
||||
item: T[number],
|
||||
key: number,
|
||||
index: number,
|
||||
][];
|
||||
function __VLS_getVForSourceType<T extends { [Symbol.iterator](): Iterator<any> }>(source: T): [
|
||||
item: T extends { [Symbol.iterator](): Iterator<infer T1> } ? T1 : never,
|
||||
key: number,
|
||||
index: undefined,
|
||||
][];
|
||||
// #3845
|
||||
function __VLS_getVForSourceType<T extends number | { [Symbol.iterator](): Iterator<any> }>(source: T): [
|
||||
item: number | (Exclude<T, number> extends { [Symbol.iterator](): Iterator<infer T1> } ? T1 : never),
|
||||
key: number,
|
||||
index: undefined,
|
||||
][];
|
||||
function __VLS_getVForSourceType<T>(source: T): [
|
||||
item: T[keyof T],
|
||||
key: keyof T,
|
||||
index: number,
|
||||
][];
|
||||
// @ts-ignore
|
||||
function __VLS_getSlotParams<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>;
|
||||
// @ts-ignore
|
||||
function __VLS_getSlotParam<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>[0];
|
||||
function __VLS_asFunctionalDirective<T>(dir: T): T extends import('vue').ObjectDirective
|
||||
? NonNullable<T['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>
|
||||
: T extends (...args: any) => any
|
||||
? T
|
||||
: __VLS_unknownDirective;
|
||||
function __VLS_withScope<T, K>(ctx: T, scope: K): ctx is T & K;
|
||||
function __VLS_makeOptional<T>(t: T): { [K in keyof T]?: T[K] };
|
||||
function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K):
|
||||
T extends new (...args: any) => any
|
||||
? (props: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>, ctx?: any) => __VLS_Element & { __ctx?: {
|
||||
attrs?: any,
|
||||
slots?: K extends { $slots: infer Slots } ? Slots : any,
|
||||
emit?: K extends { $emit: infer Emit } ? Emit : any
|
||||
} & { props?: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>; expose?(exposed: K): void; } }
|
||||
: T extends () => any ? (props: {}, ctx?: any) => ReturnType<T>
|
||||
: T extends (...args: any) => any ? T
|
||||
: (_: {} & Record<string, unknown>, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {} & Record<string, unknown> } };
|
||||
function __VLS_elementAsFunction<T>(tag: T, endTag?: T): (_: T & Record<string, unknown>) => void;
|
||||
function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): 2 extends Parameters<T>['length'] ? [any] : [];
|
||||
function __VLS_normalizeSlot<S>(s: S): S extends () => infer R ? (props: {}) => R : S;
|
||||
function __VLS_tryAsConstant<const T>(t: T): T;
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
# @algolia/autocomplete-core
|
||||
|
||||
The [`autocomplete-core`](https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-core/createAutocomplete) package is the foundation of Autocomplete. It exposes primitives to build an autocomplete experience.
|
||||
|
||||
You likely don’t need to use this package directly unless you’re building a [renderer](https://www.algolia.com/doc/ui-libraries/autocomplete/guides/creating-a-renderer).
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
yarn add @algolia/autocomplete-core
|
||||
# or
|
||||
npm install @algolia/autocomplete-core
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
See [**Documentation**](https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-core).
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { AutocompleteOptions, BaseItem } from './types';
|
||||
export declare function checkOptions<TItem extends BaseItem>(options: AutocompleteOptions<TItem>): void;
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
import { warn } from '@algolia/autocomplete-shared';
|
||||
export function checkOptions(options) {
|
||||
process.env.NODE_ENV !== 'production' ? warn(!options.debug, 'The `debug` option is meant for development debugging and should not be used in production.') : void 0;
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import { AutocompleteApi, AutocompleteOptions as AutocompleteCoreOptions, BaseItem } from './types';
|
||||
export interface AutocompleteOptionsWithMetadata<TItem extends BaseItem> extends AutocompleteCoreOptions<TItem> {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
__autocomplete_metadata?: Record<string, unknown>;
|
||||
}
|
||||
export declare function createAutocomplete<TItem extends BaseItem, TEvent = Event, TMouseEvent = MouseEvent, TKeyboardEvent = KeyboardEvent>(options: AutocompleteOptionsWithMetadata<TItem>): AutocompleteApi<TItem, TEvent, TMouseEvent, TKeyboardEvent>;
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { createAlgoliaInsightsPlugin } from '@algolia/autocomplete-plugin-algolia-insights';
|
||||
import { checkOptions } from './checkOptions';
|
||||
import { createStore } from './createStore';
|
||||
import { getAutocompleteSetters } from './getAutocompleteSetters';
|
||||
import { getDefaultProps } from './getDefaultProps';
|
||||
import { getPropGetters } from './getPropGetters';
|
||||
import { getMetadata, injectMetadata } from './metadata';
|
||||
import { onInput } from './onInput';
|
||||
import { stateReducer } from './stateReducer';
|
||||
export function createAutocomplete(options) {
|
||||
checkOptions(options);
|
||||
var subscribers = [];
|
||||
var props = getDefaultProps(options, subscribers);
|
||||
var store = createStore(stateReducer, props, onStoreStateChange);
|
||||
var setters = getAutocompleteSetters({
|
||||
store: store
|
||||
});
|
||||
var propGetters = getPropGetters(_objectSpread({
|
||||
props: props,
|
||||
refresh: refresh,
|
||||
store: store,
|
||||
navigator: props.navigator
|
||||
}, setters));
|
||||
function onStoreStateChange(_ref) {
|
||||
var _state$context, _state$context$algoli;
|
||||
var prevState = _ref.prevState,
|
||||
state = _ref.state;
|
||||
props.onStateChange(_objectSpread({
|
||||
prevState: prevState,
|
||||
state: state,
|
||||
refresh: refresh,
|
||||
navigator: props.navigator
|
||||
}, setters));
|
||||
if (!isAlgoliaInsightsPluginEnabled() && (_state$context = state.context) !== null && _state$context !== void 0 && (_state$context$algoli = _state$context.algoliaInsightsPlugin) !== null && _state$context$algoli !== void 0 && _state$context$algoli.__automaticInsights && props.insights !== false) {
|
||||
var plugin = createAlgoliaInsightsPlugin({
|
||||
__autocomplete_clickAnalytics: false
|
||||
});
|
||||
props.plugins.push(plugin);
|
||||
subscribePlugins([plugin]);
|
||||
}
|
||||
}
|
||||
function refresh() {
|
||||
return onInput(_objectSpread({
|
||||
event: new Event('input'),
|
||||
nextState: {
|
||||
isOpen: store.getState().isOpen
|
||||
},
|
||||
props: props,
|
||||
navigator: props.navigator,
|
||||
query: store.getState().query,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
}
|
||||
function subscribePlugins(plugins) {
|
||||
plugins.forEach(function (plugin) {
|
||||
var _plugin$subscribe;
|
||||
return (_plugin$subscribe = plugin.subscribe) === null || _plugin$subscribe === void 0 ? void 0 : _plugin$subscribe.call(plugin, _objectSpread(_objectSpread({}, setters), {}, {
|
||||
navigator: props.navigator,
|
||||
refresh: refresh,
|
||||
onSelect: function onSelect(fn) {
|
||||
subscribers.push({
|
||||
onSelect: fn
|
||||
});
|
||||
},
|
||||
onActive: function onActive(fn) {
|
||||
subscribers.push({
|
||||
onActive: fn
|
||||
});
|
||||
},
|
||||
onResolve: function onResolve(fn) {
|
||||
subscribers.push({
|
||||
onResolve: fn
|
||||
});
|
||||
}
|
||||
}));
|
||||
});
|
||||
}
|
||||
function isAlgoliaInsightsPluginEnabled() {
|
||||
return props.plugins.some(function (plugin) {
|
||||
return plugin.name === 'aa.algoliaInsightsPlugin';
|
||||
});
|
||||
}
|
||||
if (props.insights && !isAlgoliaInsightsPluginEnabled()) {
|
||||
var insightsParams = typeof props.insights === 'boolean' ? {} : props.insights;
|
||||
props.plugins.push(createAlgoliaInsightsPlugin(insightsParams));
|
||||
}
|
||||
subscribePlugins(props.plugins);
|
||||
injectMetadata({
|
||||
metadata: getMetadata({
|
||||
plugins: props.plugins,
|
||||
options: options
|
||||
}),
|
||||
environment: props.environment
|
||||
});
|
||||
return _objectSpread(_objectSpread({
|
||||
refresh: refresh,
|
||||
navigator: props.navigator
|
||||
}, propGetters), setters);
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import { AutocompleteState, AutocompleteStore, BaseItem, InternalAutocompleteOptions, Reducer } from './types';
|
||||
declare type OnStoreStateChange<TItem extends BaseItem> = ({ prevState, state, }: {
|
||||
prevState: AutocompleteState<TItem>;
|
||||
state: AutocompleteState<TItem>;
|
||||
}) => void;
|
||||
export declare function createStore<TItem extends BaseItem>(reducer: Reducer, props: InternalAutocompleteOptions<TItem>, onStoreStateChange: OnStoreStateChange<TItem>): AutocompleteStore<TItem>;
|
||||
export {};
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { createCancelablePromiseList } from './utils';
|
||||
export function createStore(reducer, props, onStoreStateChange) {
|
||||
var state = props.initialState;
|
||||
return {
|
||||
getState: function getState() {
|
||||
return state;
|
||||
},
|
||||
dispatch: function dispatch(action, payload) {
|
||||
var prevState = _objectSpread({}, state);
|
||||
state = reducer(state, {
|
||||
type: action,
|
||||
props: props,
|
||||
payload: payload
|
||||
});
|
||||
onStoreStateChange({
|
||||
state: state,
|
||||
prevState: prevState
|
||||
});
|
||||
},
|
||||
pendingRequests: createCancelablePromiseList()
|
||||
};
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
import { AutocompleteCollection, AutocompleteStore, BaseItem } from './types';
|
||||
interface GetAutocompleteSettersOptions<TItem extends BaseItem> {
|
||||
store: AutocompleteStore<TItem>;
|
||||
}
|
||||
export declare function getAutocompleteSetters<TItem extends BaseItem>({ store, }: GetAutocompleteSettersOptions<TItem>): {
|
||||
setActiveItemId: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<number | null>;
|
||||
setQuery: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<string>;
|
||||
setCollections: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<(AutocompleteCollection<TItem> | import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteCollection").AutocompleteCollectionItemsArray<TItem>)[]>;
|
||||
setIsOpen: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<boolean>;
|
||||
setStatus: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<"idle" | "loading" | "stalled" | "error">;
|
||||
setContext: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSetters").StateUpdater<import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteContext").AutocompleteContext>;
|
||||
};
|
||||
export {};
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { flatten } from '@algolia/autocomplete-shared';
|
||||
export function getAutocompleteSetters(_ref) {
|
||||
var store = _ref.store;
|
||||
var setActiveItemId = function setActiveItemId(value) {
|
||||
store.dispatch('setActiveItemId', value);
|
||||
};
|
||||
var setQuery = function setQuery(value) {
|
||||
store.dispatch('setQuery', value);
|
||||
};
|
||||
var setCollections = function setCollections(rawValue) {
|
||||
var baseItemId = 0;
|
||||
var value = rawValue.map(function (collection) {
|
||||
return _objectSpread(_objectSpread({}, collection), {}, {
|
||||
// We flatten the stored items to support calling `getAlgoliaResults`
|
||||
// from the source itself.
|
||||
items: flatten(collection.items).map(function (item) {
|
||||
return _objectSpread(_objectSpread({}, item), {}, {
|
||||
__autocomplete_id: baseItemId++
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
store.dispatch('setCollections', value);
|
||||
};
|
||||
var setIsOpen = function setIsOpen(value) {
|
||||
store.dispatch('setIsOpen', value);
|
||||
};
|
||||
var setStatus = function setStatus(value) {
|
||||
store.dispatch('setStatus', value);
|
||||
};
|
||||
var setContext = function setContext(value) {
|
||||
store.dispatch('setContext', value);
|
||||
};
|
||||
return {
|
||||
setActiveItemId: setActiveItemId,
|
||||
setQuery: setQuery,
|
||||
setCollections: setCollections,
|
||||
setIsOpen: setIsOpen,
|
||||
setStatus: setStatus,
|
||||
setContext: setContext
|
||||
};
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
import { AutocompleteState, BaseItem } from './types';
|
||||
interface GetCompletionProps<TItem extends BaseItem> {
|
||||
state: AutocompleteState<TItem>;
|
||||
}
|
||||
export declare function getCompletion<TItem extends BaseItem>({ state, }: GetCompletionProps<TItem>): string | null;
|
||||
export {};
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
import { getActiveItem } from './utils';
|
||||
export function getCompletion(_ref) {
|
||||
var _getActiveItem;
|
||||
var state = _ref.state;
|
||||
if (state.isOpen === false || state.activeItemId === null) {
|
||||
return null;
|
||||
}
|
||||
return ((_getActiveItem = getActiveItem(state)) === null || _getActiveItem === void 0 ? void 0 : _getActiveItem.itemInputValue) || null;
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { AutocompleteOptions, AutocompleteSubscribers, BaseItem, InternalAutocompleteOptions } from './types';
|
||||
export declare function getDefaultProps<TItem extends BaseItem>(props: AutocompleteOptions<TItem>, pluginSubscribers: AutocompleteSubscribers<TItem>): InternalAutocompleteOptions<TItem>;
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
||||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
||||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
||||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { getItemsCount, generateAutocompleteId, flatten } from '@algolia/autocomplete-shared';
|
||||
import { getNormalizedSources } from './utils';
|
||||
export function getDefaultProps(props, pluginSubscribers) {
|
||||
var _props$id;
|
||||
/* eslint-disable no-restricted-globals */
|
||||
var environment = typeof window !== 'undefined' ? window : {};
|
||||
/* eslint-enable no-restricted-globals */
|
||||
var plugins = props.plugins || [];
|
||||
return _objectSpread(_objectSpread({
|
||||
debug: false,
|
||||
openOnFocus: false,
|
||||
enterKeyHint: undefined,
|
||||
ignoreCompositionEvents: false,
|
||||
placeholder: '',
|
||||
autoFocus: false,
|
||||
defaultActiveItemId: null,
|
||||
stallThreshold: 300,
|
||||
insights: undefined,
|
||||
environment: environment,
|
||||
shouldPanelOpen: function shouldPanelOpen(_ref) {
|
||||
var state = _ref.state;
|
||||
return getItemsCount(state) > 0;
|
||||
},
|
||||
reshape: function reshape(_ref2) {
|
||||
var sources = _ref2.sources;
|
||||
return sources;
|
||||
}
|
||||
}, props), {}, {
|
||||
// Since `generateAutocompleteId` triggers a side effect (it increments
|
||||
// an internal counter), we don't want to execute it if unnecessary.
|
||||
id: (_props$id = props.id) !== null && _props$id !== void 0 ? _props$id : generateAutocompleteId(),
|
||||
plugins: plugins,
|
||||
// The following props need to be deeply defaulted.
|
||||
initialState: _objectSpread({
|
||||
activeItemId: null,
|
||||
query: '',
|
||||
completion: null,
|
||||
collections: [],
|
||||
isOpen: false,
|
||||
status: 'idle',
|
||||
context: {}
|
||||
}, props.initialState),
|
||||
onStateChange: function onStateChange(params) {
|
||||
var _props$onStateChange;
|
||||
(_props$onStateChange = props.onStateChange) === null || _props$onStateChange === void 0 ? void 0 : _props$onStateChange.call(props, params);
|
||||
plugins.forEach(function (x) {
|
||||
var _x$onStateChange;
|
||||
return (_x$onStateChange = x.onStateChange) === null || _x$onStateChange === void 0 ? void 0 : _x$onStateChange.call(x, params);
|
||||
});
|
||||
},
|
||||
onSubmit: function onSubmit(params) {
|
||||
var _props$onSubmit;
|
||||
(_props$onSubmit = props.onSubmit) === null || _props$onSubmit === void 0 ? void 0 : _props$onSubmit.call(props, params);
|
||||
plugins.forEach(function (x) {
|
||||
var _x$onSubmit;
|
||||
return (_x$onSubmit = x.onSubmit) === null || _x$onSubmit === void 0 ? void 0 : _x$onSubmit.call(x, params);
|
||||
});
|
||||
},
|
||||
onReset: function onReset(params) {
|
||||
var _props$onReset;
|
||||
(_props$onReset = props.onReset) === null || _props$onReset === void 0 ? void 0 : _props$onReset.call(props, params);
|
||||
plugins.forEach(function (x) {
|
||||
var _x$onReset;
|
||||
return (_x$onReset = x.onReset) === null || _x$onReset === void 0 ? void 0 : _x$onReset.call(x, params);
|
||||
});
|
||||
},
|
||||
getSources: function getSources(params) {
|
||||
return Promise.all([].concat(_toConsumableArray(plugins.map(function (plugin) {
|
||||
return plugin.getSources;
|
||||
})), [props.getSources]).filter(Boolean).map(function (getSources) {
|
||||
return getNormalizedSources(getSources, params);
|
||||
})).then(function (nested) {
|
||||
return flatten(nested);
|
||||
}).then(function (sources) {
|
||||
return sources.map(function (source) {
|
||||
return _objectSpread(_objectSpread({}, source), {}, {
|
||||
onSelect: function onSelect(params) {
|
||||
source.onSelect(params);
|
||||
pluginSubscribers.forEach(function (x) {
|
||||
var _x$onSelect;
|
||||
return (_x$onSelect = x.onSelect) === null || _x$onSelect === void 0 ? void 0 : _x$onSelect.call(x, params);
|
||||
});
|
||||
},
|
||||
onActive: function onActive(params) {
|
||||
source.onActive(params);
|
||||
pluginSubscribers.forEach(function (x) {
|
||||
var _x$onActive;
|
||||
return (_x$onActive = x.onActive) === null || _x$onActive === void 0 ? void 0 : _x$onActive.call(x, params);
|
||||
});
|
||||
},
|
||||
onResolve: function onResolve(params) {
|
||||
source.onResolve(params);
|
||||
pluginSubscribers.forEach(function (x) {
|
||||
var _x$onResolve;
|
||||
return (_x$onResolve = x.onResolve) === null || _x$onResolve === void 0 ? void 0 : _x$onResolve.call(x, params);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
navigator: _objectSpread({
|
||||
navigate: function navigate(_ref3) {
|
||||
var itemUrl = _ref3.itemUrl;
|
||||
environment.location.assign(itemUrl);
|
||||
},
|
||||
navigateNewTab: function navigateNewTab(_ref4) {
|
||||
var itemUrl = _ref4.itemUrl;
|
||||
var windowReference = environment.open(itemUrl, '_blank', 'noopener');
|
||||
windowReference === null || windowReference === void 0 ? void 0 : windowReference.focus();
|
||||
},
|
||||
navigateNewWindow: function navigateNewWindow(_ref5) {
|
||||
var itemUrl = _ref5.itemUrl;
|
||||
environment.open(itemUrl, '_blank', 'noopener');
|
||||
}
|
||||
}, props.navigator)
|
||||
});
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
import { AutocompleteScopeApi, AutocompleteStore, BaseItem, GetEnvironmentProps, GetFormProps, GetInputProps, GetItemProps, GetLabelProps, GetListProps, GetPanelProps, GetRootProps, InternalAutocompleteOptions } from './types';
|
||||
interface GetPropGettersOptions<TItem extends BaseItem> extends AutocompleteScopeApi<TItem> {
|
||||
store: AutocompleteStore<TItem>;
|
||||
props: InternalAutocompleteOptions<TItem>;
|
||||
}
|
||||
export declare function getPropGetters<TItem extends BaseItem, TEvent, TMouseEvent, TKeyboardEvent>({ props, refresh, store, ...setters }: GetPropGettersOptions<TItem>): {
|
||||
getEnvironmentProps: GetEnvironmentProps;
|
||||
getRootProps: GetRootProps;
|
||||
getFormProps: GetFormProps<TEvent>;
|
||||
getLabelProps: GetLabelProps;
|
||||
getInputProps: GetInputProps<TEvent, TMouseEvent, TKeyboardEvent>;
|
||||
getPanelProps: GetPanelProps<TMouseEvent>;
|
||||
getListProps: GetListProps;
|
||||
getItemProps: GetItemProps<any, TMouseEvent>;
|
||||
};
|
||||
export {};
|
||||
+335
@@ -0,0 +1,335 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
var _excluded = ["props", "refresh", "store"],
|
||||
_excluded2 = ["inputElement", "formElement", "panelElement"],
|
||||
_excluded3 = ["inputElement"],
|
||||
_excluded4 = ["inputElement", "maxLength"],
|
||||
_excluded5 = ["source"],
|
||||
_excluded6 = ["item", "source"];
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||||
import { noop } from '@algolia/autocomplete-shared';
|
||||
import { onInput } from './onInput';
|
||||
import { onKeyDown as _onKeyDown } from './onKeyDown';
|
||||
import { getActiveItem, getAutocompleteElementId, isOrContainsNode, isSamsung, getNativeEvent } from './utils';
|
||||
export function getPropGetters(_ref) {
|
||||
var props = _ref.props,
|
||||
refresh = _ref.refresh,
|
||||
store = _ref.store,
|
||||
setters = _objectWithoutProperties(_ref, _excluded);
|
||||
var getEnvironmentProps = function getEnvironmentProps(providedProps) {
|
||||
var inputElement = providedProps.inputElement,
|
||||
formElement = providedProps.formElement,
|
||||
panelElement = providedProps.panelElement,
|
||||
rest = _objectWithoutProperties(providedProps, _excluded2);
|
||||
function onMouseDownOrTouchStart(event) {
|
||||
// The `onTouchStart`/`onMouseDown` events shouldn't trigger the `blur`
|
||||
// handler when it's not an interaction with Autocomplete.
|
||||
// We detect it with the following heuristics:
|
||||
// - the panel is closed AND there are no pending requests
|
||||
// (no interaction with the autocomplete, no future state updates)
|
||||
// - OR the touched target is the input element (should open the panel)
|
||||
var isAutocompleteInteraction = store.getState().isOpen || !store.pendingRequests.isEmpty();
|
||||
if (!isAutocompleteInteraction || event.target === inputElement) {
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: support cases where there are multiple Autocomplete instances.
|
||||
// Right now, a second instance makes this computation return false.
|
||||
var isTargetWithinAutocomplete = [formElement, panelElement].some(function (contextNode) {
|
||||
return isOrContainsNode(contextNode, event.target);
|
||||
});
|
||||
if (isTargetWithinAutocomplete === false) {
|
||||
store.dispatch('blur', null);
|
||||
|
||||
// If requests are still pending when the user closes the panel, they
|
||||
// could reopen the panel once they resolve.
|
||||
// We want to prevent any subsequent query from reopening the panel
|
||||
// because it would result in an unsolicited UI behavior.
|
||||
if (!props.debug) {
|
||||
store.pendingRequests.cancelAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
return _objectSpread({
|
||||
// We do not rely on the native `blur` event of the input to close the
|
||||
// panel, but rather on a custom `touchstart`/`mousedown` event outside
|
||||
// of the autocomplete elements.
|
||||
// This ensures we don't mistakenly interpret interactions within the
|
||||
// autocomplete (but outside of the input) as a signal to close the panel.
|
||||
// For example, clicking reset button causes an input blur, but if
|
||||
// `openOnFocus=true`, it shouldn't close the panel.
|
||||
// On touch devices, scrolling results (`touchmove`) causes an input blur
|
||||
// but shouldn't close the panel.
|
||||
onTouchStart: onMouseDownOrTouchStart,
|
||||
onMouseDown: onMouseDownOrTouchStart,
|
||||
// When scrolling on touch devices (mobiles, tablets, etc.), we want to
|
||||
// mimic the native platform behavior where the input is blurred to
|
||||
// hide the virtual keyboard. This gives more vertical space to
|
||||
// discover all the suggestions showing up in the panel.
|
||||
onTouchMove: function onTouchMove(event) {
|
||||
if (store.getState().isOpen === false || inputElement !== props.environment.document.activeElement || event.target === inputElement) {
|
||||
return;
|
||||
}
|
||||
inputElement.blur();
|
||||
}
|
||||
}, rest);
|
||||
};
|
||||
var getRootProps = function getRootProps(rest) {
|
||||
return _objectSpread({
|
||||
role: 'combobox',
|
||||
'aria-expanded': store.getState().isOpen,
|
||||
'aria-haspopup': 'listbox',
|
||||
'aria-controls': store.getState().isOpen ? store.getState().collections.map(function (_ref2) {
|
||||
var source = _ref2.source;
|
||||
return getAutocompleteElementId(props.id, 'list', source);
|
||||
}).join(' ') : undefined,
|
||||
'aria-labelledby': getAutocompleteElementId(props.id, 'label')
|
||||
}, rest);
|
||||
};
|
||||
var getFormProps = function getFormProps(providedProps) {
|
||||
var inputElement = providedProps.inputElement,
|
||||
rest = _objectWithoutProperties(providedProps, _excluded3);
|
||||
return _objectSpread({
|
||||
action: '',
|
||||
noValidate: true,
|
||||
role: 'search',
|
||||
onSubmit: function onSubmit(event) {
|
||||
var _providedProps$inputE;
|
||||
event.preventDefault();
|
||||
props.onSubmit(_objectSpread({
|
||||
event: event,
|
||||
refresh: refresh,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
store.dispatch('submit', null);
|
||||
(_providedProps$inputE = providedProps.inputElement) === null || _providedProps$inputE === void 0 ? void 0 : _providedProps$inputE.blur();
|
||||
},
|
||||
onReset: function onReset(event) {
|
||||
var _providedProps$inputE2;
|
||||
event.preventDefault();
|
||||
props.onReset(_objectSpread({
|
||||
event: event,
|
||||
refresh: refresh,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
store.dispatch('reset', null);
|
||||
(_providedProps$inputE2 = providedProps.inputElement) === null || _providedProps$inputE2 === void 0 ? void 0 : _providedProps$inputE2.focus();
|
||||
}
|
||||
}, rest);
|
||||
};
|
||||
var getInputProps = function getInputProps(providedProps) {
|
||||
var _props$environment$na;
|
||||
function onFocus(event) {
|
||||
// We want to trigger a query when `openOnFocus` is true
|
||||
// because the panel should open with the current query.
|
||||
if (props.openOnFocus || Boolean(store.getState().query)) {
|
||||
onInput(_objectSpread({
|
||||
event: event,
|
||||
props: props,
|
||||
query: store.getState().completion || store.getState().query,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
}
|
||||
store.dispatch('focus', null);
|
||||
}
|
||||
var _ref3 = providedProps || {},
|
||||
inputElement = _ref3.inputElement,
|
||||
_ref3$maxLength = _ref3.maxLength,
|
||||
maxLength = _ref3$maxLength === void 0 ? 512 : _ref3$maxLength,
|
||||
rest = _objectWithoutProperties(_ref3, _excluded4);
|
||||
var activeItem = getActiveItem(store.getState());
|
||||
var userAgent = ((_props$environment$na = props.environment.navigator) === null || _props$environment$na === void 0 ? void 0 : _props$environment$na.userAgent) || '';
|
||||
var shouldFallbackKeyHint = isSamsung(userAgent);
|
||||
var enterKeyHint = props.enterKeyHint || (activeItem !== null && activeItem !== void 0 && activeItem.itemUrl && !shouldFallbackKeyHint ? 'go' : 'search');
|
||||
return _objectSpread({
|
||||
'aria-autocomplete': 'both',
|
||||
'aria-activedescendant': store.getState().isOpen && store.getState().activeItemId !== null ? getAutocompleteElementId(props.id, "item-".concat(store.getState().activeItemId), activeItem === null || activeItem === void 0 ? void 0 : activeItem.source) : undefined,
|
||||
'aria-controls': store.getState().isOpen ? store.getState().collections.map(function (_ref4) {
|
||||
var source = _ref4.source;
|
||||
return getAutocompleteElementId(props.id, 'list', source);
|
||||
}).join(' ') : undefined,
|
||||
'aria-labelledby': getAutocompleteElementId(props.id, 'label'),
|
||||
value: store.getState().completion || store.getState().query,
|
||||
id: getAutocompleteElementId(props.id, 'input'),
|
||||
autoComplete: 'off',
|
||||
autoCorrect: 'off',
|
||||
autoCapitalize: 'off',
|
||||
enterKeyHint: enterKeyHint,
|
||||
spellCheck: 'false',
|
||||
autoFocus: props.autoFocus,
|
||||
placeholder: props.placeholder,
|
||||
maxLength: maxLength,
|
||||
type: 'search',
|
||||
onChange: function onChange(event) {
|
||||
var value = event.currentTarget.value;
|
||||
if (props.ignoreCompositionEvents && getNativeEvent(event).isComposing) {
|
||||
setters.setQuery(value);
|
||||
return;
|
||||
}
|
||||
onInput(_objectSpread({
|
||||
event: event,
|
||||
props: props,
|
||||
query: value.slice(0, maxLength),
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
},
|
||||
onCompositionEnd: function onCompositionEnd(event) {
|
||||
onInput(_objectSpread({
|
||||
event: event,
|
||||
props: props,
|
||||
query: event.currentTarget.value.slice(0, maxLength),
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
},
|
||||
onKeyDown: function onKeyDown(event) {
|
||||
if (getNativeEvent(event).isComposing) {
|
||||
return;
|
||||
}
|
||||
_onKeyDown(_objectSpread({
|
||||
event: event,
|
||||
props: props,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
},
|
||||
onFocus: onFocus,
|
||||
// We don't rely on the `blur` event.
|
||||
// See explanation in `onTouchStart`/`onMouseDown`.
|
||||
// @MAJOR See if we need to keep this handler.
|
||||
onBlur: noop,
|
||||
onClick: function onClick(event) {
|
||||
// When the panel is closed and you click on the input while
|
||||
// the input is focused, the `onFocus` event is not triggered
|
||||
// (default browser behavior).
|
||||
// In an autocomplete context, it makes sense to open the panel in this
|
||||
// case.
|
||||
// We mimic this event by catching the `onClick` event which
|
||||
// triggers the `onFocus` for the panel to open.
|
||||
if (providedProps.inputElement === props.environment.document.activeElement && !store.getState().isOpen) {
|
||||
onFocus(event);
|
||||
}
|
||||
}
|
||||
}, rest);
|
||||
};
|
||||
var getLabelProps = function getLabelProps(rest) {
|
||||
return _objectSpread({
|
||||
htmlFor: getAutocompleteElementId(props.id, 'input'),
|
||||
id: getAutocompleteElementId(props.id, 'label')
|
||||
}, rest);
|
||||
};
|
||||
var getListProps = function getListProps(providedProps) {
|
||||
var _ref5 = providedProps || {},
|
||||
source = _ref5.source,
|
||||
rest = _objectWithoutProperties(_ref5, _excluded5);
|
||||
return _objectSpread({
|
||||
role: 'listbox',
|
||||
'aria-labelledby': getAutocompleteElementId(props.id, 'label'),
|
||||
id: getAutocompleteElementId(props.id, 'list', source)
|
||||
}, rest);
|
||||
};
|
||||
var getPanelProps = function getPanelProps(rest) {
|
||||
return _objectSpread({
|
||||
onMouseDown: function onMouseDown(event) {
|
||||
// Prevents the `activeElement` from being changed to the panel so
|
||||
// that the blur event is not triggered, otherwise it closes the
|
||||
// panel.
|
||||
event.preventDefault();
|
||||
},
|
||||
onMouseLeave: function onMouseLeave() {
|
||||
store.dispatch('mouseleave', null);
|
||||
}
|
||||
}, rest);
|
||||
};
|
||||
var getItemProps = function getItemProps(providedProps) {
|
||||
var item = providedProps.item,
|
||||
source = providedProps.source,
|
||||
rest = _objectWithoutProperties(providedProps, _excluded6);
|
||||
return _objectSpread({
|
||||
id: getAutocompleteElementId(props.id, "item-".concat(item.__autocomplete_id), source),
|
||||
role: 'option',
|
||||
'aria-selected': store.getState().activeItemId === item.__autocomplete_id,
|
||||
onMouseMove: function onMouseMove(event) {
|
||||
if (item.__autocomplete_id === store.getState().activeItemId) {
|
||||
return;
|
||||
}
|
||||
store.dispatch('mousemove', item.__autocomplete_id);
|
||||
var activeItem = getActiveItem(store.getState());
|
||||
if (store.getState().activeItemId !== null && activeItem) {
|
||||
var _item = activeItem.item,
|
||||
itemInputValue = activeItem.itemInputValue,
|
||||
itemUrl = activeItem.itemUrl,
|
||||
_source = activeItem.source;
|
||||
_source.onActive(_objectSpread({
|
||||
event: event,
|
||||
item: _item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: _source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
}
|
||||
},
|
||||
onMouseDown: function onMouseDown(event) {
|
||||
// Prevents the `activeElement` from being changed to the item so it
|
||||
// can remain with the current `activeElement`.
|
||||
event.preventDefault();
|
||||
},
|
||||
onClick: function onClick(event) {
|
||||
var itemInputValue = source.getItemInputValue({
|
||||
item: item,
|
||||
state: store.getState()
|
||||
});
|
||||
var itemUrl = source.getItemUrl({
|
||||
item: item,
|
||||
state: store.getState()
|
||||
});
|
||||
|
||||
// If `getItemUrl` is provided, it means that the suggestion
|
||||
// is a link, not plain text that aims at updating the query.
|
||||
// We can therefore skip the state change because it will update
|
||||
// the `activeItemId`, resulting in a UI flash, especially
|
||||
// noticeable on mobile.
|
||||
var runPreCommand = itemUrl ? Promise.resolve() : onInput(_objectSpread({
|
||||
event: event,
|
||||
nextState: {
|
||||
isOpen: false
|
||||
},
|
||||
props: props,
|
||||
query: itemInputValue,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters));
|
||||
runPreCommand.then(function () {
|
||||
source.onSelect(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
});
|
||||
}
|
||||
}, rest);
|
||||
};
|
||||
return {
|
||||
getEnvironmentProps: getEnvironmentProps,
|
||||
getRootProps: getRootProps,
|
||||
getFormProps: getFormProps,
|
||||
getLabelProps: getLabelProps,
|
||||
getInputProps: getInputProps,
|
||||
getPanelProps: getPanelProps,
|
||||
getListProps: getListProps,
|
||||
getItemProps: getItemProps
|
||||
};
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export * from './createAutocomplete';
|
||||
export * from './getDefaultProps';
|
||||
export * from './types';
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export * from './createAutocomplete';
|
||||
export * from './getDefaultProps';
|
||||
export * from './types';
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import { UserAgent } from '@algolia/autocomplete-shared';
|
||||
import { AutocompleteEnvironment, AutocompleteOptionsWithMetadata, AutocompletePlugin, BaseItem } from '.';
|
||||
declare type AutocompleteMetadata = {
|
||||
plugins: Array<{
|
||||
name: string | undefined;
|
||||
options: string[];
|
||||
}>;
|
||||
options: Record<string, string[]>;
|
||||
ua: UserAgent[];
|
||||
};
|
||||
declare type GetMetadataParams<TItem extends BaseItem, TData = unknown> = {
|
||||
plugins: Array<AutocompletePlugin<TItem, TData>>;
|
||||
options: AutocompleteOptionsWithMetadata<TItem>;
|
||||
};
|
||||
export declare function getMetadata<TItem extends BaseItem, TData = unknown>({ plugins, options, }: GetMetadataParams<TItem, TData>): {
|
||||
plugins: {
|
||||
name: string | undefined;
|
||||
options: string[];
|
||||
}[];
|
||||
options: {
|
||||
'autocomplete-core': string[];
|
||||
};
|
||||
ua: {
|
||||
segment: string;
|
||||
version: string;
|
||||
}[];
|
||||
};
|
||||
declare type InlineMetadataParams = {
|
||||
metadata: AutocompleteMetadata;
|
||||
environment: AutocompleteEnvironment;
|
||||
};
|
||||
export declare function injectMetadata({ metadata, environment, }: InlineMetadataParams): void;
|
||||
export {};
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { userAgents } from '@algolia/autocomplete-shared';
|
||||
export function getMetadata(_ref) {
|
||||
var _, _options$__autocomple, _options$__autocomple2, _options$__autocomple3;
|
||||
var plugins = _ref.plugins,
|
||||
options = _ref.options;
|
||||
var optionsKey = (_ = (((_options$__autocomple = options.__autocomplete_metadata) === null || _options$__autocomple === void 0 ? void 0 : _options$__autocomple.userAgents) || [])[0]) === null || _ === void 0 ? void 0 : _.segment;
|
||||
var extraOptions = optionsKey ? _defineProperty({}, optionsKey, Object.keys(((_options$__autocomple2 = options.__autocomplete_metadata) === null || _options$__autocomple2 === void 0 ? void 0 : _options$__autocomple2.options) || {})) : {};
|
||||
return {
|
||||
plugins: plugins.map(function (plugin) {
|
||||
return {
|
||||
name: plugin.name,
|
||||
options: Object.keys(plugin.__autocomplete_pluginOptions || [])
|
||||
};
|
||||
}),
|
||||
options: _objectSpread({
|
||||
'autocomplete-core': Object.keys(options)
|
||||
}, extraOptions),
|
||||
ua: userAgents.concat(((_options$__autocomple3 = options.__autocomplete_metadata) === null || _options$__autocomple3 === void 0 ? void 0 : _options$__autocomple3.userAgents) || [])
|
||||
};
|
||||
}
|
||||
export function injectMetadata(_ref3) {
|
||||
var _environment$navigato, _environment$navigato2;
|
||||
var metadata = _ref3.metadata,
|
||||
environment = _ref3.environment;
|
||||
var isMetadataEnabled = (_environment$navigato = environment.navigator) === null || _environment$navigato === void 0 ? void 0 : (_environment$navigato2 = _environment$navigato.userAgent) === null || _environment$navigato2 === void 0 ? void 0 : _environment$navigato2.includes('Algolia Crawler');
|
||||
if (isMetadataEnabled) {
|
||||
var metadataContainer = environment.document.createElement('meta');
|
||||
var headRef = environment.document.querySelector('head');
|
||||
metadataContainer.name = 'algolia:metadata';
|
||||
setTimeout(function () {
|
||||
metadataContainer.content = JSON.stringify(metadata);
|
||||
headRef.appendChild(metadataContainer);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
import { AutocompleteScopeApi, AutocompleteState, AutocompleteStore, BaseItem, InternalAutocompleteOptions } from './types';
|
||||
import { CancelablePromise } from './utils';
|
||||
interface OnInputParams<TItem extends BaseItem> extends AutocompleteScopeApi<TItem> {
|
||||
event: any;
|
||||
/**
|
||||
* The next partial state to apply after the function is called.
|
||||
*
|
||||
* This is useful when we call `onInput` in a different scenario than an
|
||||
* actual input. For example, we use `onInput` when we click on an item,
|
||||
* but we want to close the panel in that case.
|
||||
*/
|
||||
nextState?: Partial<AutocompleteState<TItem>>;
|
||||
props: InternalAutocompleteOptions<TItem>;
|
||||
query: string;
|
||||
store: AutocompleteStore<TItem>;
|
||||
}
|
||||
export declare function onInput<TItem extends BaseItem>({ event, nextState, props, query, refresh, store, ...setters }: OnInputParams<TItem>): CancelablePromise<void>;
|
||||
export {};
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
var _excluded = ["event", "nextState", "props", "query", "refresh", "store"];
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||||
import { reshape } from './reshape';
|
||||
import { preResolve, resolve, postResolve } from './resolve';
|
||||
import { cancelable, createConcurrentSafePromise, getActiveItem } from './utils';
|
||||
var lastStalledId = null;
|
||||
var runConcurrentSafePromise = createConcurrentSafePromise();
|
||||
export function onInput(_ref) {
|
||||
var event = _ref.event,
|
||||
_ref$nextState = _ref.nextState,
|
||||
nextState = _ref$nextState === void 0 ? {} : _ref$nextState,
|
||||
props = _ref.props,
|
||||
query = _ref.query,
|
||||
refresh = _ref.refresh,
|
||||
store = _ref.store,
|
||||
setters = _objectWithoutProperties(_ref, _excluded);
|
||||
if (lastStalledId) {
|
||||
props.environment.clearTimeout(lastStalledId);
|
||||
}
|
||||
var setCollections = setters.setCollections,
|
||||
setIsOpen = setters.setIsOpen,
|
||||
setQuery = setters.setQuery,
|
||||
setActiveItemId = setters.setActiveItemId,
|
||||
setStatus = setters.setStatus,
|
||||
setContext = setters.setContext;
|
||||
setQuery(query);
|
||||
setActiveItemId(props.defaultActiveItemId);
|
||||
if (!query && props.openOnFocus === false) {
|
||||
var _nextState$isOpen;
|
||||
var collections = store.getState().collections.map(function (collection) {
|
||||
return _objectSpread(_objectSpread({}, collection), {}, {
|
||||
items: []
|
||||
});
|
||||
});
|
||||
setStatus('idle');
|
||||
setCollections(collections);
|
||||
setIsOpen((_nextState$isOpen = nextState.isOpen) !== null && _nextState$isOpen !== void 0 ? _nextState$isOpen : props.shouldPanelOpen({
|
||||
state: store.getState()
|
||||
}));
|
||||
|
||||
// We make sure to update the latest resolved value of the tracked
|
||||
// promises to keep late resolving promises from "cancelling" the state
|
||||
// updates performed in this code path.
|
||||
// We chain with a void promise to respect `onInput`'s expected return type.
|
||||
var _request = cancelable(runConcurrentSafePromise(collections).then(function () {
|
||||
return Promise.resolve();
|
||||
}));
|
||||
return store.pendingRequests.add(_request);
|
||||
}
|
||||
setStatus('loading');
|
||||
lastStalledId = props.environment.setTimeout(function () {
|
||||
setStatus('stalled');
|
||||
}, props.stallThreshold);
|
||||
|
||||
// We track the entire promise chain triggered by `onInput` before mutating
|
||||
// the Autocomplete state to make sure that any state manipulation is based on
|
||||
// fresh data regardless of when promises individually resolve.
|
||||
// We don't track nested promises and only rely on the full chain resolution,
|
||||
// meaning we should only ever manipulate the state once this concurrent-safe
|
||||
// promise is resolved.
|
||||
var request = cancelable(runConcurrentSafePromise(props.getSources(_objectSpread({
|
||||
query: query,
|
||||
refresh: refresh,
|
||||
state: store.getState()
|
||||
}, setters)).then(function (sources) {
|
||||
return Promise.all(sources.map(function (source) {
|
||||
return Promise.resolve(source.getItems(_objectSpread({
|
||||
query: query,
|
||||
refresh: refresh,
|
||||
state: store.getState()
|
||||
}, setters))).then(function (itemsOrDescription) {
|
||||
return preResolve(itemsOrDescription, source.sourceId, store.getState());
|
||||
});
|
||||
})).then(resolve).then(function (responses) {
|
||||
var __automaticInsights = responses.some(function (_ref2) {
|
||||
var items = _ref2.items;
|
||||
return isSearchResponseWithAutomaticInsightsFlag(items);
|
||||
});
|
||||
|
||||
// No need to pollute the context if `__automaticInsights=false`
|
||||
if (__automaticInsights) {
|
||||
var _store$getState$conte;
|
||||
setContext({
|
||||
algoliaInsightsPlugin: _objectSpread(_objectSpread({}, ((_store$getState$conte = store.getState().context) === null || _store$getState$conte === void 0 ? void 0 : _store$getState$conte.algoliaInsightsPlugin) || {}), {}, {
|
||||
__automaticInsights: __automaticInsights
|
||||
})
|
||||
});
|
||||
}
|
||||
return postResolve(responses, sources, store);
|
||||
}).then(function (collections) {
|
||||
return reshape({
|
||||
collections: collections,
|
||||
props: props,
|
||||
state: store.getState()
|
||||
});
|
||||
});
|
||||
}))).then(function (collections) {
|
||||
var _nextState$isOpen2;
|
||||
// Parameters passed to `onInput` could be stale when the following code
|
||||
// executes, because `onInput` calls may not resolve in order.
|
||||
// If it becomes a problem we'll need to save the last passed parameters.
|
||||
// See: https://codesandbox.io/s/agitated-cookies-y290z
|
||||
|
||||
setStatus('idle');
|
||||
setCollections(collections);
|
||||
var isPanelOpen = props.shouldPanelOpen({
|
||||
state: store.getState()
|
||||
});
|
||||
setIsOpen((_nextState$isOpen2 = nextState.isOpen) !== null && _nextState$isOpen2 !== void 0 ? _nextState$isOpen2 : props.openOnFocus && !query && isPanelOpen || isPanelOpen);
|
||||
var highlightedItem = getActiveItem(store.getState());
|
||||
if (store.getState().activeItemId !== null && highlightedItem) {
|
||||
var item = highlightedItem.item,
|
||||
itemInputValue = highlightedItem.itemInputValue,
|
||||
itemUrl = highlightedItem.itemUrl,
|
||||
source = highlightedItem.source;
|
||||
source.onActive(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
}
|
||||
}).finally(function () {
|
||||
setStatus('idle');
|
||||
if (lastStalledId) {
|
||||
props.environment.clearTimeout(lastStalledId);
|
||||
}
|
||||
});
|
||||
return store.pendingRequests.add(request);
|
||||
}
|
||||
function isSearchResponseWithAutomaticInsightsFlag(items) {
|
||||
return !Array.isArray(items) && Boolean(items === null || items === void 0 ? void 0 : items._automaticInsights);
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import { AutocompleteScopeApi, AutocompleteStore, BaseItem, InternalAutocompleteOptions } from './types';
|
||||
interface OnKeyDownOptions<TItem extends BaseItem> extends AutocompleteScopeApi<TItem> {
|
||||
event: KeyboardEvent;
|
||||
props: InternalAutocompleteOptions<TItem>;
|
||||
store: AutocompleteStore<TItem>;
|
||||
}
|
||||
export declare function onKeyDown<TItem extends BaseItem>({ event, props, refresh, store, ...setters }: OnKeyDownOptions<TItem>): void;
|
||||
export {};
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
var _excluded = ["event", "props", "refresh", "store"];
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
||||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
||||
import { onInput } from './onInput';
|
||||
import { getActiveItem, getAutocompleteElementId } from './utils';
|
||||
export function onKeyDown(_ref) {
|
||||
var event = _ref.event,
|
||||
props = _ref.props,
|
||||
refresh = _ref.refresh,
|
||||
store = _ref.store,
|
||||
setters = _objectWithoutProperties(_ref, _excluded);
|
||||
if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
|
||||
// eslint-disable-next-line no-inner-declarations
|
||||
var triggerScrollIntoView = function triggerScrollIntoView() {
|
||||
var highlightedItem = getActiveItem(store.getState());
|
||||
var nodeItem = props.environment.document.getElementById(getAutocompleteElementId(props.id, "item-".concat(store.getState().activeItemId), highlightedItem === null || highlightedItem === void 0 ? void 0 : highlightedItem.source));
|
||||
if (nodeItem) {
|
||||
if (nodeItem.scrollIntoViewIfNeeded) {
|
||||
nodeItem.scrollIntoViewIfNeeded(false);
|
||||
} else {
|
||||
nodeItem.scrollIntoView(false);
|
||||
}
|
||||
}
|
||||
}; // eslint-disable-next-line no-inner-declarations
|
||||
var triggerOnActive = function triggerOnActive() {
|
||||
var highlightedItem = getActiveItem(store.getState());
|
||||
if (store.getState().activeItemId !== null && highlightedItem) {
|
||||
var item = highlightedItem.item,
|
||||
itemInputValue = highlightedItem.itemInputValue,
|
||||
itemUrl = highlightedItem.itemUrl,
|
||||
source = highlightedItem.source;
|
||||
source.onActive(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
}
|
||||
}; // Default browser behavior changes the caret placement on ArrowUp and
|
||||
// ArrowDown.
|
||||
event.preventDefault();
|
||||
|
||||
// When re-opening the panel, we need to split the logic to keep the actions
|
||||
// synchronized as `onInput` returns a promise.
|
||||
if (store.getState().isOpen === false && (props.openOnFocus || Boolean(store.getState().query))) {
|
||||
onInput(_objectSpread({
|
||||
event: event,
|
||||
props: props,
|
||||
query: store.getState().query,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters)).then(function () {
|
||||
store.dispatch(event.key, {
|
||||
nextActiveItemId: props.defaultActiveItemId
|
||||
});
|
||||
triggerOnActive();
|
||||
// Since we rely on the DOM, we need to wait for all the micro tasks to
|
||||
// finish (which include re-opening the panel) to make sure all the
|
||||
// elements are available.
|
||||
setTimeout(triggerScrollIntoView, 0);
|
||||
});
|
||||
} else {
|
||||
store.dispatch(event.key, {});
|
||||
triggerOnActive();
|
||||
triggerScrollIntoView();
|
||||
}
|
||||
} else if (event.key === 'Escape') {
|
||||
// This prevents the default browser behavior on `input[type="search"]`
|
||||
// from removing the query right away because we first want to close the
|
||||
// panel.
|
||||
event.preventDefault();
|
||||
store.dispatch(event.key, null);
|
||||
|
||||
// Hitting the `Escape` key signals the end of a user interaction with the
|
||||
// autocomplete. At this point, we should ignore any requests that are still
|
||||
// pending and could reopen the panel once they resolve, because that would
|
||||
// result in an unsolicited UI behavior.
|
||||
store.pendingRequests.cancelAll();
|
||||
} else if (event.key === 'Tab') {
|
||||
store.dispatch('blur', null);
|
||||
|
||||
// Hitting the `Tab` key signals the end of a user interaction with the
|
||||
// autocomplete. At this point, we should ignore any requests that are still
|
||||
// pending and could reopen the panel once they resolve, because that would
|
||||
// result in an unsolicited UI behavior.
|
||||
store.pendingRequests.cancelAll();
|
||||
} else if (event.key === 'Enter') {
|
||||
// No active item, so we let the browser handle the native `onSubmit` form
|
||||
// event.
|
||||
if (store.getState().activeItemId === null || store.getState().collections.every(function (collection) {
|
||||
return collection.items.length === 0;
|
||||
})) {
|
||||
// If requests are still pending when the panel closes, they could reopen
|
||||
// the panel once they resolve.
|
||||
// We want to prevent any subsequent query from reopening the panel
|
||||
// because it would result in an unsolicited UI behavior.
|
||||
if (!props.debug) {
|
||||
store.pendingRequests.cancelAll();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// This prevents the `onSubmit` event to be sent because an item is
|
||||
// highlighted.
|
||||
event.preventDefault();
|
||||
var _ref2 = getActiveItem(store.getState()),
|
||||
item = _ref2.item,
|
||||
itemInputValue = _ref2.itemInputValue,
|
||||
itemUrl = _ref2.itemUrl,
|
||||
source = _ref2.source;
|
||||
if (event.metaKey || event.ctrlKey) {
|
||||
if (itemUrl !== undefined) {
|
||||
source.onSelect(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
props.navigator.navigateNewTab({
|
||||
itemUrl: itemUrl,
|
||||
item: item,
|
||||
state: store.getState()
|
||||
});
|
||||
}
|
||||
} else if (event.shiftKey) {
|
||||
if (itemUrl !== undefined) {
|
||||
source.onSelect(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
props.navigator.navigateNewWindow({
|
||||
itemUrl: itemUrl,
|
||||
item: item,
|
||||
state: store.getState()
|
||||
});
|
||||
}
|
||||
} else if (event.altKey) {
|
||||
// Keep native browser behavior
|
||||
} else {
|
||||
if (itemUrl !== undefined) {
|
||||
source.onSelect(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
props.navigator.navigate({
|
||||
itemUrl: itemUrl,
|
||||
item: item,
|
||||
state: store.getState()
|
||||
});
|
||||
return;
|
||||
}
|
||||
onInput(_objectSpread({
|
||||
event: event,
|
||||
nextState: {
|
||||
isOpen: false
|
||||
},
|
||||
props: props,
|
||||
query: itemInputValue,
|
||||
refresh: refresh,
|
||||
store: store
|
||||
}, setters)).then(function () {
|
||||
source.onSelect(_objectSpread({
|
||||
event: event,
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
refresh: refresh,
|
||||
source: source,
|
||||
state: store.getState()
|
||||
}, setters));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
import { AutocompleteCollection, AutocompleteState, BaseItem, InternalAutocompleteOptions } from './types';
|
||||
declare type ReshapeParams<TItem extends BaseItem> = {
|
||||
collections: Array<AutocompleteCollection<any>>;
|
||||
props: InternalAutocompleteOptions<TItem>;
|
||||
state: AutocompleteState<TItem>;
|
||||
};
|
||||
export declare function reshape<TItem extends BaseItem>({ collections, props, state, }: ReshapeParams<TItem>): {
|
||||
source: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteReshape").AutocompleteReshapeSource<TItem>;
|
||||
items: TItem[];
|
||||
}[];
|
||||
export {};
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { flatten } from '@algolia/autocomplete-shared';
|
||||
export function reshape(_ref) {
|
||||
var collections = _ref.collections,
|
||||
props = _ref.props,
|
||||
state = _ref.state;
|
||||
// Sources are grouped by `sourceId` to conveniently pick them via destructuring.
|
||||
// Example: `const { recentSearchesPlugin } = sourcesBySourceId`
|
||||
var originalSourcesBySourceId = collections.reduce(function (acc, collection) {
|
||||
return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, collection.source.sourceId, _objectSpread(_objectSpread({}, collection.source), {}, {
|
||||
getItems: function getItems() {
|
||||
// We provide the resolved items from the collection to the `reshape` prop.
|
||||
return flatten(collection.items);
|
||||
}
|
||||
})));
|
||||
}, {});
|
||||
var _props$plugins$reduce = props.plugins.reduce(function (acc, plugin) {
|
||||
if (plugin.reshape) {
|
||||
return plugin.reshape(acc);
|
||||
}
|
||||
return acc;
|
||||
}, {
|
||||
sourcesBySourceId: originalSourcesBySourceId,
|
||||
state: state
|
||||
}),
|
||||
sourcesBySourceId = _props$plugins$reduce.sourcesBySourceId;
|
||||
var reshapeSources = props.reshape({
|
||||
sourcesBySourceId: sourcesBySourceId,
|
||||
sources: Object.values(sourcesBySourceId),
|
||||
state: state
|
||||
});
|
||||
|
||||
// We reconstruct the collections with the items modified by the `reshape` prop.
|
||||
return flatten(reshapeSources).filter(Boolean).map(function (source) {
|
||||
return {
|
||||
source: source,
|
||||
items: source.getItems()
|
||||
};
|
||||
});
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
import type { ExecuteResponse, RequesterDescription, TransformResponse } from '@algolia/autocomplete-preset-algolia';
|
||||
import type { SearchResponse } from '@algolia/autocomplete-shared';
|
||||
import { MultipleQueriesQuery, SearchForFacetValuesResponse } from '@algolia/client-search';
|
||||
import { AutocompleteState, AutocompleteStore, BaseItem, InternalAutocompleteSource } from './types';
|
||||
declare type RequestDescriptionPreResolved<TItem extends BaseItem> = Pick<RequesterDescription<TItem>, 'execute' | 'requesterId' | 'searchClient' | 'transformResponse'> & {
|
||||
requests: Array<{
|
||||
query: MultipleQueriesQuery;
|
||||
sourceId: string;
|
||||
transformResponse: TransformResponse<TItem>;
|
||||
}>;
|
||||
};
|
||||
declare type RequestDescriptionPreResolvedCustom<TItem extends BaseItem> = {
|
||||
items: TItem[] | TItem[][];
|
||||
sourceId: string;
|
||||
transformResponse?: undefined;
|
||||
};
|
||||
export declare function preResolve<TItem extends BaseItem>(itemsOrDescription: TItem[] | TItem[][] | RequesterDescription<TItem>, sourceId: string, state: AutocompleteState<TItem>): RequestDescriptionPreResolved<TItem> | RequestDescriptionPreResolvedCustom<TItem>;
|
||||
export declare function resolve<TItem extends BaseItem>(items: Array<RequestDescriptionPreResolved<TItem> | RequestDescriptionPreResolvedCustom<TItem>>): Promise<(RequestDescriptionPreResolvedCustom<TItem> | {
|
||||
items: SearchForFacetValuesResponse | SearchResponse<TItem>;
|
||||
sourceId: string;
|
||||
transformResponse: TransformResponse<TItem>;
|
||||
})[]>;
|
||||
export declare function postResolve<TItem extends BaseItem>(responses: Array<RequestDescriptionPreResolvedCustom<TItem> | ExecuteResponse<TItem>[0]>, sources: Array<InternalAutocompleteSource<TItem>>, store: AutocompleteStore<TItem>): {
|
||||
source: InternalAutocompleteSource<TItem>;
|
||||
items: {
|
||||
label: string;
|
||||
count: number;
|
||||
_highlightResult: {
|
||||
label: {
|
||||
value: string;
|
||||
};
|
||||
};
|
||||
}[][] | {
|
||||
label: string;
|
||||
count: number;
|
||||
_highlightResult: {
|
||||
label: {
|
||||
value: string;
|
||||
};
|
||||
};
|
||||
}[] | import("@algolia/client-search").Hit<TItem>[] | (SearchForFacetValuesResponse | SearchResponse<TItem> | TItem[] | TItem[][])[];
|
||||
}[];
|
||||
export {};
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
||||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
||||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
||||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
||||
import { decycle, flatten, invariant } from '@algolia/autocomplete-shared';
|
||||
import { mapToAlgoliaResponse } from './utils';
|
||||
function isDescription(item) {
|
||||
return Boolean(item.execute);
|
||||
}
|
||||
function isRequesterDescription(description) {
|
||||
return Boolean(description === null || description === void 0 ? void 0 : description.execute);
|
||||
}
|
||||
export function preResolve(itemsOrDescription, sourceId, state) {
|
||||
if (isRequesterDescription(itemsOrDescription)) {
|
||||
var contextParameters = itemsOrDescription.requesterId === 'algolia' ? Object.assign.apply(Object, [{}].concat(_toConsumableArray(Object.keys(state.context).map(function (key) {
|
||||
var _state$context$key;
|
||||
return (_state$context$key = state.context[key]) === null || _state$context$key === void 0 ? void 0 : _state$context$key.__algoliaSearchParameters;
|
||||
})))) : {};
|
||||
return _objectSpread(_objectSpread({}, itemsOrDescription), {}, {
|
||||
requests: itemsOrDescription.queries.map(function (query) {
|
||||
return {
|
||||
query: itemsOrDescription.requesterId === 'algolia' ? _objectSpread(_objectSpread({}, query), {}, {
|
||||
params: _objectSpread(_objectSpread({}, contextParameters), query.params)
|
||||
}) : query,
|
||||
sourceId: sourceId,
|
||||
transformResponse: itemsOrDescription.transformResponse
|
||||
};
|
||||
})
|
||||
});
|
||||
}
|
||||
return {
|
||||
items: itemsOrDescription,
|
||||
sourceId: sourceId
|
||||
};
|
||||
}
|
||||
export function resolve(items) {
|
||||
var packed = items.reduce(function (acc, current) {
|
||||
if (!isDescription(current)) {
|
||||
acc.push(current);
|
||||
return acc;
|
||||
}
|
||||
var searchClient = current.searchClient,
|
||||
execute = current.execute,
|
||||
requesterId = current.requesterId,
|
||||
requests = current.requests;
|
||||
var container = acc.find(function (item) {
|
||||
return isDescription(current) && isDescription(item) && item.searchClient === searchClient && Boolean(requesterId) && item.requesterId === requesterId;
|
||||
});
|
||||
if (container) {
|
||||
var _container$items;
|
||||
(_container$items = container.items).push.apply(_container$items, _toConsumableArray(requests));
|
||||
} else {
|
||||
var request = {
|
||||
execute: execute,
|
||||
requesterId: requesterId,
|
||||
items: requests,
|
||||
searchClient: searchClient
|
||||
};
|
||||
acc.push(request);
|
||||
}
|
||||
return acc;
|
||||
}, []);
|
||||
var values = packed.map(function (maybeDescription) {
|
||||
if (!isDescription(maybeDescription)) {
|
||||
return Promise.resolve(maybeDescription);
|
||||
}
|
||||
var _ref = maybeDescription,
|
||||
execute = _ref.execute,
|
||||
items = _ref.items,
|
||||
searchClient = _ref.searchClient;
|
||||
return execute({
|
||||
searchClient: searchClient,
|
||||
requests: items
|
||||
});
|
||||
});
|
||||
return Promise.all(values).then(function (responses) {
|
||||
return flatten(responses);
|
||||
});
|
||||
}
|
||||
export function postResolve(responses, sources, store) {
|
||||
return sources.map(function (source) {
|
||||
var matches = responses.filter(function (response) {
|
||||
return response.sourceId === source.sourceId;
|
||||
});
|
||||
var results = matches.map(function (_ref2) {
|
||||
var items = _ref2.items;
|
||||
return items;
|
||||
});
|
||||
var transform = matches[0].transformResponse;
|
||||
var items = transform ? transform(mapToAlgoliaResponse(results)) : results;
|
||||
source.onResolve({
|
||||
source: source,
|
||||
results: results,
|
||||
items: items,
|
||||
state: store.getState()
|
||||
});
|
||||
invariant(Array.isArray(items), function () {
|
||||
return "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned type ").concat(JSON.stringify(_typeof(items)), ":\n\n").concat(JSON.stringify(decycle(items), null, 2), ".\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems");
|
||||
});
|
||||
invariant(items.every(Boolean), "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned ").concat(JSON.stringify(undefined), ".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"));
|
||||
return {
|
||||
source: source,
|
||||
items: items
|
||||
};
|
||||
});
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { Reducer } from './types';
|
||||
export declare const stateReducer: Reducer;
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
import { getItemsCount, invariant } from '@algolia/autocomplete-shared';
|
||||
import { getCompletion } from './getCompletion';
|
||||
import { getNextActiveItemId } from './utils';
|
||||
export var stateReducer = function stateReducer(state, action) {
|
||||
switch (action.type) {
|
||||
case 'setActiveItemId':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: action.payload
|
||||
});
|
||||
}
|
||||
case 'setQuery':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
query: action.payload,
|
||||
completion: null
|
||||
});
|
||||
}
|
||||
case 'setCollections':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
collections: action.payload
|
||||
});
|
||||
}
|
||||
case 'setIsOpen':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
isOpen: action.payload
|
||||
});
|
||||
}
|
||||
case 'setStatus':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
status: action.payload
|
||||
});
|
||||
}
|
||||
case 'setContext':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
context: _objectSpread(_objectSpread({}, state.context), action.payload)
|
||||
});
|
||||
}
|
||||
case 'ArrowDown':
|
||||
{
|
||||
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: action.payload.hasOwnProperty('nextActiveItemId') ? action.payload.nextActiveItemId : getNextActiveItemId(1, state.activeItemId, getItemsCount(state), action.props.defaultActiveItemId)
|
||||
});
|
||||
return _objectSpread(_objectSpread({}, nextState), {}, {
|
||||
completion: getCompletion({
|
||||
state: nextState
|
||||
})
|
||||
});
|
||||
}
|
||||
case 'ArrowUp':
|
||||
{
|
||||
var _nextState = _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: getNextActiveItemId(-1, state.activeItemId, getItemsCount(state), action.props.defaultActiveItemId)
|
||||
});
|
||||
return _objectSpread(_objectSpread({}, _nextState), {}, {
|
||||
completion: getCompletion({
|
||||
state: _nextState
|
||||
})
|
||||
});
|
||||
}
|
||||
case 'Escape':
|
||||
{
|
||||
if (state.isOpen) {
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: null,
|
||||
isOpen: false,
|
||||
completion: null
|
||||
});
|
||||
}
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: null,
|
||||
query: '',
|
||||
status: 'idle',
|
||||
collections: []
|
||||
});
|
||||
}
|
||||
case 'submit':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: null,
|
||||
isOpen: false,
|
||||
status: 'idle'
|
||||
});
|
||||
}
|
||||
case 'reset':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId:
|
||||
// Since we open the panel on reset when openOnFocus=true
|
||||
// we need to restore the highlighted index to the defaultActiveItemId. (DocSearch use-case)
|
||||
|
||||
// Since we close the panel when openOnFocus=false
|
||||
// we lose track of the highlighted index. (Query-suggestions use-case)
|
||||
action.props.openOnFocus === true ? action.props.defaultActiveItemId : null,
|
||||
status: 'idle',
|
||||
completion: null,
|
||||
query: ''
|
||||
});
|
||||
}
|
||||
case 'focus':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: action.props.defaultActiveItemId,
|
||||
isOpen: (action.props.openOnFocus || Boolean(state.query)) && action.props.shouldPanelOpen({
|
||||
state: state
|
||||
})
|
||||
});
|
||||
}
|
||||
case 'blur':
|
||||
{
|
||||
if (action.props.debug) {
|
||||
return state;
|
||||
}
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
isOpen: false,
|
||||
activeItemId: null
|
||||
});
|
||||
}
|
||||
case 'mousemove':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: action.payload
|
||||
});
|
||||
}
|
||||
case 'mouseleave':
|
||||
{
|
||||
return _objectSpread(_objectSpread({}, state), {}, {
|
||||
activeItemId: action.props.defaultActiveItemId
|
||||
});
|
||||
}
|
||||
default:
|
||||
invariant(false, "The reducer action ".concat(JSON.stringify(action.type), " is not supported."));
|
||||
return state;
|
||||
}
|
||||
};
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
import { CancelablePromiseList } from '../utils';
|
||||
import { BaseItem, InternalAutocompleteOptions, AutocompleteState } from './';
|
||||
export interface AutocompleteStore<TItem extends BaseItem> {
|
||||
getState(): AutocompleteState<TItem>;
|
||||
dispatch(action: ActionType, payload: any): void;
|
||||
pendingRequests: CancelablePromiseList<void>;
|
||||
}
|
||||
export declare type Reducer = <TItem extends BaseItem>(state: AutocompleteState<TItem>, action: Action<TItem, any>) => AutocompleteState<TItem>;
|
||||
declare type Action<TItem extends BaseItem, TPayload> = {
|
||||
type: ActionType;
|
||||
props: InternalAutocompleteOptions<TItem>;
|
||||
payload: TPayload;
|
||||
};
|
||||
export declare type ActionType = 'setActiveItemId' | 'setQuery' | 'setCollections' | 'setIsOpen' | 'setStatus' | 'setContext' | 'ArrowUp' | 'ArrowDown' | 'Escape' | 'Enter' | 'submit' | 'reset' | 'focus' | 'blur' | 'mousemove' | 'mouseleave' | 'click';
|
||||
export {};
|
||||
+1
@@ -0,0 +1 @@
|
||||
export {};
|
||||
Generated
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
import { BaseItem, OnActiveParams, OnResolveParams, OnSelectParams } from './';
|
||||
export declare type AutocompleteSubscriber<TItem extends BaseItem> = {
|
||||
onSelect(params: OnSelectParams<TItem>): void;
|
||||
onActive(params: OnActiveParams<TItem>): void;
|
||||
onResolve(params: OnResolveParams<TItem>): void;
|
||||
};
|
||||
export declare type AutocompleteSubscribers<TItem extends BaseItem> = Array<Partial<AutocompleteSubscriber<TItem>>>;
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
export {};
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
export * from '@algolia/autocomplete-shared/dist/esm/core';
|
||||
export * from './AutocompleteStore';
|
||||
export * from './AutocompleteSubscribers';
|
||||
import { CreateAlgoliaInsightsPluginParams, AutocompleteInsightsApi as _AutocompleteInsightsApi, AlgoliaInsightsHit as _AlgoliaInsightsHit } from '@algolia/autocomplete-plugin-algolia-insights';
|
||||
import { AutocompleteOptions as _AutocompleteOptions, InternalAutocompleteOptions as _InternalAutocompleteOptions, BaseItem } from '@algolia/autocomplete-shared/dist/esm/core';
|
||||
export declare type AutocompleteInsightsApi = _AutocompleteInsightsApi;
|
||||
export declare type AlgoliaInsightsHit = _AlgoliaInsightsHit;
|
||||
declare type InsightsOption = {
|
||||
/**
|
||||
* Whether to enable the Insights plugin and load the Insights library if it has not been loaded yet.
|
||||
*
|
||||
* See [**autocomplete-plugin-algolia-insights**](https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-plugin-algolia-insights/) for more information.
|
||||
*
|
||||
* @default undefined
|
||||
* @link https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-insights
|
||||
*/
|
||||
insights?: CreateAlgoliaInsightsPluginParams | boolean | undefined;
|
||||
};
|
||||
export interface AutocompleteOptions<TItem extends BaseItem> extends _AutocompleteOptions<TItem>, InsightsOption {
|
||||
}
|
||||
export interface InternalAutocompleteOptions<TItem extends BaseItem> extends _InternalAutocompleteOptions<TItem>, InsightsOption {
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
export * from '@algolia/autocomplete-shared/dist/esm/core';
|
||||
export * from './AutocompleteStore';
|
||||
export * from './AutocompleteSubscribers';
|
||||
export {};
|
||||
Generated
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
declare type PromiseExecutor<TValue> = (resolve: (value: TValue | PromiseLike<TValue>) => void, reject: (reason?: any) => void) => void;
|
||||
export declare type CancelablePromise<TValue> = {
|
||||
then<TResultFulfilled = TValue, TResultRejected = never>(onfulfilled?: ((value: TValue) => TResultFulfilled | PromiseLike<TResultFulfilled> | CancelablePromise<TResultFulfilled>) | undefined | null, onrejected?: ((reason: any) => TResultRejected | PromiseLike<TResultRejected> | CancelablePromise<TResultRejected>) | undefined | null): CancelablePromise<TResultFulfilled | TResultRejected>;
|
||||
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult> | CancelablePromise<TResult>) | undefined | null): CancelablePromise<TValue | TResult>;
|
||||
finally(onfinally?: (() => void) | undefined | null): CancelablePromise<TValue>;
|
||||
cancel(): void;
|
||||
isCanceled(): boolean;
|
||||
};
|
||||
export declare function createCancelablePromise<TValue>(executor: PromiseExecutor<TValue>): CancelablePromise<TValue>;
|
||||
export declare namespace createCancelablePromise {
|
||||
var resolve: <TValue>(value?: TValue | PromiseLike<TValue> | CancelablePromise<TValue> | undefined) => CancelablePromise<TValue | CancelablePromise<TValue> | undefined>;
|
||||
var reject: (reason?: any) => CancelablePromise<never>;
|
||||
}
|
||||
export declare function cancelable<TValue>(promise: Promise<TValue>): CancelablePromise<TValue>;
|
||||
export {};
|
||||
Generated
Vendored
+62
@@ -0,0 +1,62 @@
|
||||
function createInternalCancelablePromise(promise, initialState) {
|
||||
var state = initialState;
|
||||
return {
|
||||
then: function then(onfulfilled, onrejected) {
|
||||
return createInternalCancelablePromise(promise.then(createCallback(onfulfilled, state, promise), createCallback(onrejected, state, promise)), state);
|
||||
},
|
||||
catch: function _catch(onrejected) {
|
||||
return createInternalCancelablePromise(promise.catch(createCallback(onrejected, state, promise)), state);
|
||||
},
|
||||
finally: function _finally(onfinally) {
|
||||
if (onfinally) {
|
||||
state.onCancelList.push(onfinally);
|
||||
}
|
||||
return createInternalCancelablePromise(promise.finally(createCallback(onfinally && function () {
|
||||
state.onCancelList = [];
|
||||
return onfinally();
|
||||
}, state, promise)), state);
|
||||
},
|
||||
cancel: function cancel() {
|
||||
state.isCanceled = true;
|
||||
var callbacks = state.onCancelList;
|
||||
state.onCancelList = [];
|
||||
callbacks.forEach(function (callback) {
|
||||
callback();
|
||||
});
|
||||
},
|
||||
isCanceled: function isCanceled() {
|
||||
return state.isCanceled === true;
|
||||
}
|
||||
};
|
||||
}
|
||||
export function createCancelablePromise(executor) {
|
||||
return createInternalCancelablePromise(new Promise(function (resolve, reject) {
|
||||
return executor(resolve, reject);
|
||||
}), {
|
||||
isCanceled: false,
|
||||
onCancelList: []
|
||||
});
|
||||
}
|
||||
createCancelablePromise.resolve = function (value) {
|
||||
return cancelable(Promise.resolve(value));
|
||||
};
|
||||
createCancelablePromise.reject = function (reason) {
|
||||
return cancelable(Promise.reject(reason));
|
||||
};
|
||||
export function cancelable(promise) {
|
||||
return createInternalCancelablePromise(promise, {
|
||||
isCanceled: false,
|
||||
onCancelList: []
|
||||
});
|
||||
}
|
||||
function createCallback(onResult, state, fallback) {
|
||||
if (!onResult) {
|
||||
return fallback;
|
||||
}
|
||||
return function callback(arg) {
|
||||
if (state.isCanceled) {
|
||||
return arg;
|
||||
}
|
||||
return onResult(arg);
|
||||
};
|
||||
}
|
||||
Generated
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
import { CancelablePromise } from '.';
|
||||
export declare type CancelablePromiseList<TValue> = {
|
||||
/**
|
||||
* Add a cancelable promise to the list.
|
||||
*
|
||||
* @param cancelablePromise The cancelable promise to add.
|
||||
*/
|
||||
add(cancelablePromise: CancelablePromise<TValue>): CancelablePromise<TValue>;
|
||||
/**
|
||||
* Cancel all pending promises.
|
||||
*
|
||||
* Requests aren't actually stopped. All pending promises will settle, but
|
||||
* attached handlers won't run.
|
||||
*/
|
||||
cancelAll(): void;
|
||||
/**
|
||||
* Whether there are pending promises in the list.
|
||||
*/
|
||||
isEmpty(): boolean;
|
||||
};
|
||||
export declare function createCancelablePromiseList<TValue>(): CancelablePromiseList<TValue>;
|
||||
Generated
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
export function createCancelablePromiseList() {
|
||||
var list = [];
|
||||
return {
|
||||
add: function add(cancelablePromise) {
|
||||
list.push(cancelablePromise);
|
||||
return cancelablePromise.finally(function () {
|
||||
list = list.filter(function (item) {
|
||||
return item !== cancelablePromise;
|
||||
});
|
||||
});
|
||||
},
|
||||
cancelAll: function cancelAll() {
|
||||
list.forEach(function (promise) {
|
||||
return promise.cancel();
|
||||
});
|
||||
},
|
||||
isEmpty: function isEmpty() {
|
||||
return list.length === 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
Generated
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
import { MaybePromise } from '@algolia/autocomplete-shared';
|
||||
/**
|
||||
* Creates a runner that executes promises in a concurrent-safe way.
|
||||
*
|
||||
* This is useful to prevent older promises to resolve after a newer promise,
|
||||
* otherwise resulting in stale resolved values.
|
||||
*/
|
||||
export declare function createConcurrentSafePromise(): <TValue>(promise: MaybePromise<TValue>) => Promise<TValue>;
|
||||
Generated
Vendored
+36
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Creates a runner that executes promises in a concurrent-safe way.
|
||||
*
|
||||
* This is useful to prevent older promises to resolve after a newer promise,
|
||||
* otherwise resulting in stale resolved values.
|
||||
*/
|
||||
export function createConcurrentSafePromise() {
|
||||
var basePromiseId = -1;
|
||||
var latestResolvedId = -1;
|
||||
var latestResolvedValue = undefined;
|
||||
return function runConcurrentSafePromise(promise) {
|
||||
basePromiseId++;
|
||||
var currentPromiseId = basePromiseId;
|
||||
return Promise.resolve(promise).then(function (x) {
|
||||
// The promise might take too long to resolve and get outdated. This would
|
||||
// result in resolving stale values.
|
||||
// When this happens, we ignore the promise value and return the one
|
||||
// coming from the latest resolved value.
|
||||
//
|
||||
// +----------------------------------+
|
||||
// | 100ms |
|
||||
// | run(1) +---> R1 |
|
||||
// | 300ms |
|
||||
// | run(2) +-------------> R2 (SKIP) |
|
||||
// | 200ms |
|
||||
// | run(3) +--------> R3 |
|
||||
// +----------------------------------+
|
||||
if (latestResolvedValue && currentPromiseId < latestResolvedId) {
|
||||
return latestResolvedValue;
|
||||
}
|
||||
latestResolvedId = currentPromiseId;
|
||||
latestResolvedValue = x;
|
||||
return x;
|
||||
});
|
||||
};
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import { AutocompleteState, BaseItem } from '../types';
|
||||
export declare function getActiveItem<TItem extends BaseItem>(state: AutocompleteState<TItem>): {
|
||||
item: TItem;
|
||||
itemInputValue: string;
|
||||
itemUrl: string | undefined;
|
||||
source: import("@algolia/autocomplete-shared/dist/esm/core/AutocompleteSource").InternalAutocompleteSource<TItem>;
|
||||
} | null;
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
// We don't have access to the autocomplete source when we call `onKeyDown`
|
||||
// or `onClick` because those are native browser events.
|
||||
// However, we can get the source from the suggestion index.
|
||||
function getCollectionFromActiveItemId(state) {
|
||||
// Given 3 sources with respectively 1, 2 and 3 suggestions: [1, 2, 3]
|
||||
// We want to get the accumulated counts:
|
||||
// [1, 1 + 2, 1 + 2 + 3] = [1, 3, 3 + 3] = [1, 3, 6]
|
||||
var accumulatedCollectionsCount = state.collections.map(function (collections) {
|
||||
return collections.items.length;
|
||||
}).reduce(function (acc, collectionsCount, index) {
|
||||
var previousValue = acc[index - 1] || 0;
|
||||
var nextValue = previousValue + collectionsCount;
|
||||
acc.push(nextValue);
|
||||
return acc;
|
||||
}, []);
|
||||
|
||||
// Based on the accumulated counts, we can infer the index of the suggestion.
|
||||
var collectionIndex = accumulatedCollectionsCount.reduce(function (acc, current) {
|
||||
if (current <= state.activeItemId) {
|
||||
return acc + 1;
|
||||
}
|
||||
return acc;
|
||||
}, 0);
|
||||
return state.collections[collectionIndex];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the highlighted index relative to a suggestion object (not the absolute
|
||||
* highlighted index).
|
||||
*
|
||||
* Example:
|
||||
* [['a', 'b'], ['c', 'd', 'e'], ['f']]
|
||||
* ↑
|
||||
* (absolute: 3, relative: 1)
|
||||
*/
|
||||
function getRelativeActiveItemId(_ref) {
|
||||
var state = _ref.state,
|
||||
collection = _ref.collection;
|
||||
var isOffsetFound = false;
|
||||
var counter = 0;
|
||||
var previousItemsOffset = 0;
|
||||
while (isOffsetFound === false) {
|
||||
var currentCollection = state.collections[counter];
|
||||
if (currentCollection === collection) {
|
||||
isOffsetFound = true;
|
||||
break;
|
||||
}
|
||||
previousItemsOffset += currentCollection.items.length;
|
||||
counter++;
|
||||
}
|
||||
return state.activeItemId - previousItemsOffset;
|
||||
}
|
||||
export function getActiveItem(state) {
|
||||
var collection = getCollectionFromActiveItemId(state);
|
||||
if (!collection) {
|
||||
return null;
|
||||
}
|
||||
var item = collection.items[getRelativeActiveItemId({
|
||||
state: state,
|
||||
collection: collection
|
||||
})];
|
||||
var source = collection.source;
|
||||
var itemInputValue = source.getItemInputValue({
|
||||
item: item,
|
||||
state: state
|
||||
});
|
||||
var itemUrl = source.getItemUrl({
|
||||
item: item,
|
||||
state: state
|
||||
});
|
||||
return {
|
||||
item: item,
|
||||
itemInputValue: itemInputValue,
|
||||
itemUrl: itemUrl,
|
||||
source: source
|
||||
};
|
||||
}
|
||||
Generated
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
import type { InternalAutocompleteSource } from '../types';
|
||||
/**
|
||||
* Returns a full element id for an autocomplete element.
|
||||
*
|
||||
* @param autocompleteInstanceId The id of the autocomplete instance
|
||||
* @param elementId The specific element id
|
||||
* @param source The source of the element, when it needs to be scoped
|
||||
*/
|
||||
export declare function getAutocompleteElementId(autocompleteInstanceId: string, elementId: string, source?: InternalAutocompleteSource<any>): string;
|
||||
Generated
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Returns a full element id for an autocomplete element.
|
||||
*
|
||||
* @param autocompleteInstanceId The id of the autocomplete instance
|
||||
* @param elementId The specific element id
|
||||
* @param source The source of the element, when it needs to be scoped
|
||||
*/
|
||||
export function getAutocompleteElementId(autocompleteInstanceId, elementId, source) {
|
||||
return [autocompleteInstanceId, source === null || source === void 0 ? void 0 : source.sourceId, elementId].filter(Boolean).join('-').replace(/\s/g, '');
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
export declare function getNativeEvent<TEvent>(event: TEvent): TEvent;
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export function getNativeEvent(event) {
|
||||
return event.nativeEvent || event;
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Returns the next active item ID from the current state.
|
||||
*
|
||||
* We allow circular keyboard navigation from the base index.
|
||||
* The base index can either be `null` (nothing is highlighted) or `0`
|
||||
* (the first item is highlighted).
|
||||
* The base index is allowed to get assigned `null` only if
|
||||
* `props.defaultActiveItemId` is `null`. This pattern allows to "stop"
|
||||
* by the actual query before navigating to other suggestions as seen on
|
||||
* Google or Amazon.
|
||||
*
|
||||
* @param moveAmount The offset to increment (or decrement) the last index
|
||||
* @param baseIndex The current index to compute the next index from
|
||||
* @param itemCount The number of items
|
||||
* @param defaultActiveItemId The default active index to fallback to
|
||||
*/
|
||||
export declare function getNextActiveItemId(moveAmount: number, baseIndex: number | null, itemCount: number, defaultActiveItemId: number | null): number | null;
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Returns the next active item ID from the current state.
|
||||
*
|
||||
* We allow circular keyboard navigation from the base index.
|
||||
* The base index can either be `null` (nothing is highlighted) or `0`
|
||||
* (the first item is highlighted).
|
||||
* The base index is allowed to get assigned `null` only if
|
||||
* `props.defaultActiveItemId` is `null`. This pattern allows to "stop"
|
||||
* by the actual query before navigating to other suggestions as seen on
|
||||
* Google or Amazon.
|
||||
*
|
||||
* @param moveAmount The offset to increment (or decrement) the last index
|
||||
* @param baseIndex The current index to compute the next index from
|
||||
* @param itemCount The number of items
|
||||
* @param defaultActiveItemId The default active index to fallback to
|
||||
*/
|
||||
export function getNextActiveItemId(moveAmount, baseIndex, itemCount, defaultActiveItemId) {
|
||||
if (!itemCount) {
|
||||
return null;
|
||||
}
|
||||
if (moveAmount < 0 && (baseIndex === null || defaultActiveItemId !== null && baseIndex === 0)) {
|
||||
return itemCount + moveAmount;
|
||||
}
|
||||
var numericIndex = (baseIndex === null ? -1 : baseIndex) + moveAmount;
|
||||
if (numericIndex <= -1 || numericIndex >= itemCount) {
|
||||
return defaultActiveItemId === null ? null : 0;
|
||||
}
|
||||
return numericIndex;
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import { BaseItem, GetSources, GetSourcesParams, InternalGetSources } from '../types';
|
||||
export declare function getNormalizedSources<TItem extends BaseItem>(getSources: GetSources<TItem>, params: GetSourcesParams<TItem>): ReturnType<InternalGetSources<TItem>>;
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
||||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
||||
import { invariant, decycle, noop } from '@algolia/autocomplete-shared';
|
||||
export function getNormalizedSources(getSources, params) {
|
||||
var seenSourceIds = [];
|
||||
return Promise.resolve(getSources(params)).then(function (sources) {
|
||||
invariant(Array.isArray(sources), function () {
|
||||
return "The `getSources` function must return an array of sources but returned type ".concat(JSON.stringify(_typeof(sources)), ":\n\n").concat(JSON.stringify(decycle(sources), null, 2));
|
||||
});
|
||||
return Promise.all(sources
|
||||
// We allow `undefined` and `false` sources to allow users to use
|
||||
// `Boolean(query) && source` (=> `false`).
|
||||
// We need to remove these values at this point.
|
||||
.filter(function (maybeSource) {
|
||||
return Boolean(maybeSource);
|
||||
}).map(function (source) {
|
||||
invariant(typeof source.sourceId === 'string', 'A source must provide a `sourceId` string.');
|
||||
if (seenSourceIds.includes(source.sourceId)) {
|
||||
throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(source.sourceId), " is not unique."));
|
||||
}
|
||||
seenSourceIds.push(source.sourceId);
|
||||
var defaultSource = {
|
||||
getItemInputValue: function getItemInputValue(_ref) {
|
||||
var state = _ref.state;
|
||||
return state.query;
|
||||
},
|
||||
getItemUrl: function getItemUrl() {
|
||||
return undefined;
|
||||
},
|
||||
onSelect: function onSelect(_ref2) {
|
||||
var setIsOpen = _ref2.setIsOpen;
|
||||
setIsOpen(false);
|
||||
},
|
||||
onActive: noop,
|
||||
onResolve: noop
|
||||
};
|
||||
Object.keys(defaultSource).forEach(function (key) {
|
||||
defaultSource[key].__default = true;
|
||||
});
|
||||
var normalizedSource = _objectSpread(_objectSpread({}, defaultSource), source);
|
||||
return Promise.resolve(normalizedSource);
|
||||
}));
|
||||
});
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
export * from './createCancelablePromise';
|
||||
export * from './createCancelablePromiseList';
|
||||
export * from './createConcurrentSafePromise';
|
||||
export * from './getNextActiveItemId';
|
||||
export * from './getNormalizedSources';
|
||||
export * from './getActiveItem';
|
||||
export * from './getAutocompleteElementId';
|
||||
export * from './isOrContainsNode';
|
||||
export * from './isSamsung';
|
||||
export * from './mapToAlgoliaResponse';
|
||||
export * from './getNativeEvent';
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
export * from './createCancelablePromise';
|
||||
export * from './createCancelablePromiseList';
|
||||
export * from './createConcurrentSafePromise';
|
||||
export * from './getNextActiveItemId';
|
||||
export * from './getNormalizedSources';
|
||||
export * from './getActiveItem';
|
||||
export * from './getAutocompleteElementId';
|
||||
export * from './isOrContainsNode';
|
||||
export * from './isSamsung';
|
||||
export * from './mapToAlgoliaResponse';
|
||||
export * from './getNativeEvent';
|
||||
+1
@@ -0,0 +1 @@
|
||||
export declare function isOrContainsNode(parent: Node, child: Node): boolean;
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export function isOrContainsNode(parent, child) {
|
||||
return parent === child || parent.contains(child);
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
export declare function isSamsung(userAgent: string): boolean;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user