@gorgo/medusa-integration 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,8 @@ import { clx, createDataTableColumnHelper, usePrompt, toast, Text, Badge, useDat
5
5
  import { useQueryClient, useQuery, keepPreviousData, useMutation } from "@tanstack/react-query";
6
6
  import React, { useState, useMemo } from "react";
7
7
  import { useTranslation } from "react-i18next";
8
- import { useNavigate, useParams, Link } from "react-router-dom";
9
- import Medusa from "@medusajs/js-sdk";
8
+ import { useNavigate, useParams } from "react-router-dom";
9
+ import Medusa, { FetchError } from "@medusajs/js-sdk";
10
10
  import { LayoutComposer } from "@medusajs/dashboard/components";
11
11
  const sdk = new Medusa({
12
12
  baseUrl: "/",
@@ -117,9 +117,9 @@ const IntegrationsPage = () => {
117
117
  queryFn: () => sdk.client.fetch("/admin/integrations", { query: queryParams }),
118
118
  placeholderData: keepPreviousData
119
119
  });
120
- const integrations = (data == null ? void 0 : data.integrations) ?? [];
121
- const count = (data == null ? void 0 : data.count) ?? 0;
122
- const categories = (data == null ? void 0 : data.categories) ?? [];
120
+ const integrations = data?.integrations ?? [];
121
+ const count = data?.count ?? 0;
122
+ const categories = data?.categories ?? [];
123
123
  const invalidate = () => qc.invalidateQueries({ queryKey: ["integration-overview"] });
124
124
  const toggleEnabled = useMutation({
125
125
  mutationFn: ({ providerId, next }) => sdk.client.fetch(`/admin/integrations/${providerId}/enable`, {
@@ -130,7 +130,7 @@ const IntegrationsPage = () => {
130
130
  toast.success(next ? t("integration.toast.enabled") : t("integration.toast.disabled"));
131
131
  invalidate();
132
132
  },
133
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.updateFailed"))
133
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.updateFailed"))
134
134
  });
135
135
  const test = useMutation({
136
136
  mutationFn: (providerId) => sdk.client.fetch(
@@ -141,7 +141,7 @@ const IntegrationsPage = () => {
141
141
  r.status === "passed" ? toast.success(t("integration.toast.connectionOk")) : toast.warning(r.message ?? r.status);
142
142
  invalidate();
143
143
  },
144
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.testFailed"))
144
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.testFailed"))
145
145
  });
146
146
  const remove = useMutation({
147
147
  mutationFn: (providerId) => sdk.client.fetch(`/admin/integrations/${providerId}`, { method: "DELETE" }),
@@ -149,7 +149,7 @@ const IntegrationsPage = () => {
149
149
  toast.success(t("integration.toast.deleted"));
150
150
  invalidate();
151
151
  },
152
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.deleteFailed"))
152
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.deleteFailed"))
153
153
  });
154
154
  const onDelete = async (item) => {
155
155
  const confirmed = await prompt({
@@ -293,7 +293,6 @@ const IntegrationFieldValue = ({
293
293
  value,
294
294
  secretConfigured = false
295
295
  }) => {
296
- var _a;
297
296
  const { t } = useTranslation();
298
297
  if (field.secret || field.control === "secret") {
299
298
  return secretConfigured ? /* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: "••••••••" }) : /* @__PURE__ */ jsx(Dash, {});
@@ -311,61 +310,51 @@ const IntegrationFieldValue = ({
311
310
  }
312
311
  if (value == null || value === "") return /* @__PURE__ */ jsx(Dash, {});
313
312
  if (field.control === "select") {
314
- const labelKey = (_a = field.optionLabels) == null ? void 0 : _a[String(value)];
313
+ const labelKey = field.optionLabels?.[String(value)];
315
314
  return /* @__PURE__ */ jsx(Badge, { size: "2xsmall", color: "grey", children: labelKey ? t(labelKey) : String(value) });
316
315
  }
317
316
  return /* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: String(value) });
318
317
  };
319
318
  var isCheckBoxInput = (element) => element.type === "checkbox";
319
+ var isFileInput = (element) => element.type === "file";
320
320
  var isDateObject = (value) => value instanceof Date;
321
321
  var isNullOrUndefined = (value) => value == null;
322
322
  const isObjectType = (value) => typeof value === "object";
323
323
  var isObject = (value) => !isNullOrUndefined(value) && !Array.isArray(value) && isObjectType(value) && !isDateObject(value);
324
- var getEventValue = (event) => isObject(event) && event.target ? isCheckBoxInput(event.target) ? event.target.checked : event.target.value : event;
325
- var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
326
- var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
324
+ var getEventValue = (event) => isObject(event) && event.target ? isCheckBoxInput(event.target) ? event.target.checked : isFileInput(event.target) ? event.target.files : event.target.value : event;
325
+ var isNameInFieldArray = (names, name) => name.split(".").some((part, index, arr) => !isNaN(Number(part)) && names.has(arr.slice(0, index).join(".")));
327
326
  var isPlainObject = (tempObject) => {
328
327
  const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
329
328
  return isObject(prototypeCopy) && prototypeCopy.hasOwnProperty("isPrototypeOf");
330
329
  };
331
330
  var isWeb = typeof window !== "undefined" && typeof window.HTMLElement !== "undefined" && typeof document !== "undefined";
332
331
  function cloneObject(data) {
333
- let copy;
334
- const isArray = Array.isArray(data);
335
332
  if (data instanceof Date) {
336
- copy = new Date(data);
337
- } else if (data instanceof Set) {
338
- copy = new Set(data);
339
- } else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) && (isArray || isObject(data))) {
340
- copy = isArray ? [] : {};
341
- if (!isArray && !isPlainObject(data)) {
342
- copy = data;
343
- } else {
344
- for (const key in data) {
345
- if (data.hasOwnProperty(key)) {
346
- copy[key] = cloneObject(data[key]);
347
- }
348
- }
349
- }
350
- } else {
333
+ return new Date(data);
334
+ }
335
+ const isFileListInstance = typeof FileList !== "undefined" && data instanceof FileList;
336
+ if (isWeb && (data instanceof Blob || isFileListInstance)) {
351
337
  return data;
352
338
  }
339
+ const isArray = Array.isArray(data);
340
+ if (!isArray && !(isObject(data) && isPlainObject(data))) {
341
+ return data;
342
+ }
343
+ const copy = isArray ? [] : Object.create(Object.getPrototypeOf(data));
344
+ for (const key in data) {
345
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
346
+ copy[key] = cloneObject(data[key]);
347
+ }
348
+ }
353
349
  return copy;
354
350
  }
355
- var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
356
- var isUndefined = (val) => val === void 0;
357
- var get = (object, path, defaultValue) => {
358
- if (!path || !isObject(object)) {
359
- return defaultValue;
360
- }
361
- const result = compact(path.split(/[,[\].]+?/)).reduce((result2, key) => isNullOrUndefined(result2) ? result2 : result2[key], object);
362
- return isUndefined(result) || result === object ? isUndefined(object[path]) ? defaultValue : object[path] : result;
363
- };
364
- var isBoolean = (value) => typeof value === "boolean";
365
351
  const EVENTS = {
366
352
  BLUR: "blur",
367
353
  FOCUS_OUT: "focusout",
368
- CHANGE: "change"
354
+ CHANGE: "change",
355
+ SUBMIT: "submit",
356
+ TRIGGER: "trigger",
357
+ VALID: "valid"
369
358
  };
370
359
  const VALIDATION_MODE = {
371
360
  onBlur: "onBlur",
@@ -383,12 +372,52 @@ const INPUT_VALIDATION_RULES = {
383
372
  required: "required",
384
373
  validate: "validate"
385
374
  };
386
- const HookFormContext = React.createContext(null);
387
- const useFormContext = () => React.useContext(HookFormContext);
375
+ const ROOT_ERROR_TYPE = "root";
376
+ const PROTOTYPE_KEYWORDS = ["__proto__", "constructor", "prototype"];
377
+ const IS_KEY_RE = /^\w*$/;
378
+ var isKey = (value) => IS_KEY_RE.test(value);
379
+ var isUndefined = (val) => val === void 0;
380
+ const FIELD_PATH_RE = /[.[\]'"]/;
381
+ var stringToPath = (input) => input.split(FIELD_PATH_RE).filter(Boolean);
382
+ var get = (object, path, defaultValue) => {
383
+ if (!path || !isObject(object)) {
384
+ return defaultValue;
385
+ }
386
+ const paths = isKey(path) ? [path] : stringToPath(path);
387
+ if (paths.some((key) => PROTOTYPE_KEYWORDS.includes(key))) {
388
+ return defaultValue;
389
+ }
390
+ const result = paths.reduce((result2, key) => {
391
+ return isNullOrUndefined(result2) ? void 0 : result2[key];
392
+ }, object);
393
+ return isUndefined(result) || result === object ? isUndefined(object[path]) ? defaultValue : object[path] : result;
394
+ };
395
+ var isBoolean = (value) => typeof value === "boolean";
396
+ var isFunction = (value) => typeof value === "function";
397
+ var set = (object, path, value) => {
398
+ let index = -1;
399
+ const tempPath = isKey(path) ? [path] : stringToPath(path);
400
+ const length = tempPath.length;
401
+ const lastIndex = length - 1;
402
+ while (++index < length) {
403
+ const key = tempPath[index];
404
+ let newValue = value;
405
+ if (index !== lastIndex) {
406
+ const objValue = object[key];
407
+ newValue = isObject(objValue) || Array.isArray(objValue) ? objValue : !isNaN(+tempPath[index + 1]) ? [] : {};
408
+ }
409
+ if (PROTOTYPE_KEYWORDS.includes(key)) {
410
+ return;
411
+ }
412
+ object[key] = newValue;
413
+ object = object[key];
414
+ }
415
+ };
416
+ const HookFormControlContext = React.createContext(null);
417
+ HookFormControlContext.displayName = "HookFormControlContext";
418
+ const useFormControlContext = () => React.useContext(HookFormControlContext);
388
419
  var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
389
- const result = {
390
- defaultValues: control._defaultValues
391
- };
420
+ const result = {};
392
421
  for (const key in formState) {
393
422
  Object.defineProperty(result, key, {
394
423
  get: () => {
@@ -403,58 +432,40 @@ var getProxyFormState = (formState, control, localProxyFormState, isRoot = true)
403
432
  }
404
433
  return result;
405
434
  };
406
- var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;
407
- var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {
408
- updateFormState(formStateData);
409
- const { name, ...formState } = formStateData;
410
- return isEmptyObject(formState) || Object.keys(formState).length >= Object.keys(_proxyFormState).length || Object.keys(formState).find((key) => _proxyFormState[key] === (!isRoot || VALIDATION_MODE.all));
411
- };
412
- var convertToArrayPayload = (value) => Array.isArray(value) ? value : [value];
413
- var shouldSubscribeByName = (name, signalName, exact) => !name || !signalName || name === signalName || convertToArrayPayload(name).some((currentName) => currentName && (exact ? currentName === signalName : currentName.startsWith(signalName) || signalName.startsWith(currentName)));
414
- function useSubscribe(props) {
415
- const _props = React.useRef(props);
416
- _props.current = props;
417
- React.useEffect(() => {
418
- const subscription = !props.disabled && _props.current.subject && _props.current.subject.subscribe({
419
- next: _props.current.next
420
- });
421
- return () => {
422
- subscription && subscription.unsubscribe();
423
- };
424
- }, [props.disabled]);
425
- }
435
+ const useIsomorphicLayoutEffect = isWeb ? React.useLayoutEffect : React.useEffect;
426
436
  function useFormState(props) {
427
- const methods = useFormContext();
428
- const { control = methods.control, disabled, name, exact } = props || {};
429
- const [formState, updateFormState] = React.useState(control._formState);
430
- const _mounted = React.useRef(true);
437
+ const formControl = useFormControlContext();
438
+ const { control = formControl, disabled, name, exact } = props || {};
439
+ const [formState, updateFormState] = React.useState(() => ({
440
+ ...control._formState,
441
+ defaultValues: control._defaultValues
442
+ }));
431
443
  const _localProxyFormState = React.useRef({
432
444
  isDirty: false,
433
445
  isLoading: false,
434
446
  dirtyFields: false,
435
447
  touchedFields: false,
448
+ validatingFields: false,
436
449
  isValidating: false,
437
450
  isValid: false,
438
451
  errors: false
439
452
  });
440
- const _name = React.useRef(name);
441
- _name.current = name;
442
- useSubscribe({
443
- disabled,
444
- next: (value) => _mounted.current && shouldSubscribeByName(_name.current, value.name, exact) && shouldRenderFormState(value, _localProxyFormState.current, control._updateFormState) && updateFormState({
445
- ...control._formState,
446
- ...value
447
- }),
448
- subject: control._subjects.state
449
- });
453
+ useIsomorphicLayoutEffect(() => control._subscribe({
454
+ name,
455
+ formState: _localProxyFormState.current,
456
+ exact,
457
+ callback: (formState2) => {
458
+ !disabled && updateFormState({
459
+ ...control._formState,
460
+ ...formState2,
461
+ defaultValues: control._defaultValues
462
+ });
463
+ }
464
+ }), [name, disabled, exact]);
450
465
  React.useEffect(() => {
451
- _mounted.current = true;
452
- _localProxyFormState.current.isValid && control._updateValid(true);
453
- return () => {
454
- _mounted.current = false;
455
- };
466
+ _localProxyFormState.current.isValid && control._setValid(true);
456
467
  }, [control]);
457
- return getProxyFormState(formState, control, _localProxyFormState.current, false);
468
+ return React.useMemo(() => getProxyFormState(formState, control, _localProxyFormState.current, false), [formState, control]);
458
469
  }
459
470
  var isString = (value) => typeof value === "string";
460
471
  var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {
@@ -468,152 +479,250 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
468
479
  isGlobal && (_names.watchAll = true);
469
480
  return formValues;
470
481
  };
471
- function useWatch(props) {
472
- const methods = useFormContext();
473
- const { control = methods.control, name, defaultValue, disabled, exact } = props || {};
474
- const _name = React.useRef(name);
475
- _name.current = name;
476
- useSubscribe({
477
- disabled,
478
- subject: control._subjects.values,
479
- next: (formState) => {
480
- if (shouldSubscribeByName(_name.current, formState.name, exact)) {
481
- updateValue(cloneObject(generateWatchOutput(_name.current, control._names, formState.values || control._formValues, false, defaultValue)));
482
+ var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
483
+ const isEmptyObjectWithCustomPrototype = (object, keys) => keys.length === 0 && !Array.isArray(object) && !isPlainObject(object);
484
+ function deepEqual(object1, object2, visited = /* @__PURE__ */ new WeakMap()) {
485
+ if (object1 === object2) {
486
+ return true;
487
+ }
488
+ if (isPrimitive(object1) || isPrimitive(object2)) {
489
+ return Object.is(object1, object2);
490
+ }
491
+ if (isDateObject(object1) && isDateObject(object2)) {
492
+ return Object.is(object1.getTime(), object2.getTime());
493
+ }
494
+ const keys1 = Object.keys(object1);
495
+ const keys2 = Object.keys(object2);
496
+ if (keys1.length !== keys2.length) {
497
+ return false;
498
+ }
499
+ if (isEmptyObjectWithCustomPrototype(object1, keys1) || isEmptyObjectWithCustomPrototype(object2, keys2)) {
500
+ return Object.is(object1, object2);
501
+ }
502
+ if (!keys1.length && Array.isArray(object1) !== Array.isArray(object2)) {
503
+ return false;
504
+ }
505
+ const visitedPairs = visited.get(object1);
506
+ if (visitedPairs && visitedPairs.has(object2)) {
507
+ return true;
508
+ }
509
+ if (visitedPairs) {
510
+ visitedPairs.add(object2);
511
+ } else {
512
+ const ws = /* @__PURE__ */ new WeakSet();
513
+ ws.add(object2);
514
+ visited.set(object1, ws);
515
+ }
516
+ for (const key of keys1) {
517
+ const val1 = object1[key];
518
+ if (!(key in object2)) {
519
+ return false;
520
+ }
521
+ if (key !== "ref") {
522
+ const val2 = object2[key];
523
+ if (isDateObject(val1) && isDateObject(val2) || (isObject(val1) || Array.isArray(val1)) && (isObject(val2) || Array.isArray(val2)) ? !deepEqual(val1, val2, visited) : !Object.is(val1, val2)) {
524
+ return false;
482
525
  }
483
526
  }
527
+ }
528
+ return true;
529
+ }
530
+ function useWatch(props) {
531
+ const formControl = useFormControlContext();
532
+ const { control = formControl, name, defaultValue, disabled, exact, compute } = props || {};
533
+ const _defaultValue = React.useRef(defaultValue);
534
+ const _compute = React.useRef(compute);
535
+ const _computeFormValues = React.useRef(void 0);
536
+ const _prevControl = React.useRef(control);
537
+ const _prevName = React.useRef(name);
538
+ _compute.current = compute;
539
+ const [value, updateValue] = React.useState(() => {
540
+ const defaultValue2 = control._getWatch(name, _defaultValue.current);
541
+ return _compute.current ? _compute.current(defaultValue2) : defaultValue2;
484
542
  });
485
- const [value, updateValue] = React.useState(control._getWatch(name, defaultValue));
543
+ const getCurrentOutput = React.useCallback((values) => {
544
+ const formValues = generateWatchOutput(name, control._names, values || control._formValues, false, _defaultValue.current);
545
+ return _compute.current ? _compute.current(formValues) : formValues;
546
+ }, [control._formValues, control._names, name]);
547
+ const refreshValue = React.useCallback((values) => {
548
+ if (!disabled) {
549
+ const formValues = generateWatchOutput(name, control._names, values || control._formValues, false, _defaultValue.current);
550
+ if (_compute.current) {
551
+ const computedFormValues = _compute.current(formValues);
552
+ if (!deepEqual(computedFormValues, _computeFormValues.current)) {
553
+ updateValue(computedFormValues);
554
+ _computeFormValues.current = computedFormValues;
555
+ }
556
+ } else {
557
+ updateValue(formValues);
558
+ }
559
+ }
560
+ }, [control._formValues, control._names, disabled, name]);
561
+ useIsomorphicLayoutEffect(() => {
562
+ if (_prevControl.current !== control || !deepEqual(_prevName.current, name)) {
563
+ _prevControl.current = control;
564
+ _prevName.current = name;
565
+ refreshValue();
566
+ }
567
+ return control._subscribe({
568
+ name,
569
+ formState: {
570
+ values: true
571
+ },
572
+ exact,
573
+ callback: (formState) => {
574
+ refreshValue(formState.values);
575
+ }
576
+ });
577
+ }, [control, exact, name, refreshValue]);
486
578
  React.useEffect(() => control._removeUnmounted());
487
- return value;
579
+ const controlChanged = _prevControl.current !== control;
580
+ const prevName = _prevName.current;
581
+ const computedOutput = React.useMemo(() => {
582
+ if (disabled) {
583
+ return null;
584
+ }
585
+ const nameChanged = !controlChanged && !deepEqual(prevName, name);
586
+ const shouldReturnImmediate = controlChanged || nameChanged;
587
+ return shouldReturnImmediate ? getCurrentOutput() : null;
588
+ }, [disabled, controlChanged, name, prevName, getCurrentOutput]);
589
+ return computedOutput !== null ? computedOutput : value;
488
590
  }
489
- var isKey = (value) => /^\w*$/.test(value);
490
- var stringToPath = (input) => compact(input.replace(/["|']|\]/g, "").split(/\.|\[/));
491
- var set = (object, path, value) => {
492
- let index = -1;
493
- const tempPath = isKey(path) ? [path] : stringToPath(path);
494
- const length = tempPath.length;
495
- const lastIndex = length - 1;
496
- while (++index < length) {
497
- const key = tempPath[index];
498
- let newValue = value;
499
- if (index !== lastIndex) {
500
- const objValue = object[key];
501
- newValue = isObject(objValue) || Array.isArray(objValue) ? objValue : !isNaN(+tempPath[index + 1]) ? [] : {};
502
- }
503
- object[key] = newValue;
504
- object = object[key];
505
- }
506
- return object;
507
- };
508
591
  function useController(props) {
509
- const methods = useFormContext();
510
- const { name, disabled, control = methods.control, shouldUnregister } = props;
592
+ const formControl = useFormControlContext();
593
+ const { name, disabled, control = formControl, shouldUnregister, defaultValue, exact = true } = props;
511
594
  const isArrayField = isNameInFieldArray(control._names.array, name);
595
+ const defaultValueMemo = React.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
512
596
  const value = useWatch({
513
597
  control,
514
598
  name,
515
- defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),
516
- exact: true
599
+ defaultValue: defaultValueMemo,
600
+ exact
517
601
  });
518
602
  const formState = useFormState({
519
603
  control,
520
- name
604
+ name,
605
+ exact
521
606
  });
607
+ const _props = React.useRef(props);
608
+ const _proxyRef = React.useRef(null);
522
609
  const _registerProps = React.useRef(control.register(name, {
523
610
  ...props.rules,
524
611
  value,
525
612
  ...isBoolean(props.disabled) ? { disabled: props.disabled } : {}
526
613
  }));
614
+ _props.current = props;
615
+ const fieldState = React.useMemo(() => Object.defineProperties({}, {
616
+ invalid: {
617
+ enumerable: true,
618
+ get: () => !!get(formState.errors, name)
619
+ },
620
+ isDirty: {
621
+ enumerable: true,
622
+ get: () => !!get(formState.dirtyFields, name)
623
+ },
624
+ isTouched: {
625
+ enumerable: true,
626
+ get: () => !!get(formState.touchedFields, name)
627
+ },
628
+ isValidating: {
629
+ enumerable: true,
630
+ get: () => !!get(formState.validatingFields, name)
631
+ },
632
+ error: {
633
+ enumerable: true,
634
+ get: () => get(formState.errors, name)
635
+ }
636
+ }), [formState, name]);
637
+ const onChange = React.useCallback((event) => {
638
+ const value2 = getEventValue(event);
639
+ if (!get(control._fields, name)) {
640
+ _registerProps.current = control.register(name, {
641
+ ..._props.current.rules,
642
+ value: value2
643
+ });
644
+ }
645
+ return _registerProps.current.onChange({
646
+ target: {
647
+ value: getEventValue(event),
648
+ name
649
+ },
650
+ type: EVENTS.CHANGE
651
+ });
652
+ }, [name, control]);
653
+ const onBlur = React.useCallback(() => _registerProps.current.onBlur({
654
+ target: {
655
+ value: get(control._formValues, name),
656
+ name
657
+ },
658
+ type: EVENTS.BLUR
659
+ }), [name, control._formValues]);
660
+ const ref = React.useCallback((elm) => {
661
+ if (elm) {
662
+ _proxyRef.current = {
663
+ focus: () => isFunction(elm.focus) && elm.focus(),
664
+ select: () => isFunction(elm.select) && elm.select(),
665
+ setCustomValidity: (message) => isFunction(elm.setCustomValidity) && elm.setCustomValidity(message),
666
+ reportValidity: () => isFunction(elm.reportValidity) && elm.reportValidity()
667
+ };
668
+ }
669
+ const field2 = get(control._fields, name);
670
+ if (field2 && field2._f && elm) {
671
+ field2._f.ref = _proxyRef.current;
672
+ }
673
+ }, [control._fields, name]);
674
+ const field = React.useMemo(() => ({
675
+ name,
676
+ value,
677
+ ...isBoolean(disabled) || formState.disabled ? { disabled: formState.disabled || disabled } : {},
678
+ onChange,
679
+ onBlur,
680
+ ref
681
+ }), [name, disabled, formState.disabled, onChange, onBlur, ref, value]);
527
682
  React.useEffect(() => {
528
683
  const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
684
+ _registerProps.current = control.register(name, {
685
+ ..._props.current.rules,
686
+ ...isBoolean(_props.current.disabled) ? { disabled: _props.current.disabled } : {}
687
+ });
529
688
  const updateMounted = (name2, value2) => {
530
- const field = get(control._fields, name2);
531
- if (field) {
532
- field._f.mount = value2;
689
+ const field2 = get(control._fields, name2);
690
+ if (field2 && field2._f) {
691
+ field2._f.mount = value2;
533
692
  }
534
693
  };
535
694
  updateMounted(name, true);
536
695
  if (_shouldUnregisterField) {
537
- const value2 = cloneObject(get(control._options.defaultValues, name));
696
+ const value2 = cloneObject(get(shouldUnregister ? control._defaultValues : control._options.values || control._defaultValues, name, get(control._options.defaultValues, name, _props.current.defaultValue)));
538
697
  set(control._defaultValues, name, value2);
539
698
  if (isUndefined(get(control._formValues, name))) {
540
699
  set(control._formValues, name, value2);
541
700
  }
542
701
  }
702
+ !isArrayField && control.register(name);
703
+ if (_proxyRef.current) {
704
+ const field2 = get(control._fields, name);
705
+ if (field2 && field2._f) {
706
+ field2._f.ref = _proxyRef.current;
707
+ }
708
+ }
543
709
  return () => {
544
710
  (isArrayField ? _shouldUnregisterField && !control._state.action : _shouldUnregisterField) ? control.unregister(name) : updateMounted(name, false);
545
711
  };
546
712
  }, [name, control, isArrayField, shouldUnregister]);
547
713
  React.useEffect(() => {
548
- if (get(control._fields, name)) {
549
- control._updateDisabledField({
550
- disabled,
551
- fields: control._fields,
552
- name,
553
- value: get(control._fields, name)._f.value
554
- });
555
- }
714
+ control._setDisabledField({
715
+ disabled,
716
+ name
717
+ });
556
718
  }, [disabled, name, control]);
557
- return {
558
- field: {
559
- name,
560
- value,
561
- ...isBoolean(disabled) || isBoolean(formState.disabled) ? { disabled: formState.disabled || disabled } : {},
562
- onChange: React.useCallback((event) => _registerProps.current.onChange({
563
- target: {
564
- value: getEventValue(event),
565
- name
566
- },
567
- type: EVENTS.CHANGE
568
- }), [name]),
569
- onBlur: React.useCallback(() => _registerProps.current.onBlur({
570
- target: {
571
- value: get(control._formValues, name),
572
- name
573
- },
574
- type: EVENTS.BLUR
575
- }), [name, control]),
576
- ref: (elm) => {
577
- const field = get(control._fields, name);
578
- if (field && elm) {
579
- field._f.ref = {
580
- focus: () => elm.focus(),
581
- select: () => elm.select(),
582
- setCustomValidity: (message) => elm.setCustomValidity(message),
583
- reportValidity: () => elm.reportValidity()
584
- };
585
- }
586
- }
587
- },
719
+ return React.useMemo(() => ({
720
+ field,
588
721
  formState,
589
- fieldState: Object.defineProperties({}, {
590
- invalid: {
591
- enumerable: true,
592
- get: () => !!get(formState.errors, name)
593
- },
594
- isDirty: {
595
- enumerable: true,
596
- get: () => !!get(formState.dirtyFields, name)
597
- },
598
- isTouched: {
599
- enumerable: true,
600
- get: () => !!get(formState.touchedFields, name)
601
- },
602
- error: {
603
- enumerable: true,
604
- get: () => get(formState.errors, name)
605
- }
606
- })
607
- };
722
+ fieldState
723
+ }), [field, formState, fieldState]);
608
724
  }
609
725
  const Controller = (props) => props.render(useController(props));
610
- var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria ? {
611
- ...errors[name],
612
- types: {
613
- ...errors[name] && errors[name].types ? errors[name].types : {},
614
- [type]: message || true
615
- }
616
- } : {};
617
726
  var getValidationModes = (mode) => ({
618
727
  isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,
619
728
  isOnBlur: mode === VALIDATION_MODE.onBlur,
@@ -621,7 +730,17 @@ var getValidationModes = (mode) => ({
621
730
  isOnAll: mode === VALIDATION_MODE.all,
622
731
  isOnTouch: mode === VALIDATION_MODE.onTouched
623
732
  });
624
- var isWatched = (name, _names, isBlurEvent) => !isBlurEvent && (_names.watchAll || _names.watch.has(name) || [..._names.watch].some((watchName) => name.startsWith(watchName) && /^\.\w+/.test(name.slice(watchName.length))));
733
+ var isWatched = (name, _names, isBlurEvent) => {
734
+ if (isBlurEvent)
735
+ return false;
736
+ if (_names.watchAll || _names.watch.has(name))
737
+ return true;
738
+ for (const watchName of _names.watch) {
739
+ if (name.startsWith(watchName) && name.charAt(watchName.length) === ".")
740
+ return true;
741
+ }
742
+ return false;
743
+ };
625
744
  const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
626
745
  for (const key of fieldsNames || Object.keys(fields)) {
627
746
  const field = get(fields, key);
@@ -629,26 +748,31 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
629
748
  const { _f, ...currentField } = field;
630
749
  if (_f) {
631
750
  if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) {
632
- break;
751
+ return true;
633
752
  } else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {
634
- break;
753
+ return true;
635
754
  } else {
636
- iterateFieldsByAction(currentField, action);
755
+ if (iterateFieldsByAction(currentField, action)) {
756
+ break;
757
+ }
637
758
  }
638
759
  } else if (isObject(currentField)) {
639
- iterateFieldsByAction(currentField, action);
760
+ if (iterateFieldsByAction(currentField, action)) {
761
+ break;
762
+ }
640
763
  }
641
764
  }
642
765
  }
766
+ return;
643
767
  };
644
768
  var updateFieldArrayRootError = (errors, error, name) => {
645
- const fieldArrayErrors = compact(get(errors, name));
646
- set(fieldArrayErrors, "root", error[name]);
769
+ const existingErrors = get(errors, name);
770
+ const fieldArrayErrors = Array.isArray(existingErrors) ? existingErrors : [];
771
+ set(fieldArrayErrors, ROOT_ERROR_TYPE, error[name]);
647
772
  set(errors, name, fieldArrayErrors);
648
773
  return errors;
649
774
  };
650
- var isFileInput = (element) => element.type === "file";
651
- var isFunction = (value) => typeof value === "function";
775
+ var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;
652
776
  var isHTMLElement = (value) => {
653
777
  if (!isWeb) {
654
778
  return false;
@@ -656,9 +780,15 @@ var isHTMLElement = (value) => {
656
780
  const owner = value ? value.ownerDocument : 0;
657
781
  return value instanceof (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement);
658
782
  };
659
- var isMessage = (value) => isString(value);
660
783
  var isRadioInput = (element) => element.type === "radio";
661
784
  var isRegex = (value) => value instanceof RegExp;
785
+ var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria ? {
786
+ ...errors[name],
787
+ types: {
788
+ ...errors[name] && errors[name].types ? errors[name].types : {},
789
+ [type]: message || true
790
+ }
791
+ } : {};
662
792
  const defaultResult = {
663
793
  value: false,
664
794
  isValid: false
@@ -686,10 +816,10 @@ var getRadioValue = (options) => Array.isArray(options) ? options.reduce((previo
686
816
  value: option.value
687
817
  } : previous, defaultReturn) : defaultReturn;
688
818
  function getValidateError(result, ref, type = "validate") {
689
- if (isMessage(result) || Array.isArray(result) && result.every(isMessage) || isBoolean(result) && !result) {
819
+ if (isString(result) || Array.isArray(result) && result.every(isString) || isBoolean(result) && !result) {
690
820
  return {
691
821
  type,
692
- message: isMessage(result) ? result : "",
822
+ message: isString(result) ? result : "",
693
823
  ref
694
824
  };
695
825
  }
@@ -698,16 +828,21 @@ var getValueAndMessage = (validationData) => isObject(validationData) && !isRege
698
828
  value: validationData,
699
829
  message: ""
700
830
  };
701
- var validateField = async (field, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {
702
- const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, disabled } = field._f;
831
+ var validateField = async (field, disabledFieldNames, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {
832
+ const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount } = field._f;
703
833
  const inputValue = get(formValues, name);
704
- if (!mount || disabled) {
834
+ if (!mount || disabledFieldNames.has(name)) {
705
835
  return {};
706
836
  }
707
837
  const inputRef = refs ? refs[0] : ref;
708
838
  const setCustomValidity = (message) => {
709
839
  if (shouldUseNativeValidation && inputRef.reportValidity) {
710
- inputRef.setCustomValidity(isBoolean(message) ? "" : message || "");
840
+ const validityMessage = isBoolean(message) ? "" : message || "";
841
+ if (refs) {
842
+ refs.forEach((ref2) => ref2.setCustomValidity(validityMessage));
843
+ } else {
844
+ inputRef.setCustomValidity(validityMessage);
845
+ }
711
846
  inputRef.reportValidity();
712
847
  }
713
848
  };
@@ -727,7 +862,7 @@ var validateField = async (field, formValues, validateAllFieldCriteria, shouldUs
727
862
  };
728
863
  };
729
864
  if (isFieldArray ? !Array.isArray(inputValue) || !inputValue.length : required && (!isRadioOrCheckbox2 && (isEmpty || isNullOrUndefined(inputValue)) || isBoolean(inputValue) && !inputValue || isCheckBox && !getCheckboxValue(refs).isValid || isRadio && !getRadioValue(refs).isValid)) {
730
- const { value, message } = isMessage(required) ? { value: !!required, message: required } : getValueAndMessage(required);
865
+ const { value, message } = isString(required) ? { value: !!required, message: required } : getValueAndMessage(required);
731
866
  if (value) {
732
867
  error[name] = {
733
868
  type: INPUT_VALIDATION_RULES.required,
@@ -848,11 +983,18 @@ var validateField = async (field, formValues, validateAllFieldCriteria, shouldUs
848
983
  setCustomValidity(true);
849
984
  return error;
850
985
  };
986
+ var convertToArrayPayload = (value) => Array.isArray(value) ? value : [value];
987
+ var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
851
988
  function baseGet(object, updatePath) {
852
989
  const length = updatePath.slice(0, -1).length;
853
990
  let index = 0;
854
991
  while (index < length) {
855
- object = isUndefined(object) ? index++ : object[updatePath[index++]];
992
+ if (isNullOrUndefined(object)) {
993
+ object = void 0;
994
+ break;
995
+ }
996
+ object = object[updatePath[index]];
997
+ index++;
856
998
  }
857
999
  return object;
858
1000
  }
@@ -865,7 +1007,14 @@ function isEmptyArray(obj) {
865
1007
  return true;
866
1008
  }
867
1009
  function unset(object, path) {
1010
+ if (isString(path) && Object.prototype.hasOwnProperty.call(object, path)) {
1011
+ delete object[path];
1012
+ return object;
1013
+ }
868
1014
  const paths = Array.isArray(path) ? path : isKey(path) ? [path] : stringToPath(path);
1015
+ if (paths.some((segment) => PROTOTYPE_KEYWORDS.includes(String(segment)))) {
1016
+ return object;
1017
+ }
869
1018
  const childObject = paths.length === 1 ? object : baseGet(object, paths);
870
1019
  const index = paths.length - 1;
871
1020
  const key = paths[index];
@@ -877,6 +1026,22 @@ function unset(object, path) {
877
1026
  }
878
1027
  return object;
879
1028
  }
1029
+ const flatten = (obj) => {
1030
+ const output = {};
1031
+ for (const key of Object.keys(obj)) {
1032
+ if (isObjectType(obj[key]) && obj[key] !== null && !isDateObject(obj[key])) {
1033
+ const nested = flatten(obj[key]);
1034
+ for (const nestedKey of Object.keys(nested)) {
1035
+ output[`${key}.${nestedKey}`] = nested[nestedKey];
1036
+ }
1037
+ } else {
1038
+ output[key] = obj[key];
1039
+ }
1040
+ }
1041
+ return output;
1042
+ };
1043
+ const HookFormContext = React.createContext(null);
1044
+ HookFormContext.displayName = "HookFormContext";
880
1045
  var createSubject = () => {
881
1046
  let _observers = [];
882
1047
  const next = (value) => {
@@ -904,32 +1069,23 @@ var createSubject = () => {
904
1069
  unsubscribe
905
1070
  };
906
1071
  };
907
- var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
908
- function deepEqual(object1, object2) {
909
- if (isPrimitive(object1) || isPrimitive(object2)) {
910
- return object1 === object2;
911
- }
912
- if (isDateObject(object1) && isDateObject(object2)) {
913
- return object1.getTime() === object2.getTime();
914
- }
915
- const keys1 = Object.keys(object1);
916
- const keys2 = Object.keys(object2);
917
- if (keys1.length !== keys2.length) {
918
- return false;
919
- }
920
- for (const key of keys1) {
921
- const val1 = object1[key];
922
- if (!keys2.includes(key)) {
923
- return false;
924
- }
925
- if (key !== "ref") {
926
- const val2 = object2[key];
927
- if (isDateObject(val1) && isDateObject(val2) || isObject(val1) && isObject(val2) || Array.isArray(val1) && Array.isArray(val2) ? !deepEqual(val1, val2) : val1 !== val2) {
928
- return false;
1072
+ function extractFormValues(fieldsState, formValues) {
1073
+ const values = {};
1074
+ for (const key in fieldsState) {
1075
+ if (fieldsState.hasOwnProperty(key)) {
1076
+ const fieldState = fieldsState[key];
1077
+ const fieldValue = formValues[key];
1078
+ if (fieldState && isObject(fieldState) && fieldValue) {
1079
+ const nestedFieldsState = extractFormValues(fieldState, fieldValue);
1080
+ if (isObject(nestedFieldsState)) {
1081
+ values[key] = nestedFieldsState;
1082
+ }
1083
+ } else if (fieldsState[key]) {
1084
+ values[key] = fieldValue;
929
1085
  }
930
1086
  }
931
1087
  }
932
- return true;
1088
+ return values;
933
1089
  }
934
1090
  var isMultipleSelect = (element) => element.type === `select-multiple`;
935
1091
  var isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);
@@ -942,44 +1098,65 @@ var objectHasFunction = (data) => {
942
1098
  }
943
1099
  return false;
944
1100
  };
945
- function markFieldsDirty(data, fields = {}) {
946
- const isParentNodeArray = Array.isArray(data);
947
- if (isObject(data) || isParentNodeArray) {
948
- for (const key in data) {
949
- if (Array.isArray(data[key]) || isObject(data[key]) && !objectHasFunction(data[key])) {
950
- fields[key] = Array.isArray(data[key]) ? [] : {};
951
- markFieldsDirty(data[key], fields[key]);
952
- } else if (!isNullOrUndefined(data[key])) {
953
- fields[key] = true;
1101
+ function isTraversable(value) {
1102
+ return Array.isArray(value) || isObject(value) && !objectHasFunction(value);
1103
+ }
1104
+ function isRegisteredLeaf(fieldRef) {
1105
+ return !!(fieldRef && "_f" in fieldRef);
1106
+ }
1107
+ function isEmptyDirtyContainer(value) {
1108
+ return Array.isArray(value) ? !value.some((item) => !isUndefined(item)) : !Object.keys(value).length;
1109
+ }
1110
+ function clearDirtyField(container, key) {
1111
+ if (Array.isArray(container)) {
1112
+ container[key] = void 0;
1113
+ } else {
1114
+ delete container[key];
1115
+ }
1116
+ }
1117
+ function markFieldsDirty(data, fields = {}, fieldRefs) {
1118
+ for (const key in data) {
1119
+ const value = data[key];
1120
+ const fieldRef = fieldRefs && fieldRefs[key];
1121
+ if (isTraversable(value) && (!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
1122
+ fields[key] = Array.isArray(value) ? [] : {};
1123
+ markFieldsDirty(value, fields[key], fieldRef);
1124
+ if (isEmptyDirtyContainer(fields[key])) {
1125
+ clearDirtyField(fields, key);
954
1126
  }
1127
+ } else if (!isUndefined(value)) {
1128
+ fields[key] = true;
955
1129
  }
956
1130
  }
957
1131
  return fields;
958
1132
  }
959
- function getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {
960
- const isParentNodeArray = Array.isArray(data);
961
- if (isObject(data) || isParentNodeArray) {
962
- for (const key in data) {
963
- if (Array.isArray(data[key]) || isObject(data[key]) && !objectHasFunction(data[key])) {
964
- if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {
965
- dirtyFieldsFromValues[key] = Array.isArray(data[key]) ? markFieldsDirty(data[key], []) : { ...markFieldsDirty(data[key]) };
966
- } else {
967
- getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
968
- }
1133
+ function getDirtyFields(data, formValues, dirtyFieldsFromValues, fieldRefs) {
1134
+ if (!dirtyFieldsFromValues) {
1135
+ dirtyFieldsFromValues = markFieldsDirty(formValues, {}, fieldRefs);
1136
+ }
1137
+ for (const key in data) {
1138
+ const value = data[key];
1139
+ const fieldRef = fieldRefs && fieldRefs[key];
1140
+ if (isTraversable(value) && (!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
1141
+ if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {
1142
+ dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {}, fieldRef);
969
1143
  } else {
970
- dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
1144
+ getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key], fieldRef);
1145
+ }
1146
+ if (isEmptyDirtyContainer(dirtyFieldsFromValues[key])) {
1147
+ clearDirtyField(dirtyFieldsFromValues, key);
971
1148
  }
1149
+ } else if (deepEqual(value, formValues[key])) {
1150
+ clearDirtyField(dirtyFieldsFromValues, key);
1151
+ } else {
1152
+ dirtyFieldsFromValues[key] = true;
972
1153
  }
973
1154
  }
974
1155
  return dirtyFieldsFromValues;
975
1156
  }
976
- var getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));
977
1157
  var getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isUndefined(value) ? value : valueAsNumber ? value === "" ? NaN : value ? +value : value : valueAsDate && isString(value) ? new Date(value) : setValueAs ? setValueAs(value) : value;
978
1158
  function getFieldValue(_f) {
979
1159
  const ref = _f.ref;
980
- if (_f.refs ? _f.refs.every((ref2) => ref2.disabled) : ref.disabled) {
981
- return;
982
- }
983
1160
  if (isFileInput(ref)) {
984
1161
  return ref.files;
985
1162
  }
@@ -1008,6 +1185,22 @@ var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeVal
1008
1185
  };
1009
1186
  };
1010
1187
  var getRuleValue = (rule) => isUndefined(rule) ? rule : isRegex(rule) ? rule.source : isObject(rule) ? isRegex(rule.value) ? rule.value.source : rule.value : rule;
1188
+ const ASYNC_FUNCTION = "AsyncFunction";
1189
+ var hasPromiseValidation = (fieldReference) => {
1190
+ if (!fieldReference || !fieldReference.validate)
1191
+ return false;
1192
+ if (isFunction(fieldReference.validate)) {
1193
+ return fieldReference.validate.constructor.name === ASYNC_FUNCTION;
1194
+ }
1195
+ if (isObject(fieldReference.validate)) {
1196
+ for (const key in fieldReference.validate) {
1197
+ if (fieldReference.validate[key].constructor.name === ASYNC_FUNCTION) {
1198
+ return true;
1199
+ }
1200
+ }
1201
+ }
1202
+ return false;
1203
+ };
1011
1204
  var hasValidation = (options) => options.mount && (options.required || options.min || options.max || options.maxLength || options.minLength || options.pattern || options.validate);
1012
1205
  function schemaErrorLookup(errors, _fields, name) {
1013
1206
  const error = get(errors, name);
@@ -1031,12 +1224,25 @@ function schemaErrorLookup(errors, _fields, name) {
1031
1224
  error: foundError
1032
1225
  };
1033
1226
  }
1227
+ if (foundError && foundError.root && foundError.root.type) {
1228
+ return {
1229
+ name: `${fieldName}.root`,
1230
+ error: foundError.root
1231
+ };
1232
+ }
1034
1233
  names.pop();
1035
1234
  }
1036
1235
  return {
1037
1236
  name
1038
1237
  };
1039
1238
  }
1239
+ var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {
1240
+ updateFormState(formStateData);
1241
+ const { name, ...formState } = formStateData;
1242
+ const keys = Object.keys(formState);
1243
+ return !keys.length || isRoot && keys.length >= Object.keys(_proxyFormState).length || keys.find((key) => _proxyFormState[key] === (!isRoot || VALIDATION_MODE.all));
1244
+ };
1245
+ var shouldSubscribeByName = (name, signalName, exact) => !name || !signalName || name === signalName || convertToArrayPayload(name).some((currentName) => currentName && (exact ? currentName === signalName || currentName.startsWith(signalName + ".") : currentName.startsWith(signalName) || signalName.startsWith(currentName)));
1040
1246
  var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {
1041
1247
  if (mode.isOnAll) {
1042
1248
  return false;
@@ -1055,24 +1261,38 @@ const defaultOptions = {
1055
1261
  reValidateMode: VALIDATION_MODE.onChange,
1056
1262
  shouldFocusError: true
1057
1263
  };
1058
- function createFormControl(props = {}, flushRootRender) {
1264
+ const FORM_ERROR_TYPE = "form";
1265
+ const updateDirtyFields = (dirtyFields, nextDirtyFields) => {
1266
+ for (const key in dirtyFields) {
1267
+ if (!(key in nextDirtyFields)) {
1268
+ delete dirtyFields[key];
1269
+ }
1270
+ }
1271
+ Object.assign(dirtyFields, nextDirtyFields);
1272
+ };
1273
+ const DEFAULT_FORM_STATE = {
1274
+ submitCount: 0,
1275
+ isDirty: false,
1276
+ isReady: false,
1277
+ isValidating: false,
1278
+ isSubmitted: false,
1279
+ isSubmitting: false,
1280
+ isSubmitSuccessful: false,
1281
+ isValid: false,
1282
+ touchedFields: {},
1283
+ dirtyFields: {},
1284
+ validatingFields: {}
1285
+ };
1286
+ function createFormControl(props = {}) {
1059
1287
  let _options = {
1060
1288
  ...defaultOptions,
1061
1289
  ...props
1062
1290
  };
1063
1291
  let _formState = {
1064
- submitCount: 0,
1065
- isDirty: false,
1292
+ ...cloneObject(DEFAULT_FORM_STATE),
1066
1293
  isLoading: isFunction(_options.defaultValues),
1067
- isValidating: false,
1068
- isSubmitted: false,
1069
- isSubmitting: false,
1070
- isSubmitSuccessful: false,
1071
- isValid: false,
1072
- touchedFields: {},
1073
- dirtyFields: {},
1074
1294
  errors: _options.errors || {},
1075
- disabled: false
1295
+ disabled: _options.disabled || false
1076
1296
  };
1077
1297
  let _fields = {};
1078
1298
  let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values) ? cloneObject(_options.defaultValues || _options.values) || {} : {};
@@ -1080,52 +1300,89 @@ function createFormControl(props = {}, flushRootRender) {
1080
1300
  let _state = {
1081
1301
  action: false,
1082
1302
  mount: false,
1083
- watch: false
1303
+ watch: false,
1304
+ keepIsValid: false
1084
1305
  };
1085
1306
  let _names = {
1086
1307
  mount: /* @__PURE__ */ new Set(),
1308
+ disabled: /* @__PURE__ */ new Set(),
1087
1309
  unMount: /* @__PURE__ */ new Set(),
1088
1310
  array: /* @__PURE__ */ new Set(),
1089
- watch: /* @__PURE__ */ new Set()
1311
+ watch: /* @__PURE__ */ new Set(),
1312
+ registerName: /* @__PURE__ */ new Set()
1090
1313
  };
1091
- let delayErrorCallback;
1092
- let timer = 0;
1093
- const _proxyFormState = {
1314
+ const delayErrorCallbacks = {};
1315
+ const timers = {};
1316
+ let _valuesSubscriberCount = 0;
1317
+ let _validationModeBeforeSubmit = getValidationModes(_options.mode);
1318
+ let _validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
1319
+ const defaultProxyFormState = {
1094
1320
  isDirty: false,
1095
1321
  dirtyFields: false,
1322
+ validatingFields: false,
1096
1323
  touchedFields: false,
1097
1324
  isValidating: false,
1098
1325
  isValid: false,
1099
1326
  errors: false
1100
1327
  };
1328
+ const _proxyFormState = {
1329
+ ...defaultProxyFormState
1330
+ };
1331
+ let _proxySubscribeFormState = {
1332
+ ..._proxyFormState
1333
+ };
1101
1334
  const _subjects = {
1102
- values: createSubject(),
1103
1335
  array: createSubject(),
1104
1336
  state: createSubject()
1105
1337
  };
1106
- const shouldCaptureDirtyFields = props.resetOptions && props.resetOptions.keepDirtyValues;
1107
- const validationModeBeforeSubmit = getValidationModes(_options.mode);
1108
- const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
1338
+ let _setValidCallId = 0;
1109
1339
  const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;
1110
- const debounce = (callback) => (wait) => {
1111
- clearTimeout(timer);
1112
- timer = setTimeout(callback, wait);
1113
- };
1114
- const _updateValid = async (shouldUpdateValid) => {
1115
- if (_proxyFormState.isValid || shouldUpdateValid) {
1116
- const isValid = _options.resolver ? isEmptyObject((await _executeSchema()).errors) : await executeBuiltInValidation(_fields, true);
1117
- if (isValid !== _formState.isValid) {
1340
+ const debounce = (name, callback) => (wait) => {
1341
+ clearTimeout(timers[name]);
1342
+ timers[name] = setTimeout(callback, wait);
1343
+ };
1344
+ const _setValid = async (shouldUpdateValid) => {
1345
+ if (_state.keepIsValid) {
1346
+ return;
1347
+ }
1348
+ if (!_options.disabled && (_proxyFormState.isValid || _proxySubscribeFormState.isValid || shouldUpdateValid)) {
1349
+ const callId = ++_setValidCallId;
1350
+ let isValid;
1351
+ if (_options.resolver) {
1352
+ isValid = isEmptyObject((await _runSchema()).errors);
1353
+ callId === _setValidCallId && _updateIsValidating();
1354
+ } else {
1355
+ isValid = await executeBuiltInValidation({
1356
+ fields: _fields,
1357
+ onlyCheckValid: true,
1358
+ eventType: EVENTS.VALID
1359
+ });
1360
+ }
1361
+ if (callId === _setValidCallId && isValid !== _formState.isValid) {
1118
1362
  _subjects.state.next({
1119
1363
  isValid
1120
1364
  });
1121
1365
  }
1122
1366
  }
1123
1367
  };
1124
- const _updateIsValidating = (value) => _proxyFormState.isValidating && _subjects.state.next({
1125
- isValidating: value
1126
- });
1127
- const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
1128
- if (args && method) {
1368
+ const _updateIsValidating = (names, isValidating) => {
1369
+ if (!_options.disabled && (_proxyFormState.isValidating || _proxyFormState.validatingFields || _proxySubscribeFormState.isValidating || _proxySubscribeFormState.validatingFields)) {
1370
+ (names || Array.from(_names.mount)).forEach((name) => {
1371
+ if (name) {
1372
+ isValidating ? set(_formState.validatingFields, name, isValidating) : unset(_formState.validatingFields, name);
1373
+ }
1374
+ });
1375
+ _subjects.state.next({
1376
+ validatingFields: _formState.validatingFields,
1377
+ isValidating: !isEmptyObject(_formState.validatingFields)
1378
+ });
1379
+ }
1380
+ };
1381
+ const _updateDirtyFields = () => {
1382
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues, void 0, _fields);
1383
+ };
1384
+ const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
1385
+ if (args && method && !_options.disabled) {
1129
1386
  _state.action = true;
1130
1387
  if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {
1131
1388
  const fieldValues = method(get(_fields, name), args.argA, args.argB);
@@ -1136,12 +1393,12 @@ function createFormControl(props = {}, flushRootRender) {
1136
1393
  shouldSetValues && set(_formState.errors, name, errors);
1137
1394
  unsetEmptyArray(_formState.errors, name);
1138
1395
  }
1139
- if (_proxyFormState.touchedFields && shouldUpdateFieldsAndState && Array.isArray(get(_formState.touchedFields, name))) {
1396
+ if ((_proxyFormState.touchedFields || _proxySubscribeFormState.touchedFields) && shouldUpdateFieldsAndState && Array.isArray(get(_formState.touchedFields, name))) {
1140
1397
  const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
1141
1398
  shouldSetValues && set(_formState.touchedFields, name, touchedFields);
1142
1399
  }
1143
- if (_proxyFormState.dirtyFields) {
1144
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1400
+ if (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) {
1401
+ _updateDirtyFields();
1145
1402
  }
1146
1403
  _subjects.state.next({
1147
1404
  name,
@@ -1156,6 +1413,7 @@ function createFormControl(props = {}, flushRootRender) {
1156
1413
  };
1157
1414
  const updateErrors = (name, error) => {
1158
1415
  set(_formState.errors, name, error);
1416
+ _formState.errors = { ..._formState.errors };
1159
1417
  _subjects.state.next({
1160
1418
  errors: _formState.errors
1161
1419
  });
@@ -1167,12 +1425,42 @@ function createFormControl(props = {}, flushRootRender) {
1167
1425
  isValid: false
1168
1426
  });
1169
1427
  };
1428
+ const hasExplicitNullIntermediate = (name) => {
1429
+ const segments = isKey(name) ? [name] : stringToPath(name);
1430
+ let formValues = _formValues;
1431
+ let defaultValues = _defaultValues;
1432
+ for (let i = 0; i < segments.length - 1; i++) {
1433
+ const key = segments[i];
1434
+ formValues = isNullOrUndefined(formValues) ? formValues : formValues[key];
1435
+ defaultValues = isNullOrUndefined(defaultValues) ? defaultValues : defaultValues[key];
1436
+ if (formValues === null && defaultValues !== null) {
1437
+ return true;
1438
+ }
1439
+ }
1440
+ return false;
1441
+ };
1170
1442
  const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
1171
1443
  const field = get(_fields, name);
1172
1444
  if (field) {
1445
+ if (hasExplicitNullIntermediate(name)) {
1446
+ return;
1447
+ }
1448
+ const wasUnsetInFormValues = isUndefined(get(_formValues, name));
1173
1449
  const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
1174
1450
  isUndefined(defaultValue) || ref && ref.defaultChecked || shouldSkipSetValueAs ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f)) : setFieldValue(name, defaultValue);
1175
- _state.mount && _updateValid();
1451
+ if (_state.mount && !_state.action) {
1452
+ _setValid();
1453
+ if (wasUnsetInFormValues && _formState.isDirty && (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty)) {
1454
+ const isDirty = _getDirty();
1455
+ if (!isDirty) {
1456
+ _formState.isDirty = false;
1457
+ _subjects.state.next({ ..._formState });
1458
+ }
1459
+ }
1460
+ if (props.shouldUnregister && wasUnsetInFormValues && !isUndefined(get(_formValues, name)) && isWatched(name, _names)) {
1461
+ _state.watch = true;
1462
+ }
1463
+ }
1176
1464
  }
1177
1465
  };
1178
1466
  const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
@@ -1181,40 +1469,46 @@ function createFormControl(props = {}, flushRootRender) {
1181
1469
  const output = {
1182
1470
  name
1183
1471
  };
1184
- const disabledField = get(_fields, name) && get(_fields, name)._f.disabled;
1185
- if (!isBlurEvent || shouldDirty) {
1186
- if (_proxyFormState.isDirty) {
1187
- isPreviousDirty = _formState.isDirty;
1188
- _formState.isDirty = output.isDirty = _getDirty();
1189
- shouldUpdateField = isPreviousDirty !== output.isDirty;
1190
- }
1191
- const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);
1192
- isPreviousDirty = !disabledField && get(_formState.dirtyFields, name);
1193
- isCurrentFieldPristine || disabledField ? unset(_formState.dirtyFields, name) : set(_formState.dirtyFields, name, true);
1194
- output.dirtyFields = _formState.dirtyFields;
1195
- shouldUpdateField = shouldUpdateField || _proxyFormState.dirtyFields && isPreviousDirty !== !isCurrentFieldPristine;
1196
- }
1197
- if (isBlurEvent) {
1198
- const isPreviousFieldTouched = get(_formState.touchedFields, name);
1199
- if (!isPreviousFieldTouched) {
1200
- set(_formState.touchedFields, name, isBlurEvent);
1201
- output.touchedFields = _formState.touchedFields;
1202
- shouldUpdateField = shouldUpdateField || _proxyFormState.touchedFields && isPreviousFieldTouched !== isBlurEvent;
1203
- }
1204
- }
1205
- shouldUpdateField && shouldRender && _subjects.state.next(output);
1472
+ if (!_options.disabled || shouldDirty === true) {
1473
+ if (!isBlurEvent || shouldDirty) {
1474
+ const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
1475
+ if (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty) {
1476
+ isPreviousDirty = _formState.isDirty;
1477
+ _formState.isDirty = output.isDirty = !isCurrentFieldPristine || _getDirty();
1478
+ shouldUpdateField = isPreviousDirty !== output.isDirty;
1479
+ }
1480
+ isPreviousDirty = !!get(_formState.dirtyFields, name);
1481
+ if (isCurrentFieldPristine !== _formState.isDirty) {
1482
+ updateDirtyFields(_formState.dirtyFields, getDirtyFields(_defaultValues, _formValues, void 0, _fields));
1483
+ } else {
1484
+ isCurrentFieldPristine ? unset(_formState.dirtyFields, name) : set(_formState.dirtyFields, name, true);
1485
+ }
1486
+ output.dirtyFields = _formState.dirtyFields;
1487
+ shouldUpdateField = shouldUpdateField || (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) && isPreviousDirty !== !isCurrentFieldPristine;
1488
+ }
1489
+ if (isBlurEvent) {
1490
+ const isPreviousFieldTouched = get(_formState.touchedFields, name);
1491
+ if (!isPreviousFieldTouched) {
1492
+ set(_formState.touchedFields, name, isBlurEvent);
1493
+ output.touchedFields = _formState.touchedFields;
1494
+ shouldUpdateField = shouldUpdateField || (_proxyFormState.touchedFields || _proxySubscribeFormState.touchedFields) && isPreviousFieldTouched !== isBlurEvent;
1495
+ }
1496
+ }
1497
+ shouldUpdateField && shouldRender && _subjects.state.next(output);
1498
+ }
1206
1499
  return shouldUpdateField ? output : {};
1207
1500
  };
1208
1501
  const shouldRenderByError = (name, isValid, error, fieldState) => {
1209
1502
  const previousFieldError = get(_formState.errors, name);
1210
- const shouldUpdateValid = _proxyFormState.isValid && isBoolean(isValid) && _formState.isValid !== isValid;
1211
- if (props.delayError && error) {
1212
- delayErrorCallback = debounce(() => updateErrors(name, error));
1213
- delayErrorCallback(props.delayError);
1503
+ const shouldUpdateValid = (_proxyFormState.isValid || _proxySubscribeFormState.isValid) && isBoolean(isValid) && _formState.isValid !== isValid;
1504
+ if (_options.delayError && error) {
1505
+ delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
1506
+ delayErrorCallbacks[name](_options.delayError);
1214
1507
  } else {
1215
- clearTimeout(timer);
1216
- delayErrorCallback = null;
1508
+ clearTimeout(timers[name]);
1509
+ delete delayErrorCallbacks[name];
1217
1510
  error ? set(_formState.errors, name, error) : unset(_formState.errors, name);
1511
+ _formState.errors = { ..._formState.errors };
1218
1512
  }
1219
1513
  if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) || !isEmptyObject(fieldState) || shouldUpdateValid) {
1220
1514
  const updatedFormState = {
@@ -1229,40 +1523,105 @@ function createFormControl(props = {}, flushRootRender) {
1229
1523
  };
1230
1524
  _subjects.state.next(updatedFormState);
1231
1525
  }
1232
- _updateIsValidating(false);
1233
1526
  };
1234
- const _executeSchema = async (name) => _options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));
1527
+ const _runSchema = async (name) => {
1528
+ _updateIsValidating(name, true);
1529
+ return await _options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));
1530
+ };
1235
1531
  const executeSchemaAndUpdateState = async (names) => {
1236
- const { errors } = await _executeSchema(names);
1532
+ const { errors } = await _runSchema(names);
1533
+ _updateIsValidating(names);
1237
1534
  if (names) {
1238
1535
  for (const name of names) {
1239
1536
  const error = get(errors, name);
1240
- error ? set(_formState.errors, name, error) : unset(_formState.errors, name);
1537
+ error ? _names.array.has(name) && isObject(error) && !Object.keys(error).some((key) => !Number.isNaN(Number(key))) ? updateFieldArrayRootError(_formState.errors, { [name]: error }, name) : set(_formState.errors, name, error) : unset(_formState.errors, name);
1241
1538
  }
1539
+ _formState.errors = { ..._formState.errors };
1242
1540
  } else {
1243
1541
  _formState.errors = errors;
1244
1542
  }
1245
1543
  return errors;
1246
1544
  };
1247
- const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {
1248
- valid: true
1249
- }) => {
1250
- for (const name in fields) {
1251
- const field = fields[name];
1545
+ const validateForm = async ({ name, eventType }) => {
1546
+ if (props.validate) {
1547
+ const result = await props.validate({
1548
+ formValues: _formValues,
1549
+ formState: _formState,
1550
+ name,
1551
+ eventType
1552
+ });
1553
+ if (isObject(result)) {
1554
+ for (const key in result) {
1555
+ const error = result[key];
1556
+ if (error) {
1557
+ setError(`${FORM_ERROR_TYPE}.${key}`, {
1558
+ message: isString(error.message) ? error.message : "",
1559
+ type: error.type || INPUT_VALIDATION_RULES.validate
1560
+ });
1561
+ }
1562
+ }
1563
+ } else if (isString(result) || !result) {
1564
+ setError(FORM_ERROR_TYPE, {
1565
+ message: result || "",
1566
+ type: INPUT_VALIDATION_RULES.validate
1567
+ });
1568
+ } else {
1569
+ clearErrors(FORM_ERROR_TYPE);
1570
+ }
1571
+ return result;
1572
+ }
1573
+ return true;
1574
+ };
1575
+ const executeBuiltInValidation = async ({ fields, onlyCheckValid, name, eventType, context = {
1576
+ valid: true,
1577
+ runRootValidation: false
1578
+ } }) => {
1579
+ if (props.validate) {
1580
+ context.runRootValidation = true;
1581
+ const result = await validateForm({
1582
+ name,
1583
+ eventType
1584
+ });
1585
+ if (!result) {
1586
+ context.valid = false;
1587
+ if (onlyCheckValid) {
1588
+ return context.valid;
1589
+ }
1590
+ }
1591
+ }
1592
+ for (const name2 in fields) {
1593
+ const field = fields[name2];
1252
1594
  if (field) {
1253
1595
  const { _f, ...fieldValue } = field;
1254
1596
  if (_f) {
1255
1597
  const isFieldArrayRoot = _names.array.has(_f.name);
1256
- const fieldError = await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !shouldOnlyCheckValid, isFieldArrayRoot);
1598
+ const isPromiseFunction = field._f && hasPromiseValidation(field._f);
1599
+ const shouldTrackIsValidatingState = _proxyFormState.validatingFields || _proxyFormState.isValidating || _proxySubscribeFormState.validatingFields || _proxySubscribeFormState.isValidating;
1600
+ if (isPromiseFunction && shouldTrackIsValidatingState) {
1601
+ _updateIsValidating([_f.name], true);
1602
+ }
1603
+ const fieldError = await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !onlyCheckValid, isFieldArrayRoot);
1604
+ if (isPromiseFunction && shouldTrackIsValidatingState) {
1605
+ _updateIsValidating([_f.name]);
1606
+ }
1257
1607
  if (fieldError[_f.name]) {
1258
1608
  context.valid = false;
1259
- if (shouldOnlyCheckValid) {
1609
+ if (onlyCheckValid) {
1260
1610
  break;
1261
1611
  }
1262
1612
  }
1263
- !shouldOnlyCheckValid && (get(fieldError, _f.name) ? isFieldArrayRoot ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name) : set(_formState.errors, _f.name, fieldError[_f.name]) : unset(_formState.errors, _f.name));
1613
+ !onlyCheckValid && (get(fieldError, _f.name) ? isFieldArrayRoot ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name) : set(_formState.errors, _f.name, fieldError[_f.name]) : unset(_formState.errors, _f.name));
1614
+ if (props.shouldUseNativeValidation && fieldError[_f.name]) {
1615
+ break;
1616
+ }
1264
1617
  }
1265
- fieldValue && await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context);
1618
+ !isEmptyObject(fieldValue) && await executeBuiltInValidation({
1619
+ context,
1620
+ onlyCheckValid,
1621
+ fields: fieldValue,
1622
+ name: name2,
1623
+ eventType
1624
+ });
1266
1625
  }
1267
1626
  }
1268
1627
  return context.valid;
@@ -1274,12 +1633,12 @@ function createFormControl(props = {}, flushRootRender) {
1274
1633
  }
1275
1634
  _names.unMount = /* @__PURE__ */ new Set();
1276
1635
  };
1277
- const _getDirty = (name, data) => (name && data && set(_formValues, name, data), !deepEqual(getValues(), _defaultValues));
1636
+ const _getDirty = (name, data) => (name && data && set(_formValues, name, data), !deepEqual(_state.mount ? _formValues : _defaultValues, _defaultValues));
1278
1637
  const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {
1279
1638
  ..._state.mount ? _formValues : isUndefined(defaultValue) ? _defaultValues : isString(names) ? { [names]: defaultValue } : defaultValue
1280
1639
  }, isGlobal, defaultValue);
1281
- const _getFieldArray = (name) => compact(get(_state.mount ? _formValues : _defaultValues, name, props.shouldUnregister ? get(_defaultValues, name, []) : []));
1282
- const setFieldValue = (name, value, options = {}) => {
1640
+ const _getFieldArray = (name) => compact(get(_state.mount ? _formValues : _defaultValues, name, _options.shouldUnregister ? get(_defaultValues, name, []) : []));
1641
+ const setFieldValue = (name, value, options = {}, skipClone = false, skipRender = false) => {
1283
1642
  const field = get(_fields, name);
1284
1643
  let fieldValue = value;
1285
1644
  if (field) {
@@ -1291,7 +1650,15 @@ function createFormControl(props = {}, flushRootRender) {
1291
1650
  [...fieldReference.ref.options].forEach((optionRef) => optionRef.selected = fieldValue.includes(optionRef.value));
1292
1651
  } else if (fieldReference.refs) {
1293
1652
  if (isCheckBoxInput(fieldReference.ref)) {
1294
- fieldReference.refs.length > 1 ? fieldReference.refs.forEach((checkboxRef) => (!checkboxRef.defaultChecked || !checkboxRef.disabled) && (checkboxRef.checked = Array.isArray(fieldValue) ? !!fieldValue.find((data) => data === checkboxRef.value) : fieldValue === checkboxRef.value)) : fieldReference.refs[0] && (fieldReference.refs[0].checked = !!fieldValue);
1653
+ fieldReference.refs.forEach((checkboxRef) => {
1654
+ if (!checkboxRef.defaultChecked || !checkboxRef.disabled) {
1655
+ if (Array.isArray(fieldValue)) {
1656
+ checkboxRef.checked = !!fieldValue.find((data) => data === checkboxRef.value);
1657
+ } else {
1658
+ checkboxRef.checked = fieldValue === checkboxRef.value || !!fieldValue;
1659
+ }
1660
+ }
1661
+ });
1295
1662
  } else {
1296
1663
  fieldReference.refs.forEach((radioRef) => radioRef.checked = radioRef.value === fieldValue);
1297
1664
  }
@@ -1299,112 +1666,184 @@ function createFormControl(props = {}, flushRootRender) {
1299
1666
  fieldReference.ref.value = "";
1300
1667
  } else {
1301
1668
  fieldReference.ref.value = fieldValue;
1302
- if (!fieldReference.ref.type) {
1303
- _subjects.values.next({
1669
+ if (!fieldReference.ref.type && !skipRender) {
1670
+ _subjects.state.next({
1304
1671
  name,
1305
- values: { ..._formValues }
1672
+ values: skipClone ? _formValues : cloneObject(_formValues)
1306
1673
  });
1307
1674
  }
1308
1675
  }
1309
1676
  }
1310
1677
  }
1311
- (options.shouldDirty || options.shouldTouch) && updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);
1312
- options.shouldValidate && trigger(name);
1678
+ (options.shouldDirty || options.shouldTouch) && updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, !skipRender);
1679
+ options.shouldValidate && trigger(name, {
1680
+ delayError: options.delayError
1681
+ });
1313
1682
  };
1314
- const setValues = (name, value, options) => {
1683
+ const setFieldValues = (name, value, options, skipClone = false, skipRender = false) => {
1315
1684
  for (const fieldKey in value) {
1685
+ if (!value.hasOwnProperty(fieldKey)) {
1686
+ return;
1687
+ }
1316
1688
  const fieldValue = value[fieldKey];
1317
- const fieldName = `${name}.${fieldKey}`;
1689
+ const fieldName = name + "." + fieldKey;
1318
1690
  const field = get(_fields, fieldName);
1319
- (_names.array.has(name) || !isPrimitive(fieldValue) || field && !field._f) && !isDateObject(fieldValue) ? setValues(fieldName, fieldValue, options) : setFieldValue(fieldName, fieldValue, options);
1691
+ (_names.array.has(name) || isObject(fieldValue) || field && !field._f) && !isDateObject(fieldValue) ? setFieldValues(fieldName, fieldValue, options, skipClone, skipRender) : setFieldValue(fieldName, fieldValue, options, skipClone, skipRender);
1320
1692
  }
1321
1693
  };
1322
- const setValue = (name, value, options = {}) => {
1694
+ const _setValue = (name, value, options, skipClone, skipStateEmit = false) => {
1323
1695
  const field = get(_fields, name);
1324
1696
  const isFieldArray = _names.array.has(name);
1325
- const cloneValue = cloneObject(value);
1326
- set(_formValues, name, cloneValue);
1697
+ const cloneValue = skipClone ? value : cloneObject(value);
1698
+ const previousValue = get(_formValues, name);
1699
+ const isValueUnchanged = deepEqual(previousValue, cloneValue);
1700
+ if (!isValueUnchanged) {
1701
+ set(_formValues, name, cloneValue);
1702
+ }
1327
1703
  if (isFieldArray) {
1328
1704
  _subjects.array.next({
1329
1705
  name,
1330
- values: { ..._formValues }
1706
+ values: skipClone ? _formValues : cloneObject(_formValues)
1331
1707
  });
1332
- if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) && options.shouldDirty) {
1333
- _subjects.state.next({
1334
- name,
1335
- dirtyFields: getDirtyFields(_defaultValues, _formValues),
1336
- isDirty: _getDirty(name, cloneValue)
1337
- });
1708
+ if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields || _proxySubscribeFormState.isDirty || _proxySubscribeFormState.dirtyFields) && options.shouldDirty) {
1709
+ _updateDirtyFields();
1710
+ if (!skipStateEmit) {
1711
+ _subjects.state.next({
1712
+ name,
1713
+ dirtyFields: _formState.dirtyFields,
1714
+ isDirty: _getDirty(name, cloneValue)
1715
+ });
1716
+ }
1338
1717
  }
1339
1718
  } else {
1340
- field && !field._f && !isNullOrUndefined(cloneValue) ? setValues(name, cloneValue, options) : setFieldValue(name, cloneValue, options);
1719
+ const isEmpty = Array.isArray(cloneValue) && !cloneValue.length || isEmptyObject(cloneValue);
1720
+ if (!field || field._f || isNullOrUndefined(cloneValue) || isEmpty) {
1721
+ setFieldValue(name, cloneValue, options, skipClone, skipStateEmit);
1722
+ } else {
1723
+ setFieldValues(name, cloneValue, options, skipClone, skipStateEmit);
1724
+ }
1725
+ }
1726
+ if (!isValueUnchanged && !skipStateEmit) {
1727
+ const watched = isWatched(name, _names);
1728
+ const values = skipClone ? _formValues : cloneObject(_formValues);
1729
+ _subjects.state.next({
1730
+ ...watched && _formState,
1731
+ name: _state.mount || watched ? name : void 0,
1732
+ values
1733
+ });
1734
+ }
1735
+ };
1736
+ const setValue = (name, value, options = {}) => _setValue(name, value, options, false);
1737
+ const setValues = (formValues, options = {}) => {
1738
+ const updatedFormValues = isFunction(formValues) ? formValues(_formValues) : formValues;
1739
+ if (!deepEqual(_formValues, updatedFormValues)) {
1740
+ _formValues = {
1741
+ ..._formValues,
1742
+ ...updatedFormValues
1743
+ };
1744
+ const flattenedUpdates = flatten(updatedFormValues);
1745
+ for (const fieldName of _names.mount) {
1746
+ if (fieldName in flattenedUpdates) {
1747
+ _setValue(fieldName, flattenedUpdates[fieldName], options, true, true);
1748
+ }
1749
+ }
1750
+ _subjects.state.next({
1751
+ ..._formState,
1752
+ name: void 0,
1753
+ type: void 0,
1754
+ ..._valuesSubscriberCount ? { values: _formValues } : {}
1755
+ });
1756
+ if (options.shouldValidate) {
1757
+ _setValid();
1758
+ }
1341
1759
  }
1342
- isWatched(name, _names) && _subjects.state.next({ ..._formState });
1343
- _subjects.values.next({
1344
- name,
1345
- values: { ..._formValues }
1346
- });
1347
- !_state.mount && flushRootRender();
1348
1760
  };
1349
1761
  const onChange = async (event) => {
1762
+ _state.mount = true;
1350
1763
  const target = event.target;
1351
1764
  let name = target.name;
1352
1765
  let isFieldValueUpdated = true;
1353
1766
  const field = get(_fields, name);
1354
- const getCurrentFieldValue = () => target.type ? getFieldValue(field._f) : getEventValue(event);
1355
1767
  const _updateIsFieldValueUpdated = (fieldValue) => {
1356
- isFieldValueUpdated = Number.isNaN(fieldValue) || fieldValue === get(_formValues, name, fieldValue);
1768
+ isFieldValueUpdated = Number.isNaN(fieldValue) || isDateObject(fieldValue) && isNaN(fieldValue.getTime()) || deepEqual(fieldValue, get(_formValues, name, fieldValue));
1357
1769
  };
1358
1770
  if (field) {
1359
1771
  let error;
1360
1772
  let isValid;
1361
- const fieldValue = getCurrentFieldValue();
1773
+ const fieldValue = target.type ? getFieldValue(field._f) : getEventValue(event);
1362
1774
  const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;
1363
- const shouldSkipValidation = !hasValidation(field._f) && !_options.resolver && !get(_formState.errors, name) && !field._f.deps || skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);
1775
+ const hasNoValidationEffect = !hasValidation(field._f) && !props.validate && !_options.resolver && !get(_formState.errors, name) && !field._f.deps;
1776
+ const shouldSkipValidation = hasNoValidationEffect || skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, _validationModeAfterSubmit, _validationModeBeforeSubmit);
1364
1777
  const watched = isWatched(name, _names, isBlurEvent);
1365
1778
  set(_formValues, name, fieldValue);
1366
1779
  if (isBlurEvent) {
1367
- field._f.onBlur && field._f.onBlur(event);
1368
- delayErrorCallback && delayErrorCallback(0);
1780
+ if (!target || !target.readOnly) {
1781
+ field._f.onBlur && field._f.onBlur(event);
1782
+ const pendingDelayError = delayErrorCallbacks[name];
1783
+ pendingDelayError && pendingDelayError(0);
1784
+ }
1369
1785
  } else if (field._f.onChange) {
1370
1786
  field._f.onChange(event);
1371
1787
  }
1372
- const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent, false);
1788
+ const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent);
1373
1789
  const shouldRender = !isEmptyObject(fieldState) || watched;
1374
- !isBlurEvent && _subjects.values.next({
1790
+ !isBlurEvent && _subjects.state.next({
1375
1791
  name,
1376
1792
  type: event.type,
1377
- values: { ..._formValues }
1793
+ ..._valuesSubscriberCount ? { values: cloneObject(_formValues) } : {}
1378
1794
  });
1379
1795
  if (shouldSkipValidation) {
1380
- _proxyFormState.isValid && _updateValid();
1796
+ if ((!hasNoValidationEffect || !_formState.isValid) && (_proxyFormState.isValid || _proxySubscribeFormState.isValid)) {
1797
+ if (_options.mode === "onBlur") {
1798
+ if (isBlurEvent) {
1799
+ _setValid();
1800
+ }
1801
+ } else if (!isBlurEvent) {
1802
+ _setValid();
1803
+ }
1804
+ }
1381
1805
  return shouldRender && _subjects.state.next({ name, ...watched ? {} : fieldState });
1382
1806
  }
1807
+ if (!_options.resolver && props.validate) {
1808
+ await validateForm({
1809
+ name,
1810
+ eventType: event.type
1811
+ });
1812
+ }
1383
1813
  !isBlurEvent && watched && _subjects.state.next({ ..._formState });
1384
- _updateIsValidating(true);
1385
1814
  if (_options.resolver) {
1386
- const { errors } = await _executeSchema([name]);
1815
+ const { errors } = await _runSchema([name]);
1816
+ _updateIsValidating([name]);
1387
1817
  _updateIsFieldValueUpdated(fieldValue);
1388
- if (isFieldValueUpdated) {
1389
- const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
1390
- const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);
1391
- error = errorLookupResult.error;
1392
- name = errorLookupResult.name;
1393
- isValid = isEmptyObject(errors);
1818
+ if (!isFieldValueUpdated) {
1819
+ !isEmptyObject(fieldState) && _subjects.state.next(fieldState);
1820
+ return;
1394
1821
  }
1822
+ const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
1823
+ const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);
1824
+ error = errorLookupResult.error;
1825
+ name = errorLookupResult.name;
1826
+ isValid = isEmptyObject(errors);
1395
1827
  } else {
1396
- error = (await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];
1828
+ _updateIsValidating([name], true);
1829
+ error = (await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];
1830
+ _updateIsValidating([name]);
1397
1831
  _updateIsFieldValueUpdated(fieldValue);
1398
1832
  if (isFieldValueUpdated) {
1399
1833
  if (error) {
1400
1834
  isValid = false;
1401
- } else if (_proxyFormState.isValid) {
1402
- isValid = await executeBuiltInValidation(_fields, true);
1835
+ } else if (_proxyFormState.isValid || _proxySubscribeFormState.isValid) {
1836
+ isValid = await executeBuiltInValidation({
1837
+ fields: _fields,
1838
+ onlyCheckValid: true,
1839
+ name,
1840
+ eventType: event.type
1841
+ });
1403
1842
  }
1404
1843
  }
1405
1844
  }
1406
1845
  if (isFieldValueUpdated) {
1407
- field._f.deps && trigger(field._f.deps);
1846
+ field._f.deps && (!Array.isArray(field._f.deps) || field._f.deps.length > 0) && trigger(field._f.deps);
1408
1847
  shouldRenderByError(name, isValid, error, fieldState);
1409
1848
  }
1410
1849
  }
@@ -1420,7 +1859,6 @@ function createFormControl(props = {}, flushRootRender) {
1420
1859
  let isValid;
1421
1860
  let validationResult;
1422
1861
  const fieldNames = convertToArrayPayload(name);
1423
- _updateIsValidating(true);
1424
1862
  if (_options.resolver) {
1425
1863
  const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);
1426
1864
  isValid = isEmptyObject(errors);
@@ -1428,43 +1866,77 @@ function createFormControl(props = {}, flushRootRender) {
1428
1866
  } else if (name) {
1429
1867
  validationResult = (await Promise.all(fieldNames.map(async (fieldName) => {
1430
1868
  const field = get(_fields, fieldName);
1431
- return await executeBuiltInValidation(field && field._f ? { [fieldName]: field } : field);
1869
+ return await executeBuiltInValidation({
1870
+ fields: field && field._f ? { [fieldName]: field } : field,
1871
+ eventType: EVENTS.TRIGGER
1872
+ });
1432
1873
  }))).every(Boolean);
1433
- !(!validationResult && !_formState.isValid) && _updateValid();
1874
+ !(!validationResult && !_formState.isValid) && _setValid();
1434
1875
  } else {
1435
- validationResult = isValid = await executeBuiltInValidation(_fields);
1876
+ validationResult = isValid = await executeBuiltInValidation({
1877
+ fields: _fields,
1878
+ name,
1879
+ eventType: EVENTS.TRIGGER
1880
+ });
1881
+ }
1882
+ if (options.delayError && _options.delayError && isString(name)) {
1883
+ const error = get(_formState.errors, name);
1884
+ if (error) {
1885
+ unset(_formState.errors, name);
1886
+ delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
1887
+ delayErrorCallbacks[name](_options.delayError);
1888
+ } else {
1889
+ clearTimeout(timers[name]);
1890
+ delete delayErrorCallbacks[name];
1891
+ }
1436
1892
  }
1437
1893
  _subjects.state.next({
1438
- ...!isString(name) || _proxyFormState.isValid && isValid !== _formState.isValid ? {} : { name },
1894
+ ...!isString(name) || (_proxyFormState.isValid || _proxySubscribeFormState.isValid) && isValid !== _formState.isValid ? {} : { name },
1439
1895
  ..._options.resolver || !name ? { isValid } : {},
1440
- errors: _formState.errors,
1441
- isValidating: false
1896
+ errors: _formState.errors
1442
1897
  });
1443
1898
  options.shouldFocus && !validationResult && iterateFieldsByAction(_fields, _focusInput, name ? fieldNames : _names.mount);
1444
1899
  return validationResult;
1445
1900
  };
1446
- const getValues = (fieldNames) => {
1447
- const values = {
1448
- ..._defaultValues,
1449
- ..._state.mount ? _formValues : {}
1901
+ const getValues = (fieldNames, config2) => {
1902
+ let values = {
1903
+ ..._state.mount ? _formValues : _defaultValues
1450
1904
  };
1905
+ if (config2) {
1906
+ values = extractFormValues(config2.dirtyFields ? _formState.dirtyFields : _formState.touchedFields, values);
1907
+ }
1451
1908
  return isUndefined(fieldNames) ? values : isString(fieldNames) ? get(values, fieldNames) : fieldNames.map((name) => get(values, name));
1452
1909
  };
1453
1910
  const getFieldState = (name, formState) => ({
1454
1911
  invalid: !!get((formState || _formState).errors, name),
1455
1912
  isDirty: !!get((formState || _formState).dirtyFields, name),
1456
- isTouched: !!get((formState || _formState).touchedFields, name),
1457
- error: get((formState || _formState).errors, name)
1913
+ error: get((formState || _formState).errors, name),
1914
+ isValidating: !!get(_formState.validatingFields, name),
1915
+ isTouched: !!get((formState || _formState).touchedFields, name)
1458
1916
  });
1459
1917
  const clearErrors = (name) => {
1460
- name && convertToArrayPayload(name).forEach((inputName) => unset(_formState.errors, inputName));
1461
- _subjects.state.next({
1462
- errors: name ? _formState.errors : {}
1463
- });
1918
+ const names = name ? convertToArrayPayload(name) : void 0;
1919
+ names === null || names === void 0 ? void 0 : names.forEach((inputName) => unset(_formState.errors, inputName));
1920
+ if (names) {
1921
+ names.forEach((inputName) => {
1922
+ _subjects.state.next({
1923
+ name: inputName,
1924
+ errors: _formState.errors
1925
+ });
1926
+ });
1927
+ } else {
1928
+ _formState.errors = {};
1929
+ _subjects.state.next({
1930
+ errors: _formState.errors
1931
+ });
1932
+ }
1464
1933
  };
1465
1934
  const setError = (name, error, options) => {
1466
1935
  const ref = (get(_fields, name, { _f: {} })._f || {}).ref;
1936
+ const currentError = get(_formState.errors, name) || {};
1937
+ const { ref: currentRef, message, type, ...restOfErrorTree } = currentError;
1467
1938
  set(_formState.errors, name, {
1939
+ ...restOfErrorTree,
1468
1940
  ...error,
1469
1941
  ref
1470
1942
  });
@@ -1475,9 +1947,72 @@ function createFormControl(props = {}, flushRootRender) {
1475
1947
  });
1476
1948
  options && options.shouldFocus && ref && ref.focus && ref.focus();
1477
1949
  };
1478
- const watch = (name, defaultValue) => isFunction(name) ? _subjects.values.subscribe({
1479
- next: (payload) => name(_getWatch(void 0, defaultValue), payload)
1480
- }) : _getWatch(name, defaultValue, true);
1950
+ const watch = (name, defaultValue) => {
1951
+ if (isFunction(name)) {
1952
+ _valuesSubscriberCount++;
1953
+ const { unsubscribe } = _subjects.state.subscribe({
1954
+ next: (payload) => "values" in payload && name(payload.values || _getWatch(void 0, defaultValue), payload)
1955
+ });
1956
+ let called = false;
1957
+ return {
1958
+ unsubscribe: () => {
1959
+ if (called) {
1960
+ return;
1961
+ }
1962
+ called = true;
1963
+ _valuesSubscriberCount--;
1964
+ unsubscribe();
1965
+ }
1966
+ };
1967
+ }
1968
+ return _getWatch(name, defaultValue, true);
1969
+ };
1970
+ const _subscribe = (props2) => {
1971
+ var _a;
1972
+ const needsValues = !!((_a = props2.formState) === null || _a === void 0 ? void 0 : _a.values);
1973
+ if (needsValues) {
1974
+ _valuesSubscriberCount++;
1975
+ }
1976
+ const { unsubscribe } = _subjects.state.subscribe({
1977
+ next: (formState) => {
1978
+ if (shouldSubscribeByName(props2.name, formState.name, props2.exact) && shouldRenderFormState(formState, props2.formState || _proxyFormState, _setFormState, props2.reRenderRoot)) {
1979
+ const snapshot = { ..._formValues };
1980
+ props2.callback({
1981
+ values: snapshot,
1982
+ ..._formState,
1983
+ ...formState,
1984
+ defaultValues: _defaultValues
1985
+ });
1986
+ }
1987
+ }
1988
+ });
1989
+ if (!needsValues) {
1990
+ return unsubscribe;
1991
+ }
1992
+ let called = false;
1993
+ return () => {
1994
+ if (called) {
1995
+ return;
1996
+ }
1997
+ called = true;
1998
+ _valuesSubscriberCount--;
1999
+ unsubscribe();
2000
+ };
2001
+ };
2002
+ const subscribe = (props2) => {
2003
+ _state.mount = true;
2004
+ _proxySubscribeFormState = {
2005
+ ..._proxySubscribeFormState,
2006
+ ...props2.formState
2007
+ };
2008
+ return _subscribe({
2009
+ ...props2,
2010
+ formState: {
2011
+ ...defaultProxyFormState,
2012
+ ...props2.formState
2013
+ }
2014
+ });
2015
+ };
1481
2016
  const unregister = (name, options = {}) => {
1482
2017
  for (const fieldName of name ? convertToArrayPayload(name) : _names.mount) {
1483
2018
  _names.mount.delete(fieldName);
@@ -1489,27 +2024,31 @@ function createFormControl(props = {}, flushRootRender) {
1489
2024
  !options.keepError && unset(_formState.errors, fieldName);
1490
2025
  !options.keepDirty && unset(_formState.dirtyFields, fieldName);
1491
2026
  !options.keepTouched && unset(_formState.touchedFields, fieldName);
2027
+ !options.keepIsValidating && unset(_formState.validatingFields, fieldName);
1492
2028
  !_options.shouldUnregister && !options.keepDefaultValue && unset(_defaultValues, fieldName);
1493
2029
  }
1494
- _subjects.values.next({
1495
- values: { ..._formValues }
2030
+ _subjects.state.next({
2031
+ values: cloneObject(_formValues)
1496
2032
  });
1497
2033
  _subjects.state.next({
1498
2034
  ..._formState,
1499
2035
  ...!options.keepDirty ? {} : { isDirty: _getDirty() }
1500
2036
  });
1501
- !options.keepIsValid && _updateValid();
2037
+ !options.keepIsValid && _setValid();
1502
2038
  };
1503
- const _updateDisabledField = ({ disabled, name, field, fields, value }) => {
1504
- if (isBoolean(disabled)) {
1505
- const inputValue = disabled ? void 0 : isUndefined(value) ? getFieldValue(field ? field._f : get(fields, name)._f) : value;
1506
- set(_formValues, name, inputValue);
1507
- updateTouchAndDirty(name, inputValue, false, false, true);
2039
+ const _setDisabledField = ({ disabled, name }) => {
2040
+ if (isBoolean(disabled) && _state.mount || !!disabled || _names.disabled.has(name)) {
2041
+ const wasDisabled = _names.disabled.has(name);
2042
+ const isDisabled = !!disabled;
2043
+ const disabledStateChanged = wasDisabled !== isDisabled;
2044
+ disabled ? _names.disabled.add(name) : _names.disabled.delete(name);
2045
+ disabledStateChanged && _state.mount && !_state.action && _setValid();
1508
2046
  }
1509
2047
  };
1510
2048
  const register = (name, options = {}) => {
1511
2049
  let field = get(_fields, name);
1512
- const disabledIsDefined = isBoolean(options.disabled);
2050
+ const disabledIsDefined = isBoolean(options.disabled) || isBoolean(_options.disabled);
2051
+ const shouldRevalidateRemount = !_names.registerName.has(name) && field && field._f && !field._f.mount;
1513
2052
  set(_fields, name, {
1514
2053
  ...field || {},
1515
2054
  _f: {
@@ -1520,17 +2059,16 @@ function createFormControl(props = {}, flushRootRender) {
1520
2059
  }
1521
2060
  });
1522
2061
  _names.mount.add(name);
1523
- if (field) {
1524
- _updateDisabledField({
1525
- field,
1526
- disabled: options.disabled,
2062
+ if (field && !shouldRevalidateRemount) {
2063
+ _setDisabledField({
2064
+ disabled: isBoolean(options.disabled) ? options.disabled : _options.disabled,
1527
2065
  name
1528
2066
  });
1529
2067
  } else {
1530
2068
  updateValidAndValue(name, true, options.value);
1531
2069
  }
1532
2070
  return {
1533
- ...disabledIsDefined ? { disabled: options.disabled } : {},
2071
+ ...disabledIsDefined ? { disabled: options.disabled || _options.disabled } : {},
1534
2072
  ..._options.progressive ? {
1535
2073
  required: !!options.required,
1536
2074
  min: getRuleValue(options.min),
@@ -1544,7 +2082,9 @@ function createFormControl(props = {}, flushRootRender) {
1544
2082
  onBlur: onChange,
1545
2083
  ref: (ref) => {
1546
2084
  if (ref) {
2085
+ _names.registerName.add(name);
1547
2086
  register(name, options);
2087
+ _names.registerName.delete(name);
1548
2088
  field = get(_fields, name);
1549
2089
  const fieldRef = isUndefined(ref.value) ? ref.querySelectorAll ? ref.querySelectorAll("input,select,textarea")[0] || ref : ref : ref;
1550
2090
  const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
@@ -1552,18 +2092,22 @@ function createFormControl(props = {}, flushRootRender) {
1552
2092
  if (radioOrCheckbox ? refs.find((option) => option === fieldRef) : fieldRef === field._f.ref) {
1553
2093
  return;
1554
2094
  }
2095
+ const newField = {
2096
+ ...field._f
2097
+ };
2098
+ if (radioOrCheckbox) {
2099
+ newField.refs = [
2100
+ ...refs.filter(live),
2101
+ fieldRef,
2102
+ ...Array.isArray(get(_defaultValues, name)) ? [{}] : []
2103
+ ];
2104
+ newField.ref = { type: fieldRef.type, name };
2105
+ } else {
2106
+ newField.ref = fieldRef;
2107
+ delete newField.refs;
2108
+ }
1555
2109
  set(_fields, name, {
1556
- _f: {
1557
- ...field._f,
1558
- ...radioOrCheckbox ? {
1559
- refs: [
1560
- ...refs.filter(live),
1561
- fieldRef,
1562
- ...Array.isArray(get(_defaultValues, name)) ? [{}] : []
1563
- ],
1564
- ref: { type: fieldRef.type, name }
1565
- } : { ref: fieldRef }
1566
- }
2110
+ _f: newField
1567
2111
  });
1568
2112
  updateValidAndValue(name, false, void 0, fieldRef);
1569
2113
  } else {
@@ -1576,21 +2120,25 @@ function createFormControl(props = {}, flushRootRender) {
1576
2120
  }
1577
2121
  };
1578
2122
  };
1579
- const _focusError = () => _options.shouldFocusError && iterateFieldsByAction(_fields, _focusInput, _names.mount);
2123
+ const _focusError = () => _options.shouldFocusError && !_options.shouldUseNativeValidation && iterateFieldsByAction(_fields, _focusInput, _names.mount);
1580
2124
  const _disableForm = (disabled) => {
1581
2125
  if (isBoolean(disabled)) {
1582
2126
  _subjects.state.next({ disabled });
1583
2127
  iterateFieldsByAction(_fields, (ref, name) => {
1584
- let requiredDisabledState = disabled;
1585
2128
  const currentField = get(_fields, name);
1586
- if (currentField && isBoolean(currentField._f.disabled)) {
1587
- requiredDisabledState || (requiredDisabledState = currentField._f.disabled);
2129
+ if (currentField) {
2130
+ ref.disabled = currentField._f.disabled || disabled;
2131
+ if (Array.isArray(currentField._f.refs)) {
2132
+ currentField._f.refs.forEach((inputRef) => {
2133
+ inputRef.disabled = currentField._f.disabled || disabled;
2134
+ });
2135
+ }
1588
2136
  }
1589
- ref.disabled = requiredDisabledState;
1590
2137
  }, 0, false);
1591
2138
  }
1592
2139
  };
1593
2140
  const handleSubmit = (onValid, onInvalid) => async (e) => {
2141
+ let onValidError = void 0;
1594
2142
  if (e) {
1595
2143
  e.preventDefault && e.preventDefault();
1596
2144
  e.persist && e.persist();
@@ -1600,18 +2148,31 @@ function createFormControl(props = {}, flushRootRender) {
1600
2148
  isSubmitting: true
1601
2149
  });
1602
2150
  if (_options.resolver) {
1603
- const { errors, values } = await _executeSchema();
2151
+ const { errors, values } = await _runSchema();
2152
+ _updateIsValidating();
1604
2153
  _formState.errors = errors;
1605
- fieldValues = values;
2154
+ fieldValues = cloneObject(values);
1606
2155
  } else {
1607
- await executeBuiltInValidation(_fields);
2156
+ await executeBuiltInValidation({
2157
+ fields: _fields,
2158
+ eventType: EVENTS.SUBMIT
2159
+ });
2160
+ }
2161
+ if (_names.disabled.size) {
2162
+ for (const name of _names.disabled) {
2163
+ unset(fieldValues, name);
2164
+ }
1608
2165
  }
1609
- unset(_formState.errors, "root");
2166
+ unset(_formState.errors, ROOT_ERROR_TYPE);
1610
2167
  if (isEmptyObject(_formState.errors)) {
1611
2168
  _subjects.state.next({
1612
2169
  errors: {}
1613
2170
  });
1614
- await onValid(fieldValues, e);
2171
+ try {
2172
+ await onValid(fieldValues, e);
2173
+ } catch (error) {
2174
+ onValidError = error;
2175
+ }
1615
2176
  } else {
1616
2177
  if (onInvalid) {
1617
2178
  await onInvalid({ ..._formState.errors }, e);
@@ -1622,29 +2183,32 @@ function createFormControl(props = {}, flushRootRender) {
1622
2183
  _subjects.state.next({
1623
2184
  isSubmitted: true,
1624
2185
  isSubmitting: false,
1625
- isSubmitSuccessful: isEmptyObject(_formState.errors),
2186
+ isSubmitSuccessful: isEmptyObject(_formState.errors) && !onValidError,
1626
2187
  submitCount: _formState.submitCount + 1,
1627
2188
  errors: _formState.errors
1628
2189
  });
2190
+ if (onValidError) {
2191
+ throw onValidError;
2192
+ }
1629
2193
  };
1630
2194
  const resetField = (name, options = {}) => {
1631
2195
  if (get(_fields, name)) {
1632
2196
  if (isUndefined(options.defaultValue)) {
1633
- setValue(name, get(_defaultValues, name));
2197
+ setValue(name, cloneObject(get(_defaultValues, name)));
1634
2198
  } else {
1635
2199
  setValue(name, options.defaultValue);
1636
- set(_defaultValues, name, options.defaultValue);
2200
+ set(_defaultValues, name, cloneObject(options.defaultValue));
1637
2201
  }
1638
2202
  if (!options.keepTouched) {
1639
2203
  unset(_formState.touchedFields, name);
1640
2204
  }
1641
2205
  if (!options.keepDirty) {
1642
2206
  unset(_formState.dirtyFields, name);
1643
- _formState.isDirty = options.defaultValue ? _getDirty(name, get(_defaultValues, name)) : _getDirty();
2207
+ _formState.isDirty = options.defaultValue ? _getDirty(name, cloneObject(get(_defaultValues, name))) : _getDirty();
1644
2208
  }
1645
2209
  if (!options.keepError) {
1646
2210
  unset(_formState.errors, name);
1647
- _proxyFormState.isValid && _updateValid();
2211
+ _proxyFormState.isValid && _setValid();
1648
2212
  }
1649
2213
  _subjects.state.next({ ..._formState });
1650
2214
  }
@@ -1652,14 +2216,27 @@ function createFormControl(props = {}, flushRootRender) {
1652
2216
  const _reset = (formValues, keepStateOptions = {}) => {
1653
2217
  const updatedValues = formValues ? cloneObject(formValues) : _defaultValues;
1654
2218
  const cloneUpdatedValues = cloneObject(updatedValues);
1655
- const values = formValues && !isEmptyObject(formValues) ? cloneUpdatedValues : _defaultValues;
2219
+ const isEmptyResetValues = isEmptyObject(formValues);
2220
+ const values = cloneUpdatedValues;
2221
+ const fieldRefs = _fields;
1656
2222
  if (!keepStateOptions.keepDefaultValues) {
1657
2223
  _defaultValues = updatedValues;
1658
2224
  }
1659
2225
  if (!keepStateOptions.keepValues) {
1660
- if (keepStateOptions.keepDirtyValues || shouldCaptureDirtyFields) {
1661
- for (const fieldName of _names.mount) {
1662
- get(_formState.dirtyFields, fieldName) ? set(values, fieldName, get(_formValues, fieldName)) : setValue(fieldName, get(values, fieldName));
2226
+ if (keepStateOptions.keepDirtyValues) {
2227
+ const fieldsToCheck = /* @__PURE__ */ new Set([
2228
+ ..._names.mount,
2229
+ ...Object.keys(getDirtyFields(_defaultValues, _formValues, void 0, fieldRefs))
2230
+ ]);
2231
+ for (const fieldName of Array.from(fieldsToCheck)) {
2232
+ const isDirty = get(_formState.dirtyFields, fieldName);
2233
+ const existingValue = get(_formValues, fieldName);
2234
+ const newValue = get(values, fieldName);
2235
+ if (isDirty && !isUndefined(existingValue)) {
2236
+ set(values, fieldName, existingValue);
2237
+ } else if (!isDirty && !isUndefined(newValue)) {
2238
+ setValue(fieldName, newValue);
2239
+ }
1663
2240
  }
1664
2241
  } else {
1665
2242
  if (isWeb && isUndefined(formValues)) {
@@ -1677,54 +2254,81 @@ function createFormControl(props = {}, flushRootRender) {
1677
2254
  }
1678
2255
  }
1679
2256
  }
1680
- _fields = {};
2257
+ if (keepStateOptions.keepFieldsRef) {
2258
+ for (const fieldName of _names.mount) {
2259
+ setValue(fieldName, get(values, fieldName));
2260
+ }
2261
+ } else {
2262
+ _fields = {};
2263
+ }
2264
+ }
2265
+ if (_options.shouldUnregister) {
2266
+ _formValues = keepStateOptions.keepDefaultValues ? cloneObject(_defaultValues) : {};
2267
+ if (keepStateOptions.keepFieldsRef) {
2268
+ for (const fieldName of _names.mount) {
2269
+ set(_formValues, fieldName, get(values, fieldName));
2270
+ }
2271
+ }
2272
+ } else {
2273
+ _formValues = cloneObject(values);
1681
2274
  }
1682
- _formValues = props.shouldUnregister ? keepStateOptions.keepDefaultValues ? cloneObject(_defaultValues) : {} : cloneObject(values);
1683
2275
  _subjects.array.next({
1684
2276
  values: { ...values }
1685
2277
  });
1686
- _subjects.values.next({
2278
+ _subjects.state.next({
2279
+ name: void 0,
2280
+ type: void 0,
1687
2281
  values: { ...values }
1688
2282
  });
1689
2283
  }
1690
2284
  _names = {
1691
- mount: /* @__PURE__ */ new Set(),
2285
+ mount: keepStateOptions.keepDirtyValues ? _names.mount : /* @__PURE__ */ new Set(),
1692
2286
  unMount: /* @__PURE__ */ new Set(),
1693
2287
  array: /* @__PURE__ */ new Set(),
2288
+ registerName: /* @__PURE__ */ new Set(),
2289
+ disabled: /* @__PURE__ */ new Set(),
1694
2290
  watch: /* @__PURE__ */ new Set(),
1695
2291
  watchAll: false,
1696
2292
  focus: ""
1697
2293
  };
1698
- !_state.mount && flushRootRender();
1699
- _state.mount = !_proxyFormState.isValid || !!keepStateOptions.keepIsValid;
1700
- _state.watch = !!props.shouldUnregister;
2294
+ _state.mount = !_proxyFormState.isValid || !!keepStateOptions.keepIsValid || !!keepStateOptions.keepDirtyValues || !_options.shouldUnregister && !isEmptyObject(values);
2295
+ _state.watch = !!_options.shouldUnregister;
2296
+ _state.keepIsValid = !!keepStateOptions.keepIsValid;
2297
+ _state.action = false;
2298
+ if (!keepStateOptions.keepErrors) {
2299
+ _formState.errors = {};
2300
+ }
1701
2301
  _subjects.state.next({
1702
2302
  submitCount: keepStateOptions.keepSubmitCount ? _formState.submitCount : 0,
1703
- isDirty: keepStateOptions.keepDirty ? _formState.isDirty : !!(keepStateOptions.keepDefaultValues && !deepEqual(formValues, _defaultValues)),
2303
+ isDirty: isEmptyResetValues ? false : keepStateOptions.keepDirty ? _formState.isDirty : keepStateOptions.keepValues ? _getDirty() : !!(keepStateOptions.keepDefaultValues && !deepEqual(formValues, _defaultValues)),
1704
2304
  isSubmitted: keepStateOptions.keepIsSubmitted ? _formState.isSubmitted : false,
1705
- dirtyFields: keepStateOptions.keepDirtyValues ? _formState.dirtyFields : keepStateOptions.keepDefaultValues && formValues ? getDirtyFields(_defaultValues, formValues) : {},
2305
+ dirtyFields: isEmptyResetValues ? {} : keepStateOptions.keepDirtyValues ? keepStateOptions.keepDefaultValues && _formValues ? getDirtyFields(_defaultValues, _formValues, void 0, fieldRefs) : _formState.dirtyFields : keepStateOptions.keepDefaultValues && formValues ? getDirtyFields(_defaultValues, formValues, void 0, fieldRefs) : keepStateOptions.keepDirty ? _formState.dirtyFields : {},
1706
2306
  touchedFields: keepStateOptions.keepTouched ? _formState.touchedFields : {},
1707
2307
  errors: keepStateOptions.keepErrors ? _formState.errors : {},
1708
2308
  isSubmitSuccessful: keepStateOptions.keepIsSubmitSuccessful ? _formState.isSubmitSuccessful : false,
1709
- isSubmitting: false
2309
+ isSubmitting: false,
2310
+ defaultValues: _defaultValues
1710
2311
  });
1711
2312
  };
1712
- const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues) ? formValues(_formValues) : formValues, keepStateOptions);
2313
+ const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues) ? formValues(_formValues) : formValues, { ..._options.resetOptions, ...keepStateOptions });
1713
2314
  const setFocus = (name, options = {}) => {
1714
2315
  const field = get(_fields, name);
1715
2316
  const fieldReference = field && field._f;
1716
2317
  if (fieldReference) {
1717
2318
  const fieldRef = fieldReference.refs ? fieldReference.refs[0] : fieldReference.ref;
1718
2319
  if (fieldRef.focus) {
1719
- fieldRef.focus();
1720
- options.shouldSelect && fieldRef.select();
2320
+ setTimeout(() => {
2321
+ fieldRef.focus();
2322
+ options.shouldSelect && isFunction(fieldRef.select) && fieldRef.select();
2323
+ });
1721
2324
  }
1722
2325
  }
1723
2326
  };
1724
- const _updateFormState = (updatedFormState) => {
2327
+ const _setFormState = (updatedFormState) => {
2328
+ const { name, type, values, ...formState } = updatedFormState;
1725
2329
  _formState = {
1726
2330
  ..._formState,
1727
- ...updatedFormState
2331
+ ...formState
1728
2332
  };
1729
2333
  };
1730
2334
  const _resetDefaultValues = () => isFunction(_options.defaultValues) && _options.defaultValues().then((values) => {
@@ -1733,28 +2337,45 @@ function createFormControl(props = {}, flushRootRender) {
1733
2337
  isLoading: false
1734
2338
  });
1735
2339
  });
1736
- return {
2340
+ const resetDefaultValues = (values, options = {}) => {
2341
+ _defaultValues = cloneObject(values);
2342
+ if (!options.keepDirty) {
2343
+ const newDirtyFields = getDirtyFields(_defaultValues, _formValues, void 0, _fields);
2344
+ _formState.dirtyFields = newDirtyFields;
2345
+ _formState.isDirty = !isEmptyObject(newDirtyFields);
2346
+ }
2347
+ if (!options.keepIsValid) {
2348
+ _setValid();
2349
+ }
2350
+ _subjects.state.next({
2351
+ ..._formState,
2352
+ defaultValues: _defaultValues
2353
+ });
2354
+ };
2355
+ const methods = {
1737
2356
  control: {
1738
2357
  register,
1739
2358
  unregister,
1740
2359
  getFieldState,
1741
2360
  handleSubmit,
1742
2361
  setError,
1743
- _executeSchema,
2362
+ _subscribe,
2363
+ _runSchema,
2364
+ _updateIsValidating,
2365
+ _focusError,
1744
2366
  _getWatch,
1745
2367
  _getDirty,
1746
- _updateValid,
1747
- _removeUnmounted,
1748
- _updateFieldArray,
1749
- _updateDisabledField,
2368
+ _setValid,
2369
+ _setFieldArray,
2370
+ _setDisabledField,
2371
+ _setErrors,
1750
2372
  _getFieldArray,
1751
2373
  _reset,
1752
2374
  _resetDefaultValues,
1753
- _updateFormState,
2375
+ _removeUnmounted,
1754
2376
  _disableForm,
1755
2377
  _subjects,
1756
2378
  _proxyFormState,
1757
- _setErrors,
1758
2379
  get _fields() {
1759
2380
  return _fields;
1760
2381
  },
@@ -1779,9 +2400,6 @@ function createFormControl(props = {}, flushRootRender) {
1779
2400
  get _formState() {
1780
2401
  return _formState;
1781
2402
  },
1782
- set _formState(value) {
1783
- _formState = value;
1784
- },
1785
2403
  get _options() {
1786
2404
  return _options;
1787
2405
  },
@@ -1790,58 +2408,99 @@ function createFormControl(props = {}, flushRootRender) {
1790
2408
  ..._options,
1791
2409
  ...value
1792
2410
  };
2411
+ _validationModeBeforeSubmit = getValidationModes(_options.mode);
2412
+ _validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
1793
2413
  }
1794
2414
  },
2415
+ subscribe,
1795
2416
  trigger,
1796
2417
  register,
1797
2418
  handleSubmit,
1798
2419
  watch,
1799
2420
  setValue,
2421
+ setValues,
1800
2422
  getValues,
1801
2423
  reset,
1802
2424
  resetField,
2425
+ resetDefaultValues,
1803
2426
  clearErrors,
1804
2427
  unregister,
1805
2428
  setError,
1806
2429
  setFocus,
1807
2430
  getFieldState
1808
2431
  };
2432
+ return {
2433
+ ...methods,
2434
+ formControl: methods
2435
+ };
1809
2436
  }
1810
2437
  function useForm(props = {}) {
1811
- const _formControl = React.useRef();
1812
- const _values = React.useRef();
1813
- const [formState, updateFormState] = React.useState({
1814
- isDirty: false,
1815
- isValidating: false,
2438
+ const _formControl = React.useRef(void 0);
2439
+ const _values = React.useRef(void 0);
2440
+ const _formControlProp = React.useRef(props.formControl);
2441
+ const [formState, updateFormState] = React.useState(() => ({
2442
+ ...cloneObject(DEFAULT_FORM_STATE),
1816
2443
  isLoading: isFunction(props.defaultValues),
1817
- isSubmitted: false,
1818
- isSubmitting: false,
1819
- isSubmitSuccessful: false,
1820
- isValid: false,
1821
- submitCount: 0,
1822
- dirtyFields: {},
1823
- touchedFields: {},
1824
2444
  errors: props.errors || {},
1825
- disabled: false,
2445
+ disabled: props.disabled || false,
1826
2446
  defaultValues: isFunction(props.defaultValues) ? void 0 : props.defaultValues
1827
- });
1828
- if (!_formControl.current) {
1829
- _formControl.current = {
1830
- ...createFormControl(props, () => updateFormState((formState2) => ({ ...formState2 }))),
1831
- formState
1832
- };
2447
+ }));
2448
+ if (!_formControl.current || props.formControl && _formControlProp.current !== props.formControl) {
2449
+ _formControlProp.current = props.formControl;
2450
+ if (props.formControl) {
2451
+ _formControl.current = {
2452
+ ...props.formControl,
2453
+ formState
2454
+ };
2455
+ if (props.defaultValues && !isFunction(props.defaultValues)) {
2456
+ props.formControl.reset(props.defaultValues, props.resetOptions);
2457
+ }
2458
+ } else {
2459
+ const { formControl, ...rest } = createFormControl(props);
2460
+ _formControl.current = {
2461
+ ...rest,
2462
+ formState
2463
+ };
2464
+ }
1833
2465
  }
1834
2466
  const control = _formControl.current.control;
1835
2467
  control._options = props;
1836
- useSubscribe({
1837
- subject: control._subjects.state,
1838
- next: (value) => {
1839
- if (shouldRenderFormState(value, control._proxyFormState, control._updateFormState, true)) {
1840
- updateFormState({ ...control._formState });
1841
- }
1842
- }
1843
- });
2468
+ useIsomorphicLayoutEffect(() => {
2469
+ const sub = control._subscribe({
2470
+ formState: control._proxyFormState,
2471
+ callback: () => updateFormState({
2472
+ ...control._formState,
2473
+ defaultValues: control._defaultValues
2474
+ }),
2475
+ reRenderRoot: true
2476
+ });
2477
+ updateFormState((data) => ({
2478
+ ...data,
2479
+ isReady: true
2480
+ }));
2481
+ control._formState.isReady = true;
2482
+ return sub;
2483
+ }, [control]);
1844
2484
  React.useEffect(() => control._disableForm(props.disabled), [control, props.disabled]);
2485
+ React.useEffect(() => {
2486
+ if (props.mode) {
2487
+ control._options.mode = props.mode;
2488
+ }
2489
+ if (props.reValidateMode) {
2490
+ control._options.reValidateMode = props.reValidateMode;
2491
+ }
2492
+ }, [control, props.mode, props.reValidateMode]);
2493
+ React.useEffect(() => {
2494
+ if (props.errors) {
2495
+ control._setErrors(props.errors);
2496
+ control._focusError();
2497
+ }
2498
+ }, [control, props.errors]);
2499
+ React.useEffect(() => {
2500
+ props.shouldUnregister && control._subjects.state.next({
2501
+ values: control._getWatch()
2502
+ });
2503
+ }, [control, props.shouldUnregister]);
1845
2504
  React.useEffect(() => {
1846
2505
  if (control._proxyFormState.isDirty) {
1847
2506
  const isDirty = control._getDirty();
@@ -1853,22 +2512,24 @@ function useForm(props = {}) {
1853
2512
  }
1854
2513
  }, [control, formState.isDirty]);
1855
2514
  React.useEffect(() => {
2515
+ var _a;
1856
2516
  if (props.values && !deepEqual(props.values, _values.current)) {
1857
- control._reset(props.values, control._options.resetOptions);
2517
+ control._reset(props.values, {
2518
+ keepFieldsRef: true,
2519
+ ...control._options.resetOptions
2520
+ });
2521
+ if (!((_a = control._options.resetOptions) === null || _a === void 0 ? void 0 : _a.keepIsValid)) {
2522
+ control._setValid();
2523
+ }
1858
2524
  _values.current = props.values;
1859
2525
  updateFormState((state) => ({ ...state }));
1860
2526
  } else {
1861
2527
  control._resetDefaultValues();
1862
2528
  }
1863
- }, [props.values, control]);
1864
- React.useEffect(() => {
1865
- if (props.errors) {
1866
- control._setErrors(props.errors);
1867
- }
1868
- }, [props.errors, control]);
2529
+ }, [control, props.values]);
1869
2530
  React.useEffect(() => {
1870
2531
  if (!control._state.mount) {
1871
- control._updateValid();
2532
+ control._setValid();
1872
2533
  control._state.mount = true;
1873
2534
  }
1874
2535
  if (control._state.watch) {
@@ -1877,7 +2538,7 @@ function useForm(props = {}) {
1877
2538
  }
1878
2539
  control._removeUnmounted();
1879
2540
  });
1880
- _formControl.current.formState = getProxyFormState(formState, control);
2541
+ _formControl.current.formState = React.useMemo(() => getProxyFormState(formState, control), [control, formState]);
1881
2542
  return _formControl.current;
1882
2543
  }
1883
2544
  const jsonToText = (v) => v == null || v === "" ? "" : JSON.stringify(v, null, 2);
@@ -1935,13 +2596,10 @@ const IntegrationField = ({
1935
2596
  rules: {
1936
2597
  required: enforceRequired ? t("integration.form.required", { field: t(field.label) }) : false
1937
2598
  },
1938
- render: ({ field: f, fieldState }) => {
1939
- var _a;
1940
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1941
- renderControl(field, f, secretConfigured, t),
1942
- ((_a = fieldState.error) == null ? void 0 : _a.message) && /* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-error", children: fieldState.error.message })
1943
- ] });
1944
- }
2599
+ render: ({ field: f, fieldState }) => /* @__PURE__ */ jsxs(Fragment, { children: [
2600
+ renderControl(field, f, secretConfigured, t),
2601
+ fieldState.error?.message && /* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-error", children: fieldState.error.message })
2602
+ ] })
1945
2603
  }
1946
2604
  ),
1947
2605
  field.hint && /* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-subtle", children: t(field.hint) })
@@ -1964,8 +2622,7 @@ function renderControl(field, f, secretConfigured, t) {
1964
2622
  children: [
1965
2623
  /* @__PURE__ */ jsx(Select.Trigger, { children: /* @__PURE__ */ jsx(Select.Value, { placeholder }) }),
1966
2624
  /* @__PURE__ */ jsx(Select.Content, { children: declared.map((o) => {
1967
- var _a;
1968
- const labelKey = (_a = field.optionLabels) == null ? void 0 : _a[String(o)];
2625
+ const labelKey = field.optionLabels?.[String(o)];
1969
2626
  return /* @__PURE__ */ jsx(Select.Item, { value: String(o), children: labelKey ? t(labelKey) : String(o) }, String(o));
1970
2627
  }) })
1971
2628
  ]
@@ -2029,9 +2686,9 @@ function sectionDefaults(section, values) {
2029
2686
  const out = {};
2030
2687
  for (const f of section.fields) {
2031
2688
  if (f.secret || f.control === "secret") out[f.name] = "";
2032
- else if (f.control === "switch") out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default ?? false;
2033
- else if (f.control === "json") out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default;
2034
- else out[f.name] = (values == null ? void 0 : values[f.name]) ?? f.default ?? "";
2689
+ else if (f.control === "switch") out[f.name] = values?.[f.name] ?? f.default ?? false;
2690
+ else if (f.control === "json") out[f.name] = values?.[f.name] ?? f.default;
2691
+ else out[f.name] = values?.[f.name] ?? f.default ?? "";
2035
2692
  }
2036
2693
  return out;
2037
2694
  }
@@ -2063,7 +2720,7 @@ const EditSectionDrawer = ({
2063
2720
  qc.invalidateQueries({ queryKey: ["integration-overview"] });
2064
2721
  onOpenChange(false);
2065
2722
  },
2066
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.saveFailed"))
2723
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.saveFailed"))
2067
2724
  });
2068
2725
  return /* @__PURE__ */ jsx(Drawer, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Drawer.Content, { children: [
2069
2726
  /* @__PURE__ */ jsx(Drawer.Header, { children: /* @__PURE__ */ jsx(Drawer.Title, { children: t(section.title) }) }),
@@ -2105,10 +2762,10 @@ const EditPage = () => {
2105
2762
  queryKey: ["integration", provider_id],
2106
2763
  queryFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`)
2107
2764
  });
2108
- const descriptor = data == null ? void 0 : data.descriptor;
2109
- const record = data == null ? void 0 : data.integration;
2765
+ const descriptor = data?.descriptor;
2766
+ const record = data?.integration;
2110
2767
  const isConfigured = !!record;
2111
- const isComplete = (data == null ? void 0 : data.is_complete) ?? false;
2768
+ const isComplete = data?.is_complete ?? false;
2112
2769
  const invalidate = () => {
2113
2770
  qc.invalidateQueries({ queryKey: ["integration", provider_id] });
2114
2771
  qc.invalidateQueries({ queryKey: ["integration-overview"] });
@@ -2122,7 +2779,7 @@ const EditPage = () => {
2122
2779
  r.status === "passed" ? toast.success(t("integration.toast.connectionOk")) : toast.warning(r.message ?? r.status);
2123
2780
  invalidate();
2124
2781
  },
2125
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.testFailed"))
2782
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.testFailed"))
2126
2783
  });
2127
2784
  const toggleEnabled = useMutation({
2128
2785
  mutationFn: (next) => sdk.client.fetch(`/admin/integrations/${provider_id}/enable`, {
@@ -2133,7 +2790,7 @@ const EditPage = () => {
2133
2790
  toast.success(next ? t("integration.toast.enabled") : t("integration.toast.disabled"));
2134
2791
  invalidate();
2135
2792
  },
2136
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.updateFailed"))
2793
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.updateFailed"))
2137
2794
  });
2138
2795
  const remove = useMutation({
2139
2796
  mutationFn: () => sdk.client.fetch(`/admin/integrations/${provider_id}`, { method: "DELETE" }),
@@ -2142,7 +2799,7 @@ const EditPage = () => {
2142
2799
  invalidate();
2143
2800
  navigate("/settings/integrations");
2144
2801
  },
2145
- onError: (e) => toast.error((e == null ? void 0 : e.message) ?? t("integration.toast.deleteFailed"))
2802
+ onError: (e) => toast.error(e?.message ?? t("integration.toast.deleteFailed"))
2146
2803
  });
2147
2804
  const onDelete = async () => {
2148
2805
  const confirmed = await prompt({
@@ -2159,22 +2816,23 @@ const EditPage = () => {
2159
2816
  return /* @__PURE__ */ jsx(Container, { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsx(Spinner, { className: "text-ui-fg-subtle animate-spin" }) });
2160
2817
  }
2161
2818
  if (!descriptor) {
2162
- return /* @__PURE__ */ jsxs(Container, { className: "p-6", children: [
2163
- /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.unknown", { id: provider_id }) }),
2164
- /* @__PURE__ */ jsx(Link, { to: "/settings/integrations", className: "text-ui-fg-base", children: t("integration.back") })
2165
- ] });
2166
- }
2167
- const version = (data == null ? void 0 : data.version) ?? null;
2168
- const author = (data == null ? void 0 : data.author) ?? null;
2169
- const authorUrl = (data == null ? void 0 : data.author_url) ?? null;
2819
+ throw new FetchError(
2820
+ `Integration with provider_id: ${provider_id} was not found`,
2821
+ "There is no page at this address",
2822
+ 404
2823
+ );
2824
+ }
2825
+ const version = data?.version ?? null;
2826
+ const author = data?.author ?? null;
2827
+ const authorUrl = data?.author_url ?? null;
2170
2828
  const lifecycle = !isConfigured ? { color: "grey", label: t("integration.status.notConfigured") } : !isComplete ? { color: "orange", label: t("integration.status.incomplete") } : record.is_enabled ? { color: "green", label: t("integration.status.enabled") } : { color: "grey", label: t("integration.status.disabled") };
2171
- const connection = descriptor.hasTestConnection ? (record == null ? void 0 : record.last_test_status) === "passed" ? { color: "green", label: t("integration.status.connected") } : (record == null ? void 0 : record.last_test_status) === "failed" ? { color: "red", label: t("integration.status.connectionFailed") } : null : null;
2829
+ const connection = descriptor.hasTestConnection ? record?.last_test_status === "passed" ? { color: "green", label: t("integration.status.connected") } : record?.last_test_status === "failed" ? { color: "red", label: t("integration.status.connectionFailed") } : null : null;
2172
2830
  const editing = descriptor.sections.find((s) => s.id === editingSection) ?? null;
2173
- const configuredSecrets = new Set((record == null ? void 0 : record.configured_secrets) ?? []);
2831
+ const configuredSecrets = new Set(record?.configured_secrets ?? []);
2174
2832
  const sectionData = {
2175
2833
  providerId: provider_id,
2176
2834
  identifier: descriptor.identifier,
2177
- values: (record == null ? void 0 : record.values) ?? {},
2835
+ values: record?.values ?? {},
2178
2836
  isComplete
2179
2837
  };
2180
2838
  const renderSection = (section) => /* @__PURE__ */ jsx(LayoutComposer.Entry, { id: section.id, children: /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
@@ -2188,17 +2846,14 @@ const EditPage = () => {
2188
2846
  ] }) })
2189
2847
  ] })
2190
2848
  ] }),
2191
- section.fields.filter((f) => isFieldVisible(f, (record == null ? void 0 : record.values) ?? {})).map((f) => {
2192
- var _a;
2193
- return /* @__PURE__ */ jsx(Row, { label: t(f.label), children: /* @__PURE__ */ jsx(
2194
- IntegrationFieldValue,
2195
- {
2196
- field: f,
2197
- value: ((_a = record == null ? void 0 : record.values) == null ? void 0 : _a[f.name]) ?? f.default,
2198
- secretConfigured: configuredSecrets.has(f.name)
2199
- }
2200
- ) }, f.name);
2201
- })
2849
+ section.fields.filter((f) => isFieldVisible(f, record?.values ?? {})).map((f) => /* @__PURE__ */ jsx(Row, { label: t(f.label), children: /* @__PURE__ */ jsx(
2850
+ IntegrationFieldValue,
2851
+ {
2852
+ field: f,
2853
+ value: record?.values?.[f.name] ?? f.default,
2854
+ secretConfigured: configuredSecrets.has(f.name)
2855
+ }
2856
+ ) }, f.name))
2202
2857
  ] }, section.id) });
2203
2858
  const mainSections = descriptor.sections.filter((s) => s.column !== "side");
2204
2859
  const sideSections = descriptor.sections.filter((s) => s.column === "side");
@@ -2269,8 +2924,8 @@ const EditPage = () => {
2269
2924
  onOpenChange: (open) => !open && setEditingSection(null),
2270
2925
  providerId: provider_id,
2271
2926
  section: editing,
2272
- values: (record == null ? void 0 : record.values) ?? {},
2273
- configuredSecrets: (record == null ? void 0 : record.configured_secrets) ?? []
2927
+ values: record?.values ?? {},
2928
+ configuredSecrets: record?.configured_secrets ?? []
2274
2929
  },
2275
2930
  editing.id
2276
2931
  )
@@ -2295,7 +2950,7 @@ const IntegrationBreadcrumb = ({ params }) => {
2295
2950
  queryFn: () => sdk.client.fetch(`/admin/integrations/${providerId}`),
2296
2951
  enabled: !!providerId
2297
2952
  });
2298
- const descriptor = data == null ? void 0 : data.descriptor;
2953
+ const descriptor = data?.descriptor;
2299
2954
  if (!descriptor) return /* @__PURE__ */ jsx(Fragment, {});
2300
2955
  const name = t(descriptor.displayName);
2301
2956
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -2488,19 +3143,18 @@ const InstallModal = ({
2488
3143
  item,
2489
3144
  onOpenChange
2490
3145
  }) => {
2491
- var _a, _b, _c;
2492
3146
  const { t, i18n } = useTranslation();
2493
3147
  const lang = i18n.language.split("-")[0] === "ru" ? "ru" : "en";
2494
- const source = ((_a = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _a[lang]) || ((_b = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _b.en) || ((_c = item == null ? void 0 : item.docsSnippet) == null ? void 0 : _c.ru) || "";
3148
+ const source = item?.docsSnippet?.[lang] || item?.docsSnippet?.en || item?.docsSnippet?.ru || "";
2495
3149
  return /* @__PURE__ */ jsx(Drawer, { open: !!item, onOpenChange, children: /* @__PURE__ */ jsxs(Drawer.Content, { children: [
2496
3150
  /* @__PURE__ */ jsx(Drawer.Header, { children: /* @__PURE__ */ jsx(Drawer.Title, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-2", children: [
2497
3151
  item && /* @__PURE__ */ jsx(IntegrationIcon, { src: iconSrc(item.icon), alt: item.label, size: "small" }),
2498
- /* @__PURE__ */ jsx("span", { children: item == null ? void 0 : item.label })
3152
+ /* @__PURE__ */ jsx("span", { children: item?.label })
2499
3153
  ] }) }) }),
2500
3154
  /* @__PURE__ */ jsx(Drawer.Body, { className: "flex flex-1 flex-col gap-y-4 overflow-auto", children: source.trim() ? /* @__PURE__ */ jsx(Markdown, { source, truncatedLabel: t("integration.browse.install_truncated") }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: t("integration.browse.install_empty") }) }),
2501
3155
  /* @__PURE__ */ jsxs(Drawer.Footer, { children: [
2502
3156
  /* @__PURE__ */ jsx(Drawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: t("integration.actions.cancel") }) }),
2503
- (item == null ? void 0 : item.docsUrl) && /* @__PURE__ */ jsx(Button, { size: "small", variant: "primary", asChild: true, children: /* @__PURE__ */ jsxs("a", { href: item.docsUrl, target: "_blank", rel: "noopener noreferrer", children: [
3157
+ item?.docsUrl && /* @__PURE__ */ jsx(Button, { size: "small", variant: "primary", asChild: true, children: /* @__PURE__ */ jsxs("a", { href: item.docsUrl, target: "_blank", rel: "noopener noreferrer", children: [
2504
3158
  t("integration.browse.install_docs"),
2505
3159
  /* @__PURE__ */ jsx(ArrowUpRightOnBox, {})
2506
3160
  ] }) })
@@ -2517,7 +3171,7 @@ const BrowsePage = () => {
2517
3171
  queryKey: ["integration-catalog"],
2518
3172
  queryFn: () => sdk.client.fetch("/admin/integrations/catalog")
2519
3173
  });
2520
- const items = (data == null ? void 0 : data.integrations) ?? [];
3174
+ const items = data?.integrations ?? [];
2521
3175
  const categories = useMemo(() => [...new Set(items.map((i) => i.category))], [items]);
2522
3176
  const q = search.trim().toLowerCase();
2523
3177
  const filtered = items.filter((i) => {
@@ -2593,217 +3247,172 @@ const BrowseBreadcrumb = () => {
2593
3247
  const handle = {
2594
3248
  breadcrumb: () => /* @__PURE__ */ jsx(BrowseBreadcrumb, {})
2595
3249
  };
2596
- const integration$1 = {
2597
- list: {
2598
- title: "Integrations",
2599
- subtitle: "Manage integrations settings",
2600
- browseIntegrations: "Browse Integrations",
2601
- learnMore: "Learn how to build integrations",
2602
- searchPlaceholder: "Search integrations",
2603
- empty: "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.",
2604
- emptyFiltered: "No integrations match your filters.",
2605
- tested: "tested",
2606
- testFailed: "test failed",
2607
- tabs: {
2608
- all: "All"
2609
- }
2610
- },
2611
- browse: {
2612
- title: "Browse",
2613
- subtitle: "Find available integrations",
2614
- publish: "Add Integration",
2615
- learnMore: "Learn how to build and publish your own integration",
2616
- searchPlaceholder: "Search integrations",
2617
- by: "by {{author}}",
2618
- installed: "Installed",
2619
- notInstalled: "Not installed",
2620
- add: "Add",
2621
- settings: "Settings",
2622
- install_docs: "Read docs",
2623
- install_empty: "Setup instructions for this integration aren't available yet.",
2624
- install_truncated: "These instructions are too long to show here — open the documentation."
2625
- },
2626
- columns: {
2627
- integration: "Integration",
2628
- description: "Description",
2629
- category: "Category",
2630
- status: "Status"
2631
- },
2632
- status: {
2633
- notConfigured: "Not configured",
2634
- incomplete: "Incomplete",
2635
- enabled: "Enabled",
2636
- disabled: "Disabled",
2637
- configured: "Configured",
2638
- connected: "Connected",
2639
- connectionFailed: "Connection failed"
2640
- },
2641
- meta: {
2642
- version: "v{{version}}",
2643
- authorPrefix: "by"
2644
- },
2645
- labels: {
2646
- category: "Category"
2647
- },
2648
- categories: {
2649
- payment: "Payment",
2650
- notification: "Notification",
2651
- fulfillment: "Fulfillment",
2652
- search: "Search",
2653
- content: "Content",
2654
- analytics: "Analytics",
2655
- authentication: "Authentication",
2656
- erp: "ERP",
2657
- crm: "CRM",
2658
- pim: "PIM",
2659
- marketplace: "Marketplace",
2660
- feed: "Feed",
2661
- file_providers: "File providers",
2662
- other: "Other"
2663
- },
2664
- actions: {
2665
- test: "Test connection",
2666
- enable: "Enable",
2667
- disable: "Disable",
2668
- "delete": "Delete",
2669
- edit: "Edit",
2670
- save: "Save",
2671
- cancel: "Cancel"
2672
- },
2673
- "delete": {
2674
- title: "Delete configuration",
2675
- description: "Remove the stored configuration for {{name}}? This can't be undone."
2676
- },
2677
- form: {
2678
- required: "{{field}} is required",
2679
- invalidJson: "Invalid JSON",
2680
- keepSecret: "•••••• – leave blank to keep",
2681
- items: "{{count}} items"
2682
- },
2683
- toast: {
2684
- saved: "Saved",
2685
- saveFailed: "Save failed",
2686
- connectionOk: "Connection OK",
2687
- testFailed: "Test failed",
2688
- enabled: "Enabled",
2689
- disabled: "Disabled",
2690
- deleted: "Configuration deleted",
2691
- deleteFailed: "Delete failed",
2692
- updateFailed: "Update failed"
2693
- },
2694
- unknown: 'Unknown integration "{{id}}".',
2695
- back: "Back to integrations"
3250
+ const integration$w = { "list": { "title": "التكاملات", "subtitle": "إدارة إعدادات التكاملات", "browseIntegrations": "تصفح التكاملات", "learnMore": "تعرّف على كيفية إنشاء التكاملات", "searchPlaceholder": "البحث في التكاملات", "empty": "لا توجد تكاملات مسجلة. عرّف المزودين ضمن options.providers الخاصة بإضافة التكاملات في medusa-config.", "emptyFiltered": "لا توجد تكاملات مطابقة لعوامل التصفية.", "tested": "تم الاختبار", "testFailed": "فشل الاختبار", "tabs": { "all": "الكل" } }, "browse": { "title": "التصفح", "subtitle": "ابحث عن التكاملات المتاحة", "publish": "إضافة تكامل", "learnMore": "تعرّف على كيفية إنشاء ونشر تكاملك الخاص", "searchPlaceholder": "البحث في التكاملات", "by": "بواسطة {{author}}", "installed": "مثبَّت", "notInstalled": "غير مثبَّت", "add": "إضافة", "settings": "الإعدادات", "install_docs": "قراءة التوثيق", "install_empty": "تعليمات الإعداد لهذا التكامل غير متوفرة بعد.", "install_truncated": "هذه التعليمات أطول من أن تُعرض هنا — افتح التوثيق." }, "columns": { "integration": "التكامل", "description": "الوصف", "category": "الفئة", "status": "الحالة" }, "status": { "notConfigured": "غير مُهيّأ", "incomplete": "غير مكتمل", "enabled": "ممكّن", "disabled": "معطل", "configured": "مُهيّأ", "connected": "متصل", "connectionFailed": "فشل الاتصال" }, "meta": { "version": "v{{version}}", "authorPrefix": "بواسطة" }, "labels": { "category": "الفئة" }, "categories": { "payment": "الدفع", "notification": "الإشعارات", "fulfillment": "التنفيذ", "search": "البحث", "content": "المحتوى", "analytics": "التحليلات", "authentication": "المصادقة", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "الأسواق", "feed": "الخلاصات", "file_providers": "مزودو الملفات", "other": "أخرى" }, "actions": { "test": "اختبار الاتصال", "enable": "تمكين", "disable": "تعطيل", "delete": "حذف", "edit": "تحرير", "save": "حفظ", "cancel": "إلغاء" }, "delete": { "title": "حذف التهيئة", "description": "هل تريد إزالة التهيئة المحفوظة لـ {{name}}؟ لا يمكن التراجع عن هذا الإجراء." }, "form": { "required": "{{field}} مطلوب", "invalidJson": "JSON غير صالح", "keepSecret": "•••••• – اتركه فارغًا للإبقاء عليه", "items": "{{count}} عناصر" }, "toast": { "saved": "تم الحفظ", "saveFailed": "فشل الحفظ", "connectionOk": "الاتصال ناجح", "testFailed": "فشل الاختبار", "enabled": "تم التمكين", "disabled": "تم التعطيل", "deleted": "تم حذف التهيئة", "deleteFailed": "فشل الحذف", "updateFailed": "فشل التحديث" }, "unknown": 'تكامل غير معروف "{{id}}".', "back": "العودة إلى التكاملات" };
3251
+ const ar = {
3252
+ integration: integration$w
3253
+ };
3254
+ const integration$v = { "list": { "title": "Интеграции", "subtitle": "Управление на настройките на интеграциите", "browseIntegrations": "Разгледай интеграциите", "learnMore": "Научете как да създавате интеграции", "searchPlaceholder": "Търсене на интеграции", "empty": "Няма регистрирани интеграции. Декларирайте доставчици в options.providers на плъгина за интеграции в medusa-config.", "emptyFiltered": "Няма интеграции, отговарящи на филтрите.", "tested": "тествано", "testFailed": "тестът е неуспешен", "tabs": { "all": "Всички" } }, "browse": { "title": "Каталог", "subtitle": "Намерете налични интеграции", "publish": "Добавяне на интеграция", "learnMore": "Научете как да създадете и публикувате собствена интеграция", "searchPlaceholder": "Търсене на интеграции", "by": "от {{author}}", "installed": "Инсталирано", "notInstalled": "Не е инсталирано", "add": "Добави", "settings": "Настройки", "install_docs": "Прочети документацията", "install_empty": "Инструкциите за настройка на тази интеграция все още не са налични.", "install_truncated": "Инструкциите са твърде дълги, за да бъдат показани тук — отворете документацията." }, "columns": { "integration": "Интеграция", "description": "Описание", "category": "Категория", "status": "Статус" }, "status": { "notConfigured": "Не е конфигурирано", "incomplete": "Незавършено", "enabled": "Активирано", "disabled": "Деактивирано", "configured": "Конфигурирано", "connected": "Свързано", "connectionFailed": "Неуспешна връзка" }, "meta": { "version": "v{{version}}", "authorPrefix": "от" }, "labels": { "category": "Категория" }, "categories": { "payment": "Плащания", "notification": "Известия", "fulfillment": "Изпълнение", "search": "Търсене", "content": "Съдържание", "analytics": "Анализи", "authentication": "Удостоверяване", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фийдове", "file_providers": "Файлови доставчици", "other": "Други" }, "actions": { "test": "Тест на връзката", "enable": "Активирай", "disable": "Деактивирай", "delete": "Изтрий", "edit": "Редактирай", "save": "Запази", "cancel": "Отказ" }, "delete": { "title": "Изтриване на конфигурацията", "description": "Да се премахне ли запазената конфигурация за {{name}}? Това действие не може да бъде отменено." }, "form": { "required": "{{field}} е задължително", "invalidJson": "Невалиден JSON", "keepSecret": "•••••• – оставете празно, за да запазите", "items": "{{count}} елемента" }, "toast": { "saved": "Запазено", "saveFailed": "Неуспешно запазване", "connectionOk": "Връзката е успешна", "testFailed": "Тестът е неуспешен", "enabled": "Активирано", "disabled": "Деактивирано", "deleted": "Конфигурацията е изтрита", "deleteFailed": "Неуспешно изтриване", "updateFailed": "Неуспешно обновяване" }, "unknown": "Неизвестна интеграция „{{id}}“.", "back": "Назад към интеграциите" };
3255
+ const bg = {
3256
+ integration: integration$v
3257
+ };
3258
+ const integration$u = { "list": { "title": "Integracije", "subtitle": "Upravljanje postavkama integracija", "browseIntegrations": "Pregledaj integracije", "learnMore": "Saznajte kako izraditi integracije", "searchPlaceholder": "Pretraži integracije", "empty": "Nema registrovanih integracija. Deklarišite pružatelje u options.providers dodatka za integracije u medusa-config.", "emptyFiltered": "Nijedna integracija ne odgovara vašim filterima.", "tested": "testirano", "testFailed": "test nije uspio", "tabs": { "all": "Sve" } }, "browse": { "title": "Katalog", "subtitle": "Pronađite dostupne integracije", "publish": "Dodaj integraciju", "learnMore": "Saznajte kako izraditi i objaviti vlastitu integraciju", "searchPlaceholder": "Pretraži integracije", "by": "od {{author}}", "installed": "Instalirano", "notInstalled": "Nije instalirano", "add": "Dodaj", "settings": "Postavke", "install_docs": "Pročitaj dokumentaciju", "install_empty": "Upute za podešavanje ove integracije još nisu dostupne.", "install_truncated": "Ove upute su predugačke za prikaz ovdje — otvorite dokumentaciju." }, "columns": { "integration": "Integracija", "description": "Opis", "category": "Kategorija", "status": "Status" }, "status": { "notConfigured": "Nije konfigurisano", "incomplete": "Nepotpuno", "enabled": "Omogućeno", "disabled": "Onemogućeno", "configured": "Konfigurisano", "connected": "Povezano", "connectionFailed": "Povezivanje nije uspjelo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Plaćanja", "notification": "Obavijesti", "fulfillment": "Ispuna", "search": "Pretraga", "content": "Sadržaj", "analytics": "Analitika", "authentication": "Autentifikacija", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržnica", "feed": "Feedovi", "file_providers": "Pružatelji datoteka", "other": "Ostalo" }, "actions": { "test": "Testiraj vezu", "enable": "Omogući", "disable": "Onemogući", "delete": "Izbriši", "edit": "Uredi", "save": "Sačuvaj", "cancel": "Otkaži" }, "delete": { "title": "Brisanje konfiguracije", "description": "Ukloniti sačuvanu konfiguraciju za {{name}}? Ova radnja se ne može poništiti." }, "form": { "required": "{{field}} je obavezno", "invalidJson": "Neispravan JSON", "keepSecret": "•••••• – ostavite prazno da zadržite", "items": "{{count}} stavki" }, "toast": { "saved": "Sačuvano", "saveFailed": "Spremanje nije uspjelo", "connectionOk": "Veza uspostavljena", "testFailed": "Test nije uspio", "enabled": "Omogućeno", "disabled": "Onemogućeno", "deleted": "Konfiguracija izbrisana", "deleteFailed": "Brisanje nije uspjelo", "updateFailed": "Ažuriranje nije uspjelo" }, "unknown": 'Nepoznata integracija "{{id}}".', "back": "Nazad na integracije" };
3259
+ const bs = {
3260
+ integration: integration$u
3261
+ };
3262
+ const integration$t = { "list": { "title": "Integrace", "subtitle": "Správa nastavení integrací", "browseIntegrations": "Procházet integrace", "learnMore": "Zjistěte, jak vytvářet integrace", "searchPlaceholder": "Hledat integrace", "empty": "Nejsou registrovány žádné integrace. Deklarujte poskytovatele v options.providers pluginu integrací v medusa-config.", "emptyFiltered": "Žádné integrace neodpovídají vašim filtrům.", "tested": "otestováno", "testFailed": "test selhal", "tabs": { "all": "Vše" } }, "browse": { "title": "Katalog", "subtitle": "Najděte dostupné integrace", "publish": "Přidat integraci", "learnMore": "Zjistěte, jak vytvořit a publikovat vlastní integraci", "searchPlaceholder": "Hledat integrace", "by": "od {{author}}", "installed": "Nainstalováno", "notInstalled": "Nenainstalováno", "add": "Přidat", "settings": "Nastavení", "install_docs": "Přečíst dokumentaci", "install_empty": "Pokyny k nastavení této integrace zatím nejsou k dispozici.", "install_truncated": "Tyto pokyny jsou příliš dlouhé na zobrazení zde — otevřete dokumentaci." }, "columns": { "integration": "Integrace", "description": "Popis", "category": "Kategorie", "status": "Stav" }, "status": { "notConfigured": "Nenakonfigurováno", "incomplete": "Nedokončeno", "enabled": "Aktivní", "disabled": "Neaktivní", "configured": "Nakonfigurováno", "connected": "Připojeno", "connectionFailed": "Připojení selhalo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorie" }, "categories": { "payment": "Platby", "notification": "Oznámení", "fulfillment": "Plnění", "search": "Vyhledávání", "content": "Obsah", "analytics": "Analytika", "authentication": "Ověřování", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržiště", "feed": "Feedy", "file_providers": "Poskytovatelé souborů", "other": "Ostatní" }, "actions": { "test": "Otestovat připojení", "enable": "Aktivovat", "disable": "Deaktivovat", "delete": "Smazat", "edit": "Upravit", "save": "Uložit", "cancel": "Zrušit" }, "delete": { "title": "Smazat konfiguraci", "description": "Odstranit uloženou konfiguraci pro {{name}}? Tuto akci nelze vrátit zpět." }, "form": { "required": "{{field}} je povinné", "invalidJson": "Neplatný JSON", "keepSecret": "•••••• – ponechte prázdné pro zachování", "items": "{{count}} položek" }, "toast": { "saved": "Uloženo", "saveFailed": "Uložení se nezdařilo", "connectionOk": "Připojení v pořádku", "testFailed": "Test se nezdařil", "enabled": "Aktivováno", "disabled": "Deaktivováno", "deleted": "Konfigurace smazána", "deleteFailed": "Smazání se nezdařilo", "updateFailed": "Aktualizace se nezdařila" }, "unknown": "Neznámá integrace „{{id}}“.", "back": "Zpět na integrace" };
3263
+ const cs = {
3264
+ integration: integration$t
2696
3265
  };
3266
+ const integration$s = { "list": { "title": "Integrationen", "subtitle": "Integrationseinstellungen verwalten", "browseIntegrations": "Integrationen durchsuchen", "learnMore": "Erfahren Sie, wie Sie Integrationen erstellen", "searchPlaceholder": "Integrationen suchen", "empty": "Keine Integrationen registriert. Deklarieren Sie Anbieter unter options.providers des Integrations-Plugins in medusa-config.", "emptyFiltered": "Keine Integrationen entsprechen Ihren Filtern.", "tested": "getestet", "testFailed": "Test fehlgeschlagen", "tabs": { "all": "Alle" } }, "browse": { "title": "Katalog", "subtitle": "Verfügbare Integrationen finden", "publish": "Integration hinzufügen", "learnMore": "Erfahren Sie, wie Sie Ihre eigene Integration erstellen und veröffentlichen", "searchPlaceholder": "Integrationen suchen", "by": "von {{author}}", "installed": "Installiert", "notInstalled": "Nicht installiert", "add": "Hinzufügen", "settings": "Einstellungen", "install_docs": "Dokumentation lesen", "install_empty": "Für diese Integration sind noch keine Einrichtungsanweisungen verfügbar.", "install_truncated": "Diese Anweisungen sind zu lang für die Anzeige hier — öffnen Sie die Dokumentation." }, "columns": { "integration": "Integration", "description": "Beschreibung", "category": "Kategorie", "status": "Status" }, "status": { "notConfigured": "Nicht konfiguriert", "incomplete": "Unvollständig", "enabled": "Aktiviert", "disabled": "Deaktiviert", "configured": "Konfiguriert", "connected": "Verbunden", "connectionFailed": "Verbindung fehlgeschlagen" }, "meta": { "version": "v{{version}}", "authorPrefix": "von" }, "labels": { "category": "Kategorie" }, "categories": { "payment": "Zahlung", "notification": "Benachrichtigungen", "fulfillment": "Erfüllung", "search": "Suche", "content": "Inhalte", "analytics": "Analyse", "authentication": "Authentifizierung", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marktplatz", "feed": "Feeds", "file_providers": "Dateianbieter", "other": "Sonstiges" }, "actions": { "test": "Verbindung testen", "enable": "Aktivieren", "disable": "Deaktivieren", "delete": "Löschen", "edit": "Bearbeiten", "save": "Speichern", "cancel": "Abbrechen" }, "delete": { "title": "Konfiguration löschen", "description": "Die gespeicherte Konfiguration für {{name}} entfernen? Diese Aktion kann nicht rückgängig gemacht werden." }, "form": { "required": "{{field}} ist erforderlich", "invalidJson": "Ungültiges JSON", "keepSecret": "•••••• – leer lassen, um beizubehalten", "items": "{{count}} Elemente" }, "toast": { "saved": "Gespeichert", "saveFailed": "Speichern fehlgeschlagen", "connectionOk": "Verbindung OK", "testFailed": "Test fehlgeschlagen", "enabled": "Aktiviert", "disabled": "Deaktiviert", "deleted": "Konfiguration gelöscht", "deleteFailed": "Löschen fehlgeschlagen", "updateFailed": "Aktualisierung fehlgeschlagen" }, "unknown": "Unbekannte Integration „{{id}}“.", "back": "Zurück zu den Integrationen" };
3267
+ const de = {
3268
+ integration: integration$s
3269
+ };
3270
+ const integration$r = { "list": { "title": "Ενσωματώσεις", "subtitle": "Διαχείριση ρυθμίσεων ενσωματώσεων", "browseIntegrations": "Περιήγηση στις ενσωματώσεις", "learnMore": "Μάθετε πώς να δημιουργείτε ενσωματώσεις", "searchPlaceholder": "Αναζήτηση ενσωματώσεων", "empty": "Δεν έχουν καταχωρηθεί ενσωματώσεις. Δηλώστε παρόχους στο options.providers του πρόσθετου ενσωματώσεων στο medusa-config.", "emptyFiltered": "Καμία ενσωμάτωση δεν ταιριάζει με τα φίλτρα σας.", "tested": "ελέγχθηκε", "testFailed": "ο έλεγχος απέτυχε", "tabs": { "all": "Όλα" } }, "browse": { "title": "Κατάλογος", "subtitle": "Βρείτε διαθέσιμες ενσωματώσεις", "publish": "Προσθήκη ενσωμάτωσης", "learnMore": "Μάθετε πώς να δημιουργήσετε και να δημοσιεύσετε τη δική σας ενσωμάτωση", "searchPlaceholder": "Αναζήτηση ενσωματώσεων", "by": "από {{author}}", "installed": "Εγκατεστημένο", "notInstalled": "Μη εγκατεστημένο", "add": "Προσθήκη", "settings": "Ρυθμίσεις", "install_docs": "Διαβάστε την τεκμηρίωση", "install_empty": "Οι οδηγίες εγκατάστασης για αυτήν την ενσωμάτωση δεν είναι ακόμη διαθέσιμες.", "install_truncated": "Αυτές οι οδηγίες είναι πολύ μεγάλες για να εμφανιστούν εδώ — ανοίξτε την τεκμηρίωση." }, "columns": { "integration": "Ενσωμάτωση", "description": "Περιγραφή", "category": "Κατηγορία", "status": "Κατάσταση" }, "status": { "notConfigured": "Μη διαμορφωμένο", "incomplete": "Ημιτελές", "enabled": "Ενεργοποιημένο", "disabled": "Απενεργοποιημένο", "configured": "Διαμορφωμένο", "connected": "Συνδεδεμένο", "connectionFailed": "Η σύνδεση απέτυχε" }, "meta": { "version": "v{{version}}", "authorPrefix": "από" }, "labels": { "category": "Κατηγορία" }, "categories": { "payment": "Πληρωμές", "notification": "Ειδοποιήσεις", "fulfillment": "Εκπλήρωση", "search": "Αναζήτηση", "content": "Περιεχόμενο", "analytics": "Αναλυτικά στοιχεία", "authentication": "Έλεγχος ταυτότητας", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Αγορά", "feed": "Ροές", "file_providers": "Πάροχοι αρχείων", "other": "Άλλα" }, "actions": { "test": "Έλεγχος σύνδεσης", "enable": "Ενεργοποίηση", "disable": "Απενεργοποίηση", "delete": "Διαγραφή", "edit": "Επεξεργασία", "save": "Αποθήκευση", "cancel": "Ακύρωση" }, "delete": { "title": "Διαγραφή διαμόρφωσης", "description": "Κατάργηση της αποθηκευμένης διαμόρφωσης για {{name}}; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί." }, "form": { "required": "Το πεδίο {{field}} είναι υποχρεωτικό", "invalidJson": "Μη έγκυρο JSON", "keepSecret": "•••••• – αφήστε το κενό για διατήρηση", "items": "{{count}} στοιχεία" }, "toast": { "saved": "Αποθηκεύτηκε", "saveFailed": "Η αποθήκευση απέτυχε", "connectionOk": "Η σύνδεση είναι εντάξει", "testFailed": "Ο έλεγχος απέτυχε", "enabled": "Ενεργοποιήθηκε", "disabled": "Απενεργοποιήθηκε", "deleted": "Η διαμόρφωση διαγράφηκε", "deleteFailed": "Η διαγραφή απέτυχε", "updateFailed": "Η ενημέρωση απέτυχε" }, "unknown": "Άγνωστη ενσωμάτωση «{{id}}».", "back": "Επιστροφή στις ενσωματώσεις" };
3271
+ const el = {
3272
+ integration: integration$r
3273
+ };
3274
+ const integration$q = { "list": { "title": "Integrations", "subtitle": "Manage integrations settings", "browseIntegrations": "Browse Integrations", "learnMore": "Learn how to build integrations", "searchPlaceholder": "Search integrations", "empty": "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.", "emptyFiltered": "No integrations match your filters.", "tested": "tested", "testFailed": "test failed", "tabs": { "all": "All" } }, "browse": { "title": "Browse", "subtitle": "Find available integrations", "publish": "Add Integration", "learnMore": "Learn how to build and publish your own integration", "searchPlaceholder": "Search integrations", "by": "by {{author}}", "installed": "Installed", "notInstalled": "Not installed", "add": "Add", "settings": "Settings", "install_docs": "Read docs", "install_empty": "Setup instructions for this integration aren't available yet.", "install_truncated": "These instructions are too long to show here — open the documentation." }, "columns": { "integration": "Integration", "description": "Description", "category": "Category", "status": "Status" }, "status": { "notConfigured": "Not configured", "incomplete": "Incomplete", "enabled": "Enabled", "disabled": "Disabled", "configured": "Configured", "connected": "Connected", "connectionFailed": "Connection failed" }, "meta": { "version": "v{{version}}", "authorPrefix": "by" }, "labels": { "category": "Category" }, "categories": { "payment": "Payment", "notification": "Notification", "fulfillment": "Fulfillment", "search": "Search", "content": "Content", "analytics": "Analytics", "authentication": "Authentication", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "File providers", "other": "Other" }, "actions": { "test": "Test connection", "enable": "Enable", "disable": "Disable", "delete": "Delete", "edit": "Edit", "save": "Save", "cancel": "Cancel" }, "delete": { "title": "Delete configuration", "description": "Remove the stored configuration for {{name}}? This can't be undone." }, "form": { "required": "{{field}} is required", "invalidJson": "Invalid JSON", "keepSecret": "•••••• – leave blank to keep", "items": "{{count}} items" }, "toast": { "saved": "Saved", "saveFailed": "Save failed", "connectionOk": "Connection OK", "testFailed": "Test failed", "enabled": "Enabled", "disabled": "Disabled", "deleted": "Configuration deleted", "deleteFailed": "Delete failed", "updateFailed": "Update failed" }, "unknown": 'Unknown integration "{{id}}".', "back": "Back to integrations" };
2697
3275
  const en = {
2698
- integration: integration$1
3276
+ integration: integration$q
3277
+ };
3278
+ const integration$p = { "list": { "title": "Integrations", "subtitle": "Manage integrations settings", "browseIntegrations": "Browse Integrations", "learnMore": "Learn how to build integrations", "searchPlaceholder": "Search integrations", "empty": "No integrations registered. Declare providers under the integration plugin's options.providers in medusa-config.", "emptyFiltered": "No integrations match your filters.", "tested": "tested", "testFailed": "test failed", "tabs": { "all": "All" } }, "browse": { "title": "Browse", "subtitle": "Find available integrations", "publish": "Add Integration", "learnMore": "Learn how to build and publish your own integration", "searchPlaceholder": "Search integrations", "by": "by {{author}}", "installed": "Installed", "notInstalled": "Not installed", "add": "Add", "settings": "Settings", "install_docs": "Read docs", "install_empty": "Setup instructions for this integration aren't available yet.", "install_truncated": "These instructions are too long to show here — open the documentation." }, "columns": { "integration": "Integration", "description": "Description", "category": "Category", "status": "Status" }, "status": { "notConfigured": "Not configured", "incomplete": "Incomplete", "enabled": "Enabled", "disabled": "Disabled", "configured": "Configured", "connected": "Connected", "connectionFailed": "Connection failed" }, "meta": { "version": "v{{version}}", "authorPrefix": "by" }, "labels": { "category": "Category" }, "categories": { "payment": "Payment", "notification": "Notification", "fulfillment": "Fulfilment", "search": "Search", "content": "Content", "analytics": "Analytics", "authentication": "Authentication", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "File providers", "other": "Other" }, "actions": { "test": "Test connection", "enable": "Enable", "disable": "Disable", "delete": "Delete", "edit": "Edit", "save": "Save", "cancel": "Cancel" }, "delete": { "title": "Delete configuration", "description": "Remove the stored configuration for {{name}}? This can't be undone." }, "form": { "required": "{{field}} is required", "invalidJson": "Invalid JSON", "keepSecret": "•••••• – leave blank to keep", "items": "{{count}} items" }, "toast": { "saved": "Saved", "saveFailed": "Save failed", "connectionOk": "Connection OK", "testFailed": "Test failed", "enabled": "Enabled", "disabled": "Disabled", "deleted": "Configuration deleted", "deleteFailed": "Delete failed", "updateFailed": "Update failed" }, "unknown": 'Unknown integration "{{id}}".', "back": "Back to integrations" };
3279
+ const enGB = {
3280
+ integration: integration$p
3281
+ };
3282
+ const integration$o = { "list": { "title": "Integraciones", "subtitle": "Gestiona la configuración de las integraciones", "browseIntegrations": "Explorar integraciones", "learnMore": "Aprende a crear integraciones", "searchPlaceholder": "Buscar integraciones", "empty": "No hay integraciones registradas. Declara los proveedores en options.providers del plugin de integraciones en medusa-config.", "emptyFiltered": "Ninguna integración coincide con tus filtros.", "tested": "probado", "testFailed": "prueba fallida", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encuentra integraciones disponibles", "publish": "Añadir integración", "learnMore": "Aprende a crear y publicar tu propia integración", "searchPlaceholder": "Buscar integraciones", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "No instalado", "add": "Añadir", "settings": "Configuración", "install_docs": "Leer documentación", "install_empty": "Las instrucciones de configuración de esta integración aún no están disponibles.", "install_truncated": "Estas instrucciones son demasiado largas para mostrarlas aquí — abre la documentación." }, "columns": { "integration": "Integración", "description": "Descripción", "category": "Categoría", "status": "Estado" }, "status": { "notConfigured": "Sin configurar", "incomplete": "Incompleto", "enabled": "Habilitado", "disabled": "Deshabilitado", "configured": "Configurado", "connected": "Conectado", "connectionFailed": "Error de conexión" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoría" }, "categories": { "payment": "Pagos", "notification": "Notificaciones", "fulfillment": "Cumplimiento", "search": "Búsqueda", "content": "Contenido", "analytics": "Analíticas", "authentication": "Autenticación", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Proveedores de archivos", "other": "Otros" }, "actions": { "test": "Probar conexión", "enable": "Habilitar", "disable": "Deshabilitar", "delete": "Eliminar", "edit": "Editar", "save": "Guardar", "cancel": "Cancelar" }, "delete": { "title": "Eliminar configuración", "description": "¿Eliminar la configuración guardada de {{name}}? Esta acción no puede deshacerse." }, "form": { "required": "{{field}} es obligatorio", "invalidJson": "JSON no válido", "keepSecret": "•••••• – déjalo en blanco para mantenerlo", "items": "{{count}} elementos" }, "toast": { "saved": "Guardado", "saveFailed": "No se pudo guardar", "connectionOk": "Conexión correcta", "testFailed": "La prueba falló", "enabled": "Habilitado", "disabled": "Deshabilitado", "deleted": "Configuración eliminada", "deleteFailed": "No se pudo eliminar", "updateFailed": "No se pudo actualizar" }, "unknown": "Integración desconocida «{{id}}».", "back": "Volver a integraciones" };
3283
+ const es = {
3284
+ integration: integration$o
3285
+ };
3286
+ const integration$n = { "list": { "title": "یکپارچه‌سازی‌ها", "subtitle": "مدیریت تنظیمات یکپارچه‌سازی‌ها", "browseIntegrations": "مرور یکپارچه‌سازی‌ها", "learnMore": "بیاموزید چگونه یکپارچه‌سازی بسازید", "searchPlaceholder": "جستجوی یکپارچه‌سازی‌ها", "empty": "هیچ یکپارچه‌سازی ثبت نشده است. ارائه‌دهندگان را در options.providers افزونه یکپارچه‌سازی در medusa-config تعریف کنید.", "emptyFiltered": "هیچ یکپارچه‌سازی با فیلترهای شما مطابقت ندارد.", "tested": "آزمایش شد", "testFailed": "آزمایش ناموفق بود", "tabs": { "all": "همه" } }, "browse": { "title": "مرور", "subtitle": "یکپارچه‌سازی‌های موجود را پیدا کنید", "publish": "افزودن یکپارچه‌سازی", "learnMore": "بیاموزید چگونه یکپارچه‌سازی خود را بسازید و منتشر کنید", "searchPlaceholder": "جستجوی یکپارچه‌سازی‌ها", "by": "توسط {{author}}", "installed": "نصب‌شده", "notInstalled": "نصب نشده", "add": "افزودن", "settings": "تنظیمات", "install_docs": "خواندن مستندات", "install_empty": "دستورالعمل راه‌اندازی این یکپارچه‌سازی هنوز در دسترس نیست.", "install_truncated": "این دستورالعمل برای نمایش در اینجا بسیار طولانی است — مستندات را باز کنید." }, "columns": { "integration": "یکپارچه‌سازی", "description": "توضیحات", "category": "دسته‌بندی", "status": "وضعیت" }, "status": { "notConfigured": "پیکربندی نشده", "incomplete": "ناقص", "enabled": "فعال", "disabled": "غیرفعال", "configured": "پیکربندی شده", "connected": "متصل", "connectionFailed": "اتصال ناموفق بود" }, "meta": { "version": "v{{version}}", "authorPrefix": "توسط" }, "labels": { "category": "دسته‌بندی" }, "categories": { "payment": "پرداخت", "notification": "اعلان‌ها", "fulfillment": "پردازش سفارش", "search": "جستجو", "content": "محتوا", "analytics": "تحلیل‌ها", "authentication": "احراز هویت", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "بازارگاه", "feed": "فیدها", "file_providers": "ارائه‌دهندگان فایل", "other": "سایر" }, "actions": { "test": "آزمایش اتصال", "enable": "فعال کردن", "disable": "غیرفعال کردن", "delete": "حذف", "edit": "ویرایش", "save": "ذخیره", "cancel": "لغو" }, "delete": { "title": "حذف پیکربندی", "description": "پیکربندی ذخیره‌شده برای {{name}} حذف شود؟ این عمل قابل بازگشت نیست." }, "form": { "required": "{{field}} الزامی است", "invalidJson": "JSON نامعتبر", "keepSecret": "•••••• – برای حفظ مقدار خالی بگذارید", "items": "{{count}} مورد" }, "toast": { "saved": "ذخیره شد", "saveFailed": "ذخیره‌سازی ناموفق بود", "connectionOk": "اتصال برقرار است", "testFailed": "آزمایش ناموفق بود", "enabled": "فعال شد", "disabled": "غیرفعال شد", "deleted": "پیکربندی حذف شد", "deleteFailed": "حذف ناموفق بود", "updateFailed": "به‌روزرسانی ناموفق بود" }, "unknown": "یکپارچه‌سازی ناشناخته «{{id}}».", "back": "بازگشت به یکپارچه‌سازی‌ها" };
3287
+ const fa = {
3288
+ integration: integration$n
3289
+ };
3290
+ const integration$m = { "list": { "title": "Intégrations", "subtitle": "Gérer les paramètres des intégrations", "browseIntegrations": "Parcourir les intégrations", "learnMore": "Découvrez comment créer des intégrations", "searchPlaceholder": "Rechercher des intégrations", "empty": "Aucune intégration enregistrée. Déclarez les fournisseurs dans options.providers du plugin d'intégrations dans medusa-config.", "emptyFiltered": "Aucune intégration ne correspond à vos filtres.", "tested": "testé", "testFailed": "échec du test", "tabs": { "all": "Toutes" } }, "browse": { "title": "Catalogue", "subtitle": "Trouvez les intégrations disponibles", "publish": "Ajouter une intégration", "learnMore": "Découvrez comment créer et publier votre propre intégration", "searchPlaceholder": "Rechercher des intégrations", "by": "par {{author}}", "installed": "Installé", "notInstalled": "Non installé", "add": "Ajouter", "settings": "Paramètres", "install_docs": "Lire la documentation", "install_empty": "Les instructions de configuration de cette intégration ne sont pas encore disponibles.", "install_truncated": "Ces instructions sont trop longues pour être affichées ici — ouvrez la documentation." }, "columns": { "integration": "Intégration", "description": "Description", "category": "Catégorie", "status": "Statut" }, "status": { "notConfigured": "Non configuré", "incomplete": "Incomplet", "enabled": "Activé", "disabled": "Désactivé", "configured": "Configuré", "connected": "Connecté", "connectionFailed": "Échec de la connexion" }, "meta": { "version": "v{{version}}", "authorPrefix": "par" }, "labels": { "category": "Catégorie" }, "categories": { "payment": "Paiement", "notification": "Notifications", "fulfillment": "Livraison", "search": "Recherche", "content": "Contenu", "analytics": "Analytique", "authentication": "Authentification", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Flux", "file_providers": "Fournisseurs de fichiers", "other": "Autres" }, "actions": { "test": "Tester la connexion", "enable": "Activer", "disable": "Désactiver", "delete": "Supprimer", "edit": "Modifier", "save": "Enregistrer", "cancel": "Annuler" }, "delete": { "title": "Supprimer la configuration", "description": "Supprimer la configuration enregistrée pour {{name}} ? Cette action ne peut être annulée." }, "form": { "required": "{{field}} est requis", "invalidJson": "JSON invalide", "keepSecret": "•••••• – laissez vide pour conserver", "items": "{{count}} éléments" }, "toast": { "saved": "Enregistré", "saveFailed": "Échec de l'enregistrement", "connectionOk": "Connexion OK", "testFailed": "Échec du test", "enabled": "Activé", "disabled": "Désactivé", "deleted": "Configuration supprimée", "deleteFailed": "Échec de la suppression", "updateFailed": "Échec de la mise à jour" }, "unknown": "Intégration inconnue « {{id}} ».", "back": "Retour aux intégrations" };
3291
+ const fr = {
3292
+ integration: integration$m
3293
+ };
3294
+ const integration$l = { "list": { "title": "אינטגרציות", "subtitle": "ניהול הגדרות האינטגרציות", "browseIntegrations": "עיון באינטגרציות", "learnMore": "למדו כיצד לבנות אינטגרציות", "searchPlaceholder": "חיפוש אינטגרציות", "empty": "לא רשומות אינטגרציות. הגדירו ספקים תחת options.providers של תוסף האינטגרציות ב-medusa-config.", "emptyFiltered": "אין אינטגרציות התואמות את הסינון שלך.", "tested": "נבדק", "testFailed": "הבדיקה נכשלה", "tabs": { "all": "הכל" } }, "browse": { "title": "קטלוג", "subtitle": "מצאו אינטגרציות זמינות", "publish": "הוספת אינטגרציה", "learnMore": "למדו כיצד לבנות ולפרסם אינטגרציה משלכם", "searchPlaceholder": "חיפוש אינטגרציות", "by": "על ידי {{author}}", "installed": "מותקן", "notInstalled": "לא מותקן", "add": "הוסף", "settings": "הגדרות", "install_docs": "קרא את התיעוד", "install_empty": "הוראות ההתקנה עבור אינטגרציה זו אינן זמינות עדיין.", "install_truncated": "ההוראות ארוכות מדי להצגה כאן — פתחו את התיעוד." }, "columns": { "integration": "אינטגרציה", "description": "תיאור", "category": "קטגוריה", "status": "סטטוס" }, "status": { "notConfigured": "לא מוגדר", "incomplete": "לא הושלם", "enabled": "מופעל", "disabled": "מושבת", "configured": "מוגדר", "connected": "מחובר", "connectionFailed": "החיבור נכשל" }, "meta": { "version": "v{{version}}", "authorPrefix": "על ידי" }, "labels": { "category": "קטגוריה" }, "categories": { "payment": "תשלומים", "notification": "התראות", "fulfillment": "מימוש", "search": "חיפוש", "content": "תוכן", "analytics": "אנליטיקה", "authentication": "אימות", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "זירת מסחר", "feed": "פידים", "file_providers": "ספקי קבצים", "other": "אחר" }, "actions": { "test": "בדיקת חיבור", "enable": "הפעל", "disable": "השבת", "delete": "מחק", "edit": "ערוך", "save": "שמור", "cancel": "בטל" }, "delete": { "title": "מחיקת תצורה", "description": "להסיר את התצורה השמורה עבור {{name}}? פעולה זו אינה ניתנת לביטול." }, "form": { "required": "{{field}} הוא שדה חובה", "invalidJson": "JSON לא תקין", "keepSecret": "•••••• – השאירו ריק כדי לשמור", "items": "{{count}} פריטים" }, "toast": { "saved": "נשמר", "saveFailed": "השמירה נכשלה", "connectionOk": "החיבור תקין", "testFailed": "הבדיקה נכשלה", "enabled": "הופעל", "disabled": "הושבת", "deleted": "התצורה נמחקה", "deleteFailed": "המחיקה נכשלה", "updateFailed": "העדכון נכשל" }, "unknown": 'אינטגרציה לא ידועה "{{id}}".', "back": "חזרה לאינטגרציות" };
3295
+ const he = {
3296
+ integration: integration$l
3297
+ };
3298
+ const integration$k = { "list": { "title": "Integracije", "subtitle": "Upravljanje postavkama integracija", "browseIntegrations": "Pregledaj integracije", "learnMore": "Saznajte kako izraditi integracije", "searchPlaceholder": "Pretraži integracije", "empty": "Nema registriranih integracija. Deklarirajte pružatelje u options.providers dodatka za integracije u medusa-config.", "emptyFiltered": "Nijedna integracija ne odgovara vašim filtrima.", "tested": "testirano", "testFailed": "test nije uspio", "tabs": { "all": "Sve" } }, "browse": { "title": "Katalog", "subtitle": "Pronađite dostupne integracije", "publish": "Dodaj integraciju", "learnMore": "Saznajte kako izraditi i objaviti vlastitu integraciju", "searchPlaceholder": "Pretraži integracije", "by": "od {{author}}", "installed": "Instalirano", "notInstalled": "Nije instalirano", "add": "Dodaj", "settings": "Postavke", "install_docs": "Pročitaj dokumentaciju", "install_empty": "Upute za postavljanje ove integracije još nisu dostupne.", "install_truncated": "Ove su upute predugačke za prikaz ovdje — otvorite dokumentaciju." }, "columns": { "integration": "Integracija", "description": "Opis", "category": "Kategorija", "status": "Status" }, "status": { "notConfigured": "Nije konfigurirano", "incomplete": "Nepotpuno", "enabled": "Omogućeno", "disabled": "Onemogućeno", "configured": "Konfigurirano", "connected": "Povezano", "connectionFailed": "Povezivanje nije uspjelo" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Plaćanja", "notification": "Obavijesti", "fulfillment": "Otprema", "search": "Pretraga", "content": "Sadržaj", "analytics": "Analitika", "authentication": "Autentifikacija", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Tržnica", "feed": "Feedovi", "file_providers": "Pružatelji datoteka", "other": "Ostalo" }, "actions": { "test": "Testiraj vezu", "enable": "Omogući", "disable": "Onemogući", "delete": "Izbriši", "edit": "Uredi", "save": "Spremi", "cancel": "Otkaži" }, "delete": { "title": "Brisanje konfiguracije", "description": "Ukloniti spremljenu konfiguraciju za {{name}}? Ovu radnju nije moguće poništiti." }, "form": { "required": "{{field}} je obavezno", "invalidJson": "Neispravan JSON", "keepSecret": "•••••• – ostavite prazno za zadržavanje", "items": "{{count}} stavki" }, "toast": { "saved": "Spremljeno", "saveFailed": "Spremanje nije uspjelo", "connectionOk": "Veza uspostavljena", "testFailed": "Test nije uspio", "enabled": "Omogućeno", "disabled": "Onemogućeno", "deleted": "Konfiguracija izbrisana", "deleteFailed": "Brisanje nije uspjelo", "updateFailed": "Ažuriranje nije uspjelo" }, "unknown": 'Nepoznata integracija "{{id}}".', "back": "Natrag na integracije" };
3299
+ const hr = {
3300
+ integration: integration$k
3301
+ };
3302
+ const integration$j = { "list": { "title": "Integrációk", "subtitle": "Integrációk beállításainak kezelése", "browseIntegrations": "Integrációk böngészése", "learnMore": "Ismerje meg, hogyan készíthet integrációkat", "searchPlaceholder": "Integrációk keresése", "empty": "Nincsenek regisztrált integrációk. Adja meg a szolgáltatókat az integrációs bővítmény options.providers beállításában a medusa-config fájlban.", "emptyFiltered": "Egyetlen integráció sem felel meg a szűrőknek.", "tested": "tesztelve", "testFailed": "a teszt sikertelen", "tabs": { "all": "Összes" } }, "browse": { "title": "Katalógus", "subtitle": "Találjon elérhető integrációkat", "publish": "Integráció hozzáadása", "learnMore": "Ismerje meg, hogyan készítheti el és teheti közzé saját integrációját", "searchPlaceholder": "Integrációk keresése", "by": "{{author}} által", "installed": "Telepítve", "notInstalled": "Nincs telepítve", "add": "Hozzáadás", "settings": "Beállítások", "install_docs": "Dokumentáció olvasása", "install_empty": "Ehhez az integrációhoz még nem érhető el beállítási útmutató.", "install_truncated": "Ez az útmutató túl hosszú ahhoz, hogy itt megjelenjen — nyissa meg a dokumentációt." }, "columns": { "integration": "Integráció", "description": "Leírás", "category": "Kategória", "status": "Státusz" }, "status": { "notConfigured": "Nincs konfigurálva", "incomplete": "Befejezetlen", "enabled": "Engedélyezve", "disabled": "Letiltva", "configured": "Konfigurálva", "connected": "Csatlakoztatva", "connectionFailed": "A kapcsolódás sikertelen" }, "meta": { "version": "v{{version}}", "authorPrefix": "készítette:" }, "labels": { "category": "Kategória" }, "categories": { "payment": "Fizetés", "notification": "Értesítések", "fulfillment": "Teljesítés", "search": "Keresés", "content": "Tartalom", "analytics": "Analitika", "authentication": "Hitelesítés", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Piactér", "feed": "Hírcsatornák", "file_providers": "Fájlszolgáltatók", "other": "Egyéb" }, "actions": { "test": "Kapcsolat tesztelése", "enable": "Engedélyezés", "disable": "Letiltás", "delete": "Törlés", "edit": "Szerkesztés", "save": "Mentés", "cancel": "Mégse" }, "delete": { "title": "Konfiguráció törlése", "description": "Eltávolítja a(z) {{name}} mentett konfigurációját? Ez a művelet nem vonható vissza." }, "form": { "required": "A(z) {{field}} megadása kötelező", "invalidJson": "Érvénytelen JSON", "keepSecret": "•••••• – hagyja üresen a megtartáshoz", "items": "{{count}} elem" }, "toast": { "saved": "Mentve", "saveFailed": "A mentés sikertelen", "connectionOk": "A kapcsolat rendben", "testFailed": "A teszt sikertelen", "enabled": "Engedélyezve", "disabled": "Letiltva", "deleted": "Konfiguráció törölve", "deleteFailed": "A törlés sikertelen", "updateFailed": "A frissítés sikertelen" }, "unknown": "Ismeretlen integráció: „{{id}}”.", "back": "Vissza az integrációkhoz" };
3303
+ const hu = {
3304
+ integration: integration$j
3305
+ };
3306
+ const integration$i = { "list": { "title": "Integrasi", "subtitle": "Kelola pengaturan integrasi", "browseIntegrations": "Jelajahi integrasi", "learnMore": "Pelajari cara membangun integrasi", "searchPlaceholder": "Cari integrasi", "empty": "Tidak ada integrasi yang terdaftar. Deklarasikan penyedia di options.providers plugin integrasi pada medusa-config.", "emptyFiltered": "Tidak ada integrasi yang cocok dengan filter Anda.", "tested": "teruji", "testFailed": "pengujian gagal", "tabs": { "all": "Semua" } }, "browse": { "title": "Katalog", "subtitle": "Temukan integrasi yang tersedia", "publish": "Tambah integrasi", "learnMore": "Pelajari cara membangun dan memublikasikan integrasi Anda sendiri", "searchPlaceholder": "Cari integrasi", "by": "oleh {{author}}", "installed": "Terpasang", "notInstalled": "Belum terpasang", "add": "Tambah", "settings": "Pengaturan", "install_docs": "Baca dokumentasi", "install_empty": "Petunjuk penyiapan untuk integrasi ini belum tersedia.", "install_truncated": "Petunjuk ini terlalu panjang untuk ditampilkan di sini — buka dokumentasinya." }, "columns": { "integration": "Integrasi", "description": "Deskripsi", "category": "Kategori", "status": "Status" }, "status": { "notConfigured": "Belum dikonfigurasi", "incomplete": "Belum lengkap", "enabled": "Diaktifkan", "disabled": "Dinonaktifkan", "configured": "Terkonfigurasi", "connected": "Terhubung", "connectionFailed": "Koneksi gagal" }, "meta": { "version": "v{{version}}", "authorPrefix": "oleh" }, "labels": { "category": "Kategori" }, "categories": { "payment": "Pembayaran", "notification": "Notifikasi", "fulfillment": "Pemenuhan", "search": "Pencarian", "content": "Konten", "analytics": "Analitik", "authentication": "Autentikasi", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "Penyedia file", "other": "Lainnya" }, "actions": { "test": "Uji koneksi", "enable": "Aktifkan", "disable": "Nonaktifkan", "delete": "Hapus", "edit": "Edit", "save": "Simpan", "cancel": "Batal" }, "delete": { "title": "Hapus konfigurasi", "description": "Hapus konfigurasi tersimpan untuk {{name}}? Tindakan ini tidak dapat dibatalkan." }, "form": { "required": "{{field}} wajib diisi", "invalidJson": "JSON tidak valid", "keepSecret": "•••••• – biarkan kosong untuk mempertahankan", "items": "{{count}} item" }, "toast": { "saved": "Tersimpan", "saveFailed": "Gagal menyimpan", "connectionOk": "Koneksi berhasil", "testFailed": "Pengujian gagal", "enabled": "Diaktifkan", "disabled": "Dinonaktifkan", "deleted": "Konfigurasi dihapus", "deleteFailed": "Gagal menghapus", "updateFailed": "Gagal memperbarui" }, "unknown": 'Integrasi tidak dikenal "{{id}}".', "back": "Kembali ke integrasi" };
3307
+ const id = {
3308
+ integration: integration$i
3309
+ };
3310
+ const integration$h = { "list": { "title": "Integrazioni", "subtitle": "Gestisci le impostazioni delle integrazioni", "browseIntegrations": "Esplora le integrazioni", "learnMore": "Scopri come creare integrazioni", "searchPlaceholder": "Cerca integrazioni", "empty": "Nessuna integrazione registrata. Dichiara i fornitori in options.providers del plugin integrazioni in medusa-config.", "emptyFiltered": "Nessuna integrazione corrisponde ai filtri.", "tested": "testato", "testFailed": "test fallito", "tabs": { "all": "Tutte" } }, "browse": { "title": "Catalogo", "subtitle": "Trova le integrazioni disponibili", "publish": "Aggiungi integrazione", "learnMore": "Scopri come creare e pubblicare la tua integrazione", "searchPlaceholder": "Cerca integrazioni", "by": "di {{author}}", "installed": "Installato", "notInstalled": "Non installato", "add": "Aggiungi", "settings": "Impostazioni", "install_docs": "Leggi la documentazione", "install_empty": "Le istruzioni di configurazione per questa integrazione non sono ancora disponibili.", "install_truncated": "Queste istruzioni sono troppo lunghe per essere mostrate qui — apri la documentazione." }, "columns": { "integration": "Integrazione", "description": "Descrizione", "category": "Categoria", "status": "Stato" }, "status": { "notConfigured": "Non configurato", "incomplete": "Incompleto", "enabled": "Abilitato", "disabled": "Disabilitato", "configured": "Configurato", "connected": "Connesso", "connectionFailed": "Connessione non riuscita" }, "meta": { "version": "v{{version}}", "authorPrefix": "di" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamenti", "notification": "Notifiche", "fulfillment": "Evasione", "search": "Ricerca", "content": "Contenuti", "analytics": "Analisi", "authentication": "Autenticazione", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feed", "file_providers": "Fornitori di file", "other": "Altro" }, "actions": { "test": "Testa connessione", "enable": "Abilita", "disable": "Disabilita", "delete": "Elimina", "edit": "Modifica", "save": "Salva", "cancel": "Annulla" }, "delete": { "title": "Elimina configurazione", "description": "Rimuovere la configurazione salvata per {{name}}? Questa azione non può essere annullata." }, "form": { "required": "{{field}} è obbligatorio", "invalidJson": "JSON non valido", "keepSecret": "•••••• – lascia vuoto per mantenere", "items": "{{count}} elementi" }, "toast": { "saved": "Salvato", "saveFailed": "Salvataggio non riuscito", "connectionOk": "Connessione OK", "testFailed": "Test non riuscito", "enabled": "Abilitato", "disabled": "Disabilitato", "deleted": "Configurazione eliminata", "deleteFailed": "Eliminazione non riuscita", "updateFailed": "Aggiornamento non riuscito" }, "unknown": "Integrazione sconosciuta «{{id}}».", "back": "Torna alle integrazioni" };
3311
+ const it = {
3312
+ integration: integration$h
2699
3313
  };
2700
- const integration = {
2701
- list: {
2702
- title: "Интеграции",
2703
- subtitle: "Управление настройками интеграций",
2704
- browseIntegrations: "Найти интеграции",
2705
- learnMore: "Как создавать интеграции",
2706
- searchPlaceholder: "Поиск интеграций",
2707
- empty: "Нет зарегистрированных интеграций. Объявите провайдеров в options.providers плагина интеграций в medusa-config.",
2708
- emptyFiltered: "Нет интеграций по заданным фильтрам",
2709
- tested: "проверено",
2710
- testFailed: "ошибка проверки",
2711
- tabs: {
2712
- all: "Все"
2713
- }
2714
- },
2715
- browse: {
2716
- title: "Каталог",
2717
- subtitle: "Поиск доступных интеграций",
2718
- publish: "Добавить интеграцию",
2719
- learnMore: "Как создать и опубликовать свою интеграцию",
2720
- searchPlaceholder: "Поиск интеграций",
2721
- by: "от {{author}}",
2722
- installed: "Установлено",
2723
- notInstalled: "Не установлено",
2724
- add: "Добавить",
2725
- settings: "Настройки",
2726
- install_docs: "Читать документацию",
2727
- install_empty: "Инструкция по настройке для этой интеграции пока недоступна.",
2728
- install_truncated: "Инструкция слишком длинная для показа здесь — откройте документацию."
2729
- },
2730
- columns: {
2731
- integration: "Интеграция",
2732
- description: "Описание",
2733
- category: "Категория",
2734
- status: "Статус"
2735
- },
2736
- status: {
2737
- notConfigured: "Не настроено",
2738
- incomplete: "Не завершено",
2739
- enabled: "Включено",
2740
- disabled: "Выключено",
2741
- configured: "Настроено",
2742
- connected: "Подключено",
2743
- connectionFailed: "Ошибка подключения"
2744
- },
2745
- meta: {
2746
- version: "v{{version}}",
2747
- authorPrefix: "от"
2748
- },
2749
- labels: {
2750
- category: "Категория"
2751
- },
2752
- categories: {
2753
- payment: "Платежи",
2754
- notification: "Уведомления",
2755
- fulfillment: "Доставка",
2756
- search: "Поиск",
2757
- content: "Контент",
2758
- analytics: "Аналитика",
2759
- authentication: "Аутентификация",
2760
- erp: "ERP",
2761
- crm: "CRM",
2762
- pim: "PIM",
2763
- marketplace: "Маркетплейс",
2764
- feed: "Фиды",
2765
- file_providers: "Файловые провайдеры",
2766
- other: "Прочее"
2767
- },
2768
- actions: {
2769
- test: "Проверить соединение",
2770
- enable: "Включить",
2771
- disable: "Выключить",
2772
- "delete": "Удалить",
2773
- edit: "Редактировать",
2774
- save: "Сохранить",
2775
- cancel: "Отмена"
2776
- },
2777
- "delete": {
2778
- title: "Удалить конфигурацию",
2779
- description: "Удалить сохранённую конфигурацию «{{name}}»? Это действие необратимо."
2780
- },
2781
- form: {
2782
- required: "Поле «{{field}}» обязательно",
2783
- invalidJson: "Некорректный JSON",
2784
- keepSecret: "•••••• – оставьте пустым, чтобы не менять",
2785
- items: "{{count}} шт."
2786
- },
2787
- toast: {
2788
- saved: "Сохранено",
2789
- saveFailed: "Не удалось сохранить",
2790
- connectionOk: "Соединение установлено",
2791
- testFailed: "Проверка не удалась",
2792
- enabled: "Включено",
2793
- disabled: "Выключено",
2794
- deleted: "Конфигурация удалена",
2795
- deleteFailed: "Не удалось удалить",
2796
- updateFailed: "Не удалось обновить"
2797
- },
2798
- unknown: "Неизвестная интеграция «{{id}}».",
2799
- back: "К интеграциям"
3314
+ const integration$g = { "list": { "title": "インテグレーション", "subtitle": "インテグレーションの設定を管理します", "browseIntegrations": "インテグレーションを探す", "learnMore": "インテグレーションの作り方を学ぶ", "searchPlaceholder": "インテグレーションを検索", "empty": "登録されているインテグレーションはありません。medusa-config のインテグレーションプラグインの options.providers にプロバイダーを宣言してください。", "emptyFiltered": "フィルターに一致するインテグレーションはありません。", "tested": "テスト済み", "testFailed": "テスト失敗", "tabs": { "all": "すべて" } }, "browse": { "title": "カタログ", "subtitle": "利用可能なインテグレーションを探す", "publish": "インテグレーションを追加", "learnMore": "独自のインテグレーションを作成して公開する方法を学ぶ", "searchPlaceholder": "インテグレーションを検索", "by": "{{author}} 作", "installed": "インストール済み", "notInstalled": "未インストール", "add": "追加", "settings": "設定", "install_docs": "ドキュメントを読む", "install_empty": "このインテグレーションのセットアップ手順はまだ利用できません。", "install_truncated": "この手順はここに表示するには長すぎます — ドキュメントを開いてください。" }, "columns": { "integration": "インテグレーション", "description": "説明", "category": "カテゴリー", "status": "ステータス" }, "status": { "notConfigured": "未設定", "incomplete": "未完了", "enabled": "有効", "disabled": "無効", "configured": "設定済み", "connected": "接続済み", "connectionFailed": "接続に失敗しました" }, "meta": { "version": "v{{version}}", "authorPrefix": "作成者" }, "labels": { "category": "カテゴリー" }, "categories": { "payment": "決済", "notification": "通知", "fulfillment": "フルフィルメント", "search": "検索", "content": "コンテンツ", "analytics": "分析", "authentication": "認証", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "マーケットプレイス", "feed": "フィード", "file_providers": "ファイルプロバイダー", "other": "その他" }, "actions": { "test": "接続テスト", "enable": "有効化", "disable": "無効化", "delete": "削除", "edit": "編集", "save": "保存", "cancel": "キャンセル" }, "delete": { "title": "設定を削除", "description": "{{name}} の保存済み設定を削除しますか?この操作は元に戻せません。" }, "form": { "required": "{{field}} は必須です", "invalidJson": "無効な JSON", "keepSecret": "•••••• – 変更しない場合は空欄のまま", "items": "{{count}} 件" }, "toast": { "saved": "保存しました", "saveFailed": "保存に失敗しました", "connectionOk": "接続に成功しました", "testFailed": "テストに失敗しました", "enabled": "有効にしました", "disabled": "無効にしました", "deleted": "設定を削除しました", "deleteFailed": "削除に失敗しました", "updateFailed": "更新に失敗しました" }, "unknown": "不明なインテグレーション「{{id}}」。", "back": "インテグレーションに戻る" };
3315
+ const ja = {
3316
+ integration: integration$g
2800
3317
  };
3318
+ const integration$f = { "list": { "title": "통합", "subtitle": "통합 설정 관리", "browseIntegrations": "통합 둘러보기", "learnMore": "통합을 만드는 방법 알아보기", "searchPlaceholder": "통합 검색", "empty": "등록된 통합이 없습니다. medusa-config의 통합 플러그인 options.providers에 제공자를 선언하세요.", "emptyFiltered": "필터와 일치하는 통합이 없습니다.", "tested": "테스트됨", "testFailed": "테스트 실패", "tabs": { "all": "전체" } }, "browse": { "title": "카탈로그", "subtitle": "사용 가능한 통합 찾기", "publish": "통합 추가", "learnMore": "자신만의 통합을 만들고 게시하는 방법 알아보기", "searchPlaceholder": "통합 검색", "by": "{{author}} 제작", "installed": "설치됨", "notInstalled": "설치되지 않음", "add": "추가", "settings": "설정", "install_docs": "문서 읽기", "install_empty": "이 통합에 대한 설정 안내는 아직 제공되지 않습니다.", "install_truncated": "안내가 너무 길어 여기에 표시할 수 없습니다 — 문서를 열어 보세요." }, "columns": { "integration": "통합", "description": "설명", "category": "카테고리", "status": "상태" }, "status": { "notConfigured": "구성되지 않음", "incomplete": "미완료", "enabled": "활성화됨", "disabled": "비활성화됨", "configured": "구성됨", "connected": "연결됨", "connectionFailed": "연결 실패" }, "meta": { "version": "v{{version}}", "authorPrefix": "제작" }, "labels": { "category": "카테고리" }, "categories": { "payment": "결제", "notification": "알림", "fulfillment": "이행", "search": "검색", "content": "콘텐츠", "analytics": "분석", "authentication": "인증", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "마켓플레이스", "feed": "피드", "file_providers": "파일 제공자", "other": "기타" }, "actions": { "test": "연결 테스트", "enable": "활성화", "disable": "비활성화", "delete": "삭제", "edit": "편집", "save": "저장", "cancel": "취소" }, "delete": { "title": "구성 삭제", "description": "{{name}}의 저장된 구성을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." }, "form": { "required": "{{field}}은(는) 필수입니다", "invalidJson": "잘못된 JSON", "keepSecret": "•••••• – 유지하려면 비워 두세요", "items": "{{count}}개 항목" }, "toast": { "saved": "저장됨", "saveFailed": "저장 실패", "connectionOk": "연결 성공", "testFailed": "테스트 실패", "enabled": "활성화됨", "disabled": "비활성화됨", "deleted": "구성이 삭제됨", "deleteFailed": "삭제 실패", "updateFailed": "업데이트 실패" }, "unknown": '알 수 없는 통합 "{{id}}".', "back": "통합으로 돌아가기" };
3319
+ const ko = {
3320
+ integration: integration$f
3321
+ };
3322
+ const integration$e = { "list": { "title": "Integracijos", "subtitle": "Integracijų nustatymų valdymas", "browseIntegrations": "Naršyti integracijas", "learnMore": "Sužinokite, kaip kurti integracijas", "searchPlaceholder": "Ieškoti integracijų", "empty": "Nėra registruotų integracijų. Nurodykite teikėjus integracijų papildinio options.providers medusa-config faile.", "emptyFiltered": "Nė viena integracija neatitinka jūsų filtrų.", "tested": "patikrinta", "testFailed": "patikra nepavyko", "tabs": { "all": "Visos" } }, "browse": { "title": "Katalogas", "subtitle": "Raskite prieinamas integracijas", "publish": "Pridėti integraciją", "learnMore": "Sužinokite, kaip sukurti ir paskelbti savo integraciją", "searchPlaceholder": "Ieškoti integracijų", "by": "sukūrė {{author}}", "installed": "Įdiegta", "notInstalled": "Neįdiegta", "add": "Pridėti", "settings": "Nustatymai", "install_docs": "Skaityti dokumentaciją", "install_empty": "Šios integracijos sąrankos instrukcijos dar nepasiekiamos.", "install_truncated": "Šios instrukcijos per ilgos, kad būtų rodomos čia — atverkite dokumentaciją." }, "columns": { "integration": "Integracija", "description": "Aprašymas", "category": "Kategorija", "status": "Būsena" }, "status": { "notConfigured": "Nesukonfigūruota", "incomplete": "Nebaigta", "enabled": "Įjungta", "disabled": "Išjungta", "configured": "Sukonfigūruota", "connected": "Prijungta", "connectionFailed": "Nepavyko prisijungti" }, "meta": { "version": "v{{version}}", "authorPrefix": "sukūrė" }, "labels": { "category": "Kategorija" }, "categories": { "payment": "Mokėjimai", "notification": "Pranešimai", "fulfillment": "Vykdymas", "search": "Paieška", "content": "Turinys", "analytics": "Analitika", "authentication": "Autentifikavimas", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Prekyvietė", "feed": "Srautai", "file_providers": "Failų teikėjai", "other": "Kita" }, "actions": { "test": "Tikrinti ryšį", "enable": "Įjungti", "disable": "Išjungti", "delete": "Ištrinti", "edit": "Keisti", "save": "Išsaugoti", "cancel": "Atšaukti" }, "delete": { "title": "Ištrinti konfigūraciją", "description": "Pašalinti išsaugotą {{name}} konfigūraciją? Šis veiksmas neatstatomas." }, "form": { "required": "{{field}} yra privalomas", "invalidJson": "Netinkamas JSON", "keepSecret": "•••••• – palikite tuščią, kad išliktų", "items": "{{count}} elementai" }, "toast": { "saved": "Išsaugota", "saveFailed": "Nepavyko išsaugoti", "connectionOk": "Ryšys sėkmingas", "testFailed": "Patikra nepavyko", "enabled": "Įjungta", "disabled": "Išjungta", "deleted": "Konfigūracija ištrinta", "deleteFailed": "Nepavyko ištrinti", "updateFailed": "Nepavyko atnaujinti" }, "unknown": "Nežinoma integracija „{{id}}“.", "back": "Atgal į integracijas" };
3323
+ const lt = {
3324
+ integration: integration$e
3325
+ };
3326
+ const integration$d = { "list": { "title": "Интеграции", "subtitle": "Управување со поставките на интеграциите", "browseIntegrations": "Прегледај интеграции", "learnMore": "Научете како да создавате интеграции", "searchPlaceholder": "Пребарај интеграции", "empty": "Нема регистрирани интеграции. Декларирајте даватели во options.providers на приклучокот за интеграции во medusa-config.", "emptyFiltered": "Нема интеграции што одговараат на вашите филтри.", "tested": "тестирано", "testFailed": "тестот не успеа", "tabs": { "all": "Сите" } }, "browse": { "title": "Каталог", "subtitle": "Најдете достапни интеграции", "publish": "Додај интеграција", "learnMore": "Научете како да создадете и објавите сопствена интеграција", "searchPlaceholder": "Пребарај интеграции", "by": "од {{author}}", "installed": "Инсталирано", "notInstalled": "Не е инсталирано", "add": "Додади", "settings": "Поставки", "install_docs": "Прочитај ја документацијата", "install_empty": "Упатствата за поставување на оваа интеграција сè уште не се достапни.", "install_truncated": "Овие упатства се предолги за да се прикажат овде — отворете ја документацијата." }, "columns": { "integration": "Интеграција", "description": "Опис", "category": "Категорија", "status": "Статус" }, "status": { "notConfigured": "Не е конфигурирано", "incomplete": "Незавршено", "enabled": "Овозможено", "disabled": "Оневозможено", "configured": "Конфигурирано", "connected": "Поврзано", "connectionFailed": "Поврзувањето не успеа" }, "meta": { "version": "v{{version}}", "authorPrefix": "од" }, "labels": { "category": "Категорија" }, "categories": { "payment": "Плаќања", "notification": "Известувања", "fulfillment": "Исполнување", "search": "Пребарување", "content": "Содржина", "analytics": "Аналитика", "authentication": "Автентикација", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Пазар", "feed": "Фидови", "file_providers": "Даватели на датотеки", "other": "Друго" }, "actions": { "test": "Тестирај врска", "enable": "Овозможи", "disable": "Оневозможи", "delete": "Избриши", "edit": "Уреди", "save": "Зачувај", "cancel": "Откажи" }, "delete": { "title": "Бришење на конфигурацијата", "description": "Да се отстрани зачуваната конфигурација за {{name}}? Ова дејство не може да се врати." }, "form": { "required": "{{field}} е задолжително", "invalidJson": "Неважечки JSON", "keepSecret": "•••••• – оставете празно за да го задржите", "items": "{{count}} ставки" }, "toast": { "saved": "Зачувано", "saveFailed": "Зачувувањето не успеа", "connectionOk": "Врската е успешна", "testFailed": "Тестот не успеа", "enabled": "Овозможено", "disabled": "Оневозможено", "deleted": "Конфигурацијата е избришана", "deleteFailed": "Бришењето не успеа", "updateFailed": "Ажурирањето не успеа" }, "unknown": "Непозната интеграција „{{id}}“.", "back": "Назад кон интеграциите" };
3327
+ const mk = {
3328
+ integration: integration$d
3329
+ };
3330
+ const integration$c = { "list": { "title": "Интеграциуд", "subtitle": "Интеграцийн тохиргоог удирдах", "browseIntegrations": "Интеграциудыг үзэх", "learnMore": "Интеграци хэрхэн бүтээхийг сурах", "searchPlaceholder": "Интеграци хайх", "empty": "Бүртгэгдсэн интеграци алга. medusa-config дахь интеграци залгаасын options.providers-д үйлчилгээ үзүүлэгчдийг зарлана уу.", "emptyFiltered": "Таны шүүлтүүрт тохирох интеграци алга.", "tested": "шалгасан", "testFailed": "шалгалт амжилтгүй", "tabs": { "all": "Бүгд" } }, "browse": { "title": "Каталог", "subtitle": "Боломжтой интеграциудыг олох", "publish": "Интеграци нэмэх", "learnMore": "Өөрийн интеграцийг хэрхэн бүтээж нийтлэхийг сурах", "searchPlaceholder": "Интеграци хайх", "by": "{{author}}-ээс", "installed": "Суулгасан", "notInstalled": "Суулгаагүй", "add": "Нэмэх", "settings": "Тохиргоо", "install_docs": "Баримтжуулалтыг унших", "install_empty": "Энэ интеграцийн тохируулгын заавар хараахан бэлэн болоогүй байна.", "install_truncated": "Энэ заавар энд харуулахад хэт урт байна — баримтжуулалтыг нээнэ үү." }, "columns": { "integration": "Интеграци", "description": "Тайлбар", "category": "Ангилал", "status": "Төлөв" }, "status": { "notConfigured": "Тохируулаагүй", "incomplete": "Дуусаагүй", "enabled": "Идэвхтэй", "disabled": "Идэвхгүй", "configured": "Тохируулсан", "connected": "Холбогдсон", "connectionFailed": "Холболт амжилтгүй" }, "meta": { "version": "v{{version}}", "authorPrefix": "зохиогч" }, "labels": { "category": "Ангилал" }, "categories": { "payment": "Төлбөр", "notification": "Мэдэгдэл", "fulfillment": "Биелэлт", "search": "Хайлт", "content": "Контент", "analytics": "Аналитик", "authentication": "Баталгаажуулалт", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фийд", "file_providers": "Файлын үйлчилгээ үзүүлэгчид", "other": "Бусад" }, "actions": { "test": "Холболтыг шалгах", "enable": "Идэвхжүүлэх", "disable": "Идэвхгүй болгох", "delete": "Устгах", "edit": "Засварлах", "save": "Хадгалах", "cancel": "Цуцлах" }, "delete": { "title": "Тохиргоог устгах", "description": "{{name}}-ийн хадгалагдсан тохиргоог устгах уу? Энэ үйлдлийг буцаах боломжгүй." }, "form": { "required": "{{field}} шаардлагатай", "invalidJson": "Буруу JSON", "keepSecret": "•••••• – хэвээр үлдээхийн тулд хоосон орхино уу", "items": "{{count}} зүйл" }, "toast": { "saved": "Хадгалагдлаа", "saveFailed": "Хадгалахад алдаа гарлаа", "connectionOk": "Холболт амжилттай", "testFailed": "Шалгалт амжилтгүй боллоо", "enabled": "Идэвхжлээ", "disabled": "Идэвхгүй боллоо", "deleted": "Тохиргоог устгалаа", "deleteFailed": "Устгахад алдаа гарлаа", "updateFailed": "Шинэчлэхэд алдаа гарлаа" }, "unknown": "Тодорхойгүй интеграци «{{id}}».", "back": "Интеграциуд руу буцах" };
3331
+ const mn = {
3332
+ integration: integration$c
3333
+ };
3334
+ const integration$b = { "list": { "title": "Integraties", "subtitle": "Beheer de instellingen van integraties", "browseIntegrations": "Integraties bekijken", "learnMore": "Leer hoe je integraties bouwt", "searchPlaceholder": "Integraties zoeken", "empty": "Geen integraties geregistreerd. Declareer providers in options.providers van de integratieplug-in in medusa-config.", "emptyFiltered": "Geen integraties komen overeen met je filters.", "tested": "getest", "testFailed": "test mislukt", "tabs": { "all": "Alle" } }, "browse": { "title": "Catalogus", "subtitle": "Vind beschikbare integraties", "publish": "Integratie toevoegen", "learnMore": "Leer hoe je je eigen integratie bouwt en publiceert", "searchPlaceholder": "Integraties zoeken", "by": "door {{author}}", "installed": "Geïnstalleerd", "notInstalled": "Niet geïnstalleerd", "add": "Toevoegen", "settings": "Instellingen", "install_docs": "Documentatie lezen", "install_empty": "Installatie-instructies voor deze integratie zijn nog niet beschikbaar.", "install_truncated": "Deze instructies zijn te lang om hier te tonen — open de documentatie." }, "columns": { "integration": "Integratie", "description": "Beschrijving", "category": "Categorie", "status": "Status" }, "status": { "notConfigured": "Niet geconfigureerd", "incomplete": "Onvolledig", "enabled": "Ingeschakeld", "disabled": "Uitgeschakeld", "configured": "Geconfigureerd", "connected": "Verbonden", "connectionFailed": "Verbinding mislukt" }, "meta": { "version": "v{{version}}", "authorPrefix": "door" }, "labels": { "category": "Categorie" }, "categories": { "payment": "Betalingen", "notification": "Notificaties", "fulfillment": "Verzending", "search": "Zoeken", "content": "Content", "analytics": "Analytics", "authentication": "Authenticatie", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marktplaats", "feed": "Feeds", "file_providers": "Bestandsproviders", "other": "Overig" }, "actions": { "test": "Verbinding testen", "enable": "Inschakelen", "disable": "Uitschakelen", "delete": "Verwijderen", "edit": "Bewerken", "save": "Opslaan", "cancel": "Annuleren" }, "delete": { "title": "Configuratie verwijderen", "description": "De opgeslagen configuratie voor {{name}} verwijderen? Deze actie kan niet ongedaan worden gemaakt." }, "form": { "required": "{{field}} is verplicht", "invalidJson": "Ongeldige JSON", "keepSecret": "•••••• – laat leeg om te behouden", "items": "{{count}} items" }, "toast": { "saved": "Opgeslagen", "saveFailed": "Opslaan mislukt", "connectionOk": "Verbinding OK", "testFailed": "Test mislukt", "enabled": "Ingeschakeld", "disabled": "Uitgeschakeld", "deleted": "Configuratie verwijderd", "deleteFailed": "Verwijderen mislukt", "updateFailed": "Bijwerken mislukt" }, "unknown": 'Onbekende integratie "{{id}}".', "back": "Terug naar integraties" };
3335
+ const nl = {
3336
+ integration: integration$b
3337
+ };
3338
+ const integration$a = { "list": { "title": "Integracje", "subtitle": "Zarządzaj ustawieniami integracji", "browseIntegrations": "Przeglądaj integracje", "learnMore": "Dowiedz się, jak tworzyć integracje", "searchPlaceholder": "Szukaj integracji", "empty": "Brak zarejestrowanych integracji. Zadeklaruj dostawców w options.providers wtyczki integracji w medusa-config.", "emptyFiltered": "Żadna integracja nie pasuje do filtrów.", "tested": "przetestowano", "testFailed": "test nieudany", "tabs": { "all": "Wszystkie" } }, "browse": { "title": "Katalog", "subtitle": "Znajdź dostępne integracje", "publish": "Dodaj integrację", "learnMore": "Dowiedz się, jak stworzyć i opublikować własną integrację", "searchPlaceholder": "Szukaj integracji", "by": "od {{author}}", "installed": "Zainstalowano", "notInstalled": "Niezainstalowano", "add": "Dodaj", "settings": "Ustawienia", "install_docs": "Przeczytaj dokumentację", "install_empty": "Instrukcja konfiguracji tej integracji nie jest jeszcze dostępna.", "install_truncated": "Ta instrukcja jest zbyt długa, aby wyświetlić ją tutaj — otwórz dokumentację." }, "columns": { "integration": "Integracja", "description": "Opis", "category": "Kategoria", "status": "Status" }, "status": { "notConfigured": "Nieskonfigurowane", "incomplete": "Niekompletne", "enabled": "Włączone", "disabled": "Wyłączone", "configured": "Skonfigurowane", "connected": "Połączono", "connectionFailed": "Połączenie nieudane" }, "meta": { "version": "v{{version}}", "authorPrefix": "od" }, "labels": { "category": "Kategoria" }, "categories": { "payment": "Płatności", "notification": "Powiadomienia", "fulfillment": "Realizacja", "search": "Wyszukiwanie", "content": "Treść", "analytics": "Analityka", "authentication": "Uwierzytelnianie", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Kanały", "file_providers": "Dostawcy plików", "other": "Inne" }, "actions": { "test": "Testuj połączenie", "enable": "Włącz", "disable": "Wyłącz", "delete": "Usuń", "edit": "Edytuj", "save": "Zapisz", "cancel": "Anuluj" }, "delete": { "title": "Usuń konfigurację", "description": "Usunąć zapisaną konfigurację dla {{name}}? Tej akcji nie można cofnąć." }, "form": { "required": "{{field}} jest wymagane", "invalidJson": "Nieprawidłowy JSON", "keepSecret": "•••••• – pozostaw puste, aby zachować", "items": "{{count}} elementów" }, "toast": { "saved": "Zapisano", "saveFailed": "Nie udało się zapisać", "connectionOk": "Połączenie OK", "testFailed": "Test nieudany", "enabled": "Włączono", "disabled": "Wyłączono", "deleted": "Konfiguracja usunięta", "deleteFailed": "Nie udało się usunąć", "updateFailed": "Nie udało się zaktualizować" }, "unknown": "Nieznana integracja „{{id}}”.", "back": "Powrót do integracji" };
3339
+ const pl = {
3340
+ integration: integration$a
3341
+ };
3342
+ const integration$9 = { "list": { "title": "Integrações", "subtitle": "Gerencie as configurações das integrações", "browseIntegrations": "Explorar integrações", "learnMore": "Aprenda a criar integrações", "searchPlaceholder": "Buscar integrações", "empty": "Nenhuma integração registrada. Declare os provedores em options.providers do plugin de integrações no medusa-config.", "emptyFiltered": "Nenhuma integração corresponde aos seus filtros.", "tested": "testado", "testFailed": "falha no teste", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encontre integrações disponíveis", "publish": "Adicionar integração", "learnMore": "Aprenda a criar e publicar sua própria integração", "searchPlaceholder": "Buscar integrações", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "Não instalado", "add": "Adicionar", "settings": "Configurações", "install_docs": "Ler documentação", "install_empty": "As instruções de configuração desta integração ainda não estão disponíveis.", "install_truncated": "Estas instruções são longas demais para exibir aqui — abra a documentação." }, "columns": { "integration": "Integração", "description": "Descrição", "category": "Categoria", "status": "Status" }, "status": { "notConfigured": "Não configurado", "incomplete": "Incompleto", "enabled": "Habilitado", "disabled": "Desabilitado", "configured": "Configurado", "connected": "Conectado", "connectionFailed": "Falha na conexão" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamentos", "notification": "Notificações", "fulfillment": "Atendimento", "search": "Busca", "content": "Conteúdo", "analytics": "Análises", "authentication": "Autenticação", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Provedores de arquivos", "other": "Outros" }, "actions": { "test": "Testar conexão", "enable": "Habilitar", "disable": "Desabilitar", "delete": "Excluir", "edit": "Editar", "save": "Salvar", "cancel": "Cancelar" }, "delete": { "title": "Excluir configuração", "description": "Remover a configuração salva de {{name}}? Esta ação não pode ser desfeita." }, "form": { "required": "{{field}} é obrigatório", "invalidJson": "JSON inválido", "keepSecret": "•••••• – deixe em branco para manter", "items": "{{count}} itens" }, "toast": { "saved": "Salvo", "saveFailed": "Falha ao salvar", "connectionOk": "Conexão OK", "testFailed": "Falha no teste", "enabled": "Habilitado", "disabled": "Desabilitado", "deleted": "Configuração excluída", "deleteFailed": "Falha ao excluir", "updateFailed": "Falha ao atualizar" }, "unknown": 'Integração desconhecida "{{id}}".', "back": "Voltar para integrações" };
3343
+ const ptBR = {
3344
+ integration: integration$9
3345
+ };
3346
+ const integration$8 = { "list": { "title": "Integrações", "subtitle": "Gere as definições das integrações", "browseIntegrations": "Explorar integrações", "learnMore": "Aprende a criar integrações", "searchPlaceholder": "Pesquisar integrações", "empty": "Nenhuma integração registada. Declara os fornecedores em options.providers do plugin de integrações no medusa-config.", "emptyFiltered": "Nenhuma integração corresponde aos teus filtros.", "tested": "testado", "testFailed": "falha no teste", "tabs": { "all": "Todas" } }, "browse": { "title": "Catálogo", "subtitle": "Encontra integrações disponíveis", "publish": "Adicionar integração", "learnMore": "Aprende a criar e publicar a tua própria integração", "searchPlaceholder": "Pesquisar integrações", "by": "por {{author}}", "installed": "Instalado", "notInstalled": "Não instalado", "add": "Adicionar", "settings": "Definições", "install_docs": "Ler documentação", "install_empty": "As instruções de configuração desta integração ainda não estão disponíveis.", "install_truncated": "Estas instruções são demasiado longas para mostrar aqui — abre a documentação." }, "columns": { "integration": "Integração", "description": "Descrição", "category": "Categoria", "status": "Estado" }, "status": { "notConfigured": "Não configurado", "incomplete": "Incompleto", "enabled": "Ativado", "disabled": "Desativado", "configured": "Configurado", "connected": "Ligado", "connectionFailed": "Falha na ligação" }, "meta": { "version": "v{{version}}", "authorPrefix": "por" }, "labels": { "category": "Categoria" }, "categories": { "payment": "Pagamentos", "notification": "Notificações", "fulfillment": "Cumprimento", "search": "Pesquisa", "content": "Conteúdo", "analytics": "Análises", "authentication": "Autenticação", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Feeds", "file_providers": "Fornecedores de ficheiros", "other": "Outros" }, "actions": { "test": "Testar ligação", "enable": "Ativar", "disable": "Desativar", "delete": "Eliminar", "edit": "Editar", "save": "Guardar", "cancel": "Cancelar" }, "delete": { "title": "Eliminar configuração", "description": "Remover a configuração guardada de {{name}}? Esta ação não pode ser anulada." }, "form": { "required": "{{field}} é obrigatório", "invalidJson": "JSON inválido", "keepSecret": "•••••• – deixa em branco para manter", "items": "{{count}} itens" }, "toast": { "saved": "Guardado", "saveFailed": "Falha ao guardar", "connectionOk": "Ligação OK", "testFailed": "Falha no teste", "enabled": "Ativado", "disabled": "Desativado", "deleted": "Configuração eliminada", "deleteFailed": "Falha ao eliminar", "updateFailed": "Falha ao atualizar" }, "unknown": "Integração desconhecida «{{id}}».", "back": "Voltar às integrações" };
3347
+ const ptPT = {
3348
+ integration: integration$8
3349
+ };
3350
+ const integration$7 = { "list": { "title": "Integrări", "subtitle": "Gestionează setările integrărilor", "browseIntegrations": "Răsfoiește integrările", "learnMore": "Află cum să creezi integrări", "searchPlaceholder": "Caută integrări", "empty": "Nicio integrare înregistrată. Declară furnizorii în options.providers al pluginului de integrări din medusa-config.", "emptyFiltered": "Nicio integrare nu corespunde filtrelor.", "tested": "testat", "testFailed": "testul a eșuat", "tabs": { "all": "Toate" } }, "browse": { "title": "Catalog", "subtitle": "Găsește integrările disponibile", "publish": "Adaugă integrare", "learnMore": "Află cum să creezi și să publici propria integrare", "searchPlaceholder": "Caută integrări", "by": "de {{author}}", "installed": "Instalat", "notInstalled": "Neinstalat", "add": "Adaugă", "settings": "Setări", "install_docs": "Citește documentația", "install_empty": "Instrucțiunile de configurare pentru această integrare nu sunt încă disponibile.", "install_truncated": "Aceste instrucțiuni sunt prea lungi pentru a fi afișate aici — deschide documentația." }, "columns": { "integration": "Integrare", "description": "Descriere", "category": "Categorie", "status": "Stare" }, "status": { "notConfigured": "Neconfigurat", "incomplete": "Incomplet", "enabled": "Activat", "disabled": "Dezactivat", "configured": "Configurat", "connected": "Conectat", "connectionFailed": "Conectarea a eșuat" }, "meta": { "version": "v{{version}}", "authorPrefix": "de" }, "labels": { "category": "Categorie" }, "categories": { "payment": "Plăți", "notification": "Notificări", "fulfillment": "Îndeplinire", "search": "Căutare", "content": "Conținut", "analytics": "Analize", "authentication": "Autentificare", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Marketplace", "feed": "Fluxuri", "file_providers": "Furnizori de fișiere", "other": "Altele" }, "actions": { "test": "Testează conexiunea", "enable": "Activează", "disable": "Dezactivează", "delete": "Șterge", "edit": "Editează", "save": "Salvează", "cancel": "Anulează" }, "delete": { "title": "Șterge configurația", "description": "Elimini configurația salvată pentru {{name}}? Această acțiune nu poate fi anulată." }, "form": { "required": "{{field}} este obligatoriu", "invalidJson": "JSON invalid", "keepSecret": "•••••• – lasă gol pentru a păstra", "items": "{{count}} elemente" }, "toast": { "saved": "Salvat", "saveFailed": "Salvarea a eșuat", "connectionOk": "Conexiune reușită", "testFailed": "Testul a eșuat", "enabled": "Activat", "disabled": "Dezactivat", "deleted": "Configurație ștearsă", "deleteFailed": "Ștergerea a eșuat", "updateFailed": "Actualizarea a eșuat" }, "unknown": "Integrare necunoscută „{{id}}”.", "back": "Înapoi la integrări" };
3351
+ const ro = {
3352
+ integration: integration$7
3353
+ };
3354
+ const integration$6 = { "list": { "title": "Интеграции", "subtitle": "Управление настройками интеграций", "browseIntegrations": "Найти интеграции", "learnMore": "Как создавать интеграции", "searchPlaceholder": "Поиск интеграций", "empty": "Нет зарегистрированных интеграций. Объявите провайдеров в options.providers плагина интеграций в medusa-config.", "emptyFiltered": "Нет интеграций по заданным фильтрам", "tested": "проверено", "testFailed": "ошибка проверки", "tabs": { "all": "Все" } }, "browse": { "title": "Каталог", "subtitle": "Поиск доступных интеграций", "publish": "Добавить интеграцию", "learnMore": "Как создать и опубликовать свою интеграцию", "searchPlaceholder": "Поиск интеграций", "by": "от {{author}}", "installed": "Установлено", "notInstalled": "Не установлено", "add": "Добавить", "settings": "Настройки", "install_docs": "Читать документацию", "install_empty": "Инструкция по настройке для этой интеграции пока недоступна.", "install_truncated": "Инструкция слишком длинная для показа здесь — откройте документацию." }, "columns": { "integration": "Интеграция", "description": "Описание", "category": "Категория", "status": "Статус" }, "status": { "notConfigured": "Не настроено", "incomplete": "Не завершено", "enabled": "Включено", "disabled": "Выключено", "configured": "Настроено", "connected": "Подключено", "connectionFailed": "Ошибка подключения" }, "meta": { "version": "v{{version}}", "authorPrefix": "от" }, "labels": { "category": "Категория" }, "categories": { "payment": "Платежи", "notification": "Уведомления", "fulfillment": "Доставка", "search": "Поиск", "content": "Контент", "analytics": "Аналитика", "authentication": "Аутентификация", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фиды", "file_providers": "Файловые провайдеры", "other": "Прочее" }, "actions": { "test": "Проверить соединение", "enable": "Включить", "disable": "Выключить", "delete": "Удалить", "edit": "Редактировать", "save": "Сохранить", "cancel": "Отмена" }, "delete": { "title": "Удалить конфигурацию", "description": "Удалить сохранённую конфигурацию «{{name}}»? Это действие необратимо." }, "form": { "required": "Поле «{{field}}» обязательно", "invalidJson": "Некорректный JSON", "keepSecret": "•••••• – оставьте пустым, чтобы не менять", "items": "{{count}} шт." }, "toast": { "saved": "Сохранено", "saveFailed": "Не удалось сохранить", "connectionOk": "Соединение установлено", "testFailed": "Проверка не удалась", "enabled": "Включено", "disabled": "Выключено", "deleted": "Конфигурация удалена", "deleteFailed": "Не удалось удалить", "updateFailed": "Не удалось обновить" }, "unknown": "Неизвестная интеграция «{{id}}».", "back": "К интеграциям" };
2801
3355
  const ru = {
3356
+ integration: integration$6
3357
+ };
3358
+ const integration$5 = { "list": { "title": "การเชื่อมต่อ", "subtitle": "จัดการการตั้งค่าการเชื่อมต่อ", "browseIntegrations": "เรียกดูการเชื่อมต่อ", "learnMore": "เรียนรู้วิธีสร้างการเชื่อมต่อ", "searchPlaceholder": "ค้นหาการเชื่อมต่อ", "empty": "ยังไม่มีการเชื่อมต่อที่ลงทะเบียน ประกาศผู้ให้บริการใน options.providers ของปลั๊กอินการเชื่อมต่อใน medusa-config", "emptyFiltered": "ไม่มีการเชื่อมต่อที่ตรงกับตัวกรองของคุณ", "tested": "ทดสอบแล้ว", "testFailed": "ทดสอบล้มเหลว", "tabs": { "all": "ทั้งหมด" } }, "browse": { "title": "แคตตาล็อก", "subtitle": "ค้นหาการเชื่อมต่อที่พร้อมใช้งาน", "publish": "เพิ่มการเชื่อมต่อ", "learnMore": "เรียนรู้วิธีสร้างและเผยแพร่การเชื่อมต่อของคุณเอง", "searchPlaceholder": "ค้นหาการเชื่อมต่อ", "by": "โดย {{author}}", "installed": "ติดตั้งแล้ว", "notInstalled": "ยังไม่ได้ติดตั้ง", "add": "เพิ่ม", "settings": "การตั้งค่า", "install_docs": "อ่านเอกสาร", "install_empty": "คำแนะนำการตั้งค่าสำหรับการเชื่อมต่อนี้ยังไม่พร้อมใช้งาน", "install_truncated": "คำแนะนำนี้ยาวเกินกว่าจะแสดงที่นี่ — เปิดเอกสารประกอบ" }, "columns": { "integration": "การเชื่อมต่อ", "description": "คำอธิบาย", "category": "หมวดหมู่", "status": "สถานะ" }, "status": { "notConfigured": "ยังไม่ได้ตั้งค่า", "incomplete": "ไม่สมบูรณ์", "enabled": "เปิดใช้งาน", "disabled": "ปิดใช้งาน", "configured": "ตั้งค่าแล้ว", "connected": "เชื่อมต่อแล้ว", "connectionFailed": "การเชื่อมต่อล้มเหลว" }, "meta": { "version": "v{{version}}", "authorPrefix": "โดย" }, "labels": { "category": "หมวดหมู่" }, "categories": { "payment": "การชำระเงิน", "notification": "การแจ้งเตือน", "fulfillment": "การจัดส่ง", "search": "ค้นหา", "content": "เนื้อหา", "analytics": "การวิเคราะห์", "authentication": "การยืนยันตัวตน", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "มาร์เก็ตเพลส", "feed": "ฟีด", "file_providers": "ผู้ให้บริการไฟล์", "other": "อื่นๆ" }, "actions": { "test": "ทดสอบการเชื่อมต่อ", "enable": "เปิดใช้งาน", "disable": "ปิดใช้งาน", "delete": "ลบ", "edit": "แก้ไข", "save": "บันทึก", "cancel": "ยกเลิก" }, "delete": { "title": "ลบการตั้งค่า", "description": "ลบการตั้งค่าที่บันทึกไว้สำหรับ {{name}} หรือไม่? การกระทำนี้ไม่สามารถย้อนกลับได้" }, "form": { "required": "ต้องระบุ {{field}}", "invalidJson": "JSON ไม่ถูกต้อง", "keepSecret": "•••••• – เว้นว่างไว้เพื่อคงค่าเดิม", "items": "{{count}} รายการ" }, "toast": { "saved": "บันทึกแล้ว", "saveFailed": "บันทึกไม่สำเร็จ", "connectionOk": "เชื่อมต่อสำเร็จ", "testFailed": "ทดสอบไม่สำเร็จ", "enabled": "เปิดใช้งานแล้ว", "disabled": "ปิดใช้งานแล้ว", "deleted": "ลบการตั้งค่าแล้ว", "deleteFailed": "ลบไม่สำเร็จ", "updateFailed": "อัปเดตไม่สำเร็จ" }, "unknown": 'ไม่รู้จักการเชื่อมต่อ "{{id}}"', "back": "กลับไปที่การเชื่อมต่อ" };
3359
+ const th = {
3360
+ integration: integration$5
3361
+ };
3362
+ const integration$4 = { "list": { "title": "Entegrasyonlar", "subtitle": "Entegrasyon ayarlarını yönetin", "browseIntegrations": "Entegrasyonlara göz atın", "learnMore": "Entegrasyonların nasıl oluşturulduğunu öğrenin", "searchPlaceholder": "Entegrasyon ara", "empty": "Kayıtlı entegrasyon yok. Sağlayıcıları medusa-config içindeki entegrasyon eklentisinin options.providers alanında tanımlayın.", "emptyFiltered": "Filtrelerinizle eşleşen entegrasyon yok.", "tested": "test edildi", "testFailed": "test başarısız", "tabs": { "all": "Tümü" } }, "browse": { "title": "Katalog", "subtitle": "Mevcut entegrasyonları bulun", "publish": "Entegrasyon ekle", "learnMore": "Kendi entegrasyonunuzu nasıl oluşturup yayımlayacağınızı öğrenin", "searchPlaceholder": "Entegrasyon ara", "by": "{{author}} tarafından", "installed": "Kurulu", "notInstalled": "Kurulu değil", "add": "Ekle", "settings": "Ayarlar", "install_docs": "Dokümantasyonu oku", "install_empty": "Bu entegrasyon için kurulum talimatları henüz mevcut değil.", "install_truncated": "Bu talimatlar burada gösterilemeyecek kadar uzun — dokümantasyonu açın." }, "columns": { "integration": "Entegrasyon", "description": "Açıklama", "category": "Kategori", "status": "Durum" }, "status": { "notConfigured": "Yapılandırılmadı", "incomplete": "Tamamlanmadı", "enabled": "Etkin", "disabled": "Devre dışı", "configured": "Yapılandırıldı", "connected": "Bağlandı", "connectionFailed": "Bağlantı başarısız" }, "meta": { "version": "v{{version}}", "authorPrefix": "geliştiren" }, "labels": { "category": "Kategori" }, "categories": { "payment": "Ödeme", "notification": "Bildirimler", "fulfillment": "Sipariş karşılama", "search": "Arama", "content": "İçerik", "analytics": "Analitik", "authentication": "Kimlik doğrulama", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Pazar yeri", "feed": "Beslemeler", "file_providers": "Dosya sağlayıcıları", "other": "Diğer" }, "actions": { "test": "Bağlantıyı test et", "enable": "Etkinleştir", "disable": "Devre dışı bırak", "delete": "Sil", "edit": "Düzenle", "save": "Kaydet", "cancel": "İptal" }, "delete": { "title": "Yapılandırmayı sil", "description": "{{name}} için kayıtlı yapılandırma kaldırılsın mı? Bu işlem geri alınamaz." }, "form": { "required": "{{field}} zorunludur", "invalidJson": "Geçersiz JSON", "keepSecret": "•••••• – korumak için boş bırakın", "items": "{{count}} öğe" }, "toast": { "saved": "Kaydedildi", "saveFailed": "Kaydetme başarısız", "connectionOk": "Bağlantı başarılı", "testFailed": "Test başarısız", "enabled": "Etkinleştirildi", "disabled": "Devre dışı bırakıldı", "deleted": "Yapılandırma silindi", "deleteFailed": "Silme başarısız", "updateFailed": "Güncelleme başarısız" }, "unknown": 'Bilinmeyen entegrasyon "{{id}}".', "back": "Entegrasyonlara dön" };
3363
+ const tr = {
3364
+ integration: integration$4
3365
+ };
3366
+ const integration$3 = { "list": { "title": "Інтеграції", "subtitle": "Керування налаштуваннями інтеграцій", "browseIntegrations": "Переглянути інтеграції", "learnMore": "Дізнайтеся, як створювати інтеграції", "searchPlaceholder": "Пошук інтеграцій", "empty": "Немає зареєстрованих інтеграцій. Оголосіть постачальників у options.providers плагіна інтеграцій у medusa-config.", "emptyFiltered": "Немає інтеграцій, що відповідають вашим фільтрам.", "tested": "перевірено", "testFailed": "помилка перевірки", "tabs": { "all": "Усі" } }, "browse": { "title": "Каталог", "subtitle": "Знайдіть доступні інтеграції", "publish": "Додати інтеграцію", "learnMore": "Дізнайтеся, як створити та опублікувати власну інтеграцію", "searchPlaceholder": "Пошук інтеграцій", "by": "від {{author}}", "installed": "Встановлено", "notInstalled": "Не встановлено", "add": "Додати", "settings": "Налаштування", "install_docs": "Читати документацію", "install_empty": "Інструкція з налаштування для цієї інтеграції поки недоступна.", "install_truncated": "Інструкція надто довга для показу тут — відкрийте документацію." }, "columns": { "integration": "Інтеграція", "description": "Опис", "category": "Категорія", "status": "Статус" }, "status": { "notConfigured": "Не налаштовано", "incomplete": "Не завершено", "enabled": "Увімкнено", "disabled": "Вимкнено", "configured": "Налаштовано", "connected": "Підключено", "connectionFailed": "Помилка підключення" }, "meta": { "version": "v{{version}}", "authorPrefix": "від" }, "labels": { "category": "Категорія" }, "categories": { "payment": "Платежі", "notification": "Сповіщення", "fulfillment": "Виконання", "search": "Пошук", "content": "Контент", "analytics": "Аналітика", "authentication": "Автентифікація", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Маркетплейс", "feed": "Фіди", "file_providers": "Файлові постачальники", "other": "Інше" }, "actions": { "test": "Перевірити з'єднання", "enable": "Увімкнути", "disable": "Вимкнути", "delete": "Видалити", "edit": "Редагувати", "save": "Зберегти", "cancel": "Скасувати" }, "delete": { "title": "Видалити конфігурацію", "description": "Видалити збережену конфігурацію для {{name}}? Цю дію неможливо скасувати." }, "form": { "required": "Поле «{{field}}» обов'язкове", "invalidJson": "Некоректний JSON", "keepSecret": "•••••• – залиште порожнім, щоб не змінювати", "items": "{{count}} шт." }, "toast": { "saved": "Збережено", "saveFailed": "Не вдалося зберегти", "connectionOk": "З'єднання встановлено", "testFailed": "Перевірка не вдалася", "enabled": "Увімкнено", "disabled": "Вимкнено", "deleted": "Конфігурацію видалено", "deleteFailed": "Не вдалося видалити", "updateFailed": "Не вдалося оновити" }, "unknown": "Невідома інтеграція «{{id}}».", "back": "До інтеграцій" };
3367
+ const uk = {
3368
+ integration: integration$3
3369
+ };
3370
+ const integration$2 = { "list": { "title": "Tích hợp", "subtitle": "Quản lý cài đặt tích hợp", "browseIntegrations": "Duyệt các tích hợp", "learnMore": "Tìm hiểu cách xây dựng tích hợp", "searchPlaceholder": "Tìm kiếm tích hợp", "empty": "Chưa có tích hợp nào được đăng ký. Khai báo nhà cung cấp trong options.providers của plugin tích hợp trong medusa-config.", "emptyFiltered": "Không có tích hợp nào khớp với bộ lọc của bạn.", "tested": "đã kiểm tra", "testFailed": "kiểm tra thất bại", "tabs": { "all": "Tất cả" } }, "browse": { "title": "Danh mục", "subtitle": "Tìm các tích hợp có sẵn", "publish": "Thêm tích hợp", "learnMore": "Tìm hiểu cách xây dựng và phát hành tích hợp của riêng bạn", "searchPlaceholder": "Tìm kiếm tích hợp", "by": "bởi {{author}}", "installed": "Đã cài đặt", "notInstalled": "Chưa cài đặt", "add": "Thêm", "settings": "Cài đặt", "install_docs": "Đọc tài liệu", "install_empty": "Hướng dẫn thiết lập cho tích hợp này chưa có sẵn.", "install_truncated": "Hướng dẫn này quá dài để hiển thị ở đây — hãy mở tài liệu." }, "columns": { "integration": "Tích hợp", "description": "Mô tả", "category": "Danh mục", "status": "Trạng thái" }, "status": { "notConfigured": "Chưa cấu hình", "incomplete": "Chưa hoàn tất", "enabled": "Đã bật", "disabled": "Đã tắt", "configured": "Đã cấu hình", "connected": "Đã kết nối", "connectionFailed": "Kết nối thất bại" }, "meta": { "version": "v{{version}}", "authorPrefix": "bởi" }, "labels": { "category": "Danh mục" }, "categories": { "payment": "Thanh toán", "notification": "Thông báo", "fulfillment": "Xử lý giao hàng", "search": "Tìm kiếm", "content": "Nội dung", "analytics": "Phân tích", "authentication": "Xác thực", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "Sàn thương mại", "feed": "Nguồn cấp", "file_providers": "Nhà cung cấp tệp", "other": "Khác" }, "actions": { "test": "Kiểm tra kết nối", "enable": "Bật", "disable": "Tắt", "delete": "Xóa", "edit": "Chỉnh sửa", "save": "Lưu", "cancel": "Hủy" }, "delete": { "title": "Xóa cấu hình", "description": "Xóa cấu hình đã lưu cho {{name}}? Hành động này không thể hoàn tác." }, "form": { "required": "{{field}} là bắt buộc", "invalidJson": "JSON không hợp lệ", "keepSecret": "•••••• – để trống để giữ nguyên", "items": "{{count}} mục" }, "toast": { "saved": "Đã lưu", "saveFailed": "Lưu thất bại", "connectionOk": "Kết nối thành công", "testFailed": "Kiểm tra thất bại", "enabled": "Đã bật", "disabled": "Đã tắt", "deleted": "Đã xóa cấu hình", "deleteFailed": "Xóa thất bại", "updateFailed": "Cập nhật thất bại" }, "unknown": 'Tích hợp không xác định "{{id}}".', "back": "Quay lại tích hợp" };
3371
+ const vi = {
3372
+ integration: integration$2
3373
+ };
3374
+ const integration$1 = { "list": { "title": "集成", "subtitle": "管理集成设置", "browseIntegrations": "浏览集成", "learnMore": "了解如何构建集成", "searchPlaceholder": "搜索集成", "empty": "尚未注册任何集成。请在 medusa-config 中集成插件的 options.providers 下声明供应商。", "emptyFiltered": "没有符合筛选条件的集成。", "tested": "已测试", "testFailed": "测试失败", "tabs": { "all": "全部" } }, "browse": { "title": "目录", "subtitle": "查找可用的集成", "publish": "添加集成", "learnMore": "了解如何构建并发布你自己的集成", "searchPlaceholder": "搜索集成", "by": "由 {{author}} 提供", "installed": "已安装", "notInstalled": "未安装", "add": "添加", "settings": "设置", "install_docs": "阅读文档", "install_empty": "该集成的设置说明尚不可用。", "install_truncated": "这些说明过长,无法在此显示 — 请打开文档。" }, "columns": { "integration": "集成", "description": "描述", "category": "分类", "status": "状态" }, "status": { "notConfigured": "未配置", "incomplete": "未完成", "enabled": "已启用", "disabled": "已禁用", "configured": "已配置", "connected": "已连接", "connectionFailed": "连接失败" }, "meta": { "version": "v{{version}}", "authorPrefix": "由" }, "labels": { "category": "分类" }, "categories": { "payment": "支付", "notification": "通知", "fulfillment": "履约", "search": "搜索", "content": "内容", "analytics": "分析", "authentication": "身份验证", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "市场", "feed": "数据源", "file_providers": "文件供应商", "other": "其他" }, "actions": { "test": "测试连接", "enable": "启用", "disable": "禁用", "delete": "删除", "edit": "编辑", "save": "保存", "cancel": "取消" }, "delete": { "title": "删除配置", "description": "移除 {{name}} 的已保存配置?此操作无法撤销。" }, "form": { "required": "{{field}} 为必填项", "invalidJson": "无效的 JSON", "keepSecret": "•••••• – 留空以保持不变", "items": "{{count}} 项" }, "toast": { "saved": "已保存", "saveFailed": "保存失败", "connectionOk": "连接成功", "testFailed": "测试失败", "enabled": "已启用", "disabled": "已禁用", "deleted": "配置已删除", "deleteFailed": "删除失败", "updateFailed": "更新失败" }, "unknown": "未知集成“{{id}}”。", "back": "返回集成" };
3375
+ const zhCN = {
3376
+ integration: integration$1
3377
+ };
3378
+ const integration = { "list": { "title": "整合", "subtitle": "管理整合設定", "browseIntegrations": "瀏覽整合", "learnMore": "了解如何建立整合", "searchPlaceholder": "搜尋整合", "empty": "尚未註冊任何整合。請在 medusa-config 中整合外掛的 options.providers 下宣告提供者。", "emptyFiltered": "沒有符合篩選條件的整合。", "tested": "已測試", "testFailed": "測試失敗", "tabs": { "all": "全部" } }, "browse": { "title": "目錄", "subtitle": "尋找可用的整合", "publish": "新增整合", "learnMore": "了解如何建立並發布您自己的整合", "searchPlaceholder": "搜尋整合", "by": "由 {{author}} 提供", "installed": "已安裝", "notInstalled": "未安裝", "add": "新增", "settings": "設定", "install_docs": "閱讀說明文件", "install_empty": "此整合的設定說明尚未提供。", "install_truncated": "這些說明過長,無法在此顯示 — 請開啟說明文件。" }, "columns": { "integration": "整合", "description": "描述", "category": "分類", "status": "狀態" }, "status": { "notConfigured": "未設定", "incomplete": "未完成", "enabled": "已啟用", "disabled": "已停用", "configured": "已設定", "connected": "已連線", "connectionFailed": "連線失敗" }, "meta": { "version": "v{{version}}", "authorPrefix": "由" }, "labels": { "category": "分類" }, "categories": { "payment": "付款", "notification": "通知", "fulfillment": "出貨", "search": "搜尋", "content": "內容", "analytics": "分析", "authentication": "驗證", "erp": "ERP", "crm": "CRM", "pim": "PIM", "marketplace": "市集", "feed": "資料來源", "file_providers": "檔案提供者", "other": "其他" }, "actions": { "test": "測試連線", "enable": "啟用", "disable": "停用", "delete": "刪除", "edit": "編輯", "save": "儲存", "cancel": "取消" }, "delete": { "title": "刪除設定", "description": "移除 {{name}} 的已儲存設定?此操作無法復原。" }, "form": { "required": "{{field}} 為必填", "invalidJson": "無效的 JSON", "keepSecret": "•••••• – 留空以保持不變", "items": "{{count}} 項" }, "toast": { "saved": "已儲存", "saveFailed": "儲存失敗", "connectionOk": "連線成功", "testFailed": "測試失敗", "enabled": "已啟用", "disabled": "已停用", "deleted": "設定已刪除", "deleteFailed": "刪除失敗", "updateFailed": "更新失敗" }, "unknown": "未知的整合「{{id}}」。", "back": "返回整合" };
3379
+ const zhTW = {
2802
3380
  integration
2803
3381
  };
2804
3382
  const i18nTranslations0 = {
3383
+ ar: { translation: ar },
3384
+ bg: { translation: bg },
3385
+ bs: { translation: bs },
3386
+ cs: { translation: cs },
3387
+ de: { translation: de },
3388
+ el: { translation: el },
2805
3389
  en: { translation: en },
2806
- ru: { translation: ru }
3390
+ enGB: { translation: enGB },
3391
+ es: { translation: es },
3392
+ fa: { translation: fa },
3393
+ fr: { translation: fr },
3394
+ he: { translation: he },
3395
+ hr: { translation: hr },
3396
+ hu: { translation: hu },
3397
+ id: { translation: id },
3398
+ it: { translation: it },
3399
+ ja: { translation: ja },
3400
+ ko: { translation: ko },
3401
+ lt: { translation: lt },
3402
+ mk: { translation: mk },
3403
+ mn: { translation: mn },
3404
+ nl: { translation: nl },
3405
+ pl: { translation: pl },
3406
+ ptBR: { translation: ptBR },
3407
+ ptPT: { translation: ptPT },
3408
+ ro: { translation: ro },
3409
+ ru: { translation: ru },
3410
+ th: { translation: th },
3411
+ tr: { translation: tr },
3412
+ uk: { translation: uk },
3413
+ vi: { translation: vi },
3414
+ zhCN: { translation: zhCN },
3415
+ zhTW: { translation: zhTW }
2807
3416
  };
2808
3417
  const widgetModule = { widgets: [] };
2809
3418
  const routeModule = {