From d805494a762a0fa30e80474a6866aa0bfa433dce Mon Sep 17 00:00:00 2001 From: alin Date: Tue, 9 Apr 2024 13:49:26 +0200 Subject: [PATCH] deploy docs --- 404.html | 37 +++ archive/current/code-of-conduct.html | 37 +++ archive/current/contribution-guide.html | 37 +++ archive/current/index.html | 130 ++++++++++ archive/current/origin.html | 37 +++ .../current/packages/container/bindings.html | 96 ++++++++ .../container/container-instance.html | 42 ++++ .../container/contextual-bindings.html | 77 ++++++ .../packages/container/dependencies.html | 67 +++++ archive/current/packages/container/index.html | 67 +++++ .../current/packages/container/install.html | 40 +++ .../packages/container/prerequisites.html | 37 +++ .../current/packages/container/resolving.html | 126 ++++++++++ archive/current/packages/contracts/index.html | 37 +++ .../current/packages/contracts/install.html | 40 +++ archive/current/packages/index.html | 37 +++ .../packages/support/CallbackWrapper.html | 117 +++++++++ .../packages/support/arrays/includesAll.html | 43 ++++ .../packages/support/arrays/includesAny.html | 43 ++++ .../packages/support/arrays/index.html | 37 +++ .../packages/support/arrays/isArrayLike.html | 51 ++++ .../support/arrays/isConcatSpreadable.html | 72 ++++++ .../support/arrays/isSafeArrayLike.html | 46 ++++ .../packages/support/arrays/isTypedArray.html | 55 +++++ .../packages/support/arrays/merge.html | 76 ++++++ .../packages/support/concerns/aliases.html | 89 +++++++ .../packages/support/concerns/booting.html | 87 +++++++ .../support/concerns/concernClass.html | 111 +++++++++ .../support/concerns/conflictResolution.html | 96 ++++++++ .../packages/support/concerns/edgeCases.html | 151 ++++++++++++ .../packages/support/concerns/hooks.html | 64 +++++ .../packages/support/concerns/index.html | 61 +++++ .../packages/support/concerns/jsdoc.html | 189 ++++++++++++++ .../support/concerns/prerequisites.html | 37 +++ .../packages/support/concerns/usage.html | 133 ++++++++++ .../exceptions/configureCustomError.html | 46 ++++ .../exceptions/configureStackTrace.html | 46 ++++ .../support/exceptions/customErrors.html | 58 +++++ .../support/exceptions/getErrorMessage.html | 52 ++++ .../packages/support/exceptions/index.html | 37 +++ .../packages/support/facades/index.html | 144 +++++++++++ archive/current/packages/support/index.html | 37 +++ archive/current/packages/support/install.html | 40 +++ .../current/packages/support/meta/index.html | 43 ++++ .../packages/support/meta/inheritance.html | 67 +++++ .../packages/support/meta/outsideChanges.html | 48 ++++ .../packages/support/meta/prerequisites.html | 37 +++ .../packages/support/meta/setAndGet.html | 93 +++++++ .../packages/support/meta/supported.html | 37 +++ .../packages/support/meta/targetMeta.html | 149 +++++++++++ .../current/packages/support/meta/tc39.html | 53 ++++ .../packages/support/misc/descTag.html | 45 ++++ .../current/packages/support/misc/empty.html | 70 ++++++ .../current/packages/support/misc/index.html | 37 +++ .../current/packages/support/misc/isKey.html | 49 ++++ .../packages/support/misc/isPrimitive.html | 50 ++++ .../packages/support/misc/isPropertyKey.html | 48 ++++ .../current/packages/support/misc/isset.html | 55 +++++ .../packages/support/misc/mergeKeys.html | 42 ++++ .../packages/support/misc/toWeakRef.html | 46 ++++ .../packages/support/mixins/apply.html | 66 +++++ .../packages/support/mixins/index.html | 65 +++++ .../packages/support/mixins/inheritance.html | 88 +++++++ .../packages/support/mixins/instanceof.html | 64 +++++ .../packages/support/mixins/newMixin.html | 59 +++++ .../packages/support/mixins/onward.html | 37 +++ .../packages/support/objects/forget.html | 51 ++++ .../packages/support/objects/forgetAll.html | 51 ++++ .../current/packages/support/objects/get.html | 62 +++++ .../current/packages/support/objects/has.html | 50 ++++ .../packages/support/objects/hasAll.html | 66 +++++ .../packages/support/objects/hasAny.html | 57 +++++ .../packages/support/objects/hasUniqueId.html | 44 ++++ .../packages/support/objects/index.html | 37 +++ .../packages/support/objects/isCloneable.html | 52 ++++ .../support/objects/isPopulatable.html | 54 ++++ .../packages/support/objects/isset.html | 57 +++++ .../packages/support/objects/merge.html | 233 ++++++++++++++++++ .../packages/support/objects/populate.html | 99 ++++++++ .../current/packages/support/objects/set.html | 44 ++++ .../packages/support/objects/uniqueId.html | 48 ++++ .../assertHasPrototypeProperty.html | 40 +++ .../support/reflections/classLooksLike.html | 77 ++++++ .../support/reflections/classOwnKeys.html | 49 ++++ .../reflections/getAllParentsOfClass.html | 47 ++++ .../getClassPropertyDescriptor.html | 51 ++++ .../getClassPropertyDescriptors.html | 63 +++++ .../reflections/getConstructorName.html | 44 ++++ .../support/reflections/getNameOrDesc.html | 43 ++++ .../support/reflections/getParentOfClass.html | 48 ++++ .../support/reflections/hasAllMethods.html | 46 ++++ .../support/reflections/hasMethod.html | 47 ++++ .../reflections/hasPrototypeProperty.html | 49 ++++ .../packages/support/reflections/index.html | 37 +++ .../support/reflections/isCallable.html | 48 ++++ .../reflections/isClassConstructor.html | 49 ++++ .../reflections/isClassMethodReference.html | 52 ++++ .../support/reflections/isConstructor.html | 55 +++++ .../support/reflections/isKeySafe.html | 43 ++++ .../support/reflections/isKeyUnsafe.html | 44 ++++ .../support/reflections/isMethod.html | 61 +++++ .../support/reflections/isSubclass.html | 48 ++++ .../reflections/isSubclassOrLooksLike.html | 51 ++++ .../support/reflections/isWeakKind.html | 49 ++++ .../components/version-disclaimer.html | 75 ++++++ .../packages/vuepress-utils/index.html | 37 +++ .../packages/vuepress-utils/install.html | 40 +++ .../vuepress-utils/navigation/archive.html | 158 ++++++++++++ .../vuepress-utils/plugins/last-updated.html | 50 ++++ archive/current/packages/xyz/index.html | 37 +++ archive/current/security.html | 93 +++++++ archive/current/upgrade-guide.html | 68 +++++ archive/index.html | 37 +++ archive/next/index.html | 37 +++ archive/not_available.html | 37 +++ assets/css/styles.2fea50f5.css | 17 ++ assets/img/back-to-top.bdc03142.svg | 1 + assets/img/copied-button.9f175e5f.svg | 3 + assets/img/copy-button.45f8803e.svg | 3 + assets/img/search.b017a09f.svg | 1 + assets/js/404.html.1424746e.js | 1 + assets/js/4475.f1641a0c.js | 2 + assets/js/4475.f1641a0c.js.LICENSE.txt | 30 +++ assets/js/CallbackWrapper.html.159d6ab7.js | 1 + assets/js/aliases.html.d906e91a.js | 1 + assets/js/app.294c6513.js | 1 + assets/js/apply.html.1fa5dcc0.js | 1 + assets/js/archive.html.b243c4ec.js | 1 + ...ssertHasPrototypeProperty.html.c96dd651.js | 1 + assets/js/bindings.html.c03df7ed.js | 1 + assets/js/booting.html.eb728ae1.js | 1 + assets/js/classLooksLike.html.efaf58a0.js | 1 + assets/js/classOwnKeys.html.ad046074.js | 1 + assets/js/code-of-conduct.html.bac34c39.js | 1 + assets/js/concernClass.html.28be5543.js | 1 + .../js/configureCustomError.html.ef9b6e9e.js | 1 + .../js/configureStackTrace.html.a35c72c3.js | 1 + assets/js/conflictResolution.html.653ec4d9.js | 1 + assets/js/container-instance.html.0c106a57.js | 1 + .../js/contextual-bindings.html.fa8c9ec2.js | 1 + assets/js/contribution-guide.html.eb251cb2.js | 1 + assets/js/customErrors.html.49a0442d.js | 1 + assets/js/dependencies.html.15552877.js | 1 + assets/js/descTag.html.704e225b.js | 1 + assets/js/edgeCases.html.b8f147f4.js | 1 + assets/js/empty.html.9e33f6c2.js | 1 + assets/js/forget.html.522dfd63.js | 1 + assets/js/forgetAll.html.58d8e9c1.js | 1 + assets/js/get.html.cb27b757.js | 1 + .../js/getAllParentsOfClass.html.fe69b65f.js | 1 + ...etClassPropertyDescriptor.html.8da3ab1f.js | 1 + ...tClassPropertyDescriptors.html.27c05d0b.js | 1 + assets/js/getConstructorName.html.8b21384d.js | 1 + assets/js/getErrorMessage.html.b3a46b8e.js | 1 + assets/js/getNameOrDesc.html.687020eb.js | 1 + assets/js/getParentOfClass.html.bb3ce886.js | 1 + assets/js/has.html.4debffef.js | 1 + assets/js/hasAll.html.ccff6c37.js | 1 + assets/js/hasAllMethods.html.42db66cc.js | 1 + assets/js/hasAny.html.6704b902.js | 1 + assets/js/hasMethod.html.04c1131e.js | 1 + .../js/hasPrototypeProperty.html.89ee5d31.js | 1 + assets/js/hasUniqueId.html.f01d682a.js | 1 + assets/js/hooks.html.ba015dd6.js | 1 + assets/js/includesAll.html.dedc848a.js | 1 + assets/js/includesAny.html.2465015b.js | 1 + assets/js/index.html.3cddfd92.js | 1 + assets/js/inheritance.html.ff09d1d0.js | 1 + assets/js/install.html.649220ed.js | 1 + assets/js/instanceof.html.46ee3113.js | 1 + assets/js/isArrayLike.html.4487815f.js | 1 + assets/js/isCallable.html.84eaa115.js | 1 + assets/js/isClassConstructor.html.1dbf8d8c.js | 1 + .../isClassMethodReference.html.97742a21.js | 1 + assets/js/isCloneable.html.a8253de5.js | 1 + assets/js/isConcatSpreadable.html.36d6883b.js | 1 + assets/js/isConstructor.html.296bf48e.js | 1 + assets/js/isKey.html.5d05550b.js | 1 + assets/js/isKeySafe.html.b4d79743.js | 1 + assets/js/isKeyUnsafe.html.48d1e86a.js | 1 + assets/js/isMethod.html.c2a2d65f.js | 1 + assets/js/isPopulatable.html.44884087.js | 1 + assets/js/isPrimitive.html.c0301777.js | 1 + assets/js/isPropertyKey.html.87fe6434.js | 1 + assets/js/isSafeArrayLike.html.d566834f.js | 1 + assets/js/isSubclass.html.8603c7e5.js | 1 + .../js/isSubclassOrLooksLike.html.46bf230a.js | 1 + assets/js/isTypedArray.html.309030b7.js | 1 + assets/js/isWeakKind.html.4f39498c.js | 1 + assets/js/isset.html.1a8165f2.js | 1 + assets/js/jsdoc.html.29e03e5d.js | 1 + assets/js/last-updated.html.d07a4dec.js | 1 + assets/js/merge.html.4504c2dd.js | 1 + assets/js/mergeKeys.html.2d62ee48.js | 1 + assets/js/newMixin.html.1e594094.js | 1 + assets/js/not_available.html.f239d346.js | 1 + assets/js/onward.html.8fb7cd66.js | 1 + assets/js/origin.html.b71a5112.js | 1 + assets/js/outsideChanges.html.156b6bbb.js | 1 + assets/js/populate.html.36046530.js | 1 + assets/js/prerequisites.html.ecd52261.js | 1 + assets/js/resolving.html.df94b85d.js | 1 + assets/js/runtime~app.c653e560.js | 1 + assets/js/security.html.2d888571.js | 1 + assets/js/set.html.87fec706.js | 1 + assets/js/setAndGet.html.eb5cdd15.js | 1 + assets/js/supported.html.adf3fce5.js | 1 + assets/js/targetMeta.html.543973ed.js | 1 + assets/js/tc39.html.ad6563e8.js | 1 + assets/js/toWeakRef.html.c223105a.js | 1 + assets/js/uniqueId.html.058f42b9.js | 1 + assets/js/upgrade-guide.html.7cad2293.js | 1 + assets/js/usage.html.0cc995d4.js | 1 + assets/js/version-disclaimer.html.f9b07ad7.js | 1 + favicon.ico | Bin 0 -> 15406 bytes images/icon/README.md | 4 + images/icon/about.txt | 6 + images/icon/android-chrome-192x192.png | Bin 0 -> 10372 bytes images/icon/android-chrome-512x512.png | Bin 0 -> 28299 bytes images/icon/apple-touch-icon.png | Bin 0 -> 9201 bytes images/icon/favicon-16x16.png | Bin 0 -> 547 bytes images/icon/favicon-32x32.png | Bin 0 -> 1290 bytes index.html | 37 +++ site.webmanifest | 19 ++ 224 files changed, 7340 insertions(+) create mode 100644 404.html create mode 100644 archive/current/code-of-conduct.html create mode 100644 archive/current/contribution-guide.html create mode 100644 archive/current/index.html create mode 100644 archive/current/origin.html create mode 100644 archive/current/packages/container/bindings.html create mode 100644 archive/current/packages/container/container-instance.html create mode 100644 archive/current/packages/container/contextual-bindings.html create mode 100644 archive/current/packages/container/dependencies.html create mode 100644 archive/current/packages/container/index.html create mode 100644 archive/current/packages/container/install.html create mode 100644 archive/current/packages/container/prerequisites.html create mode 100644 archive/current/packages/container/resolving.html create mode 100644 archive/current/packages/contracts/index.html create mode 100644 archive/current/packages/contracts/install.html create mode 100644 archive/current/packages/index.html create mode 100644 archive/current/packages/support/CallbackWrapper.html create mode 100644 archive/current/packages/support/arrays/includesAll.html create mode 100644 archive/current/packages/support/arrays/includesAny.html create mode 100644 archive/current/packages/support/arrays/index.html create mode 100644 archive/current/packages/support/arrays/isArrayLike.html create mode 100644 archive/current/packages/support/arrays/isConcatSpreadable.html create mode 100644 archive/current/packages/support/arrays/isSafeArrayLike.html create mode 100644 archive/current/packages/support/arrays/isTypedArray.html create mode 100644 archive/current/packages/support/arrays/merge.html create mode 100644 archive/current/packages/support/concerns/aliases.html create mode 100644 archive/current/packages/support/concerns/booting.html create mode 100644 archive/current/packages/support/concerns/concernClass.html create mode 100644 archive/current/packages/support/concerns/conflictResolution.html create mode 100644 archive/current/packages/support/concerns/edgeCases.html create mode 100644 archive/current/packages/support/concerns/hooks.html create mode 100644 archive/current/packages/support/concerns/index.html create mode 100644 archive/current/packages/support/concerns/jsdoc.html create mode 100644 archive/current/packages/support/concerns/prerequisites.html create mode 100644 archive/current/packages/support/concerns/usage.html create mode 100644 archive/current/packages/support/exceptions/configureCustomError.html create mode 100644 archive/current/packages/support/exceptions/configureStackTrace.html create mode 100644 archive/current/packages/support/exceptions/customErrors.html create mode 100644 archive/current/packages/support/exceptions/getErrorMessage.html create mode 100644 archive/current/packages/support/exceptions/index.html create mode 100644 archive/current/packages/support/facades/index.html create mode 100644 archive/current/packages/support/index.html create mode 100644 archive/current/packages/support/install.html create mode 100644 archive/current/packages/support/meta/index.html create mode 100644 archive/current/packages/support/meta/inheritance.html create mode 100644 archive/current/packages/support/meta/outsideChanges.html create mode 100644 archive/current/packages/support/meta/prerequisites.html create mode 100644 archive/current/packages/support/meta/setAndGet.html create mode 100644 archive/current/packages/support/meta/supported.html create mode 100644 archive/current/packages/support/meta/targetMeta.html create mode 100644 archive/current/packages/support/meta/tc39.html create mode 100644 archive/current/packages/support/misc/descTag.html create mode 100644 archive/current/packages/support/misc/empty.html create mode 100644 archive/current/packages/support/misc/index.html create mode 100644 archive/current/packages/support/misc/isKey.html create mode 100644 archive/current/packages/support/misc/isPrimitive.html create mode 100644 archive/current/packages/support/misc/isPropertyKey.html create mode 100644 archive/current/packages/support/misc/isset.html create mode 100644 archive/current/packages/support/misc/mergeKeys.html create mode 100644 archive/current/packages/support/misc/toWeakRef.html create mode 100644 archive/current/packages/support/mixins/apply.html create mode 100644 archive/current/packages/support/mixins/index.html create mode 100644 archive/current/packages/support/mixins/inheritance.html create mode 100644 archive/current/packages/support/mixins/instanceof.html create mode 100644 archive/current/packages/support/mixins/newMixin.html create mode 100644 archive/current/packages/support/mixins/onward.html create mode 100644 archive/current/packages/support/objects/forget.html create mode 100644 archive/current/packages/support/objects/forgetAll.html create mode 100644 archive/current/packages/support/objects/get.html create mode 100644 archive/current/packages/support/objects/has.html create mode 100644 archive/current/packages/support/objects/hasAll.html create mode 100644 archive/current/packages/support/objects/hasAny.html create mode 100644 archive/current/packages/support/objects/hasUniqueId.html create mode 100644 archive/current/packages/support/objects/index.html create mode 100644 archive/current/packages/support/objects/isCloneable.html create mode 100644 archive/current/packages/support/objects/isPopulatable.html create mode 100644 archive/current/packages/support/objects/isset.html create mode 100644 archive/current/packages/support/objects/merge.html create mode 100644 archive/current/packages/support/objects/populate.html create mode 100644 archive/current/packages/support/objects/set.html create mode 100644 archive/current/packages/support/objects/uniqueId.html create mode 100644 archive/current/packages/support/reflections/assertHasPrototypeProperty.html create mode 100644 archive/current/packages/support/reflections/classLooksLike.html create mode 100644 archive/current/packages/support/reflections/classOwnKeys.html create mode 100644 archive/current/packages/support/reflections/getAllParentsOfClass.html create mode 100644 archive/current/packages/support/reflections/getClassPropertyDescriptor.html create mode 100644 archive/current/packages/support/reflections/getClassPropertyDescriptors.html create mode 100644 archive/current/packages/support/reflections/getConstructorName.html create mode 100644 archive/current/packages/support/reflections/getNameOrDesc.html create mode 100644 archive/current/packages/support/reflections/getParentOfClass.html create mode 100644 archive/current/packages/support/reflections/hasAllMethods.html create mode 100644 archive/current/packages/support/reflections/hasMethod.html create mode 100644 archive/current/packages/support/reflections/hasPrototypeProperty.html create mode 100644 archive/current/packages/support/reflections/index.html create mode 100644 archive/current/packages/support/reflections/isCallable.html create mode 100644 archive/current/packages/support/reflections/isClassConstructor.html create mode 100644 archive/current/packages/support/reflections/isClassMethodReference.html create mode 100644 archive/current/packages/support/reflections/isConstructor.html create mode 100644 archive/current/packages/support/reflections/isKeySafe.html create mode 100644 archive/current/packages/support/reflections/isKeyUnsafe.html create mode 100644 archive/current/packages/support/reflections/isMethod.html create mode 100644 archive/current/packages/support/reflections/isSubclass.html create mode 100644 archive/current/packages/support/reflections/isSubclassOrLooksLike.html create mode 100644 archive/current/packages/support/reflections/isWeakKind.html create mode 100644 archive/current/packages/vuepress-utils/components/version-disclaimer.html create mode 100644 archive/current/packages/vuepress-utils/index.html create mode 100644 archive/current/packages/vuepress-utils/install.html create mode 100644 archive/current/packages/vuepress-utils/navigation/archive.html create mode 100644 archive/current/packages/vuepress-utils/plugins/last-updated.html create mode 100644 archive/current/packages/xyz/index.html create mode 100644 archive/current/security.html create mode 100644 archive/current/upgrade-guide.html create mode 100644 archive/index.html create mode 100644 archive/next/index.html create mode 100644 archive/not_available.html create mode 100644 assets/css/styles.2fea50f5.css create mode 100644 assets/img/back-to-top.bdc03142.svg create mode 100644 assets/img/copied-button.9f175e5f.svg create mode 100644 assets/img/copy-button.45f8803e.svg create mode 100644 assets/img/search.b017a09f.svg create mode 100644 assets/js/404.html.1424746e.js create mode 100644 assets/js/4475.f1641a0c.js create mode 100644 assets/js/4475.f1641a0c.js.LICENSE.txt create mode 100644 assets/js/CallbackWrapper.html.159d6ab7.js create mode 100644 assets/js/aliases.html.d906e91a.js create mode 100644 assets/js/app.294c6513.js create mode 100644 assets/js/apply.html.1fa5dcc0.js create mode 100644 assets/js/archive.html.b243c4ec.js create mode 100644 assets/js/assertHasPrototypeProperty.html.c96dd651.js create mode 100644 assets/js/bindings.html.c03df7ed.js create mode 100644 assets/js/booting.html.eb728ae1.js create mode 100644 assets/js/classLooksLike.html.efaf58a0.js create mode 100644 assets/js/classOwnKeys.html.ad046074.js create mode 100644 assets/js/code-of-conduct.html.bac34c39.js create mode 100644 assets/js/concernClass.html.28be5543.js create mode 100644 assets/js/configureCustomError.html.ef9b6e9e.js create mode 100644 assets/js/configureStackTrace.html.a35c72c3.js create mode 100644 assets/js/conflictResolution.html.653ec4d9.js create mode 100644 assets/js/container-instance.html.0c106a57.js create mode 100644 assets/js/contextual-bindings.html.fa8c9ec2.js create mode 100644 assets/js/contribution-guide.html.eb251cb2.js create mode 100644 assets/js/customErrors.html.49a0442d.js create mode 100644 assets/js/dependencies.html.15552877.js create mode 100644 assets/js/descTag.html.704e225b.js create mode 100644 assets/js/edgeCases.html.b8f147f4.js create mode 100644 assets/js/empty.html.9e33f6c2.js create mode 100644 assets/js/forget.html.522dfd63.js create mode 100644 assets/js/forgetAll.html.58d8e9c1.js create mode 100644 assets/js/get.html.cb27b757.js create mode 100644 assets/js/getAllParentsOfClass.html.fe69b65f.js create mode 100644 assets/js/getClassPropertyDescriptor.html.8da3ab1f.js create mode 100644 assets/js/getClassPropertyDescriptors.html.27c05d0b.js create mode 100644 assets/js/getConstructorName.html.8b21384d.js create mode 100644 assets/js/getErrorMessage.html.b3a46b8e.js create mode 100644 assets/js/getNameOrDesc.html.687020eb.js create mode 100644 assets/js/getParentOfClass.html.bb3ce886.js create mode 100644 assets/js/has.html.4debffef.js create mode 100644 assets/js/hasAll.html.ccff6c37.js create mode 100644 assets/js/hasAllMethods.html.42db66cc.js create mode 100644 assets/js/hasAny.html.6704b902.js create mode 100644 assets/js/hasMethod.html.04c1131e.js create mode 100644 assets/js/hasPrototypeProperty.html.89ee5d31.js create mode 100644 assets/js/hasUniqueId.html.f01d682a.js create mode 100644 assets/js/hooks.html.ba015dd6.js create mode 100644 assets/js/includesAll.html.dedc848a.js create mode 100644 assets/js/includesAny.html.2465015b.js create mode 100644 assets/js/index.html.3cddfd92.js create mode 100644 assets/js/inheritance.html.ff09d1d0.js create mode 100644 assets/js/install.html.649220ed.js create mode 100644 assets/js/instanceof.html.46ee3113.js create mode 100644 assets/js/isArrayLike.html.4487815f.js create mode 100644 assets/js/isCallable.html.84eaa115.js create mode 100644 assets/js/isClassConstructor.html.1dbf8d8c.js create mode 100644 assets/js/isClassMethodReference.html.97742a21.js create mode 100644 assets/js/isCloneable.html.a8253de5.js create mode 100644 assets/js/isConcatSpreadable.html.36d6883b.js create mode 100644 assets/js/isConstructor.html.296bf48e.js create mode 100644 assets/js/isKey.html.5d05550b.js create mode 100644 assets/js/isKeySafe.html.b4d79743.js create mode 100644 assets/js/isKeyUnsafe.html.48d1e86a.js create mode 100644 assets/js/isMethod.html.c2a2d65f.js create mode 100644 assets/js/isPopulatable.html.44884087.js create mode 100644 assets/js/isPrimitive.html.c0301777.js create mode 100644 assets/js/isPropertyKey.html.87fe6434.js create mode 100644 assets/js/isSafeArrayLike.html.d566834f.js create mode 100644 assets/js/isSubclass.html.8603c7e5.js create mode 100644 assets/js/isSubclassOrLooksLike.html.46bf230a.js create mode 100644 assets/js/isTypedArray.html.309030b7.js create mode 100644 assets/js/isWeakKind.html.4f39498c.js create mode 100644 assets/js/isset.html.1a8165f2.js create mode 100644 assets/js/jsdoc.html.29e03e5d.js create mode 100644 assets/js/last-updated.html.d07a4dec.js create mode 100644 assets/js/merge.html.4504c2dd.js create mode 100644 assets/js/mergeKeys.html.2d62ee48.js create mode 100644 assets/js/newMixin.html.1e594094.js create mode 100644 assets/js/not_available.html.f239d346.js create mode 100644 assets/js/onward.html.8fb7cd66.js create mode 100644 assets/js/origin.html.b71a5112.js create mode 100644 assets/js/outsideChanges.html.156b6bbb.js create mode 100644 assets/js/populate.html.36046530.js create mode 100644 assets/js/prerequisites.html.ecd52261.js create mode 100644 assets/js/resolving.html.df94b85d.js create mode 100644 assets/js/runtime~app.c653e560.js create mode 100644 assets/js/security.html.2d888571.js create mode 100644 assets/js/set.html.87fec706.js create mode 100644 assets/js/setAndGet.html.eb5cdd15.js create mode 100644 assets/js/supported.html.adf3fce5.js create mode 100644 assets/js/targetMeta.html.543973ed.js create mode 100644 assets/js/tc39.html.ad6563e8.js create mode 100644 assets/js/toWeakRef.html.c223105a.js create mode 100644 assets/js/uniqueId.html.058f42b9.js create mode 100644 assets/js/upgrade-guide.html.7cad2293.js create mode 100644 assets/js/usage.html.0cc995d4.js create mode 100644 assets/js/version-disclaimer.html.f9b07ad7.js create mode 100644 favicon.ico create mode 100644 images/icon/README.md create mode 100644 images/icon/about.txt create mode 100644 images/icon/android-chrome-192x192.png create mode 100644 images/icon/android-chrome-512x512.png create mode 100644 images/icon/apple-touch-icon.png create mode 100644 images/icon/favicon-16x16.png create mode 100644 images/icon/favicon-32x32.png create mode 100644 index.html create mode 100644 site.webmanifest diff --git a/404.html b/404.html new file mode 100644 index 00000000..30734d1b --- /dev/null +++ b/404.html @@ -0,0 +1,37 @@ + + + + + + + + + Ion + + + + + +

404

Looks like we've got some broken links.
Take me home
+ + + diff --git a/archive/current/code-of-conduct.html b/archive/current/code-of-conduct.html new file mode 100644 index 00000000..66e673af --- /dev/null +++ b/archive/current/code-of-conduct.html @@ -0,0 +1,37 @@ + + + + + + + + + Code of Conduct | Ion + + + + + +

Code of Conduct

Be nice... be fair! Writing free Open Source software often means spending time developing after-hours, and in weekends. Chances are pretty good that you yourself are involved in one or many Open Source projects and already know how time-consuming it can be. In any case, the following constitutes the code of conduct used by Ion:

  • Be patient, nice and fair.
  • Be helpful and constructive.
  • Your words and actions must be free of harassment, harmful deeds or remarks, and malicious intent.
  • Respect the opinions of others, even if they contradict yours.

Consequences

Participants can be subject to consequences, if the code of conduct is not upheld. Such consequences include, but not limited to, warnings, and banning from further participation.

+ + + diff --git a/archive/current/contribution-guide.html b/archive/current/contribution-guide.html new file mode 100644 index 00000000..d3bbc25e --- /dev/null +++ b/archive/current/contribution-guide.html @@ -0,0 +1,37 @@ + + + + + + + + + Contribution Guide | Ion + + + + + +

Contribution Guide

Have you found a defect ( bug or design flawopen in new window ), or do you wish improvements? In the following sections, you might find some useful information on how you can help this project. In any case, I thank you for taking the time to help me improve this project's deliverables and overall quality.

Bug Report

If you have found a bug, please report it on GitHubopen in new window. When reporting the bug, do consider the following:

  • Where is the defect located
  • A good, short and precise description of the defect (Why is it a defect)
  • How to replicate the defect
  • (A possible solution for how to resolve the defect)

When time permits it, I will review your issue and take action upon it.

Security Vulnerability

Please read the Security Policy.

Feature Request

If you have an idea for a new feature or perhaps changing an existing, feel free to create a feature requestopen in new window. Should you feel unsure whether your idea is good or not, then perhaps you could start a discussionopen in new window.

Fork, code and send pull-request

If you wish to fix a bug, add new feature, or perhaps change an existing, then please follow this guideline

  • Fork this project
  • Create a new local development branch for the given fix, addition or change
  • Write your code / changes
  • Create executable test-cases (prove that your changes are solid!)
  • Commit and push your changes to your fork-repository
  • Send a pull-request with your changes (please check "Allow edits from maintainers")
  • Drink a Beeropen in new window - you earned it 😃

As soon as I receive the pull-request (and have time for it), I will review your changes and merge them into this project. If not, I will inform you why I choose not to.

+ + + diff --git a/archive/current/index.html b/archive/current/index.html new file mode 100644 index 00000000..5f330eee --- /dev/null +++ b/archive/current/index.html @@ -0,0 +1,130 @@ + + + + + + + + + Release Notes | Ion + + + + + +

Release Notes

DANGER

Ion is still in development. You SHOULD NOT use any of the packages in a production environment. Breaking changes MUST be expected for all v0.x releases!

Please review the CHANGELOG.mdopen in new window for additional details.

Support Policy

VersionTypeScriptECMA ScriptReleaseSecurity Fixes Until
1.x5.0 - ?TBDTBDTBD
0.x*5.0ES2022ongoing releasesuntil v1.x release

*: current supported version.

TBD: "To be decided".

v0.x Highlights

Service Container Available since v0.11

An adaptation of Laravel's Service Container that offers a way to with powerful tool to manage dependencies and perform dependency injection.

import { Container } from "@aedart/container";
+
+container.bind('storage', () => {
+    return new CloudService('s3');
+});
+
+// Later in your application.
+const storage = container.make('storage');
+

For additional examples, see the Service Container documentation.

Facades Available since v0.11

Adaptation of Laravel's Facade component. It acts as an interface or gateway to an underlying object that is resolved from the Service Container.

import { Facade } from "@aedart/support/facades";
+
+export default class ApiFacade extends Facade
+{
+    static getIdentifier()
+    {
+        return 'api_client';
+    }
+}
+
+// Later in your application
+const promise = ApiFacade.obtain().fetch('https://acme.com/api/users');
+

See the Facades documentation for additional details.

Concerns Available since v0.9

Intended as an alternative to mixins, the Concerns submodule offers a different way to overcome some of the limitations of single inheritance.

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+// A concern class...
+class Role extends AbstractConcern {
+    addRole(name) {
+        /* ...not shown... */
+    }
+}
+
+// Use concern in target class...
+@use(Role)
+class User {}
+
+// Later in your application...
+const user = new User();
+user.addRole('maintainer');
+user.addRole('supporter');
+

Merge Available since v0.9

Objects merge utility, using deep copyopen in new window.

import { merge } from "@aedart/support/objects";
+
+const a = {
+    'name': 'Alin',
+};
+
+const b = {
+    'address': {
+        'street': 'Northern Street 1'
+    },
+};
+
+const result = merge(a, b); // { 'name': 'Alin', 'address': { 'street': '...' } }
+

Mixins Available since v0.8

Adaptation of Justin Fagnani's mixwith.jsopen in new window.

import { mix, Mixin } from "@aedart/support/mixins";
+
+const NameMixin = Mixin((superclass) => class extends superclass {
+    #name;
+    
+    set name(value) {
+        this.#name = value;
+    }
+    
+    get name() {
+        return this.#name;
+    }
+});
+
+class Item extends mix().with(
+    NameMixin
+) {}
+
+// ...Later in your application
+const item = new Item();
+item.name = 'My Item';
+
+console.log(item.name); // My Item
+

See details and more examples in the @aedart/support/mixins documentation.

"Target" Meta Decorator Available since v0.7

Associate arbitrary metadata directly with the target element that is being decorated. See target meta decorator fro additional details.

import {targetMeta, getTargetMeta} from '@aedart/support/meta';
+
+class Service {
+
+    @targetMeta('desc', 'Seaches for cities')
+    search() {
+        // ...not shown...
+    }
+}
+
+const instance = new Service();
+
+// ...later in your application...
+getTargetMeta(instance.search, 'desc'); // Seaches for cities
+

Meta Decorator Available since v0.6

The meta decorator is able to associate arbitrary metadata with a class and its elements.

import {meta, getMeta} from '@aedart/support/meta';
+
+@meta('description', 'Able to search for locations')
+class Service {}
+
+getMeta(Service, 'description'); // Able to search for locations
+

Support Available since v0.3

A package intended to contain various helpers and utilities. At the moment, the package comes with a few object utilities. See package documentation for more details.

Vuepress Utils Available since v0.1

Utilities for vuepress sites, which includes an Archive component for structuring documentation into an archive. See package documentation for details.

+ + + diff --git a/archive/current/origin.html b/archive/current/origin.html new file mode 100644 index 00000000..4eb8ba1a --- /dev/null +++ b/archive/current/origin.html @@ -0,0 +1,37 @@ + + + + + + + + + Origin | Ion + + + + + +

Origin

For many years, I was too discouraged and overburden to publish my JavaScript as packages. Having a full-time job and maintaining Athenaeumopen in new window took most of my time. Like so many other developers, I was copying JavaScript from one project into another. I always knew that was very bad practice. But, it was too cumbersome trying to maintain so much code, spread throughout various repositories.

Nevertheless, in recent years, Lernaopen in new window, TypeScriptopen in new window, and many other tools & frameworks made it somewhat easier to manage mono-reposopen in new window. I cannot claim to have gained more time, but decided to give JavaScript packages another shoot.

Meaning of "Ion"

"[...] An atom or a group of atoms that has an electric charge [...] - positive or negative" ("Scientific definition" from dictionary.comopen in new window)

+ + + diff --git a/archive/current/packages/container/bindings.html b/archive/current/packages/container/bindings.html new file mode 100644 index 00000000..7718830b --- /dev/null +++ b/archive/current/packages/container/bindings.html @@ -0,0 +1,96 @@ + + + + + + + + + Bindings | Ion + + + + + +

Bindings

Basics

The bind() method is used to register bindings in the Service Container. It accepts three arguments:

  • identifier: Identifier - (see Identifiers).
  • concrete: FactoryCallback | Constructor - The value to be resolved from the container.
  • shared: boolean = false - (optional - see Singletons).
import { CookieStorage } from "@acme/storage";
+
+container.bind('storage', CookieStorage);
+

When the binding is resolved from the Service Container, the concrete value is returned. Either as a new class instance (see Constructors), or the value returned from a callback (see Factory Callbacks).

You can also use bindIf() to register a binding. The method will ONLY register the binding, if one has not already been registered for the given identifier.

container.bindIf('storage', CookieStorage);
+

Singletons

If you wish to register a "shared" binding, use the singleton() method. It ensures that the binding is only resolved once. This means that the same object instance or value is returned, each time that it is requested resolved. Invoking the singleton() is the equivalent to invoking bind() with the shared argument set to true.

import { ApiClient } from "@acme/api";
+
+container.singleton('api_client', ApiClient);
+

The singletonIf() method is similar to bindIf(). It will only register a "shared" binding, if one has not already been registered.

container.singletonIf('api_client', ApiClient);
+

Instances

You can also register existing object instances in the Service Container. This is done via the instance() method. Whenever the binding is requested resolved, the same instance is returned each time.

import { ApiClient } from "@acme/api";
+
+const client = new ApiClient();
+
+container.instance('api_client', client);
+

Identifiers

To ensure that the Service Container is able to resolve the correct object instances or values, the binding identifiers must be unique. The following types are supported as binding identifiers:

  • string
  • symbol
  • number
  • object (not null)
  • Class Constructor
  • Callback

TIP

To ensure that identifiers are truly unique, you should use symbolsopen in new window or class constructorsopen in new window as binding identifiers.

// Somewhere in your application
+export const STORAGE = Symbol('app_storage');
+
import { CookieStorage } from "@acme/storage";
+import { STORAGE } from "@acme/services";
+
+container.bind(STORAGE, CookieStorage);
+

concrete Types

The concrete argument for the bind(), bindIf(), singleton() and singletonIf() methods accepts the following types:

  • Class constructor
  • "Factory" callback

Constructors

When registering a binding using a class constructor as the concrete argument value, a new instance of that class is instantiated and returned, when requested resolved.

class TextRecorder {}
+
+container.bind('recorder', TextRecorder);
+
+// Later in your application
+const recorder = container.make('recorder');
+
+console.log(recorder instanceof TextRecorder); // true
+

Factory Callbacks

If you need more advanced resolve logic, then you can specify a callback as the concrete argument value. When requested resolved, the callback is invoked and the Service Container instance is passed as argument to the callback. This allows you to perform other kinds of resolve logic.

class TextRecorder {
+    constructor(config) {
+        this.config = config;
+    }
+}
+
+container.bind('recorder', (container) => {
+    const config = container.make('my_recorder_config');
+    
+    return new TextRecorder(config);
+});
+

Although the above example shows an object instance being returned by the factory callback, any kind of value can be returned by the callback.

container.bind('my_message', () => 'Hi there...');
+
+// Later in your application
+const msg = container.make('my_message'); // Hi there...
+

Arguments

The factory callback is also provided with any arguments that are passed on to the make() method.

class User {
+    constructor(name) {
+        this.name = name;
+    }
+}
+
+container.bind('user', (container, ...args) => {
+    return new User(...args);
+});
+
+// Later in your application
+const user = container.make('user', 'Maya');
+
+console.log(user.name); // Maya
+

Extend Bindings

The extend() method can be used to decorate or configure object instances that have been resolved. The method accepts the following arguments:

  • identifier: Identifier - the target binding identifier.
  • callback: ExtendCallback - callback that is responsible for modifying the resolved instance.
container.extend('user', (resolved, container) => {
+    return DecoratedUser(resolved);
+});
+
+ + + diff --git a/archive/current/packages/container/container-instance.html b/archive/current/packages/container/container-instance.html new file mode 100644 index 00000000..f96fd90b --- /dev/null +++ b/archive/current/packages/container/container-instance.html @@ -0,0 +1,42 @@ + + + + + + + + + Container Instance | Ion + + + + + +

Container Instance

The Service Container can be instantiated like any other regular class. This allows you to use the container in isolation, without application-wide side effects.

import { Container } from "@aedart/container";
+
+const container = new Container();
+

However, if you want the use the same Service Container instance across your entire application, then you can obtain a singletonopen in new window instance, via the static method getInstance().

The getInstance() method will automatically create a new Service Container instance and store a static reference to it, if no previous instance was created. Otherwise, the method will return the existing instance.

const container = Container.getInstance();
+

Destroy Existing Instance

In situations when you need to destroy the existing singleton instance, call the static setInstance() method with null as argument.

Container.setInstance(null); // Existing singleton instance is now lost...
+
+ + + diff --git a/archive/current/packages/container/contextual-bindings.html b/archive/current/packages/container/contextual-bindings.html new file mode 100644 index 00000000..b6808542 --- /dev/null +++ b/archive/current/packages/container/contextual-bindings.html @@ -0,0 +1,77 @@ + + + + + + + + + Contextual Bindings | Ion + + + + + +

Contextual Bindings

In situations when multiple classes make use of the same dependency, but you wish to inject a different component or value on some of those classes, then you can make use of "context binding". The when() method allows you to specify (overwrite) the implementation to be resolved and injected, for a given target class.

container.when(ApiService)
+        .needs('storage')
+        .give(CookieStorage);
+
+container.when(UsersRepository, BooksRepository)
+        .needs('api_client')
+        .give(() => {
+           return new AcmeApiClient(); 
+        });
+

To illustrate the usefulness of contextual binding a bit further, consider the following example:

@dependency('storage')
+class A {
+    // ...not shown...
+}
+
+@dependency('storage')
+class B {
+    // ...not shown...
+}
+
+@dependency('storage')
+class C {
+    // ...not shown...
+}
+
+@dependency('storage')
+class D {
+    // ...not shown...
+}
+
+// Register "default" storage binding
+container.singleton('storage', CookieStorage);
+
+// Register contextual binding for C and D
+container.when(C, D)
+    .needs('storage')
+    .give(() => {
+        return new CloudStorage('s3');
+    });
+

In the above shown example, all classes define the same binding identifier ("storage") as a dependency. By default, a "storage" binding is registered in the Service Container, which ensures that when the classes are resolved, a CookieStorage component instance is injected into each target class instance.

However, classes C and D require a different implementation, than the one offered by the "storage" binding. To achieve this, and without overwriting the default "storage" binding, a new contextual binding is registered that affects only classes C and D. When they are resolved, a different implementation of injected into the target classes.

const c = container.make(C);
+console.log(c.storage); // CloudStorage
+
+ + + diff --git a/archive/current/packages/container/dependencies.html b/archive/current/packages/container/dependencies.html new file mode 100644 index 00000000..0ebe3b20 --- /dev/null +++ b/archive/current/packages/container/dependencies.html @@ -0,0 +1,67 @@ + + + + + + + + + Dependencies | Ion + + + + + +

Dependencies

In order for the Service Container to be able to automatically inject dependencies, when resolving components, you must first define them on a target class. The dependencies() decorator is used for this purpose.

import { dependencies } from "@aedart/support/container";
+
+@dependencies('engine')
+export default class Car
+{
+    engine = undefined;
+    
+    constructor(engine) {
+        this.engine = engine;
+    }
+}
+

No automatic injection

The dependencies() decorator does not automatically inject anything into your class. It will only associate binding identifiers with the target class, as metadata. This means that you can instantiate a new instance of the class, without any side effects (dependencies must be manually given as arguments to the target class).

const car = new Car();
+console.log(car.engine); // undefined
+

The Service Container's make() method is responsible for reading the defined dependencies, resolve them, and inject them into the target class.

Multiple Dependencies

The dependencies() decorator accepts an arbitrary amount of binding identifiers. This allows you to define multiple dependencies in a single call.

@dependencies(
+    'warehouse_manager',
+    'api_client',
+    'events'
+)
+export default class Warehouse
+{
+    manager = undefined;
+    apiClient = undefined;
+    eventDispatcher = undefined;
+    
+    constructor(manager, apiClient, dispatcher) {
+        this.manager = manager;
+        this.apiClient = apiClient;
+        this.eventDispatcher = dispatcher;
+    }
+}
+
+ + + diff --git a/archive/current/packages/container/index.html b/archive/current/packages/container/index.html new file mode 100644 index 00000000..bbcb9388 --- /dev/null +++ b/archive/current/packages/container/index.html @@ -0,0 +1,67 @@ + + + + + + + + + Introduction | Ion + + + + + +

Introduction Available since v0.11Browser

The @aedart/container package offers an adaptation of Laravel's Service Containeropen in new window (originally licensed under MITopen in new window).

The tools provided by this package give you a way to:

Example

Bindings

Imagine that you have an Api client (or any component for that matter). Whenever it is needed, you want it to be injected into components that depend on it.

export default class ApiClient
+{
+    // ...implementation not shown...
+}
+

To ensure that dependency injection can be performed, you must first bind the component in the service container. Each binding requires a unique identifier, e.g. a string, symbol, number...etc.

import { Container } from "@aedart/container";
+import { ApiClient } from "@acme/api";
+
+const container = Container.getInstance();
+
+// Bind 'my_api_client' to the ApiClient component...
+container.bind('my_api_client', ApiClient);
+

Define Dependencies

To define the dependencies of a component, use the dependencies() decorator. By itself, the decorator does not do anything more than to associate a component with one or more dependencies (binding identifiers). In other words, the decorator does not automatically inject anything into your class. It only registers the dependencies as metadata onto a class.

import { dependencies } from "@aedart/support/container";
+
+@dependencies('my_api_client')
+export default class BookService
+{
+    apiClient;
+    
+    constructor(client) {
+        this.apiClient = client;
+    }
+    
+    // ...remaining not shown...
+}
+

Resolve

When you want to resolve a component, with all of its dependencies injected into it, use the service container's make() method.

import { Container } from "@aedart/container";
+import { BookService } from "@acme/app/services";
+
+const bookService = Container.getInstance().make(BookService);
+
+console.log(bookService.apiClient); // ApiClient
+

Onward

The above shown example illustrates the most basic usage of the service container. Throughout the remaining of this package's documentation, more examples and use-cases are covered.

+ + + diff --git a/archive/current/packages/container/install.html b/archive/current/packages/container/install.html new file mode 100644 index 00000000..24858756 --- /dev/null +++ b/archive/current/packages/container/install.html @@ -0,0 +1,40 @@ + + + + + + + + + How to install | Ion + + + + + +

How to install

npm

npm install --save-peer @aedart/container
+

yarn

yarn add --peer @aedart/container
+

pnpm

pnpm add --save-peer @aedart/container
+
+ + + diff --git a/archive/current/packages/container/prerequisites.html b/archive/current/packages/container/prerequisites.html new file mode 100644 index 00000000..86d5647d --- /dev/null +++ b/archive/current/packages/container/prerequisites.html @@ -0,0 +1,37 @@ + + + + + + + + + Prerequisites | Ion + + + + + +

Prerequisites

At the time of this writing, decoratorsopen in new window are still in a proposal phase. To use the service container, you must either use @babel/plugin-proposal-decoratorsopen in new window, or use TypeScript 5 decoratorsopen in new window.

+ + + diff --git a/archive/current/packages/container/resolving.html b/archive/current/packages/container/resolving.html new file mode 100644 index 00000000..c9601332 --- /dev/null +++ b/archive/current/packages/container/resolving.html @@ -0,0 +1,126 @@ + + + + + + + + + Resolving | Ion + + + + + +

Resolving

The make() method

To resolve component instances or values from the Service Container, use the make() method. It accepts the following arguments:

const recorder = container.make('recorder');
+

When specifying a class constructor as the identifier argument, the make() method will automatically attempt to create a new instance of the given class, even if no binding was registered for it.

class AudioPlayer
+{
+    // ...not shown...
+}
+
+const audio = container.make(AudioPlayer); // new AudioPlayer instance
+

Dependencies

If the target that must be resolved is a class that has dependencies defined as metadata, then the make() method will automatically resolve them, and inject them into the target class.

import { dependencies } from "@aedart/support/container";
+
+@dependencies('storage')
+class TextRecorder
+{
+    storage = undeinfed;
+
+    constructor(storage) {
+        this.storage = storage;
+    }
+}
+
+// Register binding in the Service Container
+container.singleton('storage', () => {
+   return new CookieStorage(); 
+});
+
+
+// ...Later in your application
+const recorder = container.make(TextRecorder);
+console.log(recorder.storage); // CookieStorage
+

The args Argument

You can also manually specify what arguments a class constructor or "factory" callback should receive, via the args argument.

const recorder = container.make(TextRecorder, [ new CloudStorage() ]);
+console.log(recorder.storage); // CloudStorage
+

WARNING

When specifying the args argument for make(), any defined dependencies are overwritten by the values in the args array, if a class constructor is requested resolved! In other words, the binding identifiers defined via the dependencies decorator are ignored.

The call() method

The Service Container can also be used to invoke class methods or callbacks. This allows you to resolve a method's dependencies and inject them. The call() method accepts the following arguments:

  • method: Callback | CallbackWrapper | ClassMethodReference - The target callback or class method to invoke.
  • args: any[] = [] - (optional) Eventual arguments to be passed on to class method or callback.
class UsersRepository
+{
+    @dependencies('users_api_service')
+    fetchUser(usersService)
+    {
+        // ...not shown...
+    }
+}
+
+// Later in your application
+const promise = container.call([UsersRepository, 'fetchUser']);
+

Class Method Reference

A "class method reference" is an array that holds two values:

  • A class constructor or object instance.
  • The name of the method to be invoked in the target class.
const reference = [AudioPlayer, 'play'];
+

When given as the method argument, for call(), the target class constructor is automatically resolved (instantiated with eventual dependencies injected). The method is thereafter invoked and output is returned. If the class method has any dependencies defined, then those will be resolved and injected into the method as arguments.

class AudioPlayer
+{
+    @dependencies('audio_processor', 'my_song')
+    play(processor, song) {
+        // ...play logic not shown...
+        return this;
+    }
+}
+
+const player = container.call([AudioPlayer, 'play']);
+

WARNING

If you specify the args argument for call(), then eventual defined dependencies are overwritten with the values provided in the args array. Thus, the dependencies of the class method are ignored.

const player = container.call(
+    [AudioPlayer, 'play'],
+    
+    // Arguments passed on to "play" method.
+    [
+        new AudioProcessor(),
+        new FavouriteSong()
+    ]
+);
+

Callback Wrapper

When specifying a callback wrapper as target for call(), then the callback will be invoked and eventual output is returned. If the wrapper has arguments specified, then they will automatically be applied, the underlying callback is invoked.

WARNING

Providing the args argument for call() will overwrite eventual arguments set in the callback wrapper!

import { CallbackWrapper } from "@aedart/support";
+
+const wrapped = CallbackWrapper.make((firstname, lastname) => {
+    return `Hi ${firstname} ${lastname}`;
+}, 'Brian', 'Jackson');
+
+const result = container.call(wrapped, [ 'James', 'Brown' ]);
+console.log(result); // Hi James Brown
+

To define dependencies for a callback wrapper, you must use the wrapper's set() method and specify an array of target binding identifiers for the DEPENDENCIES symbol as key.

import { DEPENDENCIES } from "@aedart/contracts/container";
+
+const wrapped = CallbackWrapper.make((apiClient) => {
+    // ...fetch user logic not shown...
+    
+    return promise;
+}).set(DEPENDENCIES, [ 'api_client' ]);
+
+const promise = container.call(wrapped); // Api Client injected into callback...
+

Callback

The call() can also be used for invoking a regular callback. Any args argument given to call() are passed on to the callback, and eventual output value is returned.

const result = container.call((x) => {
+    return x * 2;
+}, 4);
+
+console.log(result); // 8
+

Limitation

At the moment, it is not possible to associate dependencies with a native callback directly. Please use a callback wrapper instead, if you need to inject dependencies into a callback.

Hooks

If you need to react to components or values that are being resolved from the Service Container, then you can use the before() and after() hook methods.

before()

The before() method registers a callback to be invoked before a binding is resolved.

container.before('user', (identifier, args, container) => {
+    // ...not shown...
+});
+

after()

The after() method registers a callback to be invoked after a binding has been resolved

container.after('user', (identifier, resolved, container) => {
+    // ...not shown...
+});
+
+ + + diff --git a/archive/current/packages/contracts/index.html b/archive/current/packages/contracts/index.html new file mode 100644 index 00000000..39b0879c --- /dev/null +++ b/archive/current/packages/contracts/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Introduction | Ion + + + + + +

Introduction Available since v0.3Browser

The contracts package contains types, interfaces and unique identifiers.

More information available at a later point...

+ + + diff --git a/archive/current/packages/contracts/install.html b/archive/current/packages/contracts/install.html new file mode 100644 index 00000000..c793868e --- /dev/null +++ b/archive/current/packages/contracts/install.html @@ -0,0 +1,40 @@ + + + + + + + + + How to install | Ion + + + + + +

How to install

npm

npm install --save-peer @aedart/contracts
+

yarn

yarn add --peer @aedart/contracts
+

pnpm

pnpm add --save-peer @aedart/contracts
+
+ + + diff --git a/archive/current/packages/index.html b/archive/current/packages/index.html new file mode 100644 index 00000000..a408eefa --- /dev/null +++ b/archive/current/packages/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Introduction | Ion + + + + + +

Packages

In here, you will find documentation for the available packages. A few things that might be good to know:

Environment

Badges are used to indicate the environment that a package is intended for, e.g. NodeBrowser.

You are of course welcome to use a package in a different environment than its original intent, if it is possible.

Available Since

The "available since x.y.z" badge might also be displayed, if a package or feature was released during a minor version. E.g. Available since v1.5.

Not Released

Sometimes, documentation might be available for a package that has not yet been released. Usually it is tagged with a Not Released badge, unless the package documentation is located in "next" release".

Not Published

In rare situations, a package might only exist in the mono-repository and not published to npm's registry. Such a package is either experimental or internal, which means that it might not ever be published. Usually, it will be tagged with Internal (not published)Experimental, or similar badges, if documentation is made available about the package!

+ + + diff --git a/archive/current/packages/support/CallbackWrapper.html b/archive/current/packages/support/CallbackWrapper.html new file mode 100644 index 00000000..37e2f90e --- /dev/null +++ b/archive/current/packages/support/CallbackWrapper.html @@ -0,0 +1,117 @@ + + + + + + + + + Callback Wrapper | Ion + + + + + +

Callback Wrapper Available since v0.11

The CallbackWrapper objects offers a convenient way to wrap a callable function.

import { CallbackWrapper } from "@aedart/support";
+
+const wrapped = CallbackWrapper.make(() => {
+    return 'Hi there...';
+});
+
+// Later in your application
+wrapped.call(); // Hi there...
+

Call

The call() method invokes the wrapped callback and returns its eventual output.

const wrapped = CallbackWrapper.make(() => {
+    return true;
+});
+
+wrapped.call(); // true
+

Arguments

There are several ways to specify arguments that must be applied for the wrapped callback, when call() is invoked.

Via make()

The static make() method allows you to specify arguments right away. This is useful, if you already know the arguments.

const wrapped = CallbackWrapper.make((firstname, lastname) => {
+    return `Hi ${firstname} ${lastname}`;
+}, 'Timmy', 'Jackson');
+
+wrapped.call(); // Hi Timmy Jackson
+

Via with()

In situations when you must add additional arguments, e.g. because you might not know all arguments up front, then you can use the with() method.

const wrapped = CallbackWrapper.make((firstname, lastname) => {
+    return `Hi ${firstname} ${lastname}`;
+}, 'Siw');
+
+wrapped
+    .with('Orion')
+    .call(); // Hi Siw Orion
+

Via arguments

Lastly, in situations when you must completely overwrite all arguments, then you can specify them via the arguments property.

const wrapped = CallbackWrapper.make((firstname, lastname) => {
+    return `Hi ${firstname} ${lastname}`;
+});
+
+wrapped.arguments = [ 'Alpha', 'Zero' ];
+wrapped
+    .call(); // Hi Alpha Zero
+

Binding

Use bind() to specify the callback's this valueopen in new window.

class A {
+    sayHi(name) {
+        return `Hi ${name}`;
+    }
+}
+const instance = new A();
+
+const wrapped = CallbackWrapper.make(function(name) {
+    return this.sayHi(name);
+});
+
+wrapped
+    .bind(instance)
+    .with('Akari')
+    .call(); // Hi Akari
+

Binding vs. Arrow Function

WARNING

It is not possible to apply a binding on an arrow function callback. Doing so can result in a TypeError or other unexpected behaviour. See Mozilla's documentationopen in new window for additional information.

// Callback Wrapper for arrow function...
+const wrapped = CallbackWrapper.make(() => {
+    // ...not shown ...
+});
+
+wrapped
+    .bind(myObject)
+    .call(); // TypeError
+

✔️

// Callback Wrapper for normal function...
+const wrapped = CallbackWrapper.make(function () {
+    // ...not shown ...
+});
+
+wrapped
+    .bind(myObject)
+    .call();
+

Misc.

If you need to determine if a value is a "callback wrapper" object, then you can use the isCallbackWrapper() util.

import { isCallbackWrapper, CallbackWrapper } from "@aedart/support";
+
+isCallbackWrapper(() => true); // false
+isCallbackWrapper(CallbackWrapper.make(() => true)); // true
+

Custom Callback Wrapper

isCallbackWrapper() can also accept custom implementation of a callback wrapper.

// Custom implementation of a callback wrapper
+const custom = {
+    'callback': function() { /* not shown */ },
+    'binding': undefined,
+    'arguments': [],
+    'with': function() { /* not shown */ },
+    'hasArguments': function() { /* not shown */ },
+    'bind': function() { /* not shown */ },
+    'hasBinding': function() { /* not shown */ },
+    'call': function() { /* not shown */ },
+};
+
+isCallbackWrapper(custom); // true
+

See the source code of isCallbackWrapper() for additional details.

+ + + diff --git a/archive/current/packages/support/arrays/includesAll.html b/archive/current/packages/support/arrays/includesAll.html new file mode 100644 index 00000000..4c609184 --- /dev/null +++ b/archive/current/packages/support/arrays/includesAll.html @@ -0,0 +1,43 @@ + + + + + + + + + Includes All | Ion + + + + + +

includesAll

Determines if an array includes all values.

import { includesAll } from '@aedart/support/arrays';
+
+const arr = [ 1, 2, 3 ];
+
+includesAll(arr, [ 1, 2 ]); // true
+includesAll(arr, [ 1, 4 ]); // false
+
+ + + diff --git a/archive/current/packages/support/arrays/includesAny.html b/archive/current/packages/support/arrays/includesAny.html new file mode 100644 index 00000000..360c0e07 --- /dev/null +++ b/archive/current/packages/support/arrays/includesAny.html @@ -0,0 +1,43 @@ + + + + + + + + + Includes Any | Ion + + + + + +

includesAny

Determines if an array includes some values.

import { includesAny } from '@aedart/support/arrays';
+
+const arr = [ 1, 2, 3 ];
+
+includesAll(arr, [ 4, 2 ]); // true
+includesAll(arr, [ 5, 5 ]); // false
+
+ + + diff --git a/archive/current/packages/support/arrays/index.html b/archive/current/packages/support/arrays/index.html new file mode 100644 index 00000000..334da946 --- /dev/null +++ b/archive/current/packages/support/arrays/index.html @@ -0,0 +1,37 @@ + + + + + + + + + About Arrays | Ion + + + + + +

About Arrays Available since v0.9

@aedart/support/arrays contains arrayopen in new window related utilities.

+ + + diff --git a/archive/current/packages/support/arrays/isArrayLike.html b/archive/current/packages/support/arrays/isArrayLike.html new file mode 100644 index 00000000..199521d0 --- /dev/null +++ b/archive/current/packages/support/arrays/isArrayLike.html @@ -0,0 +1,51 @@ + + + + + + + + + Is Array Like | Ion + + + + + +

isArrayLike

Determines if a value is "array-like"open in new window.

(isArrayLike() is an alias for Lodash's isArrayLikeopen in new window.)

import { isArrayLike } from '@aedart/support/arrays';
+
+isArrayLike([]); // true
+isArrayLike('abc'); // true
+isArrayLike(new String('abc')); // true
+isArrayLike({ length: 0 }); // true
+isArrayLike(new Int8Array()); // true
+
+isArrayLike({}); // false
+isArrayLike(function() {}); // false
+isArrayLike(new Boolean(true)); // false
+isArrayLike(123); // false
+isArrayLike(new Number(123)); // false
+// ...etc
+

See also isSafeArrayLike().

+ + + diff --git a/archive/current/packages/support/arrays/isConcatSpreadable.html b/archive/current/packages/support/arrays/isConcatSpreadable.html new file mode 100644 index 00000000..711380d5 --- /dev/null +++ b/archive/current/packages/support/arrays/isConcatSpreadable.html @@ -0,0 +1,72 @@ + + + + + + + + + Is Concat Spreadable | Ion + + + + + +

isConcatSpreadable

Determines if object contains the well-knownopen in new window symbol Symbol.isConcatSpreadableopen in new window.

import { isConcatSpreadable } from '@aedart/support/arrays';
+
+isConcatSpreadable(null); // false
+isConcatSpreadable([ 1, 2, 3 ]); // false
+isConcatSpreadable({}); // false
+
+// -------------------------------------------------------------------------
+
+const arr = [ 1, 2, 3 ];
+arr[Symbol.isConcatSpreadable] = true;
+isConcatSpreadable(arr); // true
+
+// -------------------------------------------------------------------------
+
+const obj = {
+    [Symbol.isConcatSpreadable]: true,
+
+    // NOTE: length should be present, if Symbol.isConcatSpreadable
+    // set to `true` However, isConcatSpreadable() does not check
+    // if `length` is set!
+    length: 3,
+    0: 'a',
+    1: 'b',
+    2: 'c'
+};
+isConcatSpreadable(obj); // true
+
+// ------------------------------------------------------------------------- 
+
+class A {}
+class B {
+    [Symbol.isConcatSpreadable] = false;
+}
+isConcatSpreadable(new A()); // false
+isConcatSpreadable(new B()); // true
+
+ + + diff --git a/archive/current/packages/support/arrays/isSafeArrayLike.html b/archive/current/packages/support/arrays/isSafeArrayLike.html new file mode 100644 index 00000000..d13db096 --- /dev/null +++ b/archive/current/packages/support/arrays/isSafeArrayLike.html @@ -0,0 +1,46 @@ + + + + + + + + + Is Safe Array Like | Ion + + + + + +

isSafeArrayLike

Determines if value is "safe" array-like object. In this context "safe" means that value is not a string, not an instance of Stringopen in new window object, and not a Typed Arrayopen in new window object.

import { isSafeArrayLike } from '@aedart/support/arrays';
+
+isSafeArrayLike([]); // true
+isSafeArrayLike({ length: 0 }); // true
+
+isSafeArrayLike('abc'); // false
+isSafeArrayLike(new String('abc')); // false
+isSafeArrayLike(new Int8Array()); // false
+// ...etc
+
+ + + diff --git a/archive/current/packages/support/arrays/isTypedArray.html b/archive/current/packages/support/arrays/isTypedArray.html new file mode 100644 index 00000000..3eaf0afd --- /dev/null +++ b/archive/current/packages/support/arrays/isTypedArray.html @@ -0,0 +1,55 @@ + + + + + + + + + Is Typed Array | Ion + + + + + +

isTypedArray

Determines if target is an instance of a TypedArrayopen in new window.

import { isTypedArray } from '@aedart/support/arrays';
+
+isTypedArray(null); // false
+isTypedArray({}); // false
+isTypedArray([]); // false
+isTypedArray(new Map()); // false
+
+isTypedArray(new Int8Array()); // true
+isTypedArray(new Uint8Array()); // true
+isTypedArray(new Uint8ClampedArray()); // true
+isTypedArray(new Int16Array()); // true
+isTypedArray(new Uint16Array()); // true
+isTypedArray(new Int32Array()); // true
+isTypedArray(new Uint32Array()); // true
+isTypedArray(new Float32Array()); // true
+isTypedArray(new Float64Array()); // true
+isTypedArray(new BigInt64Array()); // true
+isTypedArray(new BigUint64Array()); // true
+
+ + + diff --git a/archive/current/packages/support/arrays/merge.html b/archive/current/packages/support/arrays/merge.html new file mode 100644 index 00000000..2711ec13 --- /dev/null +++ b/archive/current/packages/support/arrays/merge.html @@ -0,0 +1,76 @@ + + + + + + + + + Merge | Ion + + + + + +

merge

Merges arrays into a new array. This function attempts to deep copy values, using structuredCloneopen in new window.

import { merge } from '@aedart/support/arrays';
+
+const a = [ 1, 2, 3 ];
+const b = [ 4, 5, 6 ];
+const c = [ 7, 8, 9 ];
+
+merge(a, b, c); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
+

Deep Copy Objects

Simple (or "plain") objects are deep copiedopen in new window. This means that new objects are returned in the resulting array.

See Mozilla's documentationopen in new window for additional information about what data types are supported.

const a = { foo: 'foo' };
+const b = { bar: 'bar' };
+const c = { ping: 'pong' };
+
+const result = merge([ a ], [ b, c ]);
+
+console.log(result[0] === a); // false
+console.log(result[1] === b); // false
+console.log(result[2] === c); // false
+

When unable to merge values

In situations when values cannot be copied via structuredClone, an ArrayMergeError is thrown.

const a = [ 1, 2, 3 ];
+const b = [ function() {} ]; // A function cannot be deep copied...
+
+merge(a, b); // ArrayMergeError
+

See merge options for details on how to deal with functions.

Merge Options Available since v0.11

merge() supports a number of options. To specify thom, use the using() method.

merge()
+    .using({ /** option: value */ })
+    .of(arrayA, arrayB, arrayC);
+

Note

When invoking merge() without any arguments, an underlying array Merger instance is returned.

transferFunctions

By default, functions are not transferred (not copied). When encountered an ArrayMergeError is thrown, because the underlying structuredCloneopen in new window is not able to duplicate functions. To change this behaviour, you can set the transferFunctions setting to true. Function are then "transferred" into the resulting array.

const foo = () => true;
+const bar = () => false;
+
+merge()
+    .using({ transferFunctions: true })
+    .of([ foo ], [ bar ]) // [ foo, bar ]
+

callback

If you require more advanced duplication logic of the array values, then you can specify a callback that can process and return the value in question.

const a = [ 1, 2 ];
+const b = [ 3, 4 ];
+
+const result = merge()
+    .using({
+        callback: (element, index, array, options) => {
+            return element * 2;
+        }
+    })
+    .of(a, b); // [ 2, 4, 6, 8 ]
+

Arguments

  • element: any - The current element being processed in the array.
  • index: number - The index of the current element being processed in the array.
  • array: any[] - The concatenated array this callback was called upon.
  • options: Readonly<ArrayMergeOptions> - The merge options to be applied.
+ + + diff --git a/archive/current/packages/support/concerns/aliases.html b/archive/current/packages/support/concerns/aliases.html new file mode 100644 index 00000000..cd0c6f0c --- /dev/null +++ b/archive/current/packages/support/concerns/aliases.html @@ -0,0 +1,89 @@ + + + + + + + + + Aliases | Ion + + + + + +

Aliases

In this context, an "alias" is a proxy property or method inside a target class. It is responsible for forwarding interaction to the original property or method, inside the concern class instance. Aliases are created automatically by the use() class decorator.

Properties & Methods

When injecting a concern into a target class, the concern's public properties and methods are defined as "aliases" (aka. proxy properties or methods), in the target class' prototype (see PROVIDES symbol for additional details).

Consider the following example:

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+class Levels extends AbstractConcern {
+    get level() { /* ...not shown */ }
+    set level(value) { /* ...not shown */ }
+    clear() { /* ...not shown */ }
+}
+
+@use(Levels)
+class Recorder {}
+

The aliasing mechanism will transform the target class into something that very roughly corresponds to this:

import {
+    use,
+    CONCERNS,
+    AbstractConcern
+} from "@aedart/support/concerns";
+
+class Levels extends AbstractConcern {
+    get level() { /* ...not shown */ }
+    set level(value) { /* ...not shown */ }
+    clear(level) { /* ...not shown */ }
+}
+
+class Recorder {
+    // ...private concerns container not shown...
+
+    // get level "alias"
+    get level() {
+        return this[CONCERNS].get(Levels)['level'];
+    }
+
+    // set level "alias"
+    set level(value) {
+        this[CONCERNS].get(Levels)['level'] = value;
+    }
+
+    // method clear "alias"
+    clear(...args) {
+        return this[CONCERNS].get(Levels)['clear'](...args);
+    }
+}
+

See Manual interaction and Conflict Resolution for additional details.

If property or method already exists

When a property or method from a concern already exists in the target class' prototype chain¹, then NO Alias is defined. Said differently, the use() class decorator does NOT overwrite a target class' properties or methods.

class Label extends AbstractConcern {
+    get name() { /* ...not shown.. */ }
+    set name(v) { /* ...not shown.. */ }
+}
+
+@use(Label) // Label's "name" property is NOT aliased
+class Battery {
+
+    // Battery's get/set "name" remains untouched by concern
+    get name() { /* ...not shown.. */ }
+    set name(v) { /* ...not shown.. */ }
+}
+

¹: Inherited properties and methods are also respected.

See Conflict Resolution for additional details.

+ + + diff --git a/archive/current/packages/support/concerns/booting.html b/archive/current/packages/support/concerns/booting.html new file mode 100644 index 00000000..d85c17bf --- /dev/null +++ b/archive/current/packages/support/concerns/booting.html @@ -0,0 +1,87 @@ + + + + + + + + + Booting | Ion + + + + + +

Booting

By default, a concern class is ONLY instantiated when you interact with its properties or methods, which have been "aliased" into a target class (aka. lazy bootingopen in new window).

class ContactsApi extends AbstractConcern {
+    get users() { /* ...not shown here... */}
+}
+
+@use(ContactsApi) // Concern is NOT instantiated
+class UsersRegistry {}
+
+const users = (new UsersRegistry()).users; // Concern is instantiated
+

Manual Booting

You can use the bootConcerns() utility to manually boot concerns. It accepts the following arguments:

  • instance: object|Owner - The target class instance that uses the concerns.
  • ...concerns: ConcernConstructor[] - List of concern classes to instantiate (aka. boot).
import { use, bootConcerns } from "@aedart/support/concerns";
+
+@use(
+    ConcernA,
+    ConcernB,
+    ConcernC,
+)
+class Target {
+    constructor() {
+        bootConcerns(this, ConcernA, ConcernB);
+    }
+}
+
+const instance = new Target(); // ConcernA and ConcernB are instantiated
+

WARNING

If you attempt to boot a concern that has already been booted, a BootError will be thrown!

To determine if a concern has already been booted, use the concern container's hasBooted() method.

import {
+    getContainer,
+    bootConcerns
+} from "@aedart/support/concerns";
+
+class Record extends ApiService {
+    constructor() {
+        super();
+        
+        if (!getContainer(this).hasBooted(ApiConnection)) {
+            bootConcerns(this, ApiConnection);
+        }
+    }
+}
+

See Manual interaction for details.

Boot All Concerns

If you wish to boot all concerns, use the bootAllConcerns() utility.

import { use, bootAllConcerns } from "@aedart/support/concerns";
+
+@use(
+    ConcernA,
+    ConcernB,
+    ConcernC,
+)
+class Target {
+    constructor() {
+        bootAllConcerns(this);
+    }
+}
+
+const instance = new Target(); // All concerns are initialised
+
+ + + diff --git a/archive/current/packages/support/concerns/concernClass.html b/archive/current/packages/support/concerns/concernClass.html new file mode 100644 index 00000000..78682289 --- /dev/null +++ b/archive/current/packages/support/concerns/concernClass.html @@ -0,0 +1,111 @@ + + + + + + + + + Concern Class | Ion + + + + + +

Concern Class

This chapter shows how to create a new concern class.

Inherit from AbstractConcern

To create a new concern class, you can inherit from the AbstractConcern class.

import { AbstractConcern } from "@aedart/support/concerns";
+
+class MyConcern extends AbstractConcern {
+    
+    get message() { /* ...not shown */ }
+    set message(message) { /* ...not shown */ }
+    
+    foo() { /* ...not shown */ }
+    
+    [MY_SYMBOL]() { /* ...not shown */ }
+}
+

By default, all the public properties and methods (all property keys) are made available for "aliasing" into a target class. To configure which members should be made available for aliasing, see Customise "alias" members.

Private Members

Note

Private methods and properties are NEVER "aliased" into a target class.

Static Members

Note

Static methods and properties are NOT "aliased" into target class.

At the moment, such a feature is not supported by the concerns' mechanism.This may become available in the future, but presently you SHOULD NOT rely on static members becoming available for aliasing.

Transpilers

Caution

Some transpilers, like Babelopen in new window and TypeScriptopen in new window, automatically move property declarations into the class' constructor. For instance:

class A {
+    foo = 'bar';
+}
+

becomes like the following, after it has been transpiled:

class A {
+    constructor() {
+        this.foo = 'bar';
+    }
+}
+

When this happens, properties cannot be "aliased". The concern mechanisms relies on the class' prototype for reading what properties are available. To overcome such an issue, you can use gettersopen in new window and settersopen in new window instead.

class A {
+    #foo = 'bar';
+    
+    get foo() {
+        return this.#foo
+    }
+
+    set foo(v) {
+        this.#foo = v;
+    }
+}
+

Customise "alias" members

If you wish to customise what properties and methods should be available for aliasing when used by a target class, overwrite the static PROVIDES method.

import { AbstractConcern, PROVIDES } from "@aedart/support/concerns";
+
+class MyConcern extends AbstractConcern {
+    
+    get message() { /* ...not shown */ }
+    set message(message) { /* ...not shown */ }
+    foo() { /* ...not shown */ }
+    [MY_SYMBOL]() { /* ...not shown */ }
+    
+    static [PROVIDES]() {
+        // Make "message" and "foo" available for aliasing...
+        return [
+            'message',
+            'foo'
+        ];
+    }
+}
+

WARNING

Even if you do customise what properties and methods are available for aliasing, the returned property keys of the PROVIDES method can be overruled, via conflict resolution!

If you truly wish to prevent certain properties or methods from being aliased into a target class, then you should declare them as privateopen in new window.

Concern Owner instance

The concernOwner property gives you direct access to the target class instance, in your concern. This allows you to create interaction between the target instance and your concern, which can be usefully in any number of situations. For instance, you can use the concernOwner to create a fluent designopen in new window of your utilities.

class ConcernsPeople extends AbstractConcern {
+    with(value) {
+        // ...not shown here...
+
+        return this.concernOwner;
+    }
+}
+
+@use(ConcernsPeople)
+class Invitation {
+    invite() { /* ...not shown here... */ }
+}
+
+const party = new Invitation();
+party
+    .with('Anna')
+    .with('Anders')
+    .with('Ulla')
+    .with('Jimmy')
+    .invite();
+

Constructor

Should you require initialisation logic, then you can overwrite the constructor in your concern class. A concern's constructor is only given the target class instance as argument.

See booting for additional information.

class Recording extends AbstractConcern {
+    constructor(owner) {
+        super(owner);
+        
+        // ...perform your initialisation here...
+    }
+}
+
+ + + diff --git a/archive/current/packages/support/concerns/conflictResolution.html b/archive/current/packages/support/concerns/conflictResolution.html new file mode 100644 index 00000000..10add4cc --- /dev/null +++ b/archive/current/packages/support/concerns/conflictResolution.html @@ -0,0 +1,96 @@ + + + + + + + + + Conflict Resolution | Ion + + + + + +

Conflict Resolution

Naming Conflicts

A concern class may ONLY occur once in a target class' prototype chain. This is a core feature of the concerns mechanism and cannot be circumvented. However, sometimes you may find yourself in situations where different injected concern classes define the same property or method name. When this happens an AliasConflictError is thrown.

class Label extends AbstractConcern {
+    get name() { /* ...not shown.. */ }
+    set name(v) { /* ...not shown.. */ }
+}
+
+class Category extends AbstractConcern {
+    get name() { /* ...not shown.. */ }
+    set name(v) { /* ...not shown.. */ }
+}
+
+@use(
+    Label,
+    Category // AliasConflictError: Alias "name" for property ...
+)
+class Battery {}
+

Resolve Naming Conflicts

To resolve the previous shown naming conflict, you can specify custom "aliases" when injecting a concern class, via an injection configuration object.

// ... Label and Category concerns not shown ...
+
+@use(
+    Label,
+    {
+        concern: Category,
+        aliases: {
+            'name': 'category' // Alias Category's "name" property as "category"
+        }
+    }
+)
+class Battery {}
+
+const instance = new Battery();
+instance.name = 'AAA';
+instance.category = 'Rechargeable';
+

The aliases option is key-value record, where;

  • key = property key in the concern class.
  • value = property key (alias) to define in the target class.

Prevent Aliases

To prevent a concern class from defining any aliases inside a target class, set the allowAliases option to false.

import { getConcernsContainer } from "@aedart/support/concerns";
+
+@use(
+    Label,
+    {
+        concern: Category,
+        allowAliases: false // Category's "name" is NOT aliased in target
+    }
+)
+class Battery {}
+
+const instance = new Battery();
+instance.name = 'AA';
+
+// Interact with Category concern to set "name"
+getConcernsContainer(instance).get(Category).name = 'Rechargeable';
+

Shorthand Configuration

You can also use a shorthand version to specify a concern injection configuration, via an array. The first array value must always be the concern class that must be injected. The second value can either be an aliases object, or boolean value for setting the allowAliases option.

@use(
+    Label,
+    [Category, {
+        'name': 'category'
+    }]
+)
+class Battery {}
+

And to prevent a concern from defining aliases in a target:

@use(
+    Label,
+    [Category, false]
+)
+class Battery {}
+
+ + + diff --git a/archive/current/packages/support/concerns/edgeCases.html b/archive/current/packages/support/concerns/edgeCases.html new file mode 100644 index 00000000..49695b33 --- /dev/null +++ b/archive/current/packages/support/concerns/edgeCases.html @@ -0,0 +1,151 @@ + + + + + + + + + Edge Cases | Ion + + + + + +

Edge Cases

Getter & Setter declared in different concerns

It is not possible to define a property's getter and setter methods in separate concerns, and thereafter use them in a target class. Despite serving different purposes, the getter and setter share the same property name and are therefore treated as being one and the same property key. The following example will therefore always lead to an AliasConflictError being thrown.

import { AbstractConcern, use } from "@aedart/support/concerns";
+
+class A extends AbstractConcern {
+    get title() { /* ...not shown.. */ }
+}
+
+class B extends AbstractConcern {
+    set title(value) { /* ...not shown.. */ }
+}
+
+@use(
+    A,
+    B // AliasConflictError - "title" property from A!
+)
+class Person {}
+

You can resolve the above shown issue via a custom alias. But, it is advisable to design your concerns such that the offer appropriate getter and setter methods for a property, in one and the same concern - if you intend for such a property to be readable and writable.

Inheritance vs. Concern members

The concerns mechanism will never overwrite existing methods or properties inside a target class - not even when those methods or properties are inherited from a parent class.

import { AbstractConcern, use } from "@aedart/support/concerns";
+
+class Connection extends AbstractConcern {
+    driver() {
+        return 'special';
+    }
+}
+
+class Api {
+    driver() {
+        return 'default';
+    }
+}
+
+@user(Connection) // driver() is NOT aliased - method inherited from Api class!
+class SailBoat extends Api {}
+
+const instance = new SailBoat();
+instance.driver(); // default
+

The only way to resolve the above shown issue, is by making use of a custom alias and manually overwrite the inherited method. E.g.

import { AbstractConcern, use } from "@aedart/support/concerns";
+
+class Connection extends AbstractConcern {
+    driver() {
+        return 'special';
+    }
+}
+
+class Api {
+    driver() {
+        return 'default';
+    }
+}
+
+@user(
+    [Connection, {
+        'driver': 'specialDriver' // alias "driver" as "specialDriver"
+    }]
+)
+class SailBoat extends Api {
+    
+    // Overwrite inherited method
+    driver() {
+        // Invoke the "specialDriver"... 
+        return this.specialDriver();
+    }
+}
+
+const instance = new SailBoat();
+instance.driver(); // special
+

Concerns using other concerns

A concern can use other concerns classes. However, depending on your complexity, doing so may impact performance. Consider the following example:

import { AbstractConcern, use } from "@aedart/support/concerns";
+
+class Ping extends AbstractConcern {
+    ping() {
+        return 'ping';
+    }
+}
+
+@use(Ping)
+class Pong extends AbstractConcern {
+    pong() {
+        return 'pong';
+    }
+}
+
+@use(Pong)
+class Game {}
+
+const instance = new Game();
+
+instance.ping(); // ping
+instance.pong(); // pong
+

In the above shown example, whenever the ping() method is invoked, the call stack will be similar to the following:

Game (instance).ping() -> Pong (instance).ping() -> Ping (instance).ping()
+
+("->" represents concerns container instance)
+

In some isolated cases, this might be acceptable for you. Nevertheless, if your application makes heavy use of concerns using other concerns, then your application's overall performance could suffer. You should consider merging multiple concern classes into a single class, if it is reasonable and possible. Alternatively, you can also consider extending existing concern classes. For instance:

import { AbstractConcern, use } from "@aedart/support/concerns";
+
+class Ping extends AbstractConcern {
+    ping() {
+        return 'ping';
+    }
+}
+
+// Extend Ping concern...
+class Pong extends Ping {
+    pong() {
+        return 'pong';
+    }
+}
+
+@use(Pong)
+class Game {}
+
+const instance = new Game();
+
+instance.ping(); // ping
+instance.pong(); // pong
+

Now, whenever the ping() method is invoked, the call stack is slightly reduced:

Game (instance).ping() -> Pong (instance).ping()
+
+("->" represents concerns container instance)
+
+ + + diff --git a/archive/current/packages/support/concerns/hooks.html b/archive/current/packages/support/concerns/hooks.html new file mode 100644 index 00000000..50793a32 --- /dev/null +++ b/archive/current/packages/support/concerns/hooks.html @@ -0,0 +1,64 @@ + + + + + + + + + Hooks | Ion + + + + + +

Hooks

Concerns offer a few hook methods. These can be used to perform advanced setup or initialisation logic.

BEFORE Registration

To perform pre-registration logic, use the static BEFORE method in your concern class. This hook method is invoked before the concern container and aliases are defined in the target class.

The method accepts the following arguments:

  • target: UsesConcerns - the target class (class constructor!).
import { BEFORE } from "@aedart/contracts/support/concerns";
+import { AbstractConcern } from "@aedart/support/concerns";
+import { isSubclass } from '@aedart/support/reflections';
+
+import { JobHandler } from '@acme/jobs';
+
+class RecordsJobs extends AbstractConcern {
+    
+    static [BEFORE](target) {
+        // E.g. prevent this concern from being used by all kinds of targets...
+        if (!isSubclass(target, JobHandler)) {
+            throw new TypeError('RecordsJobs can only be used by JobHandler');
+        }
+    }
+}
+

AFTER Registration

To perform post-registration logic, use the static AFTER method in your concern class. This method is invoked after the concern container and aliases have been defined in target's prototype.

The method accepts the following arguments:

  • target: UsesConcerns - the target class (class constructor!).
import { AFTER } from "@aedart/contracts/support/concerns";
+import { AbstractConcern } from "@aedart/support/concerns";
+
+import { ApiConnection } from '@acme/api';
+
+class RecordsJobs extends AbstractConcern {
+    
+    static [AFTER](target) {
+        // E.g. init or setup static resources...
+        ApiConnection.init();
+    }
+}
+
+ + + diff --git a/archive/current/packages/support/concerns/index.html b/archive/current/packages/support/concerns/index.html new file mode 100644 index 00000000..0471ad10 --- /dev/null +++ b/archive/current/packages/support/concerns/index.html @@ -0,0 +1,61 @@ + + + + + + + + + About Concerns | Ion + + + + + +

About Concerns Available since v0.9

Inspired by PHP's Traitsopen in new window, traditional mixinsopen in new window, and a few concepts from dependency injectionopen in new window, the @aedart/support/concerns submodule offers an alternative approach to reducing some of the limitations of single inheritanceopen in new window.

In this context, a "concern" is a class that can be injected into a target class, by means of the use() class decorator. The public properties and methods of the concern class are then "aliased" into the target class' prototype. In other words, "proxy" properties and methods are defined in the target class. They forward any interaction to the original properties and methods in the concern class instance.

Example

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+// A concern class...
+class ConsolePrinter extends AbstractConcern {
+    print(message) {
+        console.log(message);
+    }
+}
+
+// Taget class that uses a concern...
+@use(ConsolePrinter)
+class Person {
+    
+    sayHi(name) {
+        // Call method in concern
+        this.print(`Hi ${name}`);
+    }
+}
+
+// Later in your application...
+const person = new Person();
+person.sayHi('Atrid'); // Hi Astrid
+
+person.print('Ho ho ho...'); // Ho ho ho...
+

See also "Real" mixins as an alternative.

+ + + diff --git a/archive/current/packages/support/concerns/jsdoc.html b/archive/current/packages/support/concerns/jsdoc.html new file mode 100644 index 00000000..acab5a68 --- /dev/null +++ b/archive/current/packages/support/concerns/jsdoc.html @@ -0,0 +1,189 @@ + + + + + + + + + JSDoc | Ion + + + + + +

JSDoc

Most modern IDEs support JSDocopen in new window. They can improve your coding experience via code suggestions, highlights and other features. In this chapter, you will find a few ways that you can document your concerns and target class, via JSDoc.

Help wanted!

If you are an expert in JSDoc, then you are most welcome to help improve this chapter. Please see the contribution guide for details on how you can contribute.

@mixin and @mixes

Possibly the easiest way to document your concern and target class that uses the concern, is via the @mixin and @mixesopen in new window tags.

Downside: Documenting "aliases" (known as virtual fields in the context of JSDoc) is not possible via @mixin and @mixes. You can describe an alias via @functionopen in new window or @memberopen in new window tag.

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+/**
+ * @mixin
+ * @extends AbstractConcern
+ */
+class Shield extends AbstractConcern {
+
+    /**
+     * Returns the armor level
+     *
+     * @returns {number}
+     */
+    get armor() {
+        return 8;
+    }
+
+    /**
+     * Throw shield towards a target
+     *
+     * @param {object} target
+     *
+     * @returns {number} Damage given to target
+     */
+    throw(target) {
+        // target ignored here...
+        return 3;
+    }
+}
+
+/**
+ * @mixes Shield
+ */
+@use([Shield, {
+    'throw': 'fight'
+}])
+class Monster {
+
+    /**
+     * Alias for {@link Shield#throw}
+     *
+     * @function fight
+     * @param {object} target The target to throw at...
+     * @return {number} Damage taken by target
+     * @instance
+     * @memberof Monster
+     */
+
+    /**
+     * Do stuff...
+     */
+    do() {
+        this.fight({});
+    }
+}
+

@property

Another possibility is to describe properties and methods available in a target, via the @propertyopen in new window tag. Doing so allows you to immediately describe the "alias" name.

Downside: Properties and methods described via @property are listed as "static" on the target class. Also, it is not possible to reuse existing JSDoc from your concern.

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+class Armor extends AbstractConcern {
+
+    /**
+     * Returns the armor level
+     *
+     * @returns {number}
+     */
+    get level() {
+        return 8;
+    }
+}
+
+/**
+ * @property {number} armor Returns the armor level
+ */
+@use([Armor, {
+    'level': 'armor'
+}])
+class Hero {}
+

@borrows

The @borrowsopen in new window tag does also offer a possible way to describe aliases.

Downside: You are still required to use @memberopen in new window tag to describe the actual aliases inside your target class.

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+/**
+ * @extends AbstractConcern
+ */
+class Spell extends AbstractConcern {
+    
+    /**
+     * Cast the spell
+     *
+     * @name cast
+     * 
+     * @returns {number} Damage done
+     */
+    cast() {
+        return 7;
+    }
+}
+
+/**
+ * @borrows Spell#cast as damage
+ */
+@use([Spell, {
+    'cast': 'damage'
+}])
+class Mage {
+    
+    /**
+     * @function damage
+     * @return {number}
+     * @instance
+     * @memberof Npc
+     */
+}
+

@member

Lastly, you can use @memberopen in new window to describe all aliases directly, without relying on the @borrowsopen in new window tag.

Downside: This approach can be very cumbersome. Also, reuse of JSDoc is not possible.

import { use, AbstractConcern } from "@aedart/support/concerns";
+
+class Sword extends AbstractConcern {
+
+    /**
+     * Returns amount of damage
+     *
+     * @returns {number}
+     */
+    get slash() {
+        return 3;
+    }
+
+    /**
+     * Returns the sword type
+     *
+     * @name type
+     * @return {string}
+     */
+    get type() {
+        return 'unique';
+    }
+}
+
+
+@use([Sword, {
+    'slash': 'damage'
+}])
+class Enemy {
+
+    /**
+     * @public
+     * @member {number} damage  Alias for {@link Sword#slash}
+     * @memberof Enemy
+     */
+
+    /**
+     * @public
+     * @member {string} type Alias for {@link Sword#type}
+     * @memberof Enemy
+     */
+}
+
+ + + diff --git a/archive/current/packages/support/concerns/prerequisites.html b/archive/current/packages/support/concerns/prerequisites.html new file mode 100644 index 00000000..3aac87b9 --- /dev/null +++ b/archive/current/packages/support/concerns/prerequisites.html @@ -0,0 +1,37 @@ + + + + + + + + + Prerequisites | Ion + + + + + +

Prerequisites

At the time of this writing, decoratorsopen in new window are still in a proposal phase. To use concerns, you must either use @babel/plugin-proposal-decoratorsopen in new window, or use TypeScript 5 decoratorsopen in new window.

+ + + diff --git a/archive/current/packages/support/concerns/usage.html b/archive/current/packages/support/concerns/usage.html new file mode 100644 index 00000000..fd569462 --- /dev/null +++ b/archive/current/packages/support/concerns/usage.html @@ -0,0 +1,133 @@ + + + + + + + + + Using Concerns | Ion + + + + + +

How to use Concerns

Using Concerns

The class decoratoropen in new window use() is used to inject one or more concern classes into a target class.

import { use } from "@aedart/support/concerns";
+
+@use(
+    ApiConnection,
+    Serialization,
+    Collections
+)
+class Flight {}
+

When concern classes are injected, the target class is transformed and all concerns are made available inside a private CONCERNS property. See Manual interaction and Aliases for additional details.

Inheritance

All concerns that are used by a parent class are automatically available (inherited), by child classes.

@use(
+    ApiConnection,
+    Serialization,
+    Collections
+)
+class ApiService {}
+
+class Flight extends ApiService {} // Uses ApiConnection, Serialization, ...etc
+

WARNING

A concern class may ONLY occur once in a target class' prototype chain. An InjectionError is thrown, if this is violated!

@use(
+    ApiConnection,
+    Serialization,
+    Collections
+)
+class ApiService {}
+
+@use(Serialization) // InjectionError
+class Flight extends ApiService {}
+

See also Conflict Resolution for additional details.

Manual interaction

When concerns are injected into a target, they are defined inside a "Concerns Container", which is available in the target instance via the CONCERNS symbol. Should you require to perform more advanced interaction with a concern class instance, then you can obtain a concern instance via the container's get() method. It will automatically ensure to boot a concern, if not already booted.

import {
+    use,
+    CONCERNS,
+    AbstractConcern
+} from "@aedart/support/concerns";
+
+class Encryption extends AbstractConcern {
+    encrypt(value) { /* ...not shown... */ }
+}
+
+@use(Encryption)
+class CookieStore {
+    constructor() {
+        const container = this[CONCERNS];
+        const value = container.get(Encryption).encrypt('Lorum lipsum');
+        
+        // ...remaining not shown...
+    }
+}
+

You can achieve the same result by using the getContainer() utility method.

import { use, getContainer } from "@aedart/support/concerns";
+
+// ...Encryption concern not shown...
+
+@use(Encryption)
+class CookieStore {
+    constructor() {
+        const value = getContainer(this)
+            .get(Encryption)
+            .encrypt('Lorum lipsum');
+        
+        // ...remaining not shown...
+    }
+}
+
CONCERNS symbol, getContainer(), and getConcernsContainer()

There are 3 ways to obtain the concerns container instance:

A) CONCERNS symbol

Inside your target class, if you know that concerns are used (if target is a "concern owner"), then you can use the CONCERNS symbol to gain access to the container.

import { CONCERNS } from "@aedart/support/concerns";
+
+// Inside your target class...
+const container = this[CONCERNS];
+

B) getContainer()

getContainer() is essentially a just a wrapper for: return this[CONCERNS].

import { getContainer } from "@aedart/support/concerns";
+
+// Inside your target class...
+const container = getContainer(this);
+

C) getConcernsContainer()

The getConcernsContainer() achieves the same result as the previous shown methods. However, it does perform a check of the provided target instance, which ensures that it is a "concern owner". If the target does not pass this test, then a TypeError is thrown. This might can be useful in situations when you might now know if the target is a concern owner, e.g. when situated in a child class or outside a target class.

import { getConcernsContainer } from "@aedart/support/concerns";
+
+// Inside your target class...
+const container = getConcernsContainer(this);
+

Determine if target uses concerns

To determine if a target uses one or more concerns, use the usesConcerns() method. It accepts the following arguments:

  • instance: object|Owner - The target class instance.
  • ...concerns: ConcernConstructor[] - Concern classes to test for.
import {
+    use,
+    AbstractConcern,
+    usesConcerns
+} from "@aedart/support/concerns";
+
+class A extends AbstractConcern {}
+class B extends AbstractConcern {}
+class C extends AbstractConcern {}
+
+@use(
+    A,
+    B
+)
+class Game {}
+
+const instance = new Game();
+
+usesConcerns(instance, A); // true
+usesConcerns(instance, B); // true
+usesConcerns(instance, A, B); // true
+
+usesConcerns(instance, C); // false
+usesConcerns(instance, A, C); // false
+usesConcerns(instance, B, C); // false
+usesConcerns(instance, A, B, C); // false
+
+ + + diff --git a/archive/current/packages/support/exceptions/configureCustomError.html b/archive/current/packages/support/exceptions/configureCustomError.html new file mode 100644 index 00000000..605a8b91 --- /dev/null +++ b/archive/current/packages/support/exceptions/configureCustomError.html @@ -0,0 +1,46 @@ + + + + + + + + + Configure Custom Error | Ion + + + + + +

configureCustomError

Configures a custom error by automatically setting the error's name property to the class' constructor name.

Arguments

configureCustomError() accepts the following arguments:

  • error: Error - the custom error instance
  • captureStackTrace: boolean = false (optional) Captures and sets error's stack trace¹.

¹: See configureStackTrace() for details.

import { configureCustomError } from "@aedart/support/exceptions";
+
+class MyError extends Error {
+    constructor(message, options) {
+        super(message, options);
+
+        configureCustomError(this);
+    }
+}
+

See Mozilla's documentation on Custom Error Typesopen in new window for additional information.

+ + + diff --git a/archive/current/packages/support/exceptions/configureStackTrace.html b/archive/current/packages/support/exceptions/configureStackTrace.html new file mode 100644 index 00000000..ec22b13c --- /dev/null +++ b/archive/current/packages/support/exceptions/configureStackTrace.html @@ -0,0 +1,46 @@ + + + + + + + + + Configure Stack Trace | Ion + + + + + +

configureStackTrace

Captures a new stack trace and sets given Error's stackopen in new window property.

Arguments

The function accepts an Error as argument.

import { configureStackTrace } from "@aedart/support/exceptions";
+
+class MyError extends Error {
+    constructor(message, options) {
+        super(message, options);
+
+        configureStackTrace(this);
+    }
+}
+

WARNING

The stack is not yet an official featureopen in new window, even though it's supported by many major browsers and Node.js. If you are working with custom errors, you might not need to capture and set the stack property. Therefore, you should only use configureStackTrace() in situations when your JavaScript environment does not support stack traces in custom errors.

+ + + diff --git a/archive/current/packages/support/exceptions/customErrors.html b/archive/current/packages/support/exceptions/customErrors.html new file mode 100644 index 00000000..bc16a290 --- /dev/null +++ b/archive/current/packages/support/exceptions/customErrors.html @@ -0,0 +1,58 @@ + + + + + + + + + Custom Errors | Ion + + + + + +

Custom Errors

AbstractClassError

The AbstractClassError is intended to be thrown whenever an abstract class is attempted instantiated directly.

import { AbstractClassError } from "@aedart/support/exceptions";
+
+/**
+ * @abstract
+ */
+class MyAbstractClass {
+    constructor() {
+        if (new.target === MyAbstractClass) {
+            throw new AbstractClassError(MyAbstractClass);
+        }
+    }
+}
+
+const instance = new MyAbstractClass(); // AbstractClassError
+

LogicalError

To be thrown whenever there is an error in the programming logic.

Inspired by PHP's LogicExceptionopen in new window

import { LogicalError } from "@aedart/support/exceptions";
+
+function print(person) {
+    if (printer === undefined) {
+        throw new LogicalError('Printer is missing, unable to print people');
+    }
+}
+
+ + + diff --git a/archive/current/packages/support/exceptions/getErrorMessage.html b/archive/current/packages/support/exceptions/getErrorMessage.html new file mode 100644 index 00000000..41235272 --- /dev/null +++ b/archive/current/packages/support/exceptions/getErrorMessage.html @@ -0,0 +1,52 @@ + + + + + + + + + Get Error Message | Ion + + + + + +

getErrorMessage

Returns an Error's message, if an Erroropen in new window instance is provided. Otherwise, a default message is returned.

import { getErrorMessage } from "@aedart/support/exceptions";
+
+try {
+    throw new Error('Something went wrong!');
+} catch(e) {
+    const msg = getErrorMessage(e, 'unknown error'); // Something went wrong! 
+}
+
+// ---------------------------------------------------------------------------
+
+try {
+    throw 'Something went wrong!';
+} catch(e) {
+    const msg = getErrorMessage(e, 'unknown error'); // unknown error 
+}
+
+ + + diff --git a/archive/current/packages/support/exceptions/index.html b/archive/current/packages/support/exceptions/index.html new file mode 100644 index 00000000..9d39ac01 --- /dev/null +++ b/archive/current/packages/support/exceptions/index.html @@ -0,0 +1,37 @@ + + + + + + + + + About Exceptions | Ion + + + + + +

Exceptions Available since v0.9

@aedart/support/exceptions offers a few utilities for working with Custom Errorsopen in new window.

+ + + diff --git a/archive/current/packages/support/facades/index.html b/archive/current/packages/support/facades/index.html new file mode 100644 index 00000000..9c1c9202 --- /dev/null +++ b/archive/current/packages/support/facades/index.html @@ -0,0 +1,144 @@ + + + + + + + + + About Facades | Ion + + + + + +

Introduction Available since v0.11Browser

The @aedart/support/facades package is an adaptation of Laravel's Facadesopen in new window (originally licensed under MITopen in new window). In this context, a Facadeopen in new window acts as an interface (or gateway) to an underlying object instance, resolved from the Service Container.

import { Container } from "@aedart/support/facades";
+
+const service = Container.obtain().make('api_service');
+

Setup Facade's Service Container instance

Before you can make use of facades, you must ensure that the Facade abstraction has a service container instance set. This can be done via the static setContainer() method.

import { Container } from "@aedart/container";
+import { Facade } from "@aedart/support/facades";
+
+// Somewhere in your application's setup or boot logic...
+Facade.setContainer(Container.getInstance());
+

Consequently, if you need to unset the Service Container instance and make sure that the Facade abstraction is cleared of any previously resolved object instances, invoke the static destroy() method.

Facade.destroy();
+

Define a Facade

To define your own Facade, extend the abstract Facade class, and specify the target binding identifier.

import { Facade } from "@aedart/support/facades";
+
+export default class ApiFacade extends Facade
+{
+    static getIdentifier()
+    {
+        return 'api_client';
+    }
+}
+

If you are using TypeScript, then you can also specify the return type of the obtain() method, by declaring the underlying resolved object's type, for the internal type property (type property is not used for any other purpose).

import type { Identifier } from "@aedart/contracts/container";
+import { Facade } from "@aedart/support/facades";
+import type { AcmeApiClient } from "@acme/contracts/api";
+
+export default class ApiFacade extends Facade
+{
+    protected static type: AcmeApiClient;
+    
+    public static getIdentifier(): Identifier
+    {
+        return 'api_client';
+    }
+}
+

The obtain() method

The obtain() is used to obtain the Facade's underlying object instance. Typically, you do not need to do anything more than to implement the getIdentifier() method in your concrete facade class. But, in some situations you might need to resolve a binding differently. Or, perhaps perform some kind of additional post-resolve logic, in order to make easier / simpler to work with the resolved object.

export default class LimitedApiFacade extends Facade
+{
+    static getIdentifier()
+    {
+        return 'api_client';
+    }
+
+    /**
+     * @return {import('@acme/contracts/api').AcmeApiClient}
+     */
+    static obtain()
+    {
+        const client = this.resolve(this.getIdentifier());
+        client.error_response_thresshold = 3;
+        client.ttl = 350;
+        
+        return client;
+    }
+}
+
const promise = LimitedApiFacade.obtain().fetch('https://acme.com/api/users');
+

Testing

When you need to test components that rely on Facades, you can register a "spy" (mocked object), via the static method spy(). Consider, for instance, that you have a users repository component that relies on a custom Api facade.

import { ApiFacade } from "@acme/facades";
+
+class UsersRepository {
+    
+    fetch() {
+        return ApiFacade.obtain().fetch('https://acme.com/api/users');
+    }
+    
+    // ...remaining not shown...
+}
+

In your testing environment, you can specify a callback that can be used to create a fake object (mocked object) that must behave in a certain way, via the spy() method. The callback must return either of the following:

  • The Facade's underlying resolved object.
  • Or, a fake object that behaves as desired (in the context of your test).
ApiFacade.spy((container, identifier) => {
+    // ...mocking not shown ...
+
+    return myResolvedObject; // resolved or mocked object
+});
+

All subsequent calls to the facade's underlying object will be made to the registered "spy" object instead.

The following example uses Jasmineopen in new window as testing framework. However, the spy() method is not tied to any specific testing or object mocking framework. Feel free to use whatever testing tools or frameworks fits your purpose best.

import { ApiFacade } from "@acme/facades";
+import { UsersRepository } from "@app";
+
+// E.g. testing via Jasmine Framework...
+describe('@acme/api', () => {
+
+    // Test setup not shown in this example...
+    
+    afterEach(() => {
+        Facade.destroy();
+    });
+    
+    it('can obtain users', () => {
+
+        let mocked = null;
+        ApiFacade.spy((container, identifier) => {
+            const apiClient = container.get(identifier);
+
+            mocked = spyOn(apiClient, 'fetch')
+                .and
+                .returnValue([
+                    { id: 12, name: 'Jackie' },
+                    { id: 14, name: 'Lana' },
+                    // ...etc
+                ]);
+
+            // return the resolved api client...
+            return apiClient;
+        });
+
+        const repo = new UsersRepository();
+        const users = repo.fetch();
+        
+        expect(users)
+            .not
+            .toBeUndefined();
+
+        expect(mocked)
+            .toHaveBeenCalled();
+    });
+});
+

Onward

Please consider reading Laravel's "When to Utilize Facades"open in new window, to gain an idea of when using Facades can be good, and when not.

+ + + diff --git a/archive/current/packages/support/index.html b/archive/current/packages/support/index.html new file mode 100644 index 00000000..ea441f1b --- /dev/null +++ b/archive/current/packages/support/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Introduction | Ion + + + + + +

Introduction Available since v0.3Browser

The support package offers various utilities.

+ + + diff --git a/archive/current/packages/support/install.html b/archive/current/packages/support/install.html new file mode 100644 index 00000000..e7839164 --- /dev/null +++ b/archive/current/packages/support/install.html @@ -0,0 +1,40 @@ + + + + + + + + + How to install | Ion + + + + + +

How to install

npm

npm install --save-peer @aedart/support
+

yarn

yarn add --peer @aedart/support
+

pnpm

pnpm add --save-peer @aedart/support
+
+ + + diff --git a/archive/current/packages/support/meta/index.html b/archive/current/packages/support/meta/index.html new file mode 100644 index 00000000..ead4fd2d --- /dev/null +++ b/archive/current/packages/support/meta/index.html @@ -0,0 +1,43 @@ + + + + + + + + + About Meta | Ion + + + + + +

About Meta Available since v0.6

Provides a decorator that is able to associate metadata with a class, its methods and properties.

import { meta, getMeta } from '@aedart/support/meta';
+
+@meta('service_alias', 'locationSearcher')
+class Service {}
+
+getMeta(Service, 'service_alias'); // locationSearcher
+
+ + + diff --git a/archive/current/packages/support/meta/inheritance.html b/archive/current/packages/support/meta/inheritance.html new file mode 100644 index 00000000..1e37717d --- /dev/null +++ b/archive/current/packages/support/meta/inheritance.html @@ -0,0 +1,67 @@ + + + + + + + + + Inheritance | Ion + + + + + +

Inheritance

Metadata is automatically inherited by subclasses.

import { meta, getMeta } from '@aedart/support/meta';
+
+@meta('service_alias', 'locationSearcher')
+class Service {}
+
+class CitySearcher extends Service {}
+
+getMeta(CitySearcher, 'service_alias'); // locationSearcher
+

Overwrites

You can also overwrite the inherited metadata. The subclass that defines the metadata creates its own copy of the inherited metadata. The parent class' metadata remains untouched.

import { meta, getMeta } from '@aedart/support/meta';
+
+class Service {
+    
+    @meta('search.desc', 'Searches for countries')
+    search() {
+        // ...not shown...
+    }
+}
+
+class CitySearcher extends Service {
+
+    @meta('search.desc', 'Searches for cities')
+    search() {
+        // ...not shown...
+    }
+}
+
+const service = new CitySearcher();
+
+getMeta(CitySearcher, 'search.desc'); // Searches for cities
+getMeta(Service, 'search.desc'); // Searches for countries
+
+ + + diff --git a/archive/current/packages/support/meta/outsideChanges.html b/archive/current/packages/support/meta/outsideChanges.html new file mode 100644 index 00000000..4851dd9f --- /dev/null +++ b/archive/current/packages/support/meta/outsideChanges.html @@ -0,0 +1,48 @@ + + + + + + + + + Outside Changes | Ion + + + + + +

Changes outside the decorator

Whenever you read metadata, a copy is returned by the getMeta() method. This means that you can change the data, in your given context, but the original metadata remains the same.

import { meta, getMeta } from '@aedart/support/meta';
+
+@meta('description', { name: 'Search Service', alias: 'Location Sercher' })
+class Service {}
+
+// Obtain "copy" and change it...
+let desc = getMeta(Service, 'description');
+desc.name = 'Country Searcher';
+
+// Original remains unchanged
+getMeta(Service, 'description').name; // Search Service
+

Caution

Only the meta decorator is intended to alter existing metadata - even if the value is an object. Please be mindful of this behaviour, whenever you change retrieved metadata using the getMeta() and getAllMeta() methods.

+ + + diff --git a/archive/current/packages/support/meta/prerequisites.html b/archive/current/packages/support/meta/prerequisites.html new file mode 100644 index 00000000..b5f20fc0 --- /dev/null +++ b/archive/current/packages/support/meta/prerequisites.html @@ -0,0 +1,37 @@ + + + + + + + + + Prerequisites | Ion + + + + + +

Prerequisites

At the time of this writing, decoratorsopen in new window are still in a proposal phase. To use the meta decorator, you must either use @babel/plugin-proposal-decoratorsopen in new window, or use TypeScript 5 decoratorsopen in new window.

+ + + diff --git a/archive/current/packages/support/meta/setAndGet.html b/archive/current/packages/support/meta/setAndGet.html new file mode 100644 index 00000000..79d39d1a --- /dev/null +++ b/archive/current/packages/support/meta/setAndGet.html @@ -0,0 +1,93 @@ + + + + + + + + + Set & Get | Ion + + + + + +

Set and Get Metadata

Set Metadata

To define metadata on a class or its elements, use meta(). It accepts the following arguments:

To obtain metadata, use the getMeta() method. You can also use getAllMeta(), if you wish to obtain all available metadata for a target class.

import { meta } from '@aedart/support/meta';
+
+@meta('service_alias', 'locationSearcher')
+class Service
+{
+    @meta('name', 'Name of service') name;
+    
+    @meta('fetch.desc', 'Fetches resource via a gateway')
+    @meta('fetch.dependencies', [ 'my-gateway' ])
+    async fetch(gateway)
+    {
+        // ...implementation not shown...
+    }
+}
+

Get Metadata

Use getMeta() or getAllMeta() to retrieve metadata.

import { getMeta, getAllMeta } from '@aedart/support/meta';
+
+const service = new Service();
+
+const desc = getMeta(Service, 'fetch.desc');
+const dependencies = getMeta(Service, 'fetch.dependencies');
+
+// Or, obtain all metadata
+const allMeta = getAllMeta(Service);
+

Metadata Availability

Depending on the kind of element that is decorated, metadata might only become available for reading, after a new class instance has been instantiated. This is true for the following elements:

  • method
  • getter
  • setter
  • field
  • accessor

Static Elements

If an element is declared as staticopen in new window, then it's metadata becomes available as soon as the class has been defined.

Default Value

The getMeta() method also offers a defaultValue argument, which is returned, in case that a metadata value does not exist for a given identifier.

const description = getMeta(Service, 'fetch.desc', 'N/A');
+

Callback

If you need to create more advanced metadata, you can specify a callback as the first argument for the meta() decorator method. When using a callback you gain access to the target that is being decorated, as well as the decorator context. The callback MUST return an object that contains a key and a value property.

import { meta } from '@aedart/support/meta';
+
+class Service {
+
+    @meta((target, context) => {
+        return {
+            key: context.name,
+            value: '...'
+        }
+    })
+    delegateTo(gateway) {
+        // ...not shown...
+    }
+}
+

Although the above example is a bit cumbersome to read, it shows a simple way to defined metadata for a method, which utilises the decorator context. If you wish, you can use this approach to create your own specialised meta decorators. Doing so can also improve the readability of your class. Consider the following example:

import { meta } from '@aedart/support/meta';
+
+function delegateMeta() {
+    return meta((target, context) => {
+        return {
+            key: context.name,
+            value: '...'
+        }
+    });
+}
+
+class Service {
+
+    @delegateMeta()
+    delegateTo(gateway) {
+        // ...not shown...
+    }
+}
+
+ + + diff --git a/archive/current/packages/support/meta/supported.html b/archive/current/packages/support/meta/supported.html new file mode 100644 index 00000000..d7a71ae3 --- /dev/null +++ b/archive/current/packages/support/meta/supported.html @@ -0,0 +1,37 @@ + + + + + + + + + Supported Elements | Ion + + + + + +

Supported Elements

The meta decorator supports the following elements¹:

  • class
  • method
  • getter
  • setter
  • field
  • accessor

¹: An element is determined by the decorator's context.kindopen in new window property.

+ + + diff --git a/archive/current/packages/support/meta/targetMeta.html b/archive/current/packages/support/meta/targetMeta.html new file mode 100644 index 00000000..1f3d03db --- /dev/null +++ b/archive/current/packages/support/meta/targetMeta.html @@ -0,0 +1,149 @@ + + + + + + + + + Target Meta | Ion + + + + + +

Target Meta Available since v0.7

The targetMeta() decorator offers the ability to associate metadata directly with a class instance or class method reference. This can be useful in situations when you do not know the class that owns the metadata.

Behind the scene, targetMeta() uses the meta() decorator and stores a reference to the target that is decorated inside a WeakMapopen in new window.

Supported Elements

Unlike the meta() decorator, targetMeta() only supports the following elements:

  • class
  • method

Class Instance

The following shows how to define target meta for a class and retrieve it.

import { targetMeta, getTargetMeta } from '@aedart/support/meta';
+
+@targetMeta('description', { type: 'Search Service', alias: 'Location Sercher' })
+class LocationSearcherService {}
+
+const instance = new LocationSearcherService();
+
+// ...later in your application...
+getTargetMeta(instance, 'description')?.type; // Search Service
+

Method Reference

The following shows how to define target meta for a class method and retrieve it.

import { targetMeta, getTargetMeta } from '@aedart/support/meta';
+
+class LocationSearcherService {
+
+    @targetMeta('dependencies', [ 'httpClient' ])    
+    search(apiClient) {}
+}
+
+const instance = new LocationSearcherService();
+
+// ...later in your application...
+getTargetMeta(instance.search, 'dependencies'); // [ 'httpClient' ]
+

Inheritance

Target meta is automatically inherited by subclasses and can also be overwritten, similar to that of the meta() decorator.

Example: classes

import {targetMeta, getTargetMeta} from '@aedart/support/meta';
+
+@meta('service_alias', 'locationSearcher')
+class Service {}
+
+class CitySearcher extends Service {}
+
+const instance = new CitySearcher();
+
+// ...later in your application...
+getTargetMeta(instance, 'service_alias'); // locationSearcher
+

Example: methods

import {targetMeta, getTargetMeta} from '@aedart/support/meta';
+
+class Service {
+
+    @targetMeta('dependencies', [ 'countrySearchApiClient' ])
+    search(apiClient) {
+        // ...not shown...
+    }
+}
+
+class CountrySearcher extends Service {
+    // ... not method overwrite here...
+}
+
+class CitySearcher extends Service {
+
+    @targetMeta('dependencies', [ 'citySearchApiClient' ])
+    search(apiClient) {
+        // ...not shown...
+    }
+}
+
+const instanceA = new Service();
+const instanceB = new CountrySearcher();
+const instanceC = new CitySearcher();
+
+// ...later in your application...
+getTargetMeta(instanceA.search, 'dependencies'); // [ 'countrySearchApiClient' ]
+getTargetMeta(instanceB.search, 'dependencies'); // [ 'countrySearchApiClient' ]
+getTargetMeta(instanceC.search, 'dependencies'); // [ 'citySearchApiClient' ]
+

Static Methods

Inheritance for static methods works a bit differently. By default, any subclass will automatically inherit target metadata, even for static methods. However, if you overwrite the given static method, the metadata is lost.

Limitation

When a static method is overwritten, the parent's "target" metadata cannot be obtained due to a general limitation of the meta() decorator. The decorator has no late this binding available to the overwritten static method. This makes it impossible to associate the overwritten static method with metadata from the parent.

Example: inheritance for static methods

import {targetMeta, getTargetMeta} from '@aedart/support/meta';
+
+class Service {
+
+    @targetMeta('dependencies', [ 'xmlClient' ])
+    static search(client) {
+        // ...not shown...
+    }
+}
+
+class CountrySearcher extends Service {
+    // ... not method overwrite here...
+}
+
+class CitySearcher extends Service {
+    
+    // Overwite of static method - target meta is lost
+    static search(client) {}
+}
+
+// ...later in your application...
+getTargetMeta(CountrySearcher.search, 'dependencies'); // [ 'xmlClient' ]
+getTargetMeta(CitySearcher.search, 'dependencies'); // undefined
+

To overcome the above shown issue, you can use the inheritTargetMeta() decorator. It forces the static method to "copy" metadata from its parent, if available.

Example: force inheritance for static methods

import {
+    targetMeta,
+    getTargetMeta,
+    inheritTargetMeta
+} from '@aedart/support/meta';
+
+class Service {
+
+    @targetMeta('dependencies', [ 'xmlClient' ])
+    static search(client) {
+        // ...not shown...
+    }
+}
+
+class CountrySearcher extends Service {
+    // ... not method overwrite here...
+}
+
+class CitySearcher extends Service {
+    
+    @inheritTargetMeta()
+    static search(client) {}
+}
+
+// ...later in your application...
+getTargetMeta(CountrySearcher.search, 'dependencies'); // [ 'xmlClient' ]
+getTargetMeta(CitySearcher.search, 'dependencies'); // [ 'xmlClient' ]
+
+ + + diff --git a/archive/current/packages/support/meta/tc39.html b/archive/current/packages/support/meta/tc39.html new file mode 100644 index 00000000..f0a2efe7 --- /dev/null +++ b/archive/current/packages/support/meta/tc39.html @@ -0,0 +1,53 @@ + + + + + + + + + TC39 Proposal | Ion + + + + + +

TC39 Decorator Metadata

In relation to the Decorator Metadata proposalopen in new window, this decorator "mimics" a similar behaviour as the one defined by the proposal. Defining and retrieving metadata relies on a decorator's context.metadata object, and the Symbol.metadata property of a class.

Example:

import { meta, getMeta } from '@aedart/support/meta';
+
+@meta('service_alias', 'locationSearcher')
+class Service {}
+
+getMeta(Service, 'service_alias'); // locationSearcher
+

Roughly "desugars" to the following:

function meta(key, value) {
+    return (target, context) => {
+        context.metadata[key] = value;
+    }
+}
+
+@meta('service_alias', 'locationSearcher')
+class Service {}
+
+Service[Symbol.metadata].service_alias; // locationSearcher
+

(Above shown example is very simplified. Actual implementation is a bit more complex...)

At present, the internal mechanisms of the meta decorator must rely on a WeakMapopen in new window to associate metadata with the intended class. When the Decorator Metadata proposalopen in new window becomes more mature and transpilers offer the context.metadata object (or when browsers support it), then this decorator will be updated respectfully to use the available metadata object.

+ + + diff --git a/archive/current/packages/support/misc/descTag.html b/archive/current/packages/support/misc/descTag.html new file mode 100644 index 00000000..658747b4 --- /dev/null +++ b/archive/current/packages/support/misc/descTag.html @@ -0,0 +1,45 @@ + + + + + + + + + Desc. Tag | Ion + + + + + +

descTag

Return the default string description of an object.

import { descTag } from '@aedart/support/misc';
+
+descTag('foo'); // [object String]
+descTag(3); // [object Number]
+descTag([1, 2, 3]); // [object Array]
+descTag(true); // [object Boolean]
+// ... etc
+

The method is a shorthand for the following:

Object.prototype.toString.call(/* your value */);
+

See Mozilla's documentationopen in new window for additional information.

+ + + diff --git a/archive/current/packages/support/misc/empty.html b/archive/current/packages/support/misc/empty.html new file mode 100644 index 00000000..39d20c10 --- /dev/null +++ b/archive/current/packages/support/misc/empty.html @@ -0,0 +1,70 @@ + + + + + + + + + Empty | Ion + + + + + +

empty

Determine if value is empty.

See also isset().

import { empty } from '@aedart/support/misc';
+
+empty(''); // true
+empty(false); // true
+empty(0); // true
+empty(0n); // true
+empty(NaN); // true
+empty(null); // true
+empty(undefined); // true
+empty([]); // true
+empty({}); // true
+empty(new Set()); // true
+empty(new Map()); // true
+empty(new Int8Array()); // true
+
+empty(' '); // false
+empty('a'); // false
+empty(true); // false
+empty(1); // false
+empty(1n); // false
+empty(-1); // false
+empty(Infinity); // false
+empty([ 1 ]); // false
+empty({ name: 'Jimmy' }); // false
+empty((new Set()).add('a')); // false
+empty((new Map).set('foo', 'bar')); // false
+empty(new Date()); // false
+empty(function() {}); // false
+empty(Symbol('my-symbol')); // false
+
+let typedArr = new Int8Array(1);
+typedArr[0] = 1;
+empty(typedArr); // false
+

WeakMap and WeakSet

Caution

empty() is not able to determine if a WeakMapopen in new window or WeakSetopen in new window is empty.

+ + + diff --git a/archive/current/packages/support/misc/index.html b/archive/current/packages/support/misc/index.html new file mode 100644 index 00000000..ec7720bd --- /dev/null +++ b/archive/current/packages/support/misc/index.html @@ -0,0 +1,37 @@ + + + + + + + + + About Misc. | Ion + + + + + +

About Misc.

@aedart/support/misc offers miscellaneous utility functions.

+ + + diff --git a/archive/current/packages/support/misc/isKey.html b/archive/current/packages/support/misc/isKey.html new file mode 100644 index 00000000..d60ad706 --- /dev/null +++ b/archive/current/packages/support/misc/isKey.html @@ -0,0 +1,49 @@ + + + + + + + + + Is Key | Ion + + + + + +

isKey Available since v0.7

Determine if given is a valid key or property path identifier.

import { isKey } from '@aedart/support/misc';
+
+isKey('foo'); // true
+isKey(12); // true
+isKey(Symbol('my-symbol')); // true
+isKey([ 'a', 'b.c', Symbol('my-other-symbol')]); // true
+
+isKey(true); // false
+isKey([]); // false
+isKey(null); // false
+isKey(undefined); // false
+isKey(() => true); // false
+
+ + + diff --git a/archive/current/packages/support/misc/isPrimitive.html b/archive/current/packages/support/misc/isPrimitive.html new file mode 100644 index 00000000..96824f0e --- /dev/null +++ b/archive/current/packages/support/misc/isPrimitive.html @@ -0,0 +1,50 @@ + + + + + + + + + Is Primitive | Ion + + + + + +

isPrimitive

Determine if a value is a primitive valueopen in new window.

import { isPrimitive } from '@aedart/support/misc';
+
+isPrimitive(null); // true
+isPrimitive(undefined); // true
+isPrimitive(true); // true
+isPrimitive(1); // true
+isPrimitive(1n); // true
+isPrimitive('foo'); // true
+isPrimitive(Symbol('my-symbol')); // true
+
+isPrimitive([1, 2, 3]); // false
+isPrimitive({ name: 'Rian' }); // false
+isPrimitive(function() {}); // false
+
+ + + diff --git a/archive/current/packages/support/misc/isPropertyKey.html b/archive/current/packages/support/misc/isPropertyKey.html new file mode 100644 index 00000000..d9c2f385 --- /dev/null +++ b/archive/current/packages/support/misc/isPropertyKey.html @@ -0,0 +1,48 @@ + + + + + + + + + Is Property Key | Ion + + + + + +

isPropertyKey Available since v0.7

Determine if a key a valid property key name (string, number, or symbol).

import { isPropertyKey } from '@aedart/support/misc';
+
+isPropertyKey('foo'); // true
+isPropertyKey(12); // true
+isPropertyKey(Symbol('my-symbol')); // true
+
+isPropertyKey(true); // false
+isPropertyKey(['a', 'b', 'c']); // false
+isPropertyKey(null); // false
+isPropertyKey(undefined); // false
+isPropertyKey(() => true); // false
+
+ + + diff --git a/archive/current/packages/support/misc/isset.html b/archive/current/packages/support/misc/isset.html new file mode 100644 index 00000000..f0bdf188 --- /dev/null +++ b/archive/current/packages/support/misc/isset.html @@ -0,0 +1,55 @@ + + + + + + + + + Isset | Ion + + + + + +

isset

Determine if value is different from undefined and null.

See also empty().

import { isset } from '@aedart/support/misc';
+
+isset('foo'); // true
+isset(''); // true
+isset(true); // true
+isset(false); // true
+isset(1234); // true
+isset(1.234); // true
+isset([]); // true
+isset({}); // true
+isset(() => true); // true
+
+isset(undefined); // false
+isset(null); // false
+

Multiple values

You can also determine if multiple values differ from undefined and null.

Note: All given values must differ from undefined and null, before method returns true.

isset('foo', { name: 'Jane' }, [ 1, 2, 3 ]); // true
+
+isset('foo', null, [ 1, 2, 3 ]); // false
+isset('foo', { name: 'Jane' }, undefined); // false
+
+ + + diff --git a/archive/current/packages/support/misc/mergeKeys.html b/archive/current/packages/support/misc/mergeKeys.html new file mode 100644 index 00000000..4b4dab94 --- /dev/null +++ b/archive/current/packages/support/misc/mergeKeys.html @@ -0,0 +1,42 @@ + + + + + + + + + Merge Keys | Ion + + + + + +

mergeKeys Available since v0.7

The mergeKeys() method is able to merge two or more keys into a single key (see isKey()).

import { mergeKeys } from "@aedart/support/misc";
+
+const key = mergeKeys(Symbol('my-symbol'), [ 'b', 'c.d' ], 23);
+
+console.log(key); // [ Symbol('my-symbol'), 'b', 'c.d', 23 ];
+
+ + + diff --git a/archive/current/packages/support/misc/toWeakRef.html b/archive/current/packages/support/misc/toWeakRef.html new file mode 100644 index 00000000..14f26bab --- /dev/null +++ b/archive/current/packages/support/misc/toWeakRef.html @@ -0,0 +1,46 @@ + + + + + + + + + To Weak Ref. | Ion + + + + + +

toWeakRef Available since v0.7

Wraps a target object into a WeakRefopen in new window, if not already instance of a weak reference.

import { toWeakRef } from "@aedart/support/misc";
+
+const person = { name: 'Sine' };
+
+const a = toWeakRef(person); // new WeakRef of "person"
+const b = toWeakRef(a); // same WeakRef instance as "a"
+
+toWeakRef(null); // undefined
+toWeakRef(undefined); // undefined
+
+ + + diff --git a/archive/current/packages/support/mixins/apply.html b/archive/current/packages/support/mixins/apply.html new file mode 100644 index 00000000..c8767463 --- /dev/null +++ b/archive/current/packages/support/mixins/apply.html @@ -0,0 +1,66 @@ + + + + + + + + + Apply Mixins | Ion + + + + + +

Applying Mixins

To apply one or more mixins, use the mix() function and call width() with the mixins you wish to apply to a superclass.

import { mix } from "@aedart/support/mixins";
+import {
+    RectangleMixin,
+    DescMixin
+} from "@acme/mixins";
+
+class Box extends mix().with(
+    RectangleMixin,
+    DescMixin
+) {
+    // ...remaining not shown...
+}
+

Extending Superclass

To extend a superclass and apply mixins onto it, pass the superclass as argument for the mix() function.

class Shape {
+    // ...not shown...
+}
+
+class Box extends mix(Shape).with(
+    RectangleMixin,
+    DescMixin
+) {
+    // ...remaining not shown...
+}
+

Note

By default, if you do not provide mix() with a superclass, an empty class is automatically created. It is the equivalent of the following:

class Box extends mix(class {}).with(
+    MyMixinA,
+    MyMixinB,
+    MyMixinC,
+) {
+    // ...
+}
+
+ + + diff --git a/archive/current/packages/support/mixins/index.html b/archive/current/packages/support/mixins/index.html new file mode 100644 index 00000000..6c4ced89 --- /dev/null +++ b/archive/current/packages/support/mixins/index.html @@ -0,0 +1,65 @@ + + + + + + + + + About Mixins | Ion + + + + + +

Mixins Available since v0.8

@aedart/support/mixins offers an adaptation of Justin Fagnani'sopen in new windowmixwith.jsopen in new window package (originally licensed under Apache License 2.0open in new window).

import { mix, Mixin } from "@aedart/support/mixins";
+
+// Define mixin
+const NameMixin = Mixin((superclass) => class extends superclass {
+
+    #name;
+    
+    set name(value) {
+        this.#name = value;
+    }
+    
+    get name() {
+        return this.#name;
+    }
+});
+
+// Apply mixin...
+class Item extends mix().with(
+    NameMixin
+) {
+    // ...not shown...    
+}
+
+// ...Later in your application
+const item = new Item();
+item.name = 'My Item';
+
+console.log(item.name); // My Item
+

See also Concerns as an alternative.

+ + + diff --git a/archive/current/packages/support/mixins/inheritance.html b/archive/current/packages/support/mixins/inheritance.html new file mode 100644 index 00000000..a547d6e6 --- /dev/null +++ b/archive/current/packages/support/mixins/inheritance.html @@ -0,0 +1,88 @@ + + + + + + + + + Inheritance | Ion + + + + + +

How inheritance works

To gain an overview of how inheritance works when applying mixins onto a superclass, consider the following example:

const MyMixin = Mixin((superclass) => class extends superclass {
+    constructor(...args) {
+        super(...args); // Invokes A's constructor
+    }
+    
+    // Overwrites A's foo() method
+    foo() {
+        return 'zam';
+    }
+
+    // Overwrites A's bar() method
+    bar() {
+        return super.bar(); // Invoke A's bar() method
+    }
+});
+
+// -------------------------------------------------------------------- //
+
+class A {
+    foo() {
+        return 'foo';
+    }
+    
+    bar() {
+        return 'bar';
+    }
+}
+
+// -------------------------------------------------------------------- //
+
+class B extends mix(A).with(
+    MyMixin
+) {
+    constructor(...args) {
+        super(...args); // Invokes MyMixin's constructor
+    }
+
+    // Overwrite MyMixin's foo()
+    foo() {
+        const msg = super.foo(); // Invoke MyMixin's bar() method
+
+        return `<${msg}>`;
+    }
+}
+
+// -------------------------------------------------------------------- //
+
+const instance = new B();
+
+console.log(instance.foo()); // <zam>
+console.log(instance.bar()); // bar
+
+ + + diff --git a/archive/current/packages/support/mixins/instanceof.html b/archive/current/packages/support/mixins/instanceof.html new file mode 100644 index 00000000..a1a807cf --- /dev/null +++ b/archive/current/packages/support/mixins/instanceof.html @@ -0,0 +1,64 @@ + + + + + + + + + Instanceof | Ion + + + + + +

instanceof Operator

When you defined your mixins using the Mixin() decorator function, then it will support instanceof checks. Consider the following example:

// A regular mixin without "Mixin" decorator 
+const MixinA = (superclass) => class extends superclas {
+    // ...not shown...
+};
+
+// Mixin with "Mixin" decorator
+const MixinB = Mixin((superclass) => class extends superclass {
+    // ...not shown...
+});
+
+// -------------------------------------------------------------------- //
+
+class A {}
+
+class B extends mix(A).with(
+    MixinA,
+    MixinB
+) {}
+
+// -------------------------------------------------------------------- //
+
+const instance = new B();
+
+console.log(instance instanceof A); // true
+console.log(instance instanceof B); // true
+console.log(instance instanceof MixinA); // false
+console.log(instance instanceof MixinB); // true
+
+ + + diff --git a/archive/current/packages/support/mixins/newMixin.html b/archive/current/packages/support/mixins/newMixin.html new file mode 100644 index 00000000..7395e394 --- /dev/null +++ b/archive/current/packages/support/mixins/newMixin.html @@ -0,0 +1,59 @@ + + + + + + + + + New Mixin | Ion + + + + + +

Define a new Mixin

You can use the Mixin decorator to define a new mixin. Amongst other things, the decorator will enable support for instanceofopen in new window checks. See instanceof Operator for additional information.

import { Mixin } from "@aedart/support/mixins";
+
+export const RectangleMixin = Mixin((superclass) => class extends superclass {
+    length = 0
+    width = 0;
+    
+    area() {
+        return this.length * this.width;
+    }
+});
+

Constructor

If you need to perform initialisation logic in your mixins, then you can do so by implementing a class constructoropen in new window. When doing so, it is important to invoke the parent constructor via super()open in new window and pass on eventual arguments.

import { Mixin } from "@aedart/support/mixins";
+
+export const RectangleMixin = Mixin((superclass) => class extends superclass {
+    
+    constructor(...args) {
+        super(...args); // Invoke parent constructor and pass on arugments!
+        
+        // Perform your initialisaiton logic...
+    }
+    
+    // ...remaining not shown...
+});
+
+ + + diff --git a/archive/current/packages/support/mixins/onward.html b/archive/current/packages/support/mixins/onward.html new file mode 100644 index 00000000..3457da47 --- /dev/null +++ b/archive/current/packages/support/mixins/onward.html @@ -0,0 +1,37 @@ + + + + + + + + + Onward | Ion + + + + + +

Onward

For more information and examples, please read Mozilla's documentation about "Mix-ins"open in new window, and Justin Fagnani's blog posts:

+ + + diff --git a/archive/current/packages/support/objects/forget.html b/archive/current/packages/support/objects/forget.html new file mode 100644 index 00000000..18f62a14 --- /dev/null +++ b/archive/current/packages/support/objects/forget.html @@ -0,0 +1,51 @@ + + + + + + + + + Forget | Ion + + + + + +

forget

Remove (delete) a value in object at given path. Method is an alias for Lodash unsetopen in new window.

import { forget } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        c: {
+            age: 24
+        }
+    },
+};
+
+forget(target, 'b.c');
+
+console.log(target); // { a: 1234, b: {} }
+
+ + + diff --git a/archive/current/packages/support/objects/forgetAll.html b/archive/current/packages/support/objects/forgetAll.html new file mode 100644 index 00000000..1369e3d1 --- /dev/null +++ b/archive/current/packages/support/objects/forgetAll.html @@ -0,0 +1,51 @@ + + + + + + + + + Forget All | Ion + + + + + +

forgetAll

Remove (deletes) all values in object, at given paths.

import { forgetAll } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        c: {
+            age: 24
+        }
+    },
+};
+
+forgetAll(target, [ 'a', 'b.c.age' ]);
+
+console.log(target); // { b: { c: {} } }
+
+ + + diff --git a/archive/current/packages/support/objects/get.html b/archive/current/packages/support/objects/get.html new file mode 100644 index 00000000..4ee36600 --- /dev/null +++ b/archive/current/packages/support/objects/get.html @@ -0,0 +1,62 @@ + + + + + + + + + Get | Ion + + + + + +

get

Get value in object at given path. Method is an alias for Lodash getopen in new window.

See also set().

import { get } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        c: {
+            age: 24
+        }
+    },
+};
+
+let age = get(target, 'b.c.age');
+console.log(age); // 24
+

Default Value

You can also specify a default value to be returned, if the resolved value is undefined.

const target = {
+    a: 1234,
+    b: {
+        c: {
+            age: undefined
+        }
+    },
+};
+
+// Returns default value...
+let age = get(target, 'b.c.age', 20);
+console.log(age); // 20
+
+ + + diff --git a/archive/current/packages/support/objects/has.html b/archive/current/packages/support/objects/has.html new file mode 100644 index 00000000..167b4496 --- /dev/null +++ b/archive/current/packages/support/objects/has.html @@ -0,0 +1,50 @@ + + + + + + + + + Has | Ion + + + + + +

has

Determine if path is a property of given object. Method is an alias for Lodash hasInopen in new window.

See also isset().

import { has } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        c: {
+            age: 24
+        }
+    },
+};
+
+let result = has(target, 'b.c.age');
+console.log(result); // true
+
+ + + diff --git a/archive/current/packages/support/objects/hasAll.html b/archive/current/packages/support/objects/hasAll.html new file mode 100644 index 00000000..c3657225 --- /dev/null +++ b/archive/current/packages/support/objects/hasAll.html @@ -0,0 +1,66 @@ + + + + + + + + + Has All | Ion + + + + + +

hasAll

Determine if all paths are properties of given object.

See also isset().

import { hasAll } from "@aedart/support/objects";
+
+const mySymbol = Symbol('my-symbol');
+const target = {
+    a: 1234,
+    b: {
+        name: 'Sven',
+        c: {
+            age: 24,
+            [mySymbol]: true
+        }
+    },
+    d: [
+        { name: 'Jane'},
+        { name: 'Ashley'},
+    ],
+};
+
+const paths = [
+    'a',
+    'b.name',
+    'b.c.age',
+    ['b', 'c', mySymbol],
+    'd[0]',
+    'd[1].name',
+];
+
+let result = hasAll(target, paths);
+console.log(result); // true
+
+ + + diff --git a/archive/current/packages/support/objects/hasAny.html b/archive/current/packages/support/objects/hasAny.html new file mode 100644 index 00000000..75f5ea00 --- /dev/null +++ b/archive/current/packages/support/objects/hasAny.html @@ -0,0 +1,57 @@ + + + + + + + + + Has Any | Ion + + + + + +

hasAny

Determine if any paths are properties of given object.

import { hasAny } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        name: 'Sven',
+        c: {
+            age: 24
+        }
+    }
+};
+
+const paths = [
+    'z', // does not exist
+    'b.c.name', // does not exist
+    'b.c.age', // exist
+];
+
+let result = hasAny(target, paths);
+console.log(result); // true
+
+ + + diff --git a/archive/current/packages/support/objects/hasUniqueId.html b/archive/current/packages/support/objects/hasUniqueId.html new file mode 100644 index 00000000..e28800e3 --- /dev/null +++ b/archive/current/packages/support/objects/hasUniqueId.html @@ -0,0 +1,44 @@ + + + + + + + + + Has Unique ID | Ion + + + + + +

hasUniqueId Available since v0.6

Determine if an object has a unique id.

See uniqueId for additional details.

import { hasUniqueId } from "@aedart/support/objects";
+
+const target = {
+    name: 'Ursula'
+};
+
+console.log(hasUniqueId(target)); // false
+
+ + + diff --git a/archive/current/packages/support/objects/index.html b/archive/current/packages/support/objects/index.html new file mode 100644 index 00000000..deebbe5d --- /dev/null +++ b/archive/current/packages/support/objects/index.html @@ -0,0 +1,37 @@ + + + + + + + + + About Objects | Ion + + + + + +

About Objects

The @aedart/support/objects submodule offers object related utilities.

+ + + diff --git a/archive/current/packages/support/objects/isCloneable.html b/archive/current/packages/support/objects/isCloneable.html new file mode 100644 index 00000000..ccb26cfb --- /dev/null +++ b/archive/current/packages/support/objects/isCloneable.html @@ -0,0 +1,52 @@ + + + + + + + + + Is Cloneable | Ion + + + + + +

isCloneable Available since v0.9

Determines if given object is "cloneable". In this context "cloneable" means that an object implements the Cloneable interface, and offers a clone() method.

See @aedart/constracts/support/objects/Cloneable for details.

import { isCloneable } from "@aedart/support/objects";
+
+class A {};
+
+class B {
+    clone() {
+        return new this();
+    }
+}
+
+isCloneable(null); // false
+isCloneable([]); // false
+isCloneable({}); // false
+isCloneable(new A()); // false
+isCloneable(new B()); // true
+
+ + + diff --git a/archive/current/packages/support/objects/isPopulatable.html b/archive/current/packages/support/objects/isPopulatable.html new file mode 100644 index 00000000..962789a3 --- /dev/null +++ b/archive/current/packages/support/objects/isPopulatable.html @@ -0,0 +1,54 @@ + + + + + + + + + Is Populatable | Ion + + + + + +

isPopulatable Available since v0.9

Determines if given object is "populatable". Here, "populatable" means that an object implements the Populatable interface, and offers a populate() method.

See @aedart/constracts/support/objects/Populatable for details.

import { isPopulatable } from "@aedart/support/objects";
+
+class A {};
+
+class B {
+    populate(data) {
+        // ...not shown here...
+        
+        return this;
+    }
+}
+
+isPopulatable(null); // false
+isPopulatable([]); // false
+isPopulatable({}); // false
+isPopulatable(new A()); // false
+isPopulatable(new B()); // true
+
+ + + diff --git a/archive/current/packages/support/objects/isset.html b/archive/current/packages/support/objects/isset.html new file mode 100644 index 00000000..fc53c0b2 --- /dev/null +++ b/archive/current/packages/support/objects/isset.html @@ -0,0 +1,57 @@ + + + + + + + + + Isset | Ion + + + + + +

isset

Determine if paths are properties of given object and have values. This method differs from has(), in that it only returns true if properties' values are not undefined and not null.

See also misc. isset().

import { isset } from "@aedart/support/objects";
+
+const target = {
+    a: 1234,
+    b: {
+        name: undefined,
+        c: {
+            age: null
+        }
+    },
+};
+
+console.log(isset(target, 'a')); // true
+console.log(isset(target, 'b')); // true
+console.log(isset(target, 'b.name')); // false
+console.log(isset(target, 'b.c')); // true
+console.log(isset(target, 'b.c.age')); // false
+

You can also check if multiple paths are set.

console.log(isset(target, 'a', 'b')); // true
+console.log(isset(target, 'b.c', 'b.name')); // false
+console.log(isset(target, 'a', 'b.name', 'b.c.age')); // false
+
+ + + diff --git a/archive/current/packages/support/objects/merge.html b/archive/current/packages/support/objects/merge.html new file mode 100644 index 00000000..e522c50a --- /dev/null +++ b/archive/current/packages/support/objects/merge.html @@ -0,0 +1,233 @@ + + + + + + + + + Merge | Ion + + + + + +

merge Available since v0.9

Merges objects recursively into a new object. The properties and values of the source objects are copied, using deep copy techniquesopen in new window, when possible. Behind the scene, most value types are deep copied via structuredCloneopen in new window.

Example

import { merge } from "@aedart/support/objects";
+
+const person = {
+    'name': 'Alice',
+};
+
+const address = {
+    'address': {
+        'street': 'Somewhere Street 43'
+    },
+};
+
+const result = merge(person, address);
+
+console.log(result);
+

The above shown example results in a new object that looks like this:

{
+    "name": "Alice",
+    "address": {
+        "street": "Somewhere Street 43"
+    }
+}
+

Shallow Copied Types

Be default, the following value types are only shallow copiedopen in new window:

const a = {
+    'foo': null,
+    'bar': Symbol('my_symbol')
+};
+
+const b = {
+    'foo': function() {},
+};
+
+const result = merge(a, b);
+
+console.log(result.foo === b.foo); // true
+console.log(result.bar === a.bar); // true
+

Unsafe Keys

Property keys that are considered "unsafe", are never copied.

const a = {
+    'foo': 'bar'
+};
+const b = {
+    __proto__: { 'is_admin': true }
+}
+
+const result = merge(a, b);
+
+console.log(result); // { 'foo': 'bar' }
+console.log(Reflect.has(result, '__proto__')); // false
+

See isUnsafeKey() for additional details.

Merge Options

merge() supports a number of options. To specify thom, use the using() method.

merge()
+    .using({ /** option: value */ })
+    .of(objA, objB, objC);
+

Note

When invoking merge() without any arguments, an underlying objects Merger instance is returned.

depth

The depth option specifies the maximum merge depth.

  • Default maximum depth: 512

A MergeError is thrown, if the maximum depth is exceeded.

const a = {
+    'person': {
+        'name': 'Una'
+    }
+};
+
+const b = {
+    'person': {         // Level 0
+        'age': 24,      // Level 1
+        'address': {
+            'street': 'Somewhere Str. 654' // Level 2
+        }
+    }
+};
+
+const result = merge()
+    .using({
+        depth: 1
+    })
+    .of(a, b); // MergeError - Maximum merge depth (1) has been exceeded
+

skip

skip defines property keys that must not be merged.

It accepts an array of property keys or a callback.

List of property keys

const a = {
+    'person': {
+        'name': 'Ulrik'
+    }
+};
+
+const b = {
+    'person': {
+        'age': 36,
+        'address': {
+            'street': 'Nowhere Str. 12'
+        }
+    }
+};
+
+const result = merge()
+    .using({
+        skip: [ 'age' ]
+    })
+    .of(a, b);
+

The above example results in the following new object:

{
+    "person": {
+        "name": "Ulrik",
+        "address": {
+            "street": "Nowhere Str. 12"
+        }
+    }
+}
+

Note

When specifying a list of property keys, then the depth level in which the property key is found does not matter.

Skip Callback

You can use a callback, if you need to handle more advanced skip logic. The callback accepts the the following arguments:

  • key: PropertyKey - The current property that is being processed.
  • source: object - The source object that contains the key.
  • result: object - The resulting object (relative to the current depth that is being processed).

The callback MUST return a boolean value; true if given key must be skipped, false otherwise.

const a = {
+    'person': {
+        'name': 'Jane'
+    }
+};
+
+const b = {
+    'person': {
+        'name': 'James',
+        'address': {
+            'street': 'Sunview Palace 88'
+        }
+    }
+};
+
+const b = {
+    'person': {
+        'name': 'White',
+    }
+};
+
+const result = merge()
+    .using({
+        skip: (key, source, result) => {
+            return key === 'name'
+                && source[key] !== null
+                && !Reflect.has(result, key); 
+        }
+    })
+    .of(a, b);
+

The above example results in the following new object:

{
+    "person": {
+        "name": "Jane",
+        "address": {
+            "street": "Sunview Palace 88"
+        }
+    }
+}
+

overwriteWithUndefined

Determines if a property value should be overwritten with undefined.

Note: By default, all values are overwritten, even when they are undefined!

const a = { 'foo': true };
+const b = { 'foo': undefined };
+
+merge(a, b); // { 'foo': undefined }
+
+merge()
+    .using({ overwriteWithUndefined: false })
+    .of(a, b) // { 'foo': true }
+

useCloneable

Determines if an object's return value from a clone() method (see Cloneable) should be used for merging, rather than the source object itself.

Note: By default, if an object is cloneable, then its return value from clone() is used.

const a = { 'foo': { 'name': 'John Doe' } };
+const b = { 'foo': {
+     'name': 'Jane Doe',
+     clone() {
+         return {
+             'name': 'Rick Doe',
+             'age': 26
+         }
+     }
+} };
+
+merge(a, b); // { 'foo': { 'name': 'Rick Doe', 'age': 26 } }
+
+merge()
+    .using({ useCloneable: false })
+    .of(a, b); // { 'foo': { 'name': 'Jane Doe', clone() {...} } }
+

mergeArrays

When enabled, arrays, array-like, and concat spreadable objects are merged.

Note: By default, existing array values are NOT merged.

const a = { 'foo': [ 1, 2, 3 ] };
+const b = { 'foo': [ 4, 5, 6 ] };
+
+merge(a, b); // { 'foo': [ 4, 5, 6 ] }
+
+merge()
+    .using({ mergeArrays: true })
+    .of(a, b); // { 'foo': [ 1, 2, 3, 4, 5, 6 ] }
+

Behind the scene, the array merge utility is used for merging arrays.

arrayMergeOptions Available since v0.11

See Array Merge Options.

callback

In situations when you need more advanced merge logic, you may specify a custom callback.

The callback is responsible for returning the value to be merged, from a given source object.

const a = {
+    'a': 1
+};
+
+const b = {
+    'b': 2
+};
+
+const result = merge()
+    .using({
+        callback: (target, next, options) => {
+            const { key, value } = target;
+            if (key === 'b') {
+                return value + 1;
+            }
+
+            return value;
+        }
+    })
+    .of(a, b); // { 'a': 1, 'b': 3 }
+

If you do not have other merge options to specify, then you can simply provide a merge callback directly as argument for the using() method.

const result = merge()
+    .using((target, next, options) => {
+        const { key, value } = target;
+        if (key === 'b') {
+            return value + 1;
+        }
+
+        return value;
+    })
+    .of(a, b);
+

Arguments

The merge callback is given the following arguments:

  • target: MergeSourceInfo - The source target information (see below).
  • next: NextCallback - Callback to invoke for merging nested objects (next depth level).
  • options: Readonly<MergeOptions> - The merge options to be applied.

target: MergeSourceInfo

The source target information object contains the following properties:

  • result: object - The resulting object (relative to object depth)
  • key: PropertyKey - The target property key in source object to.
  • value: any - Value of the property in source object.
  • source: object - The source object that holds the property key and value.
  • sourceIndex: number - Source object's index (relative to object depth).
  • depth: number - The current recursion depth.

next: NextCallback

The callback to perform the merging of nested objects. It accepts the following arguments:

  • sources: object[] - The nested objects to be merged.
  • options: Readonly<MergeOptions> - The merge options to be applied.
  • nextDepth: number - The next recursion depth number.

Onward

For additional information about the merge callback, please review the source code of the defaultMergeCallback(), inside @aedart/support/objects.

+ + + diff --git a/archive/current/packages/support/objects/populate.html b/archive/current/packages/support/objects/populate.html new file mode 100644 index 00000000..d3ca958a --- /dev/null +++ b/archive/current/packages/support/objects/populate.html @@ -0,0 +1,99 @@ + + + + + + + + + Populate | Ion + + + + + +

populate Available since v0.9

The populate() allows you to populate a target object's properties with those from a source object. The values are shallow copiedopen in new window.

Arguments

populate() accepts the following arguments:

  • target: object

  • source: object

  • keys: PropertyKey | PropertyKey[] | SourceKeysCallback = '*' - The keys to select and copy from source object. If wildcard (*) given, then all properties from the source are selected. If a callback is given, then that callback must return key or keys to select from source.

  • safe: boolean = true - When true, properties must exist in target (must be defined in target), before they are shallow copied.

Caution

The target object is mutated by this function.

Note

"Unsafe" properties are disregarded, regardless of what keys are given.

import { populate } from "@aedart/support/objects";
+
+class Person {
+    name = null;
+    age = null;
+
+    constructor(data) {
+        populate(this, data);
+    }
+}
+
+const instance = new Person({ name: 'Janine', age: 36 });
+instance.name // Janine
+instance.age // 36
+

Limit keys to populate

By default, all keys (*) from the source object are attempted populated into the target. You can limit what properties can be populated, by specifying what keys are allowed to be populated.

class Person {
+    name = null;
+    age = null;
+    phone = null;
+
+    constructor(data) {
+        populate(this, data, [ 'name', 'age' ]);
+    }
+}
+
+const instance = new Person({ name: 'Janine', age: 36, phone: '555 555 555' });
+instance.name // Janine
+instance.age // 36
+instance.phone // null
+

Source Keys Callback

If you need a more advanced way to determine what keys to populate, then you can specify a callback as the keys argument.

populate(target, source, (source, target) => {
+    if (Reflect.has(source, 'phone') && Reflect.has(target, 'phone')) {
+        return [ 'name', 'age', 'phone' ];
+    }
+
+    return [ 'name', 'age' ];
+});
+

When keys do not exist

When the safe argument is set to true (default behavior), and a property key does not exist in the target object, then a TypeError is thrown.

class Person {
+    name = null;
+    age = null;
+
+    constructor(data) {
+        populate(this, data, [ 'name', 'age', 'phone' ]);
+    }
+}
+
+const instance = new Person({
+    name: 'Janine',
+    age: 36,
+    phone: '555 555 555'
+}); // TypeError - phone does not exist in target 
+

However, if a requested key does not exist in the source object, then a TypeError is thrown regardless of the safe argument value.

class Person {
+    name = null;
+    age = null;
+
+    constructor(data) {
+        populate(this, data, [ 'name', 'age', 'phone' ], false);
+    }
+}
+
+const instance = new Person({
+    name: 'Janine',
+    age: 36
+}); // TypeError - phone does not exist in source 
+
+ + + diff --git a/archive/current/packages/support/objects/set.html b/archive/current/packages/support/objects/set.html new file mode 100644 index 00000000..7e74ebf6 --- /dev/null +++ b/archive/current/packages/support/objects/set.html @@ -0,0 +1,44 @@ + + + + + + + + + Set | Ion + + + + + +

set

Set a value in object at given path. Method is an alias for Lodash setopen in new window.

import { set } from "@aedart/support/objects";
+
+const target = {};
+
+set(target, 'a.foo', 'bar');
+
+console.log(target); // { a: { foo: 'bar } }
+
+ + + diff --git a/archive/current/packages/support/objects/uniqueId.html b/archive/current/packages/support/objects/uniqueId.html new file mode 100644 index 00000000..8177589d --- /dev/null +++ b/archive/current/packages/support/objects/uniqueId.html @@ -0,0 +1,48 @@ + + + + + + + + + Unique ID | Ion + + + + + +

uniqueId Available since v0.6

The uniqueId() is able to return a "unique¹" reference identifier for any given object.

import { uniqueId, hasUniqueId } from "@aedart/support/objects";
+
+const target = {
+    name: 'Ursula'
+};
+
+console.log(uniqueId(target)); // 27
+
+// ...later in your application
+console.log(hasUniqueId(target)); // true
+console.log(uniqueId(target)); // 27
+

The source code is heavily inspired by Nicolas Gehlert'sopen in new window blog post: "Get object reference IDs in JavaScript/TypeScript" (September 28, 2022)open in new window

¹: In this context, the returned number is unique in the current session. The number will NOT be unique across multiple sessions, nor guarantee that an object will receive the exact same identifier as in a previous session!

+ + + diff --git a/archive/current/packages/support/reflections/assertHasPrototypeProperty.html b/archive/current/packages/support/reflections/assertHasPrototypeProperty.html new file mode 100644 index 00000000..ae1142fd --- /dev/null +++ b/archive/current/packages/support/reflections/assertHasPrototypeProperty.html @@ -0,0 +1,40 @@ + + + + + + + + + Assert Has Prototype Prop. | Ion + + + + + +

assertHasPrototypeProperty Available since v0.9

Assert that given target object has a prototype property defined. Throws a TypeError if target object does not have a prototype property

See hasPrototypeProperty for details.

import { assertHasPrototypeProperty } from '@aedart/support/reflections';
+
+assertHasPrototypeProperty({ __proto__: null }); // TypeError
+
+ + + diff --git a/archive/current/packages/support/reflections/classLooksLike.html b/archive/current/packages/support/reflections/classLooksLike.html new file mode 100644 index 00000000..808e863a --- /dev/null +++ b/archive/current/packages/support/reflections/classLooksLike.html @@ -0,0 +1,77 @@ + + + + + + + + + Class Looks Like | Ion + + + + + +

classLooksLike Available since v0.9

Determines if a target class "looks like" the provided class "blueprint".

Arguments

classLooksLike() accepts the following arguments:

  • target: object - the target class object.
  • blueprint: ClassBlueprint - a blueprint that defines the expected members of a class (see Class Blueprint for details.).
import { classLooksLike } from '@aedart/support/reflections';
+
+class A {}
+
+class B {
+    foo() {}
+}
+
+const blueprint = { members: [ 'foo' ] };
+
+classLooksLike(A, blueprint); // false
+classLooksLike(B, blueprint); // true
+

Class Blueprint

The class "blueprint" is an object that defines the expected members (property keys) of a target class. All defined members must exist in target class' prototype, before the classLooksLike() returns true.

You can specify either or both of the following properties in a class blueprint object:

  • members: PropertyKey[] - (optional) Properties or methods expected to exist in class' prototype.
  • staticMembers: PropertyKey[] - (optional) Properties or methods expected to exist in class as static members.

Note: If you do not specify either members or staticMembers, then a TypeError is thrown.

class A {
+    foo() {}
+
+    bar() {}
+}
+
+class B {
+    foo() {}
+    
+    static bar() {}
+}
+
+const blueprint = { members: [ 'foo' ], staticMembers: [ 'bar' ] };
+
+classLooksLike(A, blueprint); // false
+classLooksLike(B, blueprint); // true
+

Recursive

classLooksLike() traverses target class' prototype chain. This means that you can compare a subclass against a blueprint and inherited members will automatically be included in the check.

class A {
+    foo() {}
+}
+
+class B extends A {
+    bar() {}
+}
+
+const blueprint = { members: [ 'foo', 'bar' ]};
+
+classLooksLike(A, blueprint); // false
+classLooksLike(B, blueprint); // true
+
+ + + diff --git a/archive/current/packages/support/reflections/classOwnKeys.html b/archive/current/packages/support/reflections/classOwnKeys.html new file mode 100644 index 00000000..785ca340 --- /dev/null +++ b/archive/current/packages/support/reflections/classOwnKeys.html @@ -0,0 +1,49 @@ + + + + + + + + + Class Own Keys | Ion + + + + + +

classOwnKeys Available since v0.9

Returns property keys that are defined target class's prototype. It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class
  • recursive: boolean = false - (optional) If true, then target's prototype chain is traversed and all property keys are returned.
import { classOwnKeys } from '@aedart/support/reflections';
+
+class A {
+    foo() {}
+}
+
+class B extends A {
+    get bar() {}
+}
+
+classOwnKeys(B); // [ 'constructor', 'bar' ]
+classOwnKeys(B, true); // [ 'constructor', 'foo', 'bar' ]
+

Caution

classOwnKeys() throws TypeError if target does not have a prototype property.

Limitation

The classOwnKeys() function does not return static members of a target class.

+ + + diff --git a/archive/current/packages/support/reflections/getAllParentsOfClass.html b/archive/current/packages/support/reflections/getAllParentsOfClass.html new file mode 100644 index 00000000..852c2828 --- /dev/null +++ b/archive/current/packages/support/reflections/getAllParentsOfClass.html @@ -0,0 +1,47 @@ + + + + + + + + + Get All Parents Of Class | Ion + + + + + +

getAllParentsOfClass Available since v0.9

Returns all parents of target class. It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • includeTarget: boolean = false - (optional) If true, then given target is included in the output as the first element.
import { getAllParentsOfClass } from '@aedart/support/reflections';
+
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+getAllParentsOfClass(C); // [ B, A ]
+getAllParentsOfClass(C, true); // [ C, B, A ]
+

See also getParentOfClass().

+ + + diff --git a/archive/current/packages/support/reflections/getClassPropertyDescriptor.html b/archive/current/packages/support/reflections/getClassPropertyDescriptor.html new file mode 100644 index 00000000..6081c98f --- /dev/null +++ b/archive/current/packages/support/reflections/getClassPropertyDescriptor.html @@ -0,0 +1,51 @@ + + + + + + + + + Get Class Prop. Descriptor | Ion + + + + + +

getClassPropertyDescriptor Available since v0.9

Returns PropertyDescriptoropen in new window, from target's prototype that matches given property key.

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • key: PropertyKey - Name of the property.
import { getClassPropertyDescriptor } from '@aedart/support/reflections';
+
+class A {
+    set name(v) {}
+    get name() {}
+}
+
+getClassPropertyDescriptor(A, 'name'); // see "output"...
+

The above show example results in the given output:

const output = {
+    get: function () { /* ...Not shown... */ },
+    set: function (v) { /* ..Not shown... */ },
+    enumerable: false,
+    configurable: true
+};
+

Note

getClassPropertyDescriptor() returns undefined if requested key does not exist in class' prototype.

Caution

getClassPropertyDescriptor() throws TypeError if target does not have a prototype property.

+ + + diff --git a/archive/current/packages/support/reflections/getClassPropertyDescriptors.html b/archive/current/packages/support/reflections/getClassPropertyDescriptors.html new file mode 100644 index 00000000..75040e0b --- /dev/null +++ b/archive/current/packages/support/reflections/getClassPropertyDescriptors.html @@ -0,0 +1,63 @@ + + + + + + + + + Get Class Prop. Descriptors | Ion + + + + + +

getClassPropertyDescriptors Available since v0.9

Returns all property descriptorsopen in new window that are defined target's prototype.

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • recursive: boolean = false - (optional) If true, then target's parent prototypes are traversed. Descriptors are merged, such that the top-most class' descriptors are returned.
import { getClassPropertyDescriptors } from '@aedart/support/reflections';
+
+class A {
+    set name(v) {}
+    get name() {}
+    bar() {}
+    [MY_SYMBOL]() {}
+}
+
+getClassPropertyDescriptors(A); // { bar: {...}, name: {...}, [MY_SYMBOL]: {...} }
+

When recursive is set to true, then all property descriptors are returned from the target class' prototype chain.

import { getClassPropertyDescriptors } from '@aedart/support/reflections';
+
+class A {
+    set name(v) {}
+    get name() {}
+    foo() {}
+    [MY_SYMBOL]() {}
+}
+
+class B extends A {
+    set bar(v) {}
+    get bar() {}
+}
+
+getClassPropertyDescriptors(B, true);
+// { bar: {...}, foo: {...}, name: {...}, [MY_SYMBOL]: {...} }
+

Caution

getClassPropertyDescriptors() throws TypeError if target does not have a prototype property.

+ + + diff --git a/archive/current/packages/support/reflections/getConstructorName.html b/archive/current/packages/support/reflections/getConstructorName.html new file mode 100644 index 00000000..7cec10a7 --- /dev/null +++ b/archive/current/packages/support/reflections/getConstructorName.html @@ -0,0 +1,44 @@ + + + + + + + + + Get Constructor Name | Ion + + + + + +

getConstructorName Available since v0.9

Returns target class' constructor name, if available.

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class
  • defaultValue: string|null = null - (optional) A default string value to return if target has no constructor name.
import { getConstructorName } from '@aedart/support/reflections';
+
+class Box {}
+
+getConstructorName(Box); // Box
+getConstructorName(class {}); // null
+getConstructorName(class {}, 'MyBox'); // MyBox
+
+ + + diff --git a/archive/current/packages/support/reflections/getNameOrDesc.html b/archive/current/packages/support/reflections/getNameOrDesc.html new file mode 100644 index 00000000..9f0f63c1 --- /dev/null +++ b/archive/current/packages/support/reflections/getNameOrDesc.html @@ -0,0 +1,43 @@ + + + + + + + + + Get Name Or Desc. Tag | Ion + + + + + +

getNameOrDesc Available since v0.9

Returns target class' constructor name, or description tag if name is not available.

import { getNameOrDesc } from '@aedart/support/reflections';
+
+class ApiService {}
+
+getNameOrDesc(ApiService); // ApiService
+getNameOrDesc(class {});   // [object Function]
+
+ + + diff --git a/archive/current/packages/support/reflections/getParentOfClass.html b/archive/current/packages/support/reflections/getParentOfClass.html new file mode 100644 index 00000000..ddd86cfd --- /dev/null +++ b/archive/current/packages/support/reflections/getParentOfClass.html @@ -0,0 +1,48 @@ + + + + + + + + + Get Parent Of Class | Ion + + + + + +

getParentOfClass Available since v0.9

Returns the parent class of given target class, or null if class does not have a parent.

import { getParentOfClass } from '@aedart/support/reflections';
+
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+getParentOfClass(A); // null
+getParentOfClass(B); // A
+getParentOfClass(C); // B
+

See also getAllParentsOfClass().

+ + + diff --git a/archive/current/packages/support/reflections/hasAllMethods.html b/archive/current/packages/support/reflections/hasAllMethods.html new file mode 100644 index 00000000..56e2b4dd --- /dev/null +++ b/archive/current/packages/support/reflections/hasAllMethods.html @@ -0,0 +1,46 @@ + + + + + + + + + Has All Methods | Ion + + + + + +

hasAllMethods Available since v0.9

Determine if given target object contains all given methods.

It accepts the following arguments:

  • target: object - The target.
  • ...methods: PropertyKey[] - Names of the methods to check for.
import { hasAllMethods } from '@aedart/support/reflections';
+
+const a = {
+    foo: () => { /* ...not shown... */ },
+    bar: () => { /* ...not shown... */ },
+}
+
+hasAllMethods(a, 'foo', 'bar'); // true
+hasAllMethods(a, 'foo', 'bar', 'zar'); // false
+

See also hasMethod().

+ + + diff --git a/archive/current/packages/support/reflections/hasMethod.html b/archive/current/packages/support/reflections/hasMethod.html new file mode 100644 index 00000000..10ca00f6 --- /dev/null +++ b/archive/current/packages/support/reflections/hasMethod.html @@ -0,0 +1,47 @@ + + + + + + + + + Has Method | Ion + + + + + +

hasMethod Available since v0.9

Determine if given target object contains method.

It accepts the following arguments:

  • target: object - The target.
  • method: PropertyKey - Name of the method to check for.
import { hasMethod } from '@aedart/support/reflections';
+
+const a = {
+    foo: () => { /* ...not shown... */ },
+    bar: () => { /* ...not shown... */ },
+}
+
+hasMethod(a, 'foo'); // true
+hasMethod(a, 'bar'); // true
+hasMethod(a, 'zar'); // false
+

See also isMethod().

+ + + diff --git a/archive/current/packages/support/reflections/hasPrototypeProperty.html b/archive/current/packages/support/reflections/hasPrototypeProperty.html new file mode 100644 index 00000000..dc1cc928 --- /dev/null +++ b/archive/current/packages/support/reflections/hasPrototypeProperty.html @@ -0,0 +1,49 @@ + + + + + + + + + Has Prototype Property | Ion + + + + + +

hasPrototypeProperty Available since v0.9

Determines if object has a prototype property defined and that it is not null or undefined.

import { hasPrototypeProperty } from '@aedart/support/reflections';
+
+hasPrototypeProperty(null); // false
+hasPrototypeProperty(Object.create(null)); // false
+hasPrototypeProperty({ __proto__: undefined }); // false
+hasPrototypeProperty({ prototype: null }); // false
+hasPrototypeProperty(() => true); // false
+
+hasPrototypeProperty(Object.create({ prototype: {} })); // true
+hasPrototypeProperty({ __proto__: function() {} }); // true
+hasPrototypeProperty(function() {}); // true
+hasPrototypeProperty(class {}); // true
+
+ + + diff --git a/archive/current/packages/support/reflections/index.html b/archive/current/packages/support/reflections/index.html new file mode 100644 index 00000000..e3382966 --- /dev/null +++ b/archive/current/packages/support/reflections/index.html @@ -0,0 +1,37 @@ + + + + + + + + + About reflections | Ion + + + + + +

Reflections Available since v0.7

The @aedart/support/reflections submodule offers a few reflection related utilities.

+ + + diff --git a/archive/current/packages/support/reflections/isCallable.html b/archive/current/packages/support/reflections/isCallable.html new file mode 100644 index 00000000..f6f5629e --- /dev/null +++ b/archive/current/packages/support/reflections/isCallable.html @@ -0,0 +1,48 @@ + + + + + + + + + Is Callable | Ion + + + + + +

isCallable Available since v0.7

Determine if a value is "callable" - a function that is not a class constructor.

import { isCallable } from "@aedart/support/reflections";
+
+isCallable(null); // false
+isCallable({}); // false
+isCallable([]); // false
+isCallable(class {}); // false
+
+isCallable(function() {}); // true
+isCallable(() => {}); // true
+isCallable(Array); // true
+
+

Acknowledgement

The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the Function.isCallable / Function.isConstructoropen in new window proposal (License MIT).

See also isClassConstructor().

+ + + diff --git a/archive/current/packages/support/reflections/isClassConstructor.html b/archive/current/packages/support/reflections/isClassConstructor.html new file mode 100644 index 00000000..a1b49ef5 --- /dev/null +++ b/archive/current/packages/support/reflections/isClassConstructor.html @@ -0,0 +1,49 @@ + + + + + + + + + Is Class Constructor | Ion + + + + + +

isClassConstructor Available since v0.7

The isClassConstructor() is able to determine if a value is a class constructor.

Caution

isClassConstructor() will only be able to return true for classes that are defined using the class keyword. See ES6 classesopen in new window for additional information.

Built-in Classes

This util is NOT able to detect built-in classesopen in new window. Use isConstructor() if you wish to test for "constructable" functions / classes, including built-in classes.

import { isClassConstructor } from "@aedart/support/reflections";
+
+isClassConstructor(null); // false
+isClassConstructor({}); // false
+isClassConstructor([]); // false
+isClassConstructor(function() {}); // false
+isClassConstructor(() => {}); // false
+isClassConstructor(Array); // false
+
+class A {}
+isClassConstructor(A); // true
+isClassConstructor(class {}); // true
+

Acknowledgement

The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the Function.isCallable / Function.isConstructoropen in new window proposal (License MIT).

See also isConstructor().

+ + + diff --git a/archive/current/packages/support/reflections/isClassMethodReference.html b/archive/current/packages/support/reflections/isClassMethodReference.html new file mode 100644 index 00000000..e037c7f8 --- /dev/null +++ b/archive/current/packages/support/reflections/isClassMethodReference.html @@ -0,0 +1,52 @@ + + + + + + + + + Is Class Method Reference | Ion + + + + + +

isClassMethodReference Available since v0.11

Determine if value is a "class method reference". A class method reference is an array with two values:

  • 0 = Constructor | object Target class constructor or class instance
  • 1 = PropertyKey Name of method (property key in target).
import { isClassMethodReference } from '@aedart/support/reflections';
+
+class A {
+    age = 23;
+    
+    foo: () => { /* ...not shown... */ }
+}
+
+const instance = new A();
+
+isClassMethodReference([ A, 'age' ]); // false
+isClassMethodReference([ instance, 'age' ]); // false
+
+isClassMethodReference([ A, 'foo' ]); // true
+isClassMethodReference([ instance, 'foo' ]); // true
+
+ + + diff --git a/archive/current/packages/support/reflections/isConstructor.html b/archive/current/packages/support/reflections/isConstructor.html new file mode 100644 index 00000000..54ca591d --- /dev/null +++ b/archive/current/packages/support/reflections/isConstructor.html @@ -0,0 +1,55 @@ + + + + + + + + + Is Constructor | Ion + + + + + +

isConstructor

Based on the TC39 Function.isCallable() / Function.isConstructor()open in new window proposal, the isConstructor() can determine if value is a constructor.

import { isConstructor } from "@aedart/support/reflections";
+
+isConstructor(null); // false
+isConstructor({}); // false
+isConstructor([]); // false
+isConstructor(() => {}); // false
+
+isConstructor(function() {}); // true
+isConstructor(class {}); // true
+
+// Built-in objects
+isConstructor(Array); // true
+isConstructor(String); // true
+isConstructor(Number); // true
+isConstructor(Date); // true
+isConstructor(Map); // true
+isConstructor(Set); // true
+// ...etc
+

Acknowledgement

The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the Function.isCallable / Function.isConstructoropen in new window proposal (License MIT).

See also isClassConstructor().

+ + + diff --git a/archive/current/packages/support/reflections/isKeySafe.html b/archive/current/packages/support/reflections/isKeySafe.html new file mode 100644 index 00000000..730a5816 --- /dev/null +++ b/archive/current/packages/support/reflections/isKeySafe.html @@ -0,0 +1,43 @@ + + + + + + + + + Is Key Safe | Ion + + + + + +

isKeySafe Available since v0.9

Opposite of isKeyUnsafe().

import { isKeySafe } from '@aedart/support/reflections';
+
+isKeySafe('name'); // true
+isKeySafe('length'); // true
+isKeySafe('constructor'); // true
+isKeySafe('__proto__'); // false
+
+ + + diff --git a/archive/current/packages/support/reflections/isKeyUnsafe.html b/archive/current/packages/support/reflections/isKeyUnsafe.html new file mode 100644 index 00000000..cc1499aa --- /dev/null +++ b/archive/current/packages/support/reflections/isKeyUnsafe.html @@ -0,0 +1,44 @@ + + + + + + + + + Is Key Unsafe | Ion + + + + + +

isKeyUnsafe Available since v0.9

Determines if a property key is considered "unsafe".

import { isKeyUnsafe } from '@aedart/support/reflections';
+
+isKeyUnsafe('name'); // false
+isKeyUnsafe('length'); // false
+isKeyUnsafe('constructor'); // false
+isKeyUnsafe('__proto__'); // true
+

Note

Behind the scene, the isKeyUnsafe() function matches the given key against values from the predefined DANGEROUS_PROPERTIES list, which is defined in the @aedart/contracts/support/objects submodule;

import { DANGEROUS_PROPERTIES } from "@aedart/contracts/support/objects";
+
+ + + diff --git a/archive/current/packages/support/reflections/isMethod.html b/archive/current/packages/support/reflections/isMethod.html new file mode 100644 index 00000000..001ac48b --- /dev/null +++ b/archive/current/packages/support/reflections/isMethod.html @@ -0,0 +1,61 @@ + + + + + + + + + Is Method | Ion + + + + + +

isMethod Available since v0.11

Determine if property (name) is a method in given target object.

It accepts the following arguments:

  • target: object - The target.
  • property: PropertyKey - Name of property.
import { isMethod } from '@aedart/support/reflections';
+
+class A {
+    age = 23;
+    
+    #title = 'AAA';
+    get title() {
+        return this.#title;
+    }
+
+    #job = 'AAA';
+    set job(v) {
+        this.#job = v; 
+    }
+
+    foo: () => { /* ...not shown... */ }
+}
+
+const a = new A();
+
+isMethod(a, 'age'); // false
+isMethod(a, 'title'); // false
+isMethod(a, 'job'); // false
+isMethod(a, 'foo'); // true
+

See also hasMethod().

+ + + diff --git a/archive/current/packages/support/reflections/isSubclass.html b/archive/current/packages/support/reflections/isSubclass.html new file mode 100644 index 00000000..252c53c3 --- /dev/null +++ b/archive/current/packages/support/reflections/isSubclass.html @@ -0,0 +1,48 @@ + + + + + + + + + Is Subclass | Ion + + + + + +

isSubclass Available since v0.9

Determine if target class is a subclass (child class) of given superclass (parent class).

It accepts the following arguments:

  • target: object - The target.
  • superclass: ConstructorOrAbstractConstructor - The superclass.
import { isSubclass } from '@aedart/support/reflections';
+
+class A {}
+
+class B extends A {}
+
+isSubclass({}, A); // false
+isSubclass(A, A); // false
+isSubclass(A, B); // false
+
+isSubclass(B, A); // true
+
+ + + diff --git a/archive/current/packages/support/reflections/isSubclassOrLooksLike.html b/archive/current/packages/support/reflections/isSubclassOrLooksLike.html new file mode 100644 index 00000000..50590b6c --- /dev/null +++ b/archive/current/packages/support/reflections/isSubclassOrLooksLike.html @@ -0,0 +1,51 @@ + + + + + + + + + Is Subclass Or Looks Like | Ion + + + + + +

isSubclassOrLooksLike Available since v0.9

Determine if target class is a subclass of given superclass, or if it looks like given blueprint.

It accepts the following arguments:

  • target: object - The target.
  • superclass: ConstructorOrAbstractConstructor - The superclass.
  • blueprint: ClassBlueprint - Class Blueprint (See classLooksLike).
import { isSubclassOrLooksLike } from '@aedart/support/reflections';
+
+class A {
+    foo() {}
+}
+class B extends A {}
+
+class C {
+    foo() {}
+}
+
+isSubclassOrLooksLike(B, A, { members: [] }); // true
+isSubclassOrLooksLike(C, A, { members: [] }); // false
+isSubclassOrLooksLike(C, A, { members: [ 'foo' ] }); // true
+

See isSubclass() and classLooksLike() for additional details.

+ + + diff --git a/archive/current/packages/support/reflections/isWeakKind.html b/archive/current/packages/support/reflections/isWeakKind.html new file mode 100644 index 00000000..d71f7908 --- /dev/null +++ b/archive/current/packages/support/reflections/isWeakKind.html @@ -0,0 +1,49 @@ + + + + + + + + + Is WeakKind | Ion + + + + + +

isWeakKind Available since v0.9

Determine if object of a "weak" kind, e.g. WeakRefopen in new window, WeakMapopen in new window, or WeakSetopen in new window.

import { isWeakKind } from '@aedart/support/reflections';
+
+const a = {};
+
+isWeakKind(null); // false
+isWeakKind(a); // false
+isWeakKind(new Map()); // false
+isWeakKind(new Set()); // false
+
+isWeakKind(new WeakRef(a)); // true
+isWeakKind(new WeakMap()); // true
+isWeakKind(new WeakSet()); // true
+
+ + + diff --git a/archive/current/packages/vuepress-utils/components/version-disclaimer.html b/archive/current/packages/vuepress-utils/components/version-disclaimer.html new file mode 100644 index 00000000..da36b40f --- /dev/null +++ b/archive/current/packages/vuepress-utils/components/version-disclaimer.html @@ -0,0 +1,75 @@ + + + + + + + + + Version Disclaimer | Ion + + + + + +

Version Disclaimer

The <VersionDisclaimer /> component is a simply "notice" container, which can be used in your layout. Most often, you would use this to display a custom message when outdated / unsupported documentation is being viewed.

<VersionDisclaimer type="warning" label="Note">
+    You are viewing documentation for an unsupported version...
+</VersionDisclaimer>
+

Properties

type (optional)

The type property accepts the following values:

  • info (default)
  • warning
  • danger

label (optional)

An optional label that is used as a prefix for the custom disclaim message.

Extend Default Layout

The following example assumes that you are using an Archive component to structure documentation. When doing so, you can display a custom message whenever "outdated" or "upcoming" documentation is being viewed.

To achieve this, you will need to create a custom layoutopen in new window (e.g. extend the default theme). Create a new layout, e.g. in .vuepress/layouts/Layout.vue.

<script setup lang="ts">
+import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue';
+import VersionDisclaimer from "@aedart/vuepress-utils/components/VersionDisclaimer.vue";
+import {usePageData} from "@vuepress/client";
+import {isViewingNextRef, isViewingOtherRef} from "@aedart/vuepress-utils";
+import archive from "../my_archive";
+
+const page = usePageData();
+const showForNext = isViewingNextRef(page, archive);
+const showForOther = isViewingOtherRef(page, archive);
+</script>
+
+<template>
+  <ParentLayout>
+    <template #page-top>
+        
+      <VersionDisclaimer v-if="showForNext">
+        You are viewing documentation for next version...
+      </VersionDisclaimer>
+        
+      <VersionDisclaimer v-if="showForOther" type="danger" label="Oh oh">
+        You are viewing old stuff...
+      </VersionDisclaimer>
+
+    </template>
+  </ParentLayout>
+</template>
+

The isViewingNextRef() method returns a computed property that indicates if visitor is viewing the "next" collection of pages. The isViewingOtherRef() methods returns a computed property that determines if pages are viewed that do not belong to "next" nor "current" collections.

Client Config

In your Client Config Fileopen in new window, use the custom Layout.

import { defineClientConfig } from '@vuepress/client';
+import Layout from "./layouts/Layout.vue";
+
+export default defineClientConfig({
+    layouts: {
+        Layout
+    }
+});
+
+ + + diff --git a/archive/current/packages/vuepress-utils/index.html b/archive/current/packages/vuepress-utils/index.html new file mode 100644 index 00000000..bd3f762d --- /dev/null +++ b/archive/current/packages/vuepress-utils/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Introduction | Ion + + + + + +

Introduction Available since v0.1NodeBrowser

Contains a few utilities for Vuepress v2open in new window, which are also used for building this documentation site. Amongst them are:

Plugins

Components

+ + + diff --git a/archive/current/packages/vuepress-utils/install.html b/archive/current/packages/vuepress-utils/install.html new file mode 100644 index 00000000..9382212a --- /dev/null +++ b/archive/current/packages/vuepress-utils/install.html @@ -0,0 +1,40 @@ + + + + + + + + + How to install | Ion + + + + + +

How to install

npm

npm install --save-dev @aedart/vuepress-utils
+

yarn

yarn add --dev @aedart/vuepress-utils
+

pnpm

pnpm add --save-dev @aedart/vuepress-utils
+
+ + + diff --git a/archive/current/packages/vuepress-utils/navigation/archive.html b/archive/current/packages/vuepress-utils/navigation/archive.html new file mode 100644 index 00000000..89597a8a --- /dev/null +++ b/archive/current/packages/vuepress-utils/navigation/archive.html @@ -0,0 +1,158 @@ + + + + + + + + + Archive | Ion + + + + + +

Archive

The Archive component is a helper that keeps track of collections of pages in an "archive" (exactly like this site). It operates on the notion that there is always a "current" and "next" collection of pages. It can be used to structure documentation for various versions of your application, components, packages...etc.

Directory Structure

The following illustrates a possible archive structure of your documentation. Notice the "current" and "next" directories. These two directories are essential for the Archive component. Their names can be configured (shown later). Each of the directories contains a collection of pages.

/.vuepress
+    /my_archive
+        index.ts
+        v3x.ts
+        v4x.ts
+        v5x.ts
+        ...
+    client.ts
+    config.ts
+
+/my_archive
+    /current
+        README.md
+        ...
+    /next
+        README.md
+        ...
+    /v4x
+        README.md
+        ...
+    /v3x
+        README.md
+        ...
+    README.md
+

 









 


 









Collections

Each Archive component is dependent on having its structure defined by means of PagesCollection components. As such, to represent the "current" collection, you must create a new PagesCollection instance. Use the static make() method to create a new instance. It accepts 3 arguments:

  • name: string Name or title of the collection.
  • path: string The relative path in the archive to the collection.
  • pages: SidebarConfigArray = [] An array of pages or group of pages. Each page's path is relative to the collection's path.
// E.g. inside /.vuepress/my_archive/v5x.ts
+import {PagesCollection} from "@aedart/vuepress-utils/navigation";
+
+export default PagesCollection.make('v5.x', '/v5x', [
+    {
+        text: 'Version 5.x',
+        collapsible: true,
+        children: [
+            '',
+            'contribution-guide',
+            'security',
+            'code-of-conduct',
+        ]
+    },
+    {
+        text: 'Packages',
+        collapsible: true,
+        children: [
+            'packages/',
+
+            // ...remaining not shown here...
+        ]
+    },
+
+    // ...etc
+]);
+

PagesCollection `path`

The path argument of a pages collection will automatically be changed, by the Archive component, if the collection is marked as the "current" or "next" collection (covered in next section).

Archive Instance

Once you have your "current" and "next" collections defined, you can create a new Archive instance. Use the static make() method to create a new instance. It accepts 3 arguments:

  • current: PagesCollection The collection to be marked as the "current".
  • next: PagesCollection The collection to be marked as the "next".
  • collections: PagesCollection[] = [] Array of all available collections, including "next" and "current".
// E.g. inside /.vuepress/my_archive/index.ts
+import {PagesCollection} from "@aedart/vuepress-utils/contracts";
+import {Archive} from "@aedart/vuepress-utils/navigation";
+import v3x from "./v3x.ts";
+import v4x from "./v4x.ts";
+import v5x from "./v5x.ts";
+import v6x from "./v6x.ts";
+
+// Defined the "current" colelction 
+const CURRENT: PagesCollection = v5x;
+
+// Defined the "next" colelction
+const NEXT: PagesCollection = v6x;
+
+// Define all collections... next and current should also be part of this...
+const ALL: PagesCollection[] = [
+    NEXT,
+    CURRENT,
+    v4x,
+    v3x,
+    // ... etc
+];
+
+// Finally, create and export your archive with "current" and "next" 
+const archive = Archive.make(CURRENT, NEXT, ALL);
+archive.path = '/my_archive';
+
+export default archive;
+

Name & Path

As shown in the previous example, the archive's path was set to /my_archive by explicitly setting the path property. You can do the same for its name:

// ...previous not shown ... 
+const archive = Archive.make(CURRENT, NEXT, ALL);
+archive.name = 'Good old stuff';
+archive.path = '/old_stuff';
+

WARNING

Your archive's directory structure must match the specified path or vuepress will not be able to find it and display a "404 Not Found".

/old_stuff
+    /current
+        README.md
+        ...
+    /next
+        README.md
+        ...
+    ...
+
 







Current & Next

Whenever a collection is marked as "current" or "next", its path is automatically changed to /current or /next. This means that the full path of those collections will be the archive's path + current or next, e.g.

  • /archive/current
  • /archive/next

To change these paths, specify the currentPath and nextPath properties in your Archive instance.

archive.currentPath = '/live'
+archive.nextPath = '/upcoming'
+

WARNING

When you change the "current" and "next" paths in your archive, then the directory structure MUST reflect these names. From the above example, the archive's directory structure should now be the following:

/my_archive
+    /live
+        README.md
+        ...
+    /upcoming
+        README.md
+        ...
+    ...
+

 


 



Labels

You may also change the labels for "current" and "next", in a similar way as for changing their paths.

archive.currentLabel = 'Live'
+archive.nextLabel = 'What\'s Next?'
+

Vuepress Config File

To put it all together, in your Config Fileopen in new window, import your archive instance. Inside your theme settings, you can create a dropdown representation of your archive, by invoking the asNavigationItem() method. A sidebar configuration can be created via the sidebarConfiguration() method.

import {defineUserConfig} from 'vuepress';
+import defaultTheme from "@vuepress/theme-default"
+import archive from './my_archive'
+
+export default defineUserConfig({
+    
+    // ...other settings not shown...
+
+    theme: defaultTheme({
+        
+        // ... other theme settings not shown ...
+        
+        navbar: [
+            archive.asNavigationItem(),
+        ],
+
+        sidebar: archive.sidebarConfiguration()
+    }),
+});
+

Onward

Use can review the source code and configuration of this site, as a complete example of how the Archive component can be used.

+ + + diff --git a/archive/current/packages/vuepress-utils/plugins/last-updated.html b/archive/current/packages/vuepress-utils/plugins/last-updated.html new file mode 100644 index 00000000..119cc65c --- /dev/null +++ b/archive/current/packages/vuepress-utils/plugins/last-updated.html @@ -0,0 +1,50 @@ + + + + + + + + + Last Updated | Ion + + + + + +

Last Updated

lastUpdatedPlugin() allows you to specify a custom datetime format for the "last updated" dateopen in new window, for the default theme. It uses Luxonopen in new window to perform the formatting.

How to use

In your Config Fileopen in new window, add the lastUpdatedPlugin():

import {defineUserConfig} from 'vuepress';
+import {lastUpdatedPlugin} from "@aedart/vuepress-utils/plugins";
+
+export default defineUserConfig({
+    
+    // ...other settings not shown...
+    
+    plugins: [
+        
+        lastUpdatedPlugin()
+    ]
+});
+

Format

Use the format argument to specify your desired datetime format. See Luxon documentationopen in new window for available format tokens.

lastUpdatedPlugin({ format: 'dd-MM-yyyy HH:mm:ss' })
+

Note

The plugin uses yyyy-MM-dd HH:mm:ss ZZZZ as default format, when none is given.

Example output: 2023-03-19 16:09:20 GMT+1

+ + + diff --git a/archive/current/packages/xyz/index.html b/archive/current/packages/xyz/index.html new file mode 100644 index 00000000..feabaff0 --- /dev/null +++ b/archive/current/packages/xyz/index.html @@ -0,0 +1,37 @@ + + + + + + + + + XYZ (test package) | Ion + + + + + +

Introduction Internal (not published)

@aedart/xyz is an internal package that is used for experiments, e.g. tinkering with decorators, proxies, or whatever might be "fun" to try out. The package is NOT published, nor is it intended to ever be published.

+ + + diff --git a/archive/current/security.html b/archive/current/security.html new file mode 100644 index 00000000..f634a49a --- /dev/null +++ b/archive/current/security.html @@ -0,0 +1,93 @@ + + + + + + + + + Security Policy | Ion + + + + + +

Security Policy

WARNING

DO NOT DISCLOSE SECURITY RELATED ISSUES PUBLICLY!PLEASE SEND AN ENCRYPTED EMAIL TO ME INSTEAD!

See "How to report a vulnerability" for instructions.

How to report a vulnerability

If you have discovered a vulnerability, please send an encrypted email to Alin Eugen Deac (aedart@gmail.com). Use the public PGP key listed below for encryption. Your email will be prioritised and addressed as quickly as possible.

In addition, please make sure that the contents of your email contains appropriate information about the vulnerability. E.g.:

  • Where the vulnerability is located
  • Why it is a vulnerability
  • Affected version(s)
  • (How it can be resolved, if you have a possible solution)

Public PGP Key

-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: Mailvelope v4.4.1
+Comment: https://www.mailvelope.com
+
+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
+gA==
+=E13G
+-----END PGP PUBLIC KEY BLOCK-----
+

Supported Versions

Please read the Support Policy for additional information about what versions are supported.

+ + + diff --git a/archive/current/upgrade-guide.html b/archive/current/upgrade-guide.html new file mode 100644 index 00000000..96c820b1 --- /dev/null +++ b/archive/current/upgrade-guide.html @@ -0,0 +1,68 @@ + + + + + + + + + Upgrade Guide | Ion + + + + + +

Upgrade Guide

From v0.7.x- to v0.10.x

Meta (types)

The following deprecated types have been removed (deprecated in version v0.7.0):

  • ClassContext
  • MethodContext
  • GetterContext
  • SetterContext
  • FieldContext
  • AccessorContext
  • MetadataContext
  • MemberContext

More information available in the source code and CHANGELOG.md

Meta (targetMeta() and inheritTargetMeta())

The util functions targetMeta() and inheritTargetMeta() now throw a MetaError instead of previous TypeError. If you rely on TypeError as the type of exception being thrown in a try-catch statement, when decorating class members, then you should change it to MetaError.

From v0.6.x to v0.7.x

Node.js 20.11.0 Required

Ion now requires Node.jsopen in new window v20.11.0 or greater.

Meta

Various metadata related type definitions have now been deprecated in favour of TypeScript's own definitions. Mostly, this should not affect the implementation. However, if your decorator(s) depend on the following types (see below), then you are strongly encouraged to use corresponding TypeScript defined types instead.

Deprecated types and interfaces are defined in @aedart/contracts/support/meta:

  • ClassContext
  • MethodContext
  • GetterContext
  • SetterContext
  • FieldContext
  • AccessorContext
  • MetadataContext
  • MemberContext

More information available in the source code and CHANGELOG.md

Vuepress Utils

The @aedart/vuepress-utils has been upgraded to use vuepress v2.0.0-rc.2, meaning that you no longer should require to manually define your vuepress dependency, in your application's packages.json file.

❌ Previously

{
+    "devDependencies": {
+        "@aedart/vuepress-utils": "^0.6.1",
+        "vuepress": "2.0.0-beta.61",
+        "@vuepress/core": "2.0.0-beta.61",
+        "@vuepress/utils": "2.0.0-beta.61",
+        "@vuepress/client": "2.0.0-beta.61"
+    }   
+}
+

✔️ Now

{
+    "devDependencies": {
+        "@aedart/vuepress-utils": "^0.7.0"
+    }   
+}
+

Please read vuepress' changelogopen in new window for additional details.

Webpack Bundle

In addition to the above, the @aedart/vuepress-utils automatically comes with @vuepress/bundler-webpack as its peed dependency.

From v0.3.x to v0.4.x

Rest Parameters for forgetAll(), hasAll() and hasAny()

forgetAll(), hasAll() and hasAny() (in @aedart/support/object submodule) now accept rest parameters instead of an array of paths. If you are using these methods, then you need to upgrade or risk unexpected results.

❌ Previously

import {
+    forgetAll,
+    hasAll,
+    hasAny
+} from "@aedart/support/objects";
+
+hasAny(target, [ 'a', 'b.c.age' ]);
+hasAll(target, [ 'a', 'b.c.age' ]);
+forgetAll(target, [ 'a', 'b.c.age' ]);
+

✔️ Now

hasAny(target, ...[ 'a', 'b.c.age' ]);
+hasAll(target, ...[ 'a', 'b.c.age' ]);
+forgetAll(target, ...[ 'a', 'b.c.age' ]);
+
+// ...Or
+hasAny(target, 'a', 'b.c.age');
+hasAll(target, 'a', 'b.c.age');
+forgetAll(target, 'a', 'b.c.age');
+

Onward

More details can be found in the changelogopen in new window.

+ + + diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 00000000..326a8d0c --- /dev/null +++ b/archive/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Archive | Ion + + + + + +

Archive

Here you can find documentation for previous versions of Ion. Please select the desired version via the "Archive" menu item located in the top-menu.

+ + + diff --git a/archive/next/index.html b/archive/next/index.html new file mode 100644 index 00000000..945dbaf4 --- /dev/null +++ b/archive/next/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Not Available | Ion + + + + + +
You are viewing documentation for an upcoming version. It has not yet been released!!

Not Available

The next version of Ion has yet to be designed and implemented. Come back at a later time to review the documentation...

+ + + diff --git a/archive/not_available.html b/archive/not_available.html new file mode 100644 index 00000000..4ae3bbe3 --- /dev/null +++ b/archive/not_available.html @@ -0,0 +1,37 @@ + + + + + + + + + Not Available | Ion + + + + + +
You are viewing documentation for an outdated version. It is no longer supported!

Not Available

The next version of Ion has yet to be designed and implemented. Come back at a later time to review the documentation...

+ + + diff --git a/assets/css/styles.2fea50f5.css b/assets/css/styles.2fea50f5.css new file mode 100644 index 00000000..dca46437 --- /dev/null +++ b/assets/css/styles.2fea50f5.css @@ -0,0 +1,17 @@ +div[class*=language-]:hover::before{display:none}div[class*=language-]:hover .vp-copy-code-button{opacity:1}.vp-copy-code-button{position:absolute;top:.5em;right:.5em;z-index:5;width:2.5rem;height:2.5rem;padding:0;border-width:0;border-radius:.5rem;background:0 0;outline:0;opacity:0;cursor:pointer;transition:opacity .4s}@media print{.vp-copy-code-button{display:none}}.vp-copy-code-button.copied,.vp-copy-code-button:focus{opacity:1}.vp-copy-code-button.copied,.vp-copy-code-button:hover{background:var(--copy-code-hover)}.vp-copy-code-button.copied .vp-copy-icon{-webkit-mask-image:var(--code-copied-icon);mask-image:var(--code-copied-icon)}.vp-copy-code-button.copied::after,.vp-copy-icon{height:1.25rem;padding:.625rem;color:var(--copy-code-color)}.vp-copy-code-button.copied::after{content:attr(data-copied);position:absolute;top:0;right:calc(100% + .25rem);display:block;border-radius:.5rem;background:var(--copy-code-hover);font-weight:500;line-height:1.25rem;white-space:nowrap}.vp-copy-icon{width:1.25rem;background:currentcolor;font-size:1.25rem;-webkit-mask-image:var(--code-copy-icon);mask-image:var(--code-copy-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:1em;mask-size:1em} +:root{--code-copy-icon:url(/ion/assets/img/copy-button.45f8803e.svg);--code-copied-icon:url(/ion/assets/img/copied-button.9f175e5f.svg);--copy-code-color:#9e9e9e;--copy-code-hover:rgb(0 0 0 / 50%)} +:root{--external-link-icon-color:#aaa} +.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;user-select:none} +:root{--medium-zoom-z-index:100;--medium-zoom-bg-color:#ffffff;--medium-zoom-opacity:1} +.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)} +:root{--nprogress-color:#29d;--nprogress-z-index:1031} +#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px} + +.vp-page-meta{max-width:var(--content-width);margin:0 auto;display:flex;flex-wrap:wrap;justify-content:space-between;overflow:auto;padding:.75rem 2.5rem}@media (max-width:959px){.vp-page-meta{padding:2rem}}@media (max-width:419px){.vp-page-meta{padding:1.5rem}}@media print{.vp-page-meta{margin:0!important;padding-inline:0!important}}@media (max-width:719px){.vp-page-meta{display:block}}.vp-page-meta .vp-meta-item{flex-grow:1}.vp-page-meta .vp-meta-item .vp-meta-label{font-weight:500}.vp-page-meta .vp-meta-item .vp-meta-label:not(a){color:var(--c-text-lighter)}.vp-page-meta .vp-meta-item .vp-meta-info{color:var(--c-text-quote);font-weight:400}.vp-page-meta .git-info{text-align:end}.vp-page-meta .edit-link{margin-top:.25rem;margin-bottom:.25rem;margin-inline-end:.5rem;font-size:14px}@media print{.vp-page-meta .edit-link{display:none}}.vp-page-meta .edit-link .icon{position:relative;bottom:-.125em;width:1em;height:1em;margin-inline-end:.25em}.vp-page-meta .contributors,.vp-page-meta .last-updated{margin-top:.25rem;margin-bottom:.25rem;font-size:14px}@media (max-width:719px){.vp-page-meta .contributors,.vp-page-meta .last-updated{font-size:13px;text-align:start}} +.vp-page-nav{display:flex;flex-wrap:wrap;max-width:var(--content-width, 740px);min-height:2rem;margin-inline:auto;margin-top:0;padding-block:.5rem;padding-inline:2rem;border-top:1px solid var(--c-border);transition:border-top var(--t-color);padding-top:1rem;padding-bottom:0}@media (max-width:959px){.vp-page-nav{padding-inline:1rem}}@media print{.vp-page-nav{display:none}}.vp-page-nav .route-link{display:inline-block;flex-grow:1;margin:.25rem;padding:.25rem .5rem;border:1px solid var(--c-border);border-radius:.25rem}.vp-page-nav .route-link:hover{background:var(--c-bg-light)}.vp-page-nav .route-link .hint{color:var(--c-text-quote);font-size:.875rem;line-height:2}.vp-page-nav .prev{text-align:start}.vp-page-nav .next{text-align:end} +:root{--c-brand:#3eaf7c;--c-brand-light:#4abf8a;--c-tip:#42b983;--c-code-group-tab-title:rgba(255, 255, 255, 0.9);--c-code-group-tab-bg:var(--code-bg-color);--c-code-group-tab-outline:var(var(--c-code-group-tab-title));--c-code-group-tab-active-border:var(--c-brand)}.vp-back-to-top-button{--back-to-top-color:var(--c-brand);--back-to-top-color-hover:var(--c-brand-light);--back-to-top-bg-color:var(--c-bg)}.vp-catalog-wrapper{--catalog-bg-color:var(--c-bg);--catalog-bg-secondary-color:var(--c-bg-dark);--catalog-border-color:var(--c-border);--catalog-active-color:var(--c-brand);--catalog-hover-color:var(--c-brand-light)}.waline-wrapper{--waline-bg-color:var(--c-bg);--waline-bg-color-light:var(--c-bg-light);--waline-text-color:var(--c-color);--waline-border:1px solid var(--c-border);--waline-border-color:var(--c-border);--waline-theme-color:var(--c-brand);--waline-active-color:var(--c-brand-light)}body,html{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}body{--photo-swipe-bullet:var(--c-bg);--photo-swipe-bullet-active:var(--c-brand);--pwa-text-color:var(--c-text);--pwa-bg-color:var(--c-bg);--pwa-border-color:var(--c-brand);--pwa-btn-text-color:var(--c-bg);--pwa-btn-bg-color:var(--c-brand);--pwa-btn-hover-bg-color:var(--c-brand-light)}.language-modal-mask{--redirect-bg-color:var(--c-bg);--redirect-bg-color-light:var(--c-bg-light);--redirect-bg-color-lighter:var(--c-bg-lighter);--redirect-text-color:var(--c-text);--redirect-primary-color:var(--c-brand);--redirect-primary-hover-color:var(--c-brand-light);--redirect-primary-text-color:var(--c-bg)}html.dark{--c-brand:#3aa675;--c-brand-light:#349469;--c-tip:#318a62;color-scheme:dark;--c-brand:#F09838;--c-brand-light:#F0C738;--c-bg:#22272e;--c-bg-light:#2b313a;--c-bg-lighter:#262c34;--c-bg-dark:#343b44;--c-bg-darker:#37404c;--c-text:#adbac7;--c-text-light:#96a7b7;--c-text-lighter:#8b9eb0;--c-text-lightest:#8094a8;--c-border:#3e4c5a;--c-border-dark:#34404c;--c-tip:#4F81D6;--c-warning:#e0ad15;--c-warning-bg:#2d2f2d;--c-warning-bg-light:#423e2a;--c-warning-bg-lighter:#44442f;--c-warning-border-dark:#957c35;--c-warning-details-bg:#39392d;--c-warning-title:#fdca31;--c-warning-text:#d8d96d;--c-warning-text-accent:#ffbf00;--c-warning-text-light:#ddb84b;--c-warning-text-quote:#ccab49;--c-danger:#fc1e38;--c-danger-bg:#39232c;--c-danger-bg-light:#4b2b35;--c-danger-bg-lighter:#553040;--c-danger-border-dark:#a25151;--c-danger-details-bg:#482936;--c-danger-title:#fc2d3b;--c-danger-text:#ea9ca0;--c-danger-text-accent:#fd3636;--c-danger-text-light:#d9777c;--c-danger-text-quote:#d56b6b;--c-details-bg:#323843;--c-badge-warning:var(--c-warning);--c-badge-warning-text:#3c2e05;--c-badge-danger:var(--c-danger);--c-badge-danger-text:#401416;--code-hl-bg-color:#363b46}html.dark body{--pwa-shadow-color:rgb(0 0 0 / 30%);--pwa-content-color:#ccc;--pwa-content-light-color:#999}html{font-size:16px}body,kbd{color:var(--c-text)}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem}a,p a code{color:var(--c-text-accent)}a{font-weight:500;text-decoration:none}p a code{font-weight:400}kbd{background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}a,blockquote,code,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}code,kbd{font-family:var(--font-family-code)}code{color:var(--c-text-lighter);padding:.25rem .5rem;font-size:.85em;background-color:var(--c-bg-light);border-radius:3px;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p,code{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}h1 .header-anchor:focus-visible,h1:focus-visible,h2 .header-anchor:focus-visible,h2:focus-visible,h3 .header-anchor:focus-visible,h3:focus-visible,h4 .header-anchor:focus-visible,h4:focus-visible,h5 .header-anchor:focus-visible,h5:focus-visible,h6 .header-anchor:focus-visible,h6:focus-visible{outline:0}h1 .header-anchor,h2 .header-anchor,h3 .header-anchor,h4 .header-anchor,h5 .header-anchor,h6 .header-anchor{color:inherit;text-decoration:none;position:relative}h1 .header-anchor:hover::before,h2 .header-anchor:hover::before,h3 .header-anchor:hover::before,h4 .header-anchor:hover::before,h5 .header-anchor:hover::before,h6 .header-anchor:hover::before{font-size:.8em;content:"¶";position:absolute;left:-.75em;color:var(--c-brand)}h1 .header-anchor:focus-visible::before,h2 .header-anchor:focus-visible::before,h3 .header-anchor:focus-visible::before,h4 .header-anchor:focus-visible::before,h5 .header-anchor:focus-visible::before,h6 .header-anchor:focus-visible::before{content:"¶";position:absolute;left:-.75em;color:var(--c-brand);outline:auto}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}@media print{a[href^="http://"]::after,a[href^="https://"]::after{content:" ("attr(href)") "}}ol,p,ul{line-height:1.7;overflow-wrap:break-word}hr{border:0;border-top:1px solid var(--c-border)}h2,table,tr{transition:border-color var(--t-color)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid var(--c-border-dark)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}tr:nth-child(2n) code{background-color:var(--c-bg-dark)}td,th{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow,.badge{display:inline-block}.arrow{vertical-align:middle;width:1em;height:1em;background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%280,0,0,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;line-height:normal;transition:all .3s}html.dark .arrow{background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27rgba%28255,255,255,0.5%29%27 d=%27M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z%27/%3E%3C/svg%3E")}.arrow.down{transform:rotate(180deg)}.arrow.right{transform:rotate(90deg)}.arrow.left{transform:rotate(-90deg)}.badge{font-size:14px;font-weight:600;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning);color:var(--c-badge-warning-text)}.badge.danger{background-color:var(--c-badge-danger);color:var(--c-badge-danger-text)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.375;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent!important;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]::before{content:attr(data-title);position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:0 0!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.375}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line::before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.375;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;user-select:none;height:1.375em}div[class*=language-].line-numbers-mode .line-numbers .line-number::before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode::after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}@media (max-width:419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--c-code-group-tab-bg)}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:var(--c-code-group-tab-title);font-weight:600}.code-group__nav-tab:focus{outline:0}.code-group__nav-tab:focus-visible{outline:1px solid var(--c-code-group-tab-outline)}.code-group__nav-tab-active{border-bottom:var(--c-code-group-tab-active-border) 1px solid}@media (max-width:419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.danger,.custom-container.tip,.custom-container.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.tip code{background-color:var(--c-bg-dark)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.warning blockquote{border-left-color:var(--c-warning-border-dark);color:var(--c-warning-text-quote)}.custom-container.warning code{color:var(--c-warning-text-light);background-color:var(--c-warning-bg-light)}.custom-container.warning details{background-color:var(--c-warning-details-bg)}.custom-container.warning details code{background-color:var(--c-warning-bg-lighter)}.custom-container.warning .external-link-icon{--external-link-icon-color:var(--c-warning-text-quote)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.danger blockquote{border-left-color:var(--c-danger-border-dark);color:var(--c-danger-text-quote)}.custom-container.danger code{color:var(--c-danger-text-light);background-color:var(--c-danger-bg-light)}.custom-container.danger details{background-color:var(--c-danger-details-bg)}.custom-container.danger details code{background-color:var(--c-danger-bg-lighter)}.custom-container.danger .external-link-icon{--external-link-icon-color:var(--c-danger-text-quote)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details code{background-color:var(--c-bg-darker)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:0;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .actions,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .actions,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar,.sidebar{position:fixed;left:0;box-sizing:border-box}.navbar{z-index:20;top:0;right:0;height:var(--navbar-height);border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);z-index:10;margin:0;top:var(--navbar-height);bottom:0;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.route-link-active::after,.theme-container.no-sidebar .sidebar{display:none}@media (max-width:719px){.theme-container.no-sidebar .sidebar{display:block}}.theme-container.no-sidebar .page{padding-left:0}.theme-default-content a:not(.header-anchor):hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+.custom-container,.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h6:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre{margin-top:2rem}@media (max-width:959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width:719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translateX(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}}#vp-comment{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){#vp-comment{padding:2rem}}@media (max-width:419px){#vp-comment{padding:1.5rem}}.navbar{--navbar-line-height:calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media screen and (max-width:719px){.navbar{padding-left:4rem}.navbar .site-name{display:block;width:calc(100vw - 11rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.navbar .can-hide{display:none}}.navbar-items,.navbar-items a{display:inline-block}@media print{.navbar-items{display:none}}.navbar-items a{line-height:1.4rem;color:inherit}.navbar-items a.route-link-active,.navbar-items a:hover{color:var(--c-text)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}.navbar-items .navbar-item>a.route-link-active,.navbar-items .navbar-item>a:hover{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}@media (max-width:719px){.navbar-items .navbar-item{margin-left:0}.navbar-items .navbar-item>a.route-link-active,.navbar-items .navbar-item>a:hover{margin-bottom:0;border-bottom:none}.navbar-items a.route-link-active,.navbar-items a:hover{color:var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width:719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:0 0;color:var(--c-text);opacity:.8;cursor:pointer}@media print{.toggle-color-mode-button{display:none}}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:0 0;border:0;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover,.navbar-dropdown-wrapper .navbar-dropdown-title:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.route-link-active,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.route-link-active::after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title,.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title{display:none}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper.mobile .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0;font-size:15px;line-height:2rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}.navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.navbar-dropdown-wrapper:not(.mobile).open .navbar-dropdown,.navbar-dropdown-wrapper:not(.mobile):hover .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper:not(.mobile).open:blur{display:none}.navbar-dropdown-wrapper:not(.mobile) .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width:959px){.page .theme-default-content{padding:2rem}}@media (max-width:419px){.page .theme-default-content{padding:1.5rem}}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width:719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.route-link-active::after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.collapsible,a.sidebar-item{cursor:pointer}.sidebar-item.collapsible .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}:root{--c-brand:#F09838;--c-brand-light:#F0C738;--success:#157938;--c-bg:#ffffff;--c-bg-light:#f3f4f5;--c-bg-lighter:#eeeeee;--c-bg-dark:#ebebec;--c-bg-darker:#e6e6e6;--c-bg-navbar:var(--c-bg);--c-bg-sidebar:var(--c-bg);--c-bg-arrow:#cccccc;--c-text:#2c3e50;--c-text-accent:var(--c-brand);--c-text-light:#3a5169;--c-text-lighter:#4e6e8e;--c-text-lightest:#6a8bad;--c-text-quote:#999999;--c-border:#eaecef;--c-border-dark:#dfe2e5;--c-tip:#4F81D6;--c-tip-bg:var(--c-bg-light);--c-tip-title:var(--c-text);--c-tip-text:var(--c-text);--c-tip-text-accent:var(--c-text-accent);--c-warning:#ffc310;--c-warning-bg:#fffae3;--c-warning-bg-light:#fff3ba;--c-warning-bg-lighter:#fff0b0;--c-warning-border-dark:#f7dc91;--c-warning-details-bg:#fff5ca;--c-warning-title:#f1b300;--c-warning-text:#746000;--c-warning-text-accent:#edb100;--c-warning-text-light:#c1971c;--c-warning-text-quote:#ccab49;--c-danger:#f11e37;--c-danger-bg:#ffe0e0;--c-danger-bg-light:#ffcfde;--c-danger-bg-lighter:#ffc9c9;--c-danger-border-dark:#f1abab;--c-danger-details-bg:#ffd4d4;--c-danger-title:#ed1e2c;--c-danger-text:#660000;--c-danger-text-accent:#bd1a1a;--c-danger-text-light:#b5474d;--c-danger-text-quote:#c15b5b;--c-details-bg:#eeeeee;--c-badge-tip:var(--c-tip);--c-badge-warning:#ecc808;--c-badge-warning-text:var(--c-bg);--c-badge-danger:#dc2626;--c-badge-danger-text:var(--c-bg);--t-color:0.3s ease;--t-transform:0.3s ease;--code-bg-color:#282c34;--code-hl-bg-color:rgba(0, 0, 0, 0.66);--code-ln-color:#9e9e9e;--code-ln-wrapper-width:3.5rem;--font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code:Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height:3.6rem;--navbar-padding-v:0.7rem;--navbar-padding-h:1.5rem;--sidebar-width:20rem;--sidebar-width-mobile:calc(var(--sidebar-width) * 0.82);--content-width:740px;--homepage-width:960px}.back-to-top{--back-to-top-color:var(--c-brand);--back-to-top-color-hover:var(--c-brand-light)}.DocSearch{--docsearch-primary-color:var(--c-brand);--docsearch-text-color:var(--c-text);--docsearch-highlight-color:var(--c-brand);--docsearch-muted-color:var(--c-text-quote);--docsearch-container-background:rgba(9, 10, 17, 0.8);--docsearch-modal-background:var(--c-bg-light);--docsearch-searchbox-background:var(--c-bg-lighter);--docsearch-searchbox-focus-background:var(--c-bg);--docsearch-searchbox-shadow:inset 0 0 0 2px var(--c-brand);--docsearch-hit-color:var(--c-text-light);--docsearch-hit-active-color:var(--c-bg);--docsearch-hit-background:var(--c-bg);--docsearch-hit-shadow:0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background:var(--c-bg)}.external-link-icon{--external-link-icon-color:var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color:var(--c-bg)}#nprogress{--nprogress-color:var(--c-brand)}.pwa-popup{--pwa-popup-text-color:var(--c-text);--pwa-popup-bg-color:var(--c-bg);--pwa-popup-border-color:var(--c-brand);--pwa-popup-shadow:0 4px 16px var(--c-brand);--pwa-popup-btn-text-color:var(--c-bg);--pwa-popup-btn-bg-color:var(--c-brand);--pwa-popup-btn-hover-bg-color:var(--c-brand-light)}.search-box{--search-bg-color:var(--c-bg);--search-accent-color:var(--c-brand);--search-text-color:var(--c-text);--search-border-color:var(--c-border);--search-item-text-color:var(--c-text-lighter);--search-item-focus-bg-color:var(--c-bg-light);--search-input-width:25rem;--search-result-width:45rem}.search-box .suggestions .suggestion a::after{content:""attr(href)"";display:block;color:var(--c-text-lightest);font-style:italic;width:100%;padding:2px}html.dark .DocSearch{--docsearch-logo-color:var(--c-text);--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow:inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, 0.3);--docsearch-key-gradient:linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73, 76, 106, 0.5), 0 -4px 8px 0 rgba(0, 0, 0, 0.2)}.badge.success{background-color:var(--success)} +.vp-back-to-top-button{position:fixed!important;bottom:4rem;inset-inline-end:1rem;z-index:100;width:48px;height:48px;padding:8px;border-width:0;border-radius:50%;background:var(--back-to-top-bg-color);color:var(--back-to-top-color);box-shadow:2px 2px 10px 4px var(--back-to-top-shadow);cursor:pointer}@media (max-width:959px){.vp-back-to-top-button{transform:scale(.8);transform-origin:100% 100%}}@media print{.vp-back-to-top-button{display:none}}.vp-back-to-top-button:hover{color:var(--back-to-top-color-hover)}.vp-back-to-top-button .back-to-top-icon{overflow:hidden;width:100%;height:100%;background:currentcolor;border-radius:50%;-webkit-mask-image:var(--back-to-top-icon);mask-image:var(--back-to-top-icon);-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:cover;mask-size:cover}.vp-scroll-progress{position:absolute;right:-2px;bottom:-2px;width:52px;height:52px}.vp-scroll-progress svg{width:100%;height:100%}.vp-scroll-progress circle{opacity:.9;transform:rotate(-90deg);transform-origin:50% 50%}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0} +:root{--back-to-top-z-index:5;--back-to-top-icon:url(/ion/assets/img/back-to-top.bdc03142.svg);--back-to-top-bg-color:#fff;--back-to-top-color:#3eaf7c;--back-to-top-color-hover:#71cda3;--back-to-top-shadow:rgb(0 0 0 / 20%)} +:root{--search-bg-color:#ffffff;--search-accent-color:#3eaf7c;--search-text-color:#2c3e50;--search-border-color:#eaecef;--search-item-text-color:#5d81a5;--search-item-focus-bg-color:#f3f4f5;--search-input-width:8rem;--search-result-width:20rem} +.search-box{display:inline-block;position:relative;margin-left:1rem}@media print{.search-box{display:none}}.search-box input{-webkit-appearance:none;appearance:none;cursor:text;width:var(--search-input-width);height:2rem;color:var(--search-text-color);display:inline-block;border:1px solid var(--search-border-color);border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:0;transition:all ease .3s;background:var(--search-bg-color)url(/ion/assets/img/search.b017a09f.svg).6rem .5rem no-repeat;background-size:1rem}@media (max-width:719px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}}.search-box input:focus{cursor:auto;border-color:var(--search-accent-color)}@media (max-width:719px){.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:419px){.search-box input:focus{width:8rem}}.search-box .suggestions{background:var(--search-bg-color);width:var(--search-result-width);position:absolute;top:2rem;right:0;border:1px solid var(--search-border-color);border-radius:6px;padding:.4rem;list-style-type:none}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem);right:-.5rem}}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:var(--search-item-text-color)}.search-box .suggestion.focus{background-color:var(--search-item-focus-bg-color)}.search-box .suggestion.focus a{color:var(--search-accent-color)}.search-box .suggestion .page-title{font-weight:600}.search-box .suggestion .page-header{font-size:.9em;margin-left:.25em} +.version-disclaimer{max-width:var(--content-width);margin:0 auto;padding:1.2em;border-bottom:1px solid var(--c-border)}.version-disclaimer label{font-weight:700;margin-right:.2em}.version-disclaimer label:after{content:":"}.version-disclaimer.info label{color:var(--c-tip)}.version-disclaimer.warning label{color:var(--c-warning)}.version-disclaimer.danger label{color:var(--c-danger)} diff --git a/assets/img/back-to-top.bdc03142.svg b/assets/img/back-to-top.bdc03142.svg new file mode 100644 index 00000000..0045f3d7 --- /dev/null +++ b/assets/img/back-to-top.bdc03142.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/img/copied-button.9f175e5f.svg b/assets/img/copied-button.9f175e5f.svg new file mode 100644 index 00000000..c1fd2657 --- /dev/null +++ b/assets/img/copied-button.9f175e5f.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/img/copy-button.45f8803e.svg b/assets/img/copy-button.45f8803e.svg new file mode 100644 index 00000000..42ae2573 --- /dev/null +++ b/assets/img/copy-button.45f8803e.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/img/search.b017a09f.svg b/assets/img/search.b017a09f.svg new file mode 100644 index 00000000..03d83913 --- /dev/null +++ b/assets/img/search.b017a09f.svg @@ -0,0 +1 @@ + diff --git a/assets/js/404.html.1424746e.js b/assets/js/404.html.1424746e.js new file mode 100644 index 00000000..e8539d41 --- /dev/null +++ b/assets/js/404.html.1424746e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7490],{2632:function(t,n,e){e.r(n),e.d(n,{comp:function(){return u},data:function(){return l}});var a=e(641);const o=[(0,a.Lk)("p",null,"404 Not Found",-1)],r={};var u=(0,e(6262).A)(r,[["render",function(t,n){return(0,a.uX)(),(0,a.CE)("div",null,o)}]]);const l=JSON.parse('{"path":"/404.html","title":"","lang":"en-GB","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null,"lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/4475.f1641a0c.js b/assets/js/4475.f1641a0c.js new file mode 100644 index 00000000..61deab1d --- /dev/null +++ b/assets/js/4475.f1641a0c.js @@ -0,0 +1,2 @@ +/*! For license information please see 4475.f1641a0c.js.LICENSE.txt */ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4475],{953:function(e,t,n){n.d(t,{C4:function(){return g},EW:function(){return Ce},Gc:function(){return he},IG:function(){return ke},IJ:function(){return Le},KR:function(){return Me},Kh:function(){return fe},Pr:function(){return We},QW:function(){return Fe},R1:function(){return $e},X2:function(){return u},bl:function(){return y},fE:function(){return ye},g8:function(){return ve},hZ:function(){return M},i9:function(){return Oe},jr:function(){return l},ju:function(){return be},o5:function(){return a},rY:function(){return De},tB:function(){return me},u4:function(){return O},ux:function(){return we},yC:function(){return i}});var r=n(33);let o,s;class i{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=o,!e&&o&&(this.index=(o.scopes||(o.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=o;try{return o=this,e()}finally{o=t}}}on(){o=this}off(){o=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t=4))break}1===this._dirtyLevel&&(this._dirtyLevel=0),y()}return this._dirtyLevel>=4}set dirty(e){this._dirtyLevel=e?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=m,t=s;try{return m=!0,s=this,this._runnings++,d(this),this.fn()}finally{f(this),this._runnings--,s=t,m=e}}stop(){var e;this.active&&(d(this),f(this),null==(e=this.onStop)||e.call(this),this.active=!1)}}function c(e){return e.value}function d(e){e._trackId++,e._depsLength=0}function f(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},C=new WeakMap,T=Symbol(""),x=Symbol("");function O(e,t,n){if(m&&s){let t=C.get(e);t||C.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=_((()=>t.delete(n)))),k(s,r)}}function M(e,t,n,o,s,i){const a=C.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&(0,r.cy)(e)){const e=Number(o);a.forEach(((t,n)=>{("length"===n||!(0,r.Bm)(n)&&n>=e)&&l.push(t)}))}else switch(void 0!==n&&l.push(a.get(n)),t){case"add":(0,r.cy)(e)?(0,r.yI)(n)&&l.push(a.get("length")):(l.push(a.get(T)),(0,r.CE)(e)&&l.push(a.get(x)));break;case"delete":(0,r.cy)(e)||(l.push(a.get(T)),(0,r.CE)(e)&&l.push(a.get(x)));break;case"set":(0,r.CE)(e)&&l.push(a.get(T))}b();for(const e of l)e&&S(e,4);w()}const L=(0,r.pD)("__proto__,__v_isRef,__isVue"),N=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(r.Bm)),R=$();function $(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=we(this);for(let e=0,t=this.length;e{e[t]=function(...e){g(),b();const n=we(this)[t].apply(this,e);return w(),y(),n}})),e}function I(e){const t=we(this);return O(t,0,e),t.hasOwnProperty(e)}class W{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){const o=this._isReadonly,s=this._isShallow;if("__v_isReactive"===t)return!o;if("__v_isReadonly"===t)return o;if("__v_isShallow"===t)return s;if("__v_raw"===t)return n===(o?s?de:ce:s?ue:le).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const i=(0,r.cy)(e);if(!o){if(i&&(0,r.$3)(R,t))return Reflect.get(R,t,n);if("hasOwnProperty"===t)return I}const a=Reflect.get(e,t,n);return((0,r.Bm)(t)?N.has(t):L(t))?a:(o||O(e,0,t),s?a:Oe(a)?i&&(0,r.yI)(t)?a:a.value:(0,r.Gv)(a)?o?me(a):fe(a):a)}}class A extends W{constructor(e=!1){super(!1,e)}set(e,t,n,o){let s=e[t];if(!this._isShallow){const t=ge(s);if(ye(n)||ge(n)||(s=we(s),n=we(n)),!(0,r.cy)(e)&&Oe(s)&&!Oe(n))return!t&&(s.value=n,!0)}const i=(0,r.cy)(e)&&(0,r.yI)(t)?Number(t)e,P=e=>Reflect.getPrototypeOf(e);function Z(e,t,n=!1,o=!1){const s=we(e=e.__v_raw),i=we(t);n||((0,r.$H)(t,i)&&O(s,0,t),O(s,0,i));const{has:a}=P(s),l=o?j:n?Se:Ee;return a.call(s,t)?l(e.get(t)):a.call(s,i)?l(e.get(i)):void(e!==s&&e.get(t))}function B(e,t=!1){const n=this.__v_raw,o=we(n),s=we(e);return t||((0,r.$H)(e,s)&&O(o,0,e),O(o,0,s)),e===s?n.has(e):n.has(e)||n.has(s)}function U(e,t=!1){return e=e.__v_raw,!t&&O(we(e),0,T),Reflect.get(e,"size",e)}function q(e){e=we(e);const t=we(this);return P(t).has.call(t,e)||(t.add(e),M(t,"add",e,e)),this}function H(e,t){t=we(t);const n=we(this),{has:o,get:s}=P(n);let i=o.call(n,e);i||(e=we(e),i=o.call(n,e));const a=s.call(n,e);return n.set(e,t),i?(0,r.$H)(t,a)&&M(n,"set",e,t):M(n,"add",e,t),this}function G(e){const t=we(this),{has:n,get:r}=P(t);let o=n.call(t,e);o||(e=we(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&M(t,"delete",e,void 0),s}function K(){const e=we(this),t=0!==e.size,n=e.clear();return t&&M(e,"clear",void 0,void 0),n}function X(e,t){return function(n,r){const o=this,s=o.__v_raw,i=we(s),a=t?j:e?Se:Ee;return!e&&O(i,0,T),s.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function Y(e,t,n){return function(...o){const s=this.__v_raw,i=we(s),a=(0,r.CE)(i),l="entries"===e||e===Symbol.iterator&&a,u="keys"===e&&a,c=s[e](...o),d=n?j:t?Se:Ee;return!t&&O(i,0,u?x:T),{next(){const{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function Q(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function J(){const e={get(e){return Z(this,e)},get size(){return U(this)},has:B,add:q,set:H,delete:G,clear:K,forEach:X(!1,!1)},t={get(e){return Z(this,e,!1,!0)},get size(){return U(this)},has:B,add:q,set:H,delete:G,clear:K,forEach:X(!1,!0)},n={get(e){return Z(this,e,!0)},get size(){return U(this,!0)},has(e){return B.call(this,e,!0)},add:Q("add"),set:Q("set"),delete:Q("delete"),clear:Q("clear"),forEach:X(!0,!1)},r={get(e){return Z(this,e,!0,!0)},get size(){return U(this,!0)},has(e){return B.call(this,e,!0)},add:Q("add"),set:Q("set"),delete:Q("delete"),clear:Q("clear"),forEach:X(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=Y(o,!1,!1),n[o]=Y(o,!0,!1),t[o]=Y(o,!1,!0),r[o]=Y(o,!0,!0)})),[e,n,t,r]}const[ee,te,ne,re]=J();function oe(e,t){const n=t?e?re:ne:e?te:ee;return(t,o,s)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.$3)(n,o)&&o in t?n:t,o,s)}const se={get:oe(!1,!1)},ie={get:oe(!1,!0)},ae={get:oe(!0,!1)},le=new WeakMap,ue=new WeakMap,ce=new WeakMap,de=new WeakMap;function fe(e){return ge(e)?e:pe(e,!1,F,se,le)}function he(e){return pe(e,!1,z,ie,ue)}function me(e){return pe(e,!0,V,ae,ce)}function pe(e,t,n,o,s){if(!(0,r.Gv)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,r.Zf)(l));var l;if(0===a)return e;const u=new Proxy(e,2===a?o:n);return s.set(e,u),u}function ve(e){return ge(e)?ve(e.__v_raw):!(!e||!e.__v_isReactive)}function ge(e){return!(!e||!e.__v_isReadonly)}function ye(e){return!(!e||!e.__v_isShallow)}function be(e){return ve(e)||ge(e)}function we(e){const t=e&&e.__v_raw;return t?we(t):e}function ke(e){return Object.isExtensible(e)&&(0,r.yQ)(e,"__v_skip",!0),e}const Ee=e=>(0,r.Gv)(e)?fe(e):e,Se=e=>(0,r.Gv)(e)?me(e):e;class _e{constructor(e,t,n,r){this.getter=e,this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new u((()=>e(this._value)),(()=>xe(this,2===this.effect._dirtyLevel?2:3))),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=we(this);return e._cacheable&&!e.effect.dirty||!(0,r.$H)(e._value,e._value=e.effect.run())||xe(e,4),Te(e),e.effect._dirtyLevel>=2&&xe(e,2),e._value}set value(e){this._setter(e)}get _dirty(){return this.effect.dirty}set _dirty(e){this.effect.dirty=e}}function Ce(e,t,n=!1){let o,s;const i=(0,r.Tn)(e);return i?(o=e,s=r.tE):(o=e.get,s=e.set),new _e(o,s,i||!s,n)}function Te(e){var t;m&&s&&(e=we(e),k(s,null!=(t=e.dep)?t:e.dep=_((()=>e.dep=void 0),e instanceof _e?e:void 0)))}function xe(e,t=4,n){const r=(e=we(e)).dep;r&&S(r,t)}function Oe(e){return!(!e||!0!==e.__v_isRef)}function Me(e){return Ne(e,!1)}function Le(e){return Ne(e,!0)}function Ne(e,t){return Oe(e)?e:new Re(e,t)}class Re{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:we(e),this._value=t?e:Ee(e)}get value(){return Te(this),this._value}set value(e){const t=this.__v_isShallow||ye(e)||ge(e);e=t?e:we(e),(0,r.$H)(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Ee(e),xe(this,4))}}function $e(e){return Oe(e)?e.value:e}const Ie={get:(e,t,n)=>$e(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Oe(o)&&!Oe(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function We(e){return ve(e)?e:new Proxy(e,Ie)}class Ae{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Te(this)),(()=>xe(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function De(e){return new Ae(e)}function Fe(e){const t=(0,r.cy)(e)?new Array(e.length):{};for(const n in e)t[n]=ze(e,n);return t}class Ve{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return e=we(this._object),t=this._key,null==(n=C.get(e))?void 0:n.get(t);var e,t,n}}function ze(e,t,n){const r=e[t];return Oe(r)?r:new Ve(e,t,n)}},641:function(e,t,n){n.d(t,{$V:function(){return fe},$u:function(){return _e},CE:function(){return zt},Df:function(){return ue},EW:function(){return wn},FK:function(){return Lt},Fv:function(){return Yt},Gt:function(){return et},Gy:function(){return ee},K9:function(){return Et},Lk:function(){return Ht},MZ:function(){return le},OW:function(){return se},Q3:function(){return Qt},QP:function(){return ne},RG:function(){return Re},WQ:function(){return tt},Wv:function(){return jt},bF:function(){return Gt},bo:function(){return X},ci:function(){return St},dY:function(){return g},eW:function(){return Xt},g2:function(){return D},h:function(){return kn},hi:function(){return Te},k6:function(){return N},nI:function(){return ln},nT:function(){return Z},pI:function(){return Ne},pM:function(){return ce},pR:function(){return re},qL:function(){return i},sV:function(){return Ee},uX:function(){return At},v6:function(){return nn},wB:function(){return U},xo:function(){return Ce}});var r=n(953),o=n(33);function s(e,t,n,r){try{return r?e(...r):e()}catch(e){a(e,t,n)}}function i(e,t,n,r){if((0,o.Tn)(e)){const i=s(e,t,n,r);return i&&(0,o.yL)(i)&&i.catch((e=>{a(e,t,n)})),i}const l=[];for(let o=0;o>>1,o=c[r],s=E(o);sE(e)-E(t)));if(f.length=0,h)return void h.push(...e);for(h=e,m=0;mnull==e.id?1/0:e.id,S=(e,t)=>{const n=E(e)-E(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function _(e){u=!1,l=!0,c.sort(S),o.tE;try{for(d=0;d(0,o.Kg)(e)?e.trim():e))),t&&(s=n.map(o.bB))}let u,c=r[u=(0,o.rU)(t)]||r[u=(0,o.rU)((0,o.PT)(t))];!c&&a&&(c=r[u=(0,o.rU)((0,o.Tg)(t))]),c&&i(c,e,6,s);const d=r[u+"Once"];if(d){if(e.emitted){if(e.emitted[u])return}else e.emitted={};e.emitted[u]=!0,i(d,e,6,s)}}function T(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(void 0!==s)return s;const i=e.emits;let a={},l=!1;if(!(0,o.Tn)(e)){const r=e=>{const n=T(e,t,!0);n&&(l=!0,(0,o.X$)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return i||l?((0,o.cy)(i)?i.forEach((e=>a[e]=null)):(0,o.X$)(a,i),(0,o.Gv)(e)&&r.set(e,a),a):((0,o.Gv)(e)&&r.set(e,null),null)}function x(e,t){return!(!e||!(0,o.Mp)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.$3)(e,t[0].toLowerCase()+t.slice(1))||(0,o.$3)(e,(0,o.Tg)(t))||(0,o.$3)(e,t))}let O=null,M=null;function L(e){const t=O;return O=e,M=e&&e.type.__scopeId||null,t}function N(e,t=O,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&Ft(-1);const o=L(t);let s;try{s=e(...n)}finally{L(o),r._d&&Ft(1)}return s};return r._n=!0,r._c=!0,r._d=!0,r}function R(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:i,propsOptions:[l],slots:u,attrs:c,emit:d,render:f,renderCache:h,data:m,setupState:p,ctx:v,inheritAttrs:g}=e;let y,b;const w=L(e);try{if(4&n.shapeFlag){const e=s||r,t=e;y=Jt(f.call(t,e,h,i,p,m,v)),b=c}else{const e=t;y=Jt(e.length>1?e(i,{attrs:c,slots:u,emit:d}):e(i,null)),b=t.props?c:$(c)}}catch(t){It.length=0,a(t,e,1),y=Gt(Rt)}let k=y;if(b&&!1!==g){const e=Object.keys(b),{shapeFlag:t}=k;e.length&&7&t&&(l&&e.some(o.CP)&&(b=I(b,l)),k=Kt(k,b))}return n.dirs&&(k=Kt(k),k.dirs=k.dirs?k.dirs.concat(n.dirs):n.dirs),n.transition&&(k.transition=n.transition),y=k,L(w),y}const $=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,o.Mp)(n))&&((t||(t={}))[n]=e[n]);return t},I=(e,t)=>{const n={};for(const r in e)(0,o.CP)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function W(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;ott(j);function Z(e,t){return q(e,null,t)}const B={};function U(e,t,n){return q(e,t,n)}function q(e,t,{immediate:n,deep:a,flush:l,once:u,onTrack:c,onTrigger:d}=o.MZ){if(t&&u){const e=t;t=(...t)=>{e(...t),T()}}const f=an,h=e=>!0===a?e:K(e,!1===a?1:void 0);let m,p,v=!1,g=!1;if((0,r.i9)(e)?(m=()=>e.value,v=(0,r.fE)(e)):(0,r.g8)(e)?(m=()=>h(e),v=!0):(0,o.cy)(e)?(g=!0,v=e.some((e=>(0,r.g8)(e)||(0,r.fE)(e))),m=()=>e.map((e=>(0,r.i9)(e)?e.value:(0,r.g8)(e)?h(e):(0,o.Tn)(e)?s(e,f,2):void 0))):m=(0,o.Tn)(e)?t?()=>s(e,f,2):()=>(p&&p(),i(e,f,3,[w])):o.tE,t&&a){const e=m;m=()=>K(e())}let b,w=e=>{p=_.onStop=()=>{s(e,f,4),p=_.onStop=void 0}};if(vn){if(w=o.tE,t?n&&i(t,f,3,[m(),g?[]:void 0,w]):m(),"sync"!==l)return o.tE;{const e=P();b=e.__watcherHandles||(e.__watcherHandles=[])}}let k=g?new Array(e.length).fill(B):B;const E=()=>{if(_.active&&_.dirty)if(t){const e=_.run();(a||v||(g?e.some(((e,t)=>(0,o.$H)(e,k[t]))):(0,o.$H)(e,k)))&&(p&&p(),i(t,f,3,[e,k===B?void 0:g&&k[0]===B?[]:k,w]),k=e)}else _.run()};let S;E.allowRecurse=!!t,"sync"===l?S=E:"post"===l?S=()=>kt(E,f&&f.suspense):(E.pre=!0,f&&(E.id=f.uid),S=()=>y(E));const _=new r.X2(m,o.tE,S),C=(0,r.o5)(),T=()=>{_.stop(),C&&(0,o.TF)(C.effects,_)};return t?n?E():k=_.run():"post"===l?kt(_.run.bind(_),f&&f.suspense):_.run(),b&&b.push(T),T}function H(e,t,n){const r=this.proxy,s=(0,o.Kg)(e)?e.includes(".")?G(r,e):()=>r[e]:e.bind(r,r);let i;(0,o.Tn)(t)?i=t:(i=t.handler,n=t);const a=dn(this),l=q(s,i.bind(r),n);return a(),l}function G(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e0){if(n>=t)return e;n++}if((s=s||new Set).has(e))return e;if(s.add(e),(0,r.i9)(e))K(e.value,t,n,s);else if((0,o.cy)(e))for(let r=0;r{K(e,t,n,s)}));else if((0,o.Qd)(e))for(const r in e)K(e[r],t,n,s);return e}function X(e,t){if(null===O)return e;const n=bn(O)||O.proxy,r=e.dirs||(e.dirs=[]);for(let e=0;e{e.isMounted=!0})),Ce((()=>{e.isUnmounting=!0})),e}const te=[Function,Array],ne={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:te,onEnter:te,onAfterEnter:te,onEnterCancelled:te,onBeforeLeave:te,onLeave:te,onAfterLeave:te,onLeaveCancelled:te,onBeforeAppear:te,onAppear:te,onAfterAppear:te,onAppearCancelled:te},re={name:"BaseTransition",props:ne,setup(e,{slots:t}){const n=ln(),o=ee();return()=>{const s=t.default&&ue(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){let e=!1;for(const t of s)if(t.type!==Rt){i=t,e=!0;break}}const a=(0,r.ux)(e),{mode:l}=a;if(o.isLeaving)return ie(i);const u=ae(i);if(!u)return ie(i);const c=se(u,a,o,n);le(u,c);const d=n.subTree,f=d&&ae(d);if(f&&f.type!==Rt&&!Zt(u,f)){const e=se(f,a,o,n);if(le(f,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,!1!==n.update.active&&(n.effect.dirty=!0,n.update())},ie(i);"in-out"===l&&u.type!==Rt&&(e.delayLeave=(e,t,n)=>{oe(o,f)[String(f.key)]=f,e[Q]=()=>{t(),e[Q]=void 0,delete c.delayedLeave},c.delayedLeave=n})}return i}}};function oe(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function se(e,t,n,r){const{appear:s,mode:a,persisted:l=!1,onBeforeEnter:u,onEnter:c,onAfterEnter:d,onEnterCancelled:f,onBeforeLeave:h,onLeave:m,onAfterLeave:p,onLeaveCancelled:v,onBeforeAppear:g,onAppear:y,onAfterAppear:b,onAppearCancelled:w}=t,k=String(e.key),E=oe(n,e),S=(e,t)=>{e&&i(e,r,9,t)},_=(e,t)=>{const n=t[1];S(e,t),(0,o.cy)(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},C={mode:a,persisted:l,beforeEnter(t){let r=u;if(!n.isMounted){if(!s)return;r=g||u}t[Q]&&t[Q](!0);const o=E[k];o&&Zt(e,o)&&o.el[Q]&&o.el[Q](),S(r,[t])},enter(e){let t=c,r=d,o=f;if(!n.isMounted){if(!s)return;t=y||c,r=b||d,o=w||f}let i=!1;const a=e[J]=t=>{i||(i=!0,S(t?o:r,[e]),C.delayedLeave&&C.delayedLeave(),e[J]=void 0)};t?_(t,[e,a]):a()},leave(t,r){const o=String(e.key);if(t[J]&&t[J](!0),n.isUnmounting)return r();S(h,[t]);let s=!1;const i=t[Q]=n=>{s||(s=!0,r(),S(n?v:p,[t]),t[Q]=void 0,E[o]===e&&delete E[o])};E[o]=e,m?_(m,[t,i]):i()},clone(e){return se(e,t,n,r)}};return C}function ie(e){if(me(e))return(e=Kt(e)).children=null,e}function ae(e){return me(e)?e.children?e.children[0]:void 0:e}function le(e,t){6&e.shapeFlag&&e.component?le(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ue(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let e=0;e(0,o.X$)({name:e.name},t,{setup:e}))():e}const de=e=>!!e.type.__asyncLoader;function fe(e){(0,o.Tn)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:i=200,timeout:l,suspensible:u=!0,onError:c}=e;let d,f=null,h=0;const m=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,f=null,m()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),d=t,t))))};return ce({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return d},setup(){const e=an;if(d)return()=>he(d,e);const t=t=>{f=null,a(t,e,13,!s)};if(u&&e.suspense||vn)return m().then((t=>()=>he(t,e))).catch((e=>(t(e),()=>s?Gt(s,{error:e}):null)));const o=(0,r.KR)(!1),c=(0,r.KR)(),h=(0,r.KR)(!!i);return i&&setTimeout((()=>{h.value=!1}),i),null!=l&&setTimeout((()=>{if(!o.value&&!c.value){const e=new Error(`Async component timed out after ${l}ms.`);t(e),c.value=e}}),l),m().then((()=>{o.value=!0,e.parent&&me(e.parent.vnode)&&(e.parent.effect.dirty=!0,y(e.parent.update))})).catch((e=>{t(e),c.value=e})),()=>o.value&&d?he(d,e):c.value&&s?Gt(s,{error:c.value}):n&&!h.value?Gt(n):void 0}})}function he(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=Gt(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const me=e=>e.type.__isKeepAlive;function pe(e,t){ge(e,"a",t)}function ve(e,t){ge(e,"da",t)}function ge(e,t,n=an){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(be(t,r,n),n){let e=n.parent;for(;e&&e.parent;)me(e.parent.vnode)&&ye(r,t,n,e),e=e.parent}}function ye(e,t,n,r){const s=be(t,e,r,!0);Te((()=>{(0,o.TF)(r[t],s)}),n)}function be(e,t,n=an,o=!1){if(n){const s=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;(0,r.C4)();const s=dn(n),a=i(t,n,e,o);return s(),(0,r.bl)(),a});return o?s.unshift(a):s.push(a),a}}RegExp,RegExp;const we=e=>(t,n=an)=>(!vn||"sp"===e)&&be(e,((...e)=>t(...e)),n),ke=we("bm"),Ee=we("m"),Se=we("bu"),_e=we("u"),Ce=we("bum"),Te=we("um"),xe=we("sp"),Oe=we("rtg"),Me=we("rtc");function Le(e,t=an){be("ec",e,t)}function Ne(e,t,n,r){let s;const i=n&&n[r];if((0,o.cy)(e)||(0,o.Kg)(e)){s=new Array(e.length);for(let n=0,r=e.length;nt(e,n,void 0,i&&i[n])));else{const n=Object.keys(e);s=new Array(n.length);for(let r=0,o=n.length;r!Pt(e)||e.type!==Rt&&!(e.type===Lt&&!$e(e.children))))?e:null}const Ie=e=>e?hn(e)?bn(e)||e.proxy:Ie(e.parent):null,We=(0,o.X$)(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ie(e.parent),$root:e=>Ie(e.root),$emit:e=>e.emit,$options:e=>Pe(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,y(e.update)}),$nextTick:e=>e.n||(e.n=g.bind(e.proxy)),$watch:e=>H.bind(e)}),Ae=(e,t)=>e!==o.MZ&&!e.__isScriptSetup&&(0,o.$3)(e,t),De={get({_:e},t){const{ctx:n,setupState:s,data:i,props:a,accessCache:l,type:u,appContext:c}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return a[t]}else{if(Ae(s,t))return l[t]=1,s[t];if(i!==o.MZ&&(0,o.$3)(i,t))return l[t]=2,i[t];if((d=e.propsOptions[0])&&(0,o.$3)(d,t))return l[t]=3,a[t];if(n!==o.MZ&&(0,o.$3)(n,t))return l[t]=4,n[t];Ve&&(l[t]=0)}}const f=We[t];let h,m;return f?("$attrs"===t&&(0,r.u4)(e,"get",t),f(e)):(h=u.__cssModules)&&(h=h[t])?h:n!==o.MZ&&(0,o.$3)(n,t)?(l[t]=4,n[t]):(m=c.config.globalProperties,(0,o.$3)(m,t)?m[t]:void 0)},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return Ae(s,t)?(s[t]=n,!0):r!==o.MZ&&(0,o.$3)(r,t)?(r[t]=n,!0):!((0,o.$3)(e.props,t)||"$"===t[0]&&t.slice(1)in e||(i[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},a){let l;return!!n[a]||e!==o.MZ&&(0,o.$3)(e,a)||Ae(t,a)||(l=i[0])&&(0,o.$3)(l,a)||(0,o.$3)(r,a)||(0,o.$3)(We,a)||(0,o.$3)(s.config.globalProperties,a)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:(0,o.$3)(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Fe(e){return(0,o.cy)(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}let Ve=!0;function ze(e,t,n){i((0,o.cy)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function je(e,t,n,r){const s=r.includes(".")?G(n,r):()=>n[r];if((0,o.Kg)(e)){const n=t[e];(0,o.Tn)(n)&&U(s,n)}else if((0,o.Tn)(e))U(s,e.bind(n));else if((0,o.Gv)(e))if((0,o.cy)(e))e.forEach((e=>je(e,t,n,r)));else{const r=(0,o.Tn)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.Tn)(r)&&U(s,r,e)}}function Pe(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,l=i.get(t);let u;return l?u=l:s.length||n||r?(u={},s.length&&s.forEach((e=>Ze(u,e,a,!0))),Ze(u,t,a)):u=t,(0,o.Gv)(t)&&i.set(t,u),u}function Ze(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ze(e,s,n,!0),o&&o.forEach((t=>Ze(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=Be[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const Be={data:Ue,props:Ke,emits:Ke,methods:Ge,computed:Ge,beforeCreate:He,created:He,beforeMount:He,mounted:He,beforeUpdate:He,updated:He,beforeDestroy:He,beforeUnmount:He,destroyed:He,unmounted:He,activated:He,deactivated:He,errorCaptured:He,serverPrefetch:He,components:Ge,directives:Ge,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,o.X$)(Object.create(null),e);for(const r in t)n[r]=He(e[r],t[r]);return n},provide:Ue,inject:function(e,t){return Ge(qe(e),qe(t))}};function Ue(e,t){return t?e?function(){return(0,o.X$)((0,o.Tn)(e)?e.call(this,this):e,(0,o.Tn)(t)?t.call(this,this):t)}:t:e}function qe(e){if((0,o.cy)(e)){const t={};for(let n=0;n1)return n&&(0,o.Tn)(t)?t.call(r&&r.proxy):t}}function nt(e,t,n,s){const[i,a]=e.propsOptions;let l,u=!1;if(t)for(let r in t){if((0,o.SU)(r))continue;const c=t[r];let d;i&&(0,o.$3)(i,d=(0,o.PT)(r))?a&&a.includes(d)?(l||(l={}))[d]=c:n[d]=c:x(e.emitsOptions,r)||r in s&&c===s[r]||(s[r]=c,u=!0)}if(a){const t=(0,r.ux)(n),s=l||o.MZ;for(let r=0;r{u=!0;const[n,r]=ot(e,t,!0);(0,o.X$)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!i&&!u)return(0,o.Gv)(e)&&r.set(e,o.Oj),o.Oj;if((0,o.cy)(i))for(let e=0;e-1,r[1]=n<0||e-1||(0,o.$3)(r,"default"))&&l.push(t)}}}const c=[a,l];return(0,o.Gv)(e)&&r.set(e,c),c}function st(e){return"$"!==e[0]&&!(0,o.SU)(e)}function it(e){return null===e?"null":"function"==typeof e?e.name||"":"object"==typeof e&&e.constructor&&e.constructor.name||""}function at(e,t){return it(e)===it(t)}function lt(e,t){return(0,o.cy)(t)?t.findIndex((t=>at(t,e))):(0,o.Tn)(t)&&at(t,e)?0:-1}const ut=e=>"_"===e[0]||"$stable"===e,ct=e=>(0,o.cy)(e)?e.map(Jt):[Jt(e)],dt=(e,t,n)=>{if(t._n)return t;const r=N(((...e)=>ct(t(...e))),n);return r._c=!1,r},ft=(e,t,n)=>{const r=e._ctx;for(const n in e){if(ut(n))continue;const s=e[n];if((0,o.Tn)(s))t[n]=dt(0,s,r);else if(null!=s){const e=ct(s);t[n]=()=>e}}},ht=(e,t)=>{const n=ct(t);e.slots.default=()=>n},mt=(e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,r.ux)(t),(0,o.yQ)(t,"_",n)):ft(t,e.slots={})}else e.slots={},t&&ht(e,t);(0,o.yQ)(e.slots,Bt,1)},pt=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,a=o.MZ;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:((0,o.X$)(s,t),n||1!==e||delete s._):(i=!t.$stable,ft(t,s)),a=t}else t&&(ht(e,t),a={default:1});if(i)for(const e in s)ut(e)||null!=a[e]||delete s[e]};function vt(e,t,n,i,a=!1){if((0,o.cy)(e))return void e.forEach(((e,r)=>vt(e,t&&((0,o.cy)(t)?t[r]:t),n,i,a)));if(de(i)&&!a)return;const l=4&i.shapeFlag?bn(i.component)||i.component.proxy:i.el,u=a?null:l,{i:c,r:d}=e,f=t&&t.r,h=c.refs===o.MZ?c.refs={}:c.refs,m=c.setupState;if(null!=f&&f!==d&&((0,o.Kg)(f)?(h[f]=null,(0,o.$3)(m,f)&&(m[f]=null)):(0,r.i9)(f)&&(f.value=null)),(0,o.Tn)(d))s(d,c,12,[u,h]);else{const t=(0,o.Kg)(d),s=(0,r.i9)(d);if(t||s){const r=()=>{if(e.f){const n=t?(0,o.$3)(m,d)?m[d]:h[d]:d.value;a?(0,o.cy)(n)&&(0,o.TF)(n,l):(0,o.cy)(n)?n.includes(l)||n.push(l):t?(h[d]=[l],(0,o.$3)(m,d)&&(m[d]=h[d])):(d.value=[l],e.k&&(h[e.k]=d.value))}else t?(h[d]=u,(0,o.$3)(m,d)&&(m[d]=u)):s&&(d.value=u,e.k&&(h[e.k]=u))};u?(r.id=-1,kt(r,n)):r()}}}let gt=!1;const yt=e=>(e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName)(e)?"svg":(e=>e.namespaceURI.includes("MathML"))(e)?"mathml":void 0,bt=e=>8===e.nodeType;function wt(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:a,remove:l,insert:u,createComment:c}}=e,d=(n,r,o,l,c,b=!1)=>{const w=bt(n)&&"["===n.data,k=()=>p(n,r,o,l,c,w),{type:E,ref:S,shapeFlag:_,patchFlag:C}=r;let T=n.nodeType;r.el=n,-2===C&&(b=!1,r.dynamicChildren=null);let x=null;switch(E){case Nt:3!==T?""===r.children?(u(r.el=s(""),a(n),n),x=n):x=k():(n.data!==r.children&&(gt=!0,n.data=r.children),x=i(n));break;case Rt:y(n)?(x=i(n),g(r.el=n.content.firstChild,n,o)):x=8!==T||w?k():i(n);break;case $t:if(w&&(T=(n=i(n)).nodeType),1===T||3===T){x=n;const e=!r.children.length;for(let t=0;t{a=a||!!t.dynamicChildren;const{type:u,props:c,patchFlag:d,shapeFlag:f,dirs:m,transition:p}=t,v="input"===u||"option"===u;if(v||-1!==d){m&&Y(t,null,n,"created");let u,b=!1;if(y(e)){b=xt(s,p)&&n&&n.vnode.props&&n.vnode.props.appear;const r=e.content.firstChild;b&&p.beforeEnter(r),g(r,e,n),t.el=e=r}if(16&f&&(!c||!c.innerHTML&&!c.textContent)){let r=h(e.firstChild,t,e,n,s,i,a);for(;r;){gt=!0;const e=r;r=r.nextSibling,l(e)}}else 8&f&&e.textContent!==t.children&&(gt=!0,e.textContent=t.children);if(c)if(v||!a||48&d)for(const t in c)(v&&(t.endsWith("value")||"indeterminate"===t)||(0,o.Mp)(t)&&!(0,o.SU)(t)||"."===t[0])&&r(e,t,null,c[t],void 0,void 0,n);else c.onClick&&r(e,"onClick",null,c.onClick,void 0,void 0,n);(u=c&&c.onVnodeBeforeMount)&&rn(u,n,t),m&&Y(t,null,n,"beforeMount"),((u=c&&c.onVnodeMounted)||m||b)&&z((()=>{u&&rn(u,n,t),b&&p.enter(e),m&&Y(t,null,n,"mounted")}),s)}return e.nextSibling},h=(e,t,r,o,s,i,a)=>{a=a||!!t.dynamicChildren;const l=t.children,u=l.length;for(let t=0;t{const{slotScopeIds:l}=t;l&&(o=o?o.concat(l):l);const d=a(e),f=h(i(e),t,d,n,r,o,s);return f&&bt(f)&&"]"===f.data?i(t.anchor=f):(gt=!0,u(t.anchor=c("]"),d,f),f)},p=(e,t,r,o,s,u)=>{if(gt=!0,t.el=null,u){const t=v(e);for(;;){const n=i(e);if(!n||n===t)break;l(n)}}const c=i(e),d=a(e);return l(e),n(null,t,d,c,r,o,yt(d),s),c},v=(e,t="[",n="]")=>{let r=0;for(;e;)if((e=i(e))&&bt(e)&&(e.data===t&&r++,e.data===n)){if(0===r)return i(e);r--}return e},g=(e,t,n)=>{const r=t.parentNode;r&&r.replaceChild(e,t);let o=n;for(;o;)o.vnode.el===t&&(o.vnode.el=o.subTree.el=e),o=o.parent},y=e=>1===e.nodeType&&"template"===e.tagName.toLowerCase();return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),k(),void(t._vnode=e);gt=!1,d(t.firstChild,e,null,null,null),k(),t._vnode=e,gt&&console.error("Hydration completed but contains mismatches.")},d]}const kt=z;function Et(e){return _t(e)}function St(e){return _t(e,wt)}function _t(e,t){(0,o.We)().__VUE__=!0;const{insert:n,remove:i,patchProp:l,createElement:u,createText:f,createComment:h,setText:m,setElementText:p,parentNode:v,nextSibling:g,setScopeId:b=o.tE,insertStaticContent:E}=e,S=(e,t,n,r=null,o=null,s=null,i=void 0,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Zt(e,t)&&(r=te(e),K(e,o,s,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:u,ref:c,shapeFlag:d}=t;switch(u){case Nt:_(e,t,n,r);break;case Rt:O(e,t,n,r);break;case $t:null==e&&M(t,n,r,i);break;case Lt:V(e,t,n,r,o,s,i,a,l);break;default:1&d?L(e,t,n,r,o,s,i,a,l):6&d?z(e,t,n,r,o,s,i,a,l):(64&d||128&d)&&u.process(e,t,n,r,o,s,i,a,l,oe)}null!=c&&o&&vt(c,e&&e.ref,s,t||e,!t)},_=(e,t,r,o)=>{if(null==e)n(t.el=f(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&m(n,t.children)}},O=(e,t,r,o)=>{null==e?n(t.el=h(t.children||""),r,o):t.el=e.el},M=(e,t,n,r)=>{[e.el,e.anchor]=E(e.children,t,n,r,e.el,e.anchor)},L=(e,t,n,r,o,s,i,a,l)=>{"svg"===t.type?i="svg":"math"===t.type&&(i="mathml"),null==e?N(t,n,r,o,s,i,a,l):A(e,t,o,s,i,a,l)},N=(e,t,r,s,i,a,c,d)=>{let f,h;const{props:m,shapeFlag:v,transition:g,dirs:y}=e;if(f=e.el=u(e.type,a,m&&m.is,m),8&v?p(f,e.children):16&v&&I(e.children,f,null,s,i,Ct(e,a),c,d),y&&Y(e,null,s,"created"),$(f,e,e.scopeId,c,s),m){for(const t in m)"value"===t||(0,o.SU)(t)||l(f,t,null,m[t],a,e.children,s,i,ee);"value"in m&&l(f,"value",null,m.value,a),(h=m.onVnodeBeforeMount)&&rn(h,s,e)}y&&Y(e,null,s,"beforeMount");const b=xt(i,g);b&&g.beforeEnter(f),n(f,t,r),((h=m&&m.onVnodeMounted)||b||y)&&kt((()=>{h&&rn(h,s,e),b&&g.enter(f),y&&Y(e,null,s,"mounted")}),i)},$=(e,t,n,r,o)=>{if(n&&b(e,n),r)for(let t=0;t{for(let u=l;u{const u=t.el=e.el;let{patchFlag:c,dynamicChildren:d,dirs:f}=t;c|=16&e.patchFlag;const h=e.props||o.MZ,m=t.props||o.MZ;let v;if(n&&Tt(n,!1),(v=m.onVnodeBeforeUpdate)&&rn(v,n,t,e),f&&Y(t,e,n,"beforeUpdate"),n&&Tt(n,!0),d?D(e.dynamicChildren,d,u,n,r,Ct(t,s),i):a||U(e,t,u,null,n,r,Ct(t,s),i,!1),c>0){if(16&c)F(u,t,h,m,n,r,s);else if(2&c&&h.class!==m.class&&l(u,"class",null,m.class,s),4&c&&l(u,"style",h.style,m.style,s),8&c){const o=t.dynamicProps;for(let t=0;t{v&&rn(v,n,t,e),f&&Y(t,e,n,"updated")}),r)},D=(e,t,n,r,o,s,i)=>{for(let a=0;a{if(n!==r){if(n!==o.MZ)for(const u in n)(0,o.SU)(u)||u in r||l(e,u,n[u],null,a,t.children,s,i,ee);for(const u in r){if((0,o.SU)(u))continue;const c=r[u],d=n[u];c!==d&&"value"!==u&&l(e,u,d,c,a,t.children,s,i,ee)}"value"in r&&l(e,"value",n.value,r.value,a)}},V=(e,t,r,o,s,i,a,l,u)=>{const c=t.el=e?e.el:f(""),d=t.anchor=e?e.anchor:f("");let{patchFlag:h,dynamicChildren:m,slotScopeIds:p}=t;p&&(l=l?l.concat(p):p),null==e?(n(c,r,o),n(d,r,o),I(t.children||[],r,d,s,i,a,l,u)):h>0&&64&h&&m&&e.dynamicChildren?(D(e.dynamicChildren,m,r,s,i,a,l),(null!=t.key||s&&t===s.subTree)&&Ot(e,t,!0)):U(e,t,r,d,s,i,a,l,u)},z=(e,t,n,r,o,s,i,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,i,l):j(t,n,r,o,s,i,l):P(e,t,l)},j=(e,t,n,i,l,u,c)=>{const d=e.component=function(e,t,n){const s=e.type,i=(t?t.appContext:e.appContext)||on,a={uid:sn++,vnode:e,type:s,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,scope:new r.yC(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ot(s,i),emitsOptions:T(s,i),emit:null,emitted:null,propsDefaults:o.MZ,inheritAttrs:s.inheritAttrs,ctx:o.MZ,data:o.MZ,props:o.MZ,attrs:o.MZ,slots:o.MZ,refs:o.MZ,setupState:o.MZ,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=C.bind(null,a),e.ce&&e.ce(a),a}(e,i,l);if(me(e)&&(d.ctx.renderer=oe),function(e,t=!1){t&&cn(t);const{props:n,children:i}=e.vnode,l=hn(e);!function(e,t,n,s=!1){const i={},a={};(0,o.yQ)(a,Bt,1),e.propsDefaults=Object.create(null),nt(e,t,i,a);for(const t in e.propsOptions[0])t in i||(i[t]=void 0);n?e.props=s?i:(0,r.Gc)(i):e.type.props?e.props=i:e.props=a,e.attrs=a}(e,n,l,t),mt(e,i);const u=l?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,r.IG)(new Proxy(e.ctx,De));const{setup:i}=n;if(i){const n=e.setupContext=i.length>1?function(e){const t=t=>{e.exposed=t||{}};return{get attrs(){return function(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return(0,r.u4)(e,"get","$attrs"),t[n]}}))}(e)},slots:e.slots,emit:e.emit,expose:t}}(e):null,l=dn(e);(0,r.C4)();const u=s(i,e,0,[e.props,n]);if((0,r.bl)(),l(),(0,o.yL)(u)){if(u.then(fn,fn),t)return u.then((n=>{gn(e,n,t)})).catch((t=>{a(t,e,0)}));e.asyncDep=u}else gn(e,u,t)}else yn(e,t)}(e,t):void 0;t&&cn(!1)}(d),d.asyncDep){if(l&&l.registerDep(d,Z),!e.el){const e=d.subTree=Gt(Rt);O(null,e,t,n)}}else Z(d,e,t,n,l,u,c)},P=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==i&&(r?!i||W(r,i,u):!!i);if(1024&l)return!0;if(16&l)return r?W(r,i,u):!!i;if(8&l){const e=t.dynamicProps;for(let t=0;td&&c.splice(t,1)}(r.update),r.effect.dirty=!0,r.update()}else t.el=e.el,r.vnode=t},Z=(e,t,n,s,i,a,l)=>{const u=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{const n=Mt(e);if(n)return t&&(t.el=c.el,B(e,t,l)),void n.asyncDep.then((()=>{e.isUnmounted||u()}))}let d,f=t;Tt(e,!1),t?(t.el=c.el,B(e,t,l)):t=c,n&&(0,o.DY)(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&rn(d,s,t,c),Tt(e,!0);const h=R(e),m=e.subTree;e.subTree=h,S(m,h,v(m.el),te(m),e,i,a),t.el=h.el,null===f&&function({vnode:e,parent:t},n){for(;t;){const r=t.subTree;if(r.suspense&&r.suspense.activeBranch===e&&(r.el=e.el),r!==e)break;(e=t.vnode).el=n,t=t.parent}}(e,h.el),r&&kt(r,i),(d=t.props&&t.props.onVnodeUpdated)&&kt((()=>rn(d,s,t,c)),i)}else{let r;const{el:l,props:u}=t,{bm:c,m:d,parent:f}=e,h=de(t);if(Tt(e,!1),c&&(0,o.DY)(c),!h&&(r=u&&u.onVnodeBeforeMount)&&rn(r,f,t),Tt(e,!0),l&&ie){const n=()=>{e.subTree=R(e),ie(l,e.subTree,e,i,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const r=e.subTree=R(e);S(null,r,n,s,e,i,a),t.el=r.el}if(d&&kt(d,i),!h&&(r=u&&u.onVnodeMounted)){const e=t;kt((()=>rn(r,f,e)),i)}(256&t.shapeFlag||f&&de(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&kt(e.a,i),e.isMounted=!0,t=n=s=null}},c=e.effect=new r.X2(u,o.tE,(()=>y(d)),e.scope),d=e.update=()=>{c.dirty&&c.run()};d.id=e.uid,Tt(e,!0),d()},B=(e,t,n)=>{t.component=e;const s=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,s){const{props:i,attrs:a,vnode:{patchFlag:l}}=e,u=(0,r.ux)(i),[c]=e.propsOptions;let d=!1;if(!(s||l>0)||16&l){let r;nt(e,t,i,a)&&(d=!0);for(const s in u)t&&((0,o.$3)(t,s)||(r=(0,o.Tg)(s))!==s&&(0,o.$3)(t,r))||(c?!n||void 0===n[s]&&void 0===n[r]||(i[s]=rt(c,u,s,void 0,e,!0)):delete i[s]);if(a!==u)for(const e in a)t&&(0,o.$3)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r{const u=e&&e.children,c=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:h}=t;if(f>0){if(128&f)return void H(u,d,n,r,o,s,i,a,l);if(256&f)return void q(u,d,n,r,o,s,i,a,l)}8&h?(16&c&&ee(u,o,s),d!==u&&p(n,d)):16&c?16&h?H(u,d,n,r,o,s,i,a,l):ee(u,o,s,!0):(8&c&&p(n,""),16&h&&I(d,n,r,o,s,i,a,l))},q=(e,t,n,r,s,i,a,l,u)=>{e=e||o.Oj,t=t||o.Oj;const c=e.length,d=t.length,f=Math.min(c,d);let h;for(h=0;hd?ee(e,s,i,!0,!1,f):I(t,n,r,s,i,a,l,u,f)},H=(e,t,n,r,s,i,a,l,u)=>{let c=0;const d=t.length;let f=e.length-1,h=d-1;for(;c<=f&&c<=h;){const r=e[c],o=t[c]=u?en(t[c]):Jt(t[c]);if(!Zt(r,o))break;S(r,o,n,null,s,i,a,l,u),c++}for(;c<=f&&c<=h;){const r=e[f],o=t[h]=u?en(t[h]):Jt(t[h]);if(!Zt(r,o))break;S(r,o,n,null,s,i,a,l,u),f--,h--}if(c>f){if(c<=h){const e=h+1,o=eh)for(;c<=f;)K(e[c],s,i,!0),c++;else{const m=c,p=c,v=new Map;for(c=p;c<=h;c++){const e=t[c]=u?en(t[c]):Jt(t[c]);null!=e.key&&v.set(e.key,c)}let g,y=0;const b=h-p+1;let w=!1,k=0;const E=new Array(b);for(c=0;c=b){K(r,s,i,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(g=p;g<=h;g++)if(0===E[g-p]&&Zt(r,t[g])){o=g;break}void 0===o?K(r,s,i,!0):(E[o-p]=c+1,o>=k?k=o:w=!0,S(r,t[o],n,null,s,i,a,l,u),y++)}const _=w?function(e){const t=e.slice(),n=[0];let r,o,s,i,a;const l=e.length;for(r=0;r>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}(E):o.Oj;for(g=_.length-1,c=b-1;c>=0;c--){const e=p+c,o=t[e],f=e+1{const{el:i,type:a,transition:l,children:u,shapeFlag:c}=e;if(6&c)G(e.component.subTree,t,r,o);else if(128&c)e.suspense.move(t,r,o);else if(64&c)a.move(e,t,r,oe);else if(a!==Lt)if(a!==$t)if(2!==o&&1&c&&l)if(0===o)l.beforeEnter(i),n(i,t,r),kt((()=>l.enter(i)),s);else{const{leave:e,delayLeave:o,afterLeave:s}=l,a=()=>n(i,t,r),u=()=>{e(i,(()=>{a(),s&&s()}))};o?o(i,a,u):u()}else n(i,t,r);else(({el:e,anchor:t},r,o)=>{let s;for(;e&&e!==t;)s=g(e),n(e,r,o),e=s;n(t,r,o)})(e,t,r);else{n(i,t,r);for(let e=0;e{const{type:s,props:i,ref:a,children:l,dynamicChildren:u,shapeFlag:c,patchFlag:d,dirs:f}=e;if(null!=a&&vt(a,null,n,e,!0),256&c)return void t.ctx.deactivate(e);const h=1&c&&f,m=!de(e);let p;if(m&&(p=i&&i.onVnodeBeforeUnmount)&&rn(p,t,e),6&c)J(e.component,n,r);else{if(128&c)return void e.suspense.unmount(n,r);h&&Y(e,null,t,"beforeUnmount"),64&c?e.type.remove(e,t,n,o,oe,r):u&&(s!==Lt||d>0&&64&d)?ee(u,t,n,!1,!0):(s===Lt&&384&d||!o&&16&c)&&ee(l,t,n),r&&X(e)}(m&&(p=i&&i.onVnodeUnmounted)||h)&&kt((()=>{p&&rn(p,t,e),h&&Y(e,null,t,"unmounted")}),n)},X=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Lt)return void Q(n,r);if(t===$t)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),i(e),e=n;i(t)})(e);const s=()=>{i(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,i=()=>t(n,s);r?r(e.el,s,i):i()}else s()},Q=(e,t)=>{let n;for(;e!==t;)n=g(e),i(e),e=n;i(t)},J=(e,t,n)=>{const{bum:r,scope:s,update:i,subTree:a,um:l}=e;r&&(0,o.DY)(r),s.stop(),i&&(i.active=!1,K(a,e,t,n)),l&&kt(l,t),kt((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},ee=(e,t,n,r=!1,o=!1,s=0)=>{for(let i=s;i6&e.shapeFlag?te(e.component.subTree):128&e.shapeFlag?e.suspense.next():g(e.anchor||e.el);let ne=!1;const re=(e,t,n)=>{null==e?t._vnode&&K(t._vnode,null,null,!0):S(t._vnode||null,e,t,null,null,null,n),ne||(ne=!0,w(),k(),ne=!1),t._vnode=e},oe={p:S,um:K,m:G,r:X,mt:j,mc:I,pc:U,pbc:D,n:te,o:e};let se,ie;return t&&([se,ie]=t(oe)),{render:re,hydrate:se,createApp:Qe(re,se)}}function Ct({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Tt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function xt(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ot(e,t,n=!1){const r=e.children,s=t.children;if((0,o.cy)(r)&&(0,o.cy)(s))for(let e=0;e0?Wt||o.Oj:null,It.pop(),Wt=It[It.length-1]||null,Dt>0&&Wt&&Wt.push(e),e}function zt(e,t,n,r,o,s){return Vt(Ht(e,t,n,r,o,s,!0))}function jt(e,t,n,r,o){return Vt(Gt(e,t,n,r,o,!0))}function Pt(e){return!!e&&!0===e.__v_isVNode}function Zt(e,t){return e.type===t.type&&e.key===t.key}const Bt="__vInternal",Ut=({key:e})=>null!=e?e:null,qt=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?(0,o.Kg)(e)||(0,r.i9)(e)||(0,o.Tn)(e)?{i:O,r:e,k:t,f:!!n}:e:null);function Ht(e,t=null,n=null,r=0,s=null,i=(e===Lt?0:1),a=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ut(t),ref:t&&qt(t),scopeId:M,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:O};return l?(tn(u,n),128&i&&e.normalize(u)):n&&(u.shapeFlag|=(0,o.Kg)(n)?8:16),Dt>0&&!a&&Wt&&(u.patchFlag>0||6&i)&&32!==u.patchFlag&&Wt.push(u),u}const Gt=function(e,t=null,n=null,s=0,i=null,a=!1){if(e&&e!==F||(e=Rt),Pt(e)){const r=Kt(e,t,!0);return n&&tn(r,n),Dt>0&&!a&&Wt&&(6&r.shapeFlag?Wt[Wt.indexOf(e)]=r:Wt.push(r)),r.patchFlag|=-2,r}if(l=e,(0,o.Tn)(l)&&"__vccOpts"in l&&(e=e.__vccOpts),t){t=function(e){return e?(0,r.ju)(e)||Bt in e?(0,o.X$)({},e):e:null}(t);let{class:e,style:n}=t;e&&!(0,o.Kg)(e)&&(t.class=(0,o.C4)(e)),(0,o.Gv)(n)&&((0,r.ju)(n)&&!(0,o.cy)(n)&&(n=(0,o.X$)({},n)),t.style=(0,o.Tr)(n))}var l;return Ht(e,t,n,s,i,(0,o.Kg)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,o.Gv)(e)?4:(0,o.Tn)(e)?2:0,a,!0)};function Kt(e,t,n=!1){const{props:r,ref:s,patchFlag:i,children:a}=e,l=t?nn(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ut(l),ref:t&&t.ref?n&&s?(0,o.cy)(s)?s.concat(qt(t)):[s,qt(t)]:qt(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Lt?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Kt(e.ssContent),ssFallback:e.ssFallback&&Kt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Xt(e=" ",t=0){return Gt(Nt,null,e,t)}function Yt(e,t){const n=Gt($t,null,e);return n.staticCount=t,n}function Qt(e="",t=!1){return t?(At(),jt(Rt,null,e)):Gt(Rt,null,e)}function Jt(e){return null==e||"boolean"==typeof e?Gt(Rt):(0,o.cy)(e)?Gt(Lt,null,e.slice()):"object"==typeof e?en(e):Gt(Nt,null,String(e))}function en(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:Kt(e)}function tn(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.cy)(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),tn(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||Bt in t?3===r&&O&&(1===O.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=O}}else(0,o.Tn)(t)?(t={default:t,_ctx:O},n=32):(t=String(t),64&r?(n=16,t=[Xt(t)]):n=8);e.children=t,e.shapeFlag|=n}function nn(...e){const t={};for(let n=0;nan||O;let un,cn;{const e=(0,o.We)(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach((t=>t(e))):r[0](e)}};un=t("__VUE_INSTANCE_SETTERS__",(e=>an=e)),cn=t("__VUE_SSR_SETTERS__",(e=>vn=e))}const dn=e=>{const t=an;return un(e),e.scope.on(),()=>{e.scope.off(),un(t)}},fn=()=>{an&&an.scope.off(),un(null)};function hn(e){return 4&e.vnode.shapeFlag}let mn,pn,vn=!1;function gn(e,t,n){(0,o.Tn)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Gv)(t)&&(e.setupState=(0,r.Pr)(t)),yn(e,n)}function yn(e,t,n){const s=e.type;if(!e.render){if(!t&&mn&&!s.render){const t=s.template||Pe(e).template;if(t){const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:i,compilerOptions:a}=s,l=(0,o.X$)((0,o.X$)({isCustomElement:n,delimiters:i},r),a);s.render=mn(t,l)}}e.render=s.render||o.tE,pn&&pn(e)}{const t=dn(e);(0,r.C4)();try{!function(e){const t=Pe(e),n=e.proxy,s=e.ctx;Ve=!1,t.beforeCreate&&ze(t.beforeCreate,e,"bc");const{data:i,computed:a,methods:l,watch:u,provide:c,inject:d,created:f,beforeMount:h,mounted:m,beforeUpdate:p,updated:v,activated:g,deactivated:y,beforeDestroy:b,beforeUnmount:w,destroyed:k,unmounted:E,render:S,renderTracked:_,renderTriggered:C,errorCaptured:T,serverPrefetch:x,expose:O,inheritAttrs:M,components:L,directives:N,filters:R}=t;if(d&&function(e,t,n=o.tE){(0,o.cy)(e)&&(e=qe(e));for(const n in e){const s=e[n];let i;i=(0,o.Gv)(s)?"default"in s?tt(s.from||n,s.default,!0):tt(s.from||n):tt(s),(0,r.i9)(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}(d,s,null),l)for(const e in l){const t=l[e];(0,o.Tn)(t)&&(s[e]=t.bind(n))}if(i){const t=i.call(n,n);(0,o.Gv)(t)&&(e.data=(0,r.Kh)(t))}if(Ve=!0,a)for(const e in a){const t=a[e],r=(0,o.Tn)(t)?t.bind(n,n):(0,o.Tn)(t.get)?t.get.bind(n,n):o.tE,i=!(0,o.Tn)(t)&&(0,o.Tn)(t.set)?t.set.bind(n):o.tE,l=wn({get:r,set:i});Object.defineProperty(s,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(u)for(const e in u)je(u[e],s,n,e);if(c){const e=(0,o.Tn)(c)?c.call(n):c;Reflect.ownKeys(e).forEach((t=>{et(t,e[t])}))}function $(e,t){(0,o.cy)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&ze(f,e,"c"),$(ke,h),$(Ee,m),$(Se,p),$(_e,v),$(pe,g),$(ve,y),$(Le,T),$(Me,_),$(Oe,C),$(Ce,w),$(Te,E),$(xe,x),(0,o.cy)(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.tE&&(e.render=S),null!=M&&(e.inheritAttrs=M),L&&(e.components=L),N&&(e.directives=N)}(e)}finally{(0,r.bl)(),t()}}}function bn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,r.Pr)((0,r.IG)(e.exposed)),{get(t,n){return n in t?t[n]:n in We?We[n](e):void 0},has(e,t){return t in e||t in We}}))}const wn=(e,t)=>(0,r.EW)(e,t,vn);function kn(e,t,n){const r=arguments.length;return 2===r?(0,o.Gv)(t)&&!(0,o.cy)(t)?Pt(t)?Gt(e,null,[t]):Gt(e,t):Gt(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&Pt(n)&&(n=[n]),Gt(e,t,n))}const En="3.4.21"},3751:function(e,t,n){n.d(t,{aG:function(){return C},eB:function(){return d},jR:function(){return j},m1:function(){return U}});var r=n(641),o=n(33);n(953);const s="undefined"!=typeof document?document:null,i=s&&s.createElement("template"),a={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o="svg"===t?s.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?s.createElementNS("http://www.w3.org/1998/Math/MathML",e):s.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>s.createTextNode(e),createComment:e=>s.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>s.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const a=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==s&&(o=o.nextSibling););else{i.innerHTML="svg"===r?`${e}`:"mathml"===r?`${e}`:e;const o=i.content;if("svg"===r||"mathml"===r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},l="transition",u="animation",c=Symbol("_vtc"),d=(e,{slots:t})=>(0,r.h)(r.pR,function(e){const t={};for(const n in e)n in f||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:u=i,appearActiveClass:c=a,appearToClass:d=l,leaveFromClass:b=`${n}-leave-from`,leaveActiveClass:k=`${n}-leave-active`,leaveToClass:E=`${n}-leave-to`}=e,S=function(e){if(null==e)return null;if((0,o.Gv)(e))return[p(e.enter),p(e.leave)];{const t=p(e);return[t,t]}}(s),_=S&&S[0],C=S&&S[1],{onBeforeEnter:T,onEnter:x,onEnterCancelled:O,onLeave:M,onLeaveCancelled:L,onBeforeAppear:N=T,onAppear:R=x,onAppearCancelled:$=O}=t,I=(e,t,n)=>{g(e,t?d:l),g(e,t?c:a),n&&n()},W=(e,t)=>{e._isLeaving=!1,g(e,b),g(e,E),g(e,k),t&&t()},A=e=>(t,n)=>{const o=e?R:x,s=()=>I(t,e,n);h(o,[t,s]),y((()=>{g(t,e?u:i),v(t,e?d:l),m(o)||w(t,r,_,s)}))};return(0,o.X$)(t,{onBeforeEnter(e){h(T,[e]),v(e,i),v(e,a)},onBeforeAppear(e){h(N,[e]),v(e,u),v(e,c)},onEnter:A(!1),onAppear:A(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>W(e,t);v(e,b),document.body.offsetHeight,v(e,k),y((()=>{e._isLeaving&&(g(e,b),v(e,E),m(M)||w(e,r,C,n))})),h(M,[e,n])},onEnterCancelled(e){I(e,!1),h(O,[e])},onAppearCancelled(e){I(e,!0),h($,[e])},onLeaveCancelled(e){W(e),h(L,[e])}})}(e),t);d.displayName="Transition";const f={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},h=(d.props=(0,o.X$)({},r.QP,f),(e,t=[])=>{(0,o.cy)(e)?e.forEach((e=>e(...t))):e&&e(...t)}),m=e=>!!e&&((0,o.cy)(e)?e.some((e=>e.length>1)):e.length>1);function p(e){return(0,o.Ro)(e)}function v(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[c]||(e[c]=new Set)).add(t)}function g(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[c];n&&(n.delete(t),n.size||(e[c]=void 0))}function y(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let b=0;function w(e,t,n,r){const o=e._endId=++b,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:c}=function(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r(`${l}Delay`),s=r(`${l}Duration`),i=k(o,s),a=r(`${u}Delay`),c=r(`${u}Duration`),d=k(a,c);let f=null,h=0,m=0;return t===l?i>0&&(f=l,h=i,m=s.length):t===u?d>0&&(f=u,h=d,m=c.length):(h=Math.max(i,d),f=h>0?i>d?l:u:null,m=f?f===l?s.length:c.length:0),{type:f,timeout:h,propCount:m,hasTransform:f===l&&/\b(transform|all)(,|$)/.test(r(`${l}Property`).toString())}}(e,t);if(!i)return r();const d=i+"end";let f=0;const h=()=>{e.removeEventListener(d,m),s()},m=t=>{t.target===e&&++f>=c&&h()};setTimeout((()=>{fE(t)+E(e[n]))))}function E(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}const S=Symbol("_vod"),_=Symbol("_vsh"),C={beforeMount(e,{value:t},{transition:n}){e[S]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):T(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),T(e,!0),r.enter(e)):r.leave(e,(()=>{T(e,!1)})):T(e,t))},beforeUnmount(e,{value:t}){T(e,t)}};function T(e,t){e.style.display=t?e[S]:"none",e[_]=!t}const x=Symbol(""),O=/(^|;)\s*display\s*:/,M=/\s*!important$/;function L(e,t,n){if((0,o.cy)(n))n.forEach((n=>L(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=R[t];if(n)return n;let r=(0,o.PT)(t);if("filter"!==r&&r in e)return R[t]=r;r=(0,o.ZH)(r);for(let n=0;nA||(D.then((()=>A=0)),A=Date.now()),V=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;"undefined"!=typeof HTMLElement&&HTMLElement,Symbol("_moveCb"),Symbol("_enterCb"),Symbol("_assign");const z={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},j=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=n=>{if(!("key"in n))return;const r=(0,o.Tg)(n.key);return t.some((e=>e===r||z[e]===r))?e(n):void 0})},P=(0,o.X$)({patchProp:(e,t,n,s,i,a,l,u,d)=>{const f="svg"===i;"class"===t?function(e,t,n){const r=e[c];r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,s,f):"style"===t?function(e,t,n){const r=e.style,s=(0,o.Kg)(n);let i=!1;if(n&&!s){if(t)if((0,o.Kg)(t))for(const e of t.split(";")){const t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&L(r,t,"")}else for(const e in t)null==n[e]&&L(r,e,"");for(const e in n)"display"===e&&(i=!0),L(r,e,n[e])}else if(s){if(t!==n){const e=r[x];e&&(n+=";"+e),r.cssText=n,i=O.test(n)}}else t&&e.removeAttribute("style");S in e&&(e[S]=i?r.display:"",e[_]&&(r.display="none"))}(e,n,s):(0,o.Mp)(t)?(0,o.CP)(t)||function(e,t,n,s,i=null){const a=e[I]||(e[I]={}),l=a[t];if(s&&l)l.value=s;else{const[n,u]=function(e){let t;if(W.test(e)){let n;for(t={};n=e.match(W);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):(0,o.Tg)(e.slice(2)),t]}(t);if(s){const l=a[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();(0,r.qL)(function(e,t){if((0,o.cy)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=F(),n}(s,i);!function(e,t,n,r){e.addEventListener(t,n,r)}(e,n,l,u)}else l&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,l,u),a[t]=void 0)}}(e,t,0,s,l):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&V(t)&&(0,o.Tn)(n));if("spellcheck"===t||"draggable"===t||"translate"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return(!V(t)||!(0,o.Kg)(n))&&t in e}(e,t,s,f))?function(e,t,n,r,s,i,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,s,i),void(e[t]=null==n?"":n);const l=e.tagName;if("value"===t&&"PROGRESS"!==l&&!l.includes("-")){const r=null==n?"":n;return("OPTION"===l?e.getAttribute("value")||"":e.value)===r&&"_value"in e||(e.value=r),null==n&&e.removeAttribute(t),void(e._value=n)}let u=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=(0,o.Y2)(n):null==n&&"string"===r?(n="",u=!0):"number"===r&&(n=0,u=!0)}try{e[t]=n}catch(e){}u&&e.removeAttribute(t)}(e,t,s,a,l,u,d):("true-value"===t?e._trueValue=s:"false-value"===t&&(e._falseValue=s),function(e,t,n,r,s){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS($,t.slice(6,t.length)):e.setAttributeNS($,t,n);else{const r=(0,o.J$)(t);null==n||r&&!(0,o.Y2)(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,s,f))}},a);let Z,B=!1;const U=(...e)=>{const t=(Z=B?Z:(0,r.ci)(P),B=!0,Z).createApp(...e),{mount:n}=t;return t.mount=e=>{const t=function(e){if((0,o.Kg)(e))return document.querySelector(e);return e}(e);if(t)return n(t,!0,function(e){return e instanceof SVGElement?"svg":"function"==typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}(t))},t}},33:function(e,t,n){function r(e,t){const n=new Set(e.split(","));return t?e=>n.has(e.toLowerCase()):e=>n.has(e)}n.d(t,{$3:function(){return h},$H:function(){return D},BH:function(){return B},BX:function(){return J},Bm:function(){return k},C4:function(){return X},CE:function(){return p},CP:function(){return u},DY:function(){return F},Gv:function(){return E},J$:function(){return Y},Kg:function(){return w},MZ:function(){return o},Mp:function(){return l},NO:function(){return a},Oj:function(){return s},PT:function(){return R},Qd:function(){return x},Ro:function(){return j},SU:function(){return M},TF:function(){return d},Tg:function(){return I},Tn:function(){return b},Tr:function(){return U},We:function(){return Z},X$:function(){return c},Y2:function(){return Q},ZH:function(){return W},Zf:function(){return T},bB:function(){return z},cy:function(){return m},gd:function(){return y},pD:function(){return r},rU:function(){return A},tE:function(){return i},u3:function(){return ee},vM:function(){return v},v_:function(){return te},yI:function(){return O},yL:function(){return S},yQ:function(){return V}});const o={},s=[],i=()=>{},a=()=>!1,l=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),u=e=>e.startsWith("onUpdate:"),c=Object.assign,d=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},f=Object.prototype.hasOwnProperty,h=(e,t)=>f.call(e,t),m=Array.isArray,p=e=>"[object Map]"===C(e),v=e=>"[object Set]"===C(e),g=e=>"[object Date]"===C(e),y=e=>"[object RegExp]"===C(e),b=e=>"function"==typeof e,w=e=>"string"==typeof e,k=e=>"symbol"==typeof e,E=e=>null!==e&&"object"==typeof e,S=e=>(E(e)||b(e))&&b(e.then)&&b(e.catch),_=Object.prototype.toString,C=e=>_.call(e),T=e=>C(e).slice(8,-1),x=e=>"[object Object]"===C(e),O=e=>w(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,M=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),L=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},N=/-(\w)/g,R=L((e=>e.replace(N,((e,t)=>t?t.toUpperCase():"")))),$=/\B([A-Z])/g,I=L((e=>e.replace($,"-$1").toLowerCase())),W=L((e=>e.charAt(0).toUpperCase()+e.slice(1))),A=L((e=>e?`on${W(e)}`:"")),D=(e,t)=>!Object.is(e,t),F=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},z=e=>{const t=parseFloat(e);return isNaN(t)?e:t},j=e=>{const t=w(e)?Number(e):NaN;return isNaN(t)?e:t};let P;const Z=()=>P||(P="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}),B=r("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error");function U(e){if(m(e)){const t={};for(let n=0;n{if(e){const n=e.split(H);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function X(e){let t="";if(w(e))t=e;else if(m(e))for(let n=0;nJ(e,t)))}const te=e=>w(e)?e:null==e?"":m(e)||E(e)&&(e.toString===_||!b(e.toString))?JSON.stringify(e,ne,2):String(e),ne=(e,t)=>t&&t.__v_isRef?ne(e,t.value):p(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],r)=>(e[re(t,r)+" =>"]=n,e)),{})}:v(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>re(e)))}:k(t)?re(t):!E(t)||m(t)||x(t)?t:String(t),re=(e,t="")=>{var n;return k(e)?`Symbol(${null!=(n=e.description)?n:t})`:e}},4779:function(e,t,n){n.d(t,{A:function(){return u}});var r=n(641),o=n(953),s=n(33),i=n(6209),a=n(3246);const l=["href","rel","target","aria-label"];var u=(0,r.pM)({inheritAttrs:!1,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,n=(0,i.lq)(),u=(0,i.rU)(),{item:c}=(0,o.QW)(t),d=(0,r.EW)((()=>(0,a.r3)(c.value.link))),f=(0,r.EW)((()=>!d.value&&(0,a.zn)(c.value.link))),h=(0,r.EW)((()=>{if(!f.value)return c.value.target?c.value.target:d.value?"_blank":void 0})),m=(0,r.EW)((()=>"_blank"===h.value)),p=(0,r.EW)((()=>!d.value&&!f.value&&!m.value)),v=(0,r.EW)((()=>{if(!f.value)return c.value.rel?c.value.rel:m.value?"noopener noreferrer":void 0})),g=(0,r.EW)((()=>c.value.ariaLabel||c.value.text)),y=(0,r.EW)((()=>{const e=Object.keys(u.value.locales);return e.length?!e.some((e=>e===c.value.link)):"/"!==c.value.link})),b=(0,r.EW)((()=>!!p.value&&(c.value.activeMatch?new RegExp(c.value.activeMatch).test(n.path):!!y.value&&n.path.startsWith(c.value.link))));return(e,t)=>{const n=(0,r.g2)("RouteLink"),i=(0,r.g2)("AutoLinkExternalIcon");return p.value?((0,r.uX)(),(0,r.Wv)(n,(0,r.v6)({key:0,active:b.value,to:(0,o.R1)(c).link,"aria-label":g.value},e.$attrs),{default:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"default",{},(()=>[(0,r.RG)(e.$slots,"before"),(0,r.eW)(" "+(0,s.v_)((0,o.R1)(c).text)+" ",1),(0,r.RG)(e.$slots,"after")]))])),_:3},16,["active","to","aria-label"])):((0,r.uX)(),(0,r.CE)("a",(0,r.v6)({key:1,class:"external-link",href:(0,o.R1)(c).link,rel:v.value,target:h.value,"aria-label":g.value},e.$attrs),[(0,r.RG)(e.$slots,"default",{},(()=>[(0,r.RG)(e.$slots,"before"),(0,r.eW)(" "+(0,s.v_)((0,o.R1)(c).text)+" ",1),m.value?((0,r.uX)(),(0,r.Wv)(i,{key:0})):(0,r.Q3)("",!0),(0,r.RG)(e.$slots,"after")]))],16,l))}}})},6167:function(e,t,n){n.d(t,{A:function(){return k}});var r=n(641),o=n(953),s=n(33),i=n(4779),a=n(6209),l=n(8216),u=n(5146);const c={class:"vp-page-meta"},d={key:0,class:"vp-meta-item edit-link"},f=(0,r.Lk)("svg",{class:"icon",viewBox:"0 0 1024 1024"},[(0,r.Lk)("g",{fill:"currentColor"},[(0,r.Lk)("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),(0,r.Lk)("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})])],-1),h={class:"vp-meta-item git-info"},m={key:0,class:"vp-meta-item last-updated"},p={class:"meta-item-label"},v={class:"meta-item-info"},g={key:1,class:"vp-meta-item contributors"},y={class:"meta-item-label"},b={class:"meta-item-info"},w=["title"];var k=(0,r.pM)({__name:"PageMeta",setup(e){const t=(0,l.To)(),n=(()=>{const e=(0,l.To)(),t=(0,a.BV)(),n=(0,a.R7)();return(0,r.EW)((()=>{var r,o,s;if(null!=(o=null!=(r=n.value.editLink)?r:e.value.editLink)&&!o)return null;const{repo:i,docsRepo:a=i,docsBranch:l="main",docsDir:c="",editLinkText:d}=e.value;if(!a)return null;const f=(0,u.lL)({docsRepo:a,docsBranch:l,docsDir:c,filePathRelative:t.value.filePathRelative,editLinkPattern:null!=(s=n.value.editLinkPattern)?s:e.value.editLinkPattern});return f?{text:null!=d?d:"Edit this page",link:f}:null}))})(),k=(()=>{const e=(0,l.To)(),t=(0,a.BV)(),n=(0,a.R7)();return(0,r.EW)((()=>{var r,o,s,i;return(null==(o=null!=(r=n.value.lastUpdated)?r:e.value.lastUpdated)||o)&&(null==(s=t.value.git)?void 0:s.updatedTime)?new Date(null==(i=t.value.git)?void 0:i.updatedTime).toLocaleString():null}))})(),E=(()=>{const e=(0,l.To)(),t=(0,a.BV)(),n=(0,a.R7)();return(0,r.EW)((()=>{var r,o,s,i;return null!=(o=null!=(r=n.value.contributors)?r:e.value.contributors)&&!o||null==(i=null==(s=t.value.git)?void 0:s.contributors)?null:i}))})();return(e,a)=>{const l=(0,r.g2)("ClientOnly");return(0,r.uX)(),(0,r.CE)("footer",c,[(0,o.R1)(n)?((0,r.uX)(),(0,r.CE)("div",d,[(0,r.bF)(i.A,{class:"label",item:(0,o.R1)(n)},{before:(0,r.k6)((()=>[f])),_:1},8,["item"])])):(0,r.Q3)("",!0),(0,r.Lk)("div",h,[(0,o.R1)(k)?((0,r.uX)(),(0,r.CE)("div",m,[(0,r.Lk)("span",p,(0,s.v_)((0,o.R1)(t).lastUpdatedText)+": ",1),(0,r.bF)(l,null,{default:(0,r.k6)((()=>[(0,r.Lk)("span",v,(0,s.v_)((0,o.R1)(k)),1)])),_:1})])):(0,r.Q3)("",!0),(0,o.R1)(E)&&(0,o.R1)(E).length?((0,r.uX)(),(0,r.CE)("div",g,[(0,r.Lk)("span",y,(0,s.v_)((0,o.R1)(t).contributorsText)+": ",1),(0,r.Lk)("span",b,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)((0,o.R1)(E),((e,t)=>((0,r.uX)(),(0,r.CE)(r.FK,{key:t},[(0,r.Lk)("span",{class:"contributor",title:`email: ${e.email}`},(0,s.v_)(e.name),9,w),t!==(0,o.R1)(E).length-1?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.eW)(", ")],64)):(0,r.Q3)("",!0)],64)))),128))])])):(0,r.Q3)("",!0)])])}}})},3567:function(e,t,n){n.d(t,{A:function(){return be}});var r=n(641),o=n(33),s=n(953),i=n(3751);const a={class:"theme-default-content"},l={};var u=(0,n(6262).A)(l,[["render",function(e,t){const n=(0,r.g2)("Content");return(0,r.uX)(),(0,r.CE)("div",a,[(0,r.bF)(n)])}]]),c=n(6209);const d={key:0,class:"features"};var f=(0,r.pM)({__name:"HomeFeatures",setup(e){const t=(0,c.R7)(),n=(0,r.EW)((()=>Array.isArray(t.value.features)?t.value.features:[]));return(e,t)=>n.value.length?((0,r.uX)(),(0,r.CE)("div",d,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.value,(e=>((0,r.uX)(),(0,r.CE)("div",{key:e.title,class:"feature"},[(0,r.Lk)("h2",null,(0,o.v_)(e.title),1),(0,r.Lk)("p",null,(0,o.v_)(e.details),1)])))),128))])):(0,r.Q3)("",!0)}});const h=["innerHTML"],m=["textContent"];var p=(0,r.pM)({__name:"HomeFooter",setup(e){const t=(0,c.R7)(),n=(0,r.EW)((()=>t.value.footer)),s=(0,r.EW)((()=>t.value.footerHtml));return(e,t)=>n.value?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[s.value?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"footer",innerHTML:n.value},null,8,h)):((0,r.uX)(),(0,r.CE)("div",{key:1,class:"footer",textContent:(0,o.v_)(n.value)},null,8,m))],64)):(0,r.Q3)("",!0)}}),v=n(4779),g=n(8216);const y={class:"hero"},b={key:0,id:"main-title"},w={key:1,class:"description"},k={key:2,class:"actions"};var E=(0,r.pM)({__name:"HomeHero",setup(e){const t=(0,c.R7)(),n=(0,c.rR)(),s=(0,g.D2)(),i=(0,r.EW)((()=>s.value&&void 0!==t.value.heroImageDark?t.value.heroImageDark:t.value.heroImage)),a=(0,r.EW)((()=>t.value.heroAlt||u.value||"hero")),l=(0,r.EW)((()=>t.value.heroHeight||280)),u=(0,r.EW)((()=>null===t.value.heroText?null:t.value.heroText||n.value.title||"Hello")),d=(0,r.EW)((()=>null===t.value.tagline?null:t.value.tagline||n.value.description||"Welcome to your VuePress site")),f=(0,r.EW)((()=>Array.isArray(t.value.actions)?t.value.actions.map((({text:e,link:t,type:n="primary"})=>({text:e,link:t,type:n}))):[])),h=()=>{if(!i.value)return null;const e=(0,r.h)("img",{src:(0,c.cV)(i.value),alt:a.value,height:l.value});return void 0===t.value.heroImageDark?e:(0,r.h)(c.YX,(()=>e))};return(e,t)=>((0,r.uX)(),(0,r.CE)("header",y,[(0,r.bF)(h),u.value?((0,r.uX)(),(0,r.CE)("h1",b,(0,o.v_)(u.value),1)):(0,r.Q3)("",!0),d.value?((0,r.uX)(),(0,r.CE)("p",w,(0,o.v_)(d.value),1)):(0,r.Q3)("",!0),f.value.length?((0,r.uX)(),(0,r.CE)("p",k,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(f.value,(e=>((0,r.uX)(),(0,r.Wv)(v.A,{key:e.text,class:(0,o.C4)(["action-button",[e.type]]),item:e},null,8,["class","item"])))),128))])):(0,r.Q3)("",!0)]))}});const S={class:"home"};var _=(0,r.pM)({__name:"Home",setup(e){return(e,t)=>((0,r.uX)(),(0,r.CE)("main",S,[(0,r.bF)(E),(0,r.bF)(f),(0,r.bF)(u),(0,r.bF)(p)]))}});const C=["aria-hidden"];var T=(0,r.pM)({__name:"NavbarBrand",setup(e){const t=(0,c.Zv)(),n=(0,c.rR)(),i=(0,g.To)(),a=(0,g.D2)(),l=(0,r.EW)((()=>i.value.home||t.value)),u=(0,r.EW)((()=>n.value.title)),d=(0,r.EW)((()=>a.value&&void 0!==i.value.logoDark?i.value.logoDark:i.value.logo)),f=(0,r.EW)((()=>{var e;return null!=(e=i.value.logoAlt)?e:u.value})),h=(0,r.EW)((()=>u.value.toLocaleUpperCase().trim()===f.value.toLocaleUpperCase().trim())),m=()=>{if(!d.value)return null;const e=(0,r.h)("img",{class:"logo",src:(0,c.cV)(d.value),alt:f.value});return void 0===i.value.logoDark?e:(0,r.h)(c.YX,(()=>e))};return(e,t)=>((0,r.uX)(),(0,r.Wv)((0,s.R1)(c.Wt),{to:l.value},{default:(0,r.k6)((()=>[(0,r.bF)(m),u.value?((0,r.uX)(),(0,r.CE)("span",{key:0,class:(0,o.C4)(["site-name",{"can-hide":d.value}]),"aria-hidden":h.value},(0,o.v_)(u.value),11,C)):(0,r.Q3)("",!0)])),_:1},8,["to"]))}}),x=(0,r.pM)({__name:"DropdownTransition",setup(e){const t=e=>{e.style.height=e.scrollHeight+"px"},n=e=>{e.style.height=""};return(e,o)=>((0,r.uX)(),(0,r.Wv)(i.eB,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"default")])),_:3}))}});const O=["aria-label"],M={class:"title"},L=(0,r.Lk)("span",{class:"arrow down"},null,-1),N=["aria-label"],R={class:"title"},$={class:"navbar-dropdown"},I={class:"navbar-dropdown-subtitle"},W={key:1},A={class:"navbar-dropdown-subitem-wrapper"};var D=(0,r.pM)({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:n}=(0,s.QW)(t),a=(0,r.EW)((()=>n.value.ariaLabel||n.value.text)),l=(0,s.KR)(!1),u=(0,c.lq)();(0,r.wB)((()=>u.path),(()=>{l.value=!1}));const d=e=>{const t=0===e.detail;l.value=!!t&&!l.value},f=(e,t)=>t[t.length-1]===e;return(e,t)=>((0,r.uX)(),(0,r.CE)("div",{class:(0,o.C4)(["navbar-dropdown-wrapper",{open:l.value}])},[(0,r.Lk)("button",{class:"navbar-dropdown-title",type:"button","aria-label":a.value,onClick:d},[(0,r.Lk)("span",M,(0,o.v_)((0,s.R1)(n).text),1),L],8,O),(0,r.Lk)("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":a.value,onClick:t[0]||(t[0]=e=>l.value=!l.value)},[(0,r.Lk)("span",R,(0,o.v_)((0,s.R1)(n).text),1),(0,r.Lk)("span",{class:(0,o.C4)(["arrow",l.value?"down":"right"])},null,2)],8,N),(0,r.bF)(x,null,{default:(0,r.k6)((()=>[(0,r.bo)((0,r.Lk)("ul",$,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)((0,s.R1)(n).children,(e=>((0,r.uX)(),(0,r.CE)("li",{key:e.text,class:"navbar-dropdown-item"},[e.children?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.Lk)("h4",I,[e.link?((0,r.uX)(),(0,r.Wv)(v.A,{key:0,item:e,onFocusout:t=>f(e,(0,s.R1)(n).children)&&0===e.children.length&&(l.value=!1)},null,8,["item","onFocusout"])):((0,r.uX)(),(0,r.CE)("span",W,(0,o.v_)(e.text),1))]),(0,r.Lk)("ul",A,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.children,(t=>((0,r.uX)(),(0,r.CE)("li",{key:t.link,class:"navbar-dropdown-subitem"},[(0,r.bF)(v.A,{item:t,onFocusout:r=>f(t,e.children)&&f(e,(0,s.R1)(n).children)&&(l.value=!1)},null,8,["item","onFocusout"])])))),128))])],64)):((0,r.uX)(),(0,r.Wv)(v.A,{key:1,item:e,onFocusout:t=>f(e,(0,s.R1)(n).children)&&(l.value=!1)},null,8,["item","onFocusout"]))])))),128))],512),[[i.aG,l.value]])])),_:1})],2))}}),F=n(8627),V=n(3246),z=n(5146);const j=["aria-label"];var P=(0,r.pM)({__name:"NavbarItems",setup(e){const t=e=>(0,V.Kg)(e)?(0,z.eU)(e):e.children?{...e,children:e.children.map((e=>t(e)))}:e,n=(0,s.KR)(!1),i=(()=>{const e=(0,g.To)();return(0,r.EW)((()=>(e.value.navbar||[]).map((e=>t(e)))))})(),a=(()=>{const e=(0,c.lq)(),t=(0,F.jq)(),n=(0,c.Zv)(),o=(0,c.rU)(),s=(0,c.rR)(),i=(0,g.dy)(),a=(0,g.To)();return(0,r.EW)((()=>{var r;const l=Object.keys(o.value.locales);if(l.length<2)return[];const u=e.path,c=e.fullPath;return[{text:`${a.value.selectLanguageText}`,ariaLabel:`${null!=(r=a.value.selectLanguageAriaLabel)?r:a.value.selectLanguageText}`,children:l.map((r=>{var a,l,d,f,h,m,p;const v=null!=(l=null==(a=o.value.locales)?void 0:a[r])?l:{},g=null!=(f=null==(d=i.value.locales)?void 0:d[r])?f:{},y=`${v.lang}`,b=null!=(h=g.selectLanguageName)?h:y;if(y===s.value.lang)return{text:b,activeMatch:/./,link:null!=(m=e.hash)?m:"#"};const w=u.replace(n.value,r);return{text:b,link:t.value.some((e=>e===w))?c.replace(u,w):null!=(p=g.home)?p:r}}))}]}))})(),l=(()=>{const e=(0,g.To)(),t=(0,r.EW)((()=>e.value.repo)),n=(0,r.EW)((()=>t.value?(0,z.DA)(t.value):null)),o=(0,r.EW)((()=>t.value&&!(0,V.r3)(t.value)?`https://github.com/${t.value}`:t.value)),s=(0,r.EW)((()=>o.value?e.value.repoLabel?e.value.repoLabel:null===n.value?"Source":n.value:null));return(0,r.EW)((()=>o.value&&s.value?[{text:s.value,link:o.value}]:[]))})(),u=(0,r.EW)((()=>[...i.value,...a.value,...l.value]));(0,g.ZI)(g.bq.MOBILE,(e=>{window.innerWidth{var e;return null!=(e=(0,g.To)().value.navbarLabel)?e:"site navigation"}));return(e,t)=>u.value.length?((0,r.uX)(),(0,r.CE)("nav",{key:0,class:"navbar-items","aria-label":d.value},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(u.value,(e=>((0,r.uX)(),(0,r.CE)("div",{key:e.text,class:"navbar-item"},["children"in e?((0,r.uX)(),(0,r.Wv)(D,{key:0,item:e,class:(0,o.C4)(n.value?"mobile":"")},null,8,["item","class"])):((0,r.uX)(),(0,r.Wv)(v.A,{key:1,item:e},null,8,["item"]))])))),128))],8,j)):(0,r.Q3)("",!0)}});const Z=["title"],B={class:"icon",focusable:"false",viewBox:"0 0 32 32"},U=[(0,r.Fv)('',9)],q={class:"icon",focusable:"false",viewBox:"0 0 32 32"},H=[(0,r.Lk)("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1)];var G=(0,r.pM)({__name:"ToggleColorModeButton",setup(e){const t=(0,g.To)(),n=(0,g.D2)(),o=()=>{n.value=!n.value};return(e,a)=>((0,r.uX)(),(0,r.CE)("button",{class:"toggle-color-mode-button",title:(0,s.R1)(t).toggleColorMode,onClick:o},[(0,r.bo)(((0,r.uX)(),(0,r.CE)("svg",B,U,512)),[[i.aG,!(0,s.R1)(n)]]),(0,r.bo)(((0,r.uX)(),(0,r.CE)("svg",q,H,512)),[[i.aG,(0,s.R1)(n)]])],8,Z))}});const K=["title"],X=[(0,r.Lk)("div",{class:"icon","aria-hidden":"true"},[(0,r.Lk)("span"),(0,r.Lk)("span"),(0,r.Lk)("span")],-1)];var Y=(0,r.pM)({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=(0,g.To)();return(e,n)=>((0,r.uX)(),(0,r.CE)("div",{class:"toggle-sidebar-button",title:(0,s.R1)(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:n[0]||(n[0]=t=>e.$emit("toggle"))},X,8,K))}}),Q=(0,r.pM)({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=(0,g.To)(),n=(0,s.KR)(null),i=(0,s.KR)(null),a=(0,s.KR)(0),l=(0,r.EW)((()=>a.value?{maxWidth:a.value+"px"}:{})),u=(e,t)=>{var n,r,o;const s=null==(o=null==(r=null==(n=null==e?void 0:e.ownerDocument)?void 0:n.defaultView)?void 0:r.getComputedStyle(e,null))?void 0:o[t],i=Number.parseInt(s,10);return Number.isNaN(i)?0:i};return(0,g.ZI)(g.bq.MOBILE,(e=>{var t;const r=u(n.value,"paddingLeft")+u(n.value,"paddingRight");window.innerWidth{const u=(0,r.g2)("NavbarSearch");return(0,r.uX)(),(0,r.CE)("header",{ref_key:"navbar",ref:n,class:"navbar"},[(0,r.bF)(Y,{onToggle:a[0]||(a[0]=t=>e.$emit("toggle-sidebar"))}),(0,r.Lk)("span",{ref_key:"navbarBrand",ref:i},[(0,r.bF)(T)],512),(0,r.Lk)("div",{class:"navbar-items-wrapper",style:(0,o.Tr)(l.value)},[(0,r.RG)(e.$slots,"before"),(0,r.bF)(P,{class:"can-hide"}),(0,r.RG)(e.$slots,"after"),(0,s.R1)(t).colorModeSwitch?((0,r.uX)(),(0,r.Wv)(G,{key:0})):(0,r.Q3)("",!0),(0,r.bF)(u)],4)],512)}}}),J=n(2950),ee=n(3073);const te=["aria-label"],ne={class:"hint"},re=(0,r.Lk)("span",{class:"arrow left"},null,-1),oe={class:"link"},se={class:"hint"},ie=(0,r.Lk)("span",{class:"arrow right"},null,-1),ae={class:"link"};var le=(0,r.pM)({__name:"PageNav",setup(e){const t=(e,t)=>{if(!1===e)return null;if((0,V.Kg)(e)){const{notFound:n,meta:r,path:o}=(0,F.ie)(e,t);return n?{text:o,link:o}:{text:r.title||o,link:o}}return!!(0,V.Qd)(e)&&{...e,link:(0,F.ie)(e.link,t).path}},n=(e,t,r)=>{const o=e.findIndex((e=>e.link===t));if(-1!==o){const t=e[o+r];return(null==t?void 0:t.link)?t:null}for(const o of e)if(o.children){const e=n(o.children,t,r);if(e)return e}return null},i=(0,c.R7)(),a=(0,g.em)(),l=(0,g.To)(),u=(0,c.lq)(),d=(0,g.Zp)(),f=(0,r.EW)((()=>{const e=t(i.value.prev,u.path);return!1!==e?e:n(a.value,u.path,-1)})),h=(0,r.EW)((()=>{const e=t(i.value.next,u.path);return!1!==e?e:n(a.value,u.path,1)})),m=(0,r.EW)((()=>{var e;return null!=(e=(0,g.To)().value.pageNavbarLabel)?e:"page navigation"}));return(0,ee.MLh)("keydown",(e=>{e.altKey&&("ArrowRight"===e.key?h.value&&(d(h.value.link),e.preventDefault()):"ArrowLeft"===e.key&&f.value&&(d(f.value.link),e.preventDefault()))})),(e,t)=>f.value||h.value?((0,r.uX)(),(0,r.CE)("nav",{key:0,class:"vp-page-nav","aria-label":m.value},[f.value?((0,r.uX)(),(0,r.Wv)(v.A,{key:0,class:"prev",item:f.value},{default:(0,r.k6)((()=>{var e;return[(0,r.Lk)("div",ne,[re,(0,r.eW)(" "+(0,o.v_)(null!=(e=(0,s.R1)(l).prev)?e:"Prev"),1)]),(0,r.Lk)("div",oe,[(0,r.Lk)("span",null,(0,o.v_)(f.value.text),1)])]})),_:1},8,["item"])):(0,r.Q3)("",!0),h.value?((0,r.uX)(),(0,r.Wv)(v.A,{key:1,class:"next",item:h.value},{default:(0,r.k6)((()=>{var e;return[(0,r.Lk)("div",se,[(0,r.eW)((0,o.v_)(null!=(e=(0,s.R1)(l).next)?e:"Next")+" ",1),ie]),(0,r.Lk)("div",ae,[(0,r.Lk)("span",null,(0,o.v_)(h.value.text),1)])]})),_:1},8,["item"])):(0,r.Q3)("",!0)],8,te)):(0,r.Q3)("",!0)}});const ue={class:"page"},ce={class:"theme-default-content"};var de=(0,r.pM)({__name:"Page",setup(e){return(e,t)=>{const n=(0,r.g2)("Content");return(0,r.uX)(),(0,r.CE)("main",ue,[(0,r.RG)(e.$slots,"top"),(0,r.Lk)("div",ce,[(0,r.RG)(e.$slots,"content-top"),(0,r.bF)(n),(0,r.RG)(e.$slots,"content-bottom")]),(0,r.bF)(J.A),(0,r.bF)(le),(0,r.RG)(e.$slots,"bottom")])}}}),fe=n(9271);const he={class:"sidebar-item-children"};var me=(0,r.pM)({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:n,depth:a}=(0,s.QW)(t),l=(0,c.lq)(),u=(0,c.rd)(),d=(0,r.EW)((()=>(0,z.w8)(n.value,l))),f=(0,r.EW)((()=>({"sidebar-item":!0,"sidebar-heading":0===a.value,active:d.value,collapsible:n.value.collapsible}))),h=(0,r.EW)((()=>!n.value.collapsible||d.value)),[m,p]=(0,fe.eY)(h.value),g=e=>{n.value.collapsible&&(e.preventDefault(),p())},y=u.afterEach((e=>{(0,r.dY)((()=>{m.value=h.value}))}));return(0,r.xo)((()=>{y()})),(e,t)=>{var l;const u=(0,r.g2)("SidebarItem",!0);return(0,r.uX)(),(0,r.CE)("li",null,[(0,s.R1)(n).link?((0,r.uX)(),(0,r.Wv)(v.A,{key:0,class:(0,o.C4)(f.value),item:(0,s.R1)(n)},null,8,["class","item"])):((0,r.uX)(),(0,r.CE)("p",{key:1,tabindex:"0",class:(0,o.C4)(f.value),onClick:g,onKeydown:(0,i.jR)(g,["enter"])},[(0,r.eW)((0,o.v_)((0,s.R1)(n).text)+" ",1),(0,s.R1)(n).collapsible?((0,r.uX)(),(0,r.CE)("span",{key:0,class:(0,o.C4)(["arrow",(0,s.R1)(m)?"down":"right"])},null,2)):(0,r.Q3)("",!0)],34)),(null==(l=(0,s.R1)(n).children)?void 0:l.length)?((0,r.uX)(),(0,r.Wv)(x,{key:2},{default:(0,r.k6)((()=>[(0,r.bo)((0,r.Lk)("ul",he,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)((0,s.R1)(n).children,(e=>((0,r.uX)(),(0,r.Wv)(u,{key:`${(0,s.R1)(a)}${e.text}${e.link}`,item:e,depth:(0,s.R1)(a)+1},null,8,["item","depth"])))),128))],512),[[i.aG,(0,s.R1)(m)]])])),_:1})):(0,r.Q3)("",!0)])}}});const pe={key:0,class:"sidebar-items"};var ve=(0,r.pM)({__name:"SidebarItems",setup(e){const t=(0,c.lq)(),n=(0,g.em)();return(0,r.sV)((()=>{(0,r.wB)((()=>t.hash),(e=>{const n=document.querySelector(".sidebar");if(!n)return;const r=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${e}"]`);if(!r)return;const{top:o,height:s}=n.getBoundingClientRect(),{top:i,height:a}=r.getBoundingClientRect();io+s&&r.scrollIntoView(!1)}))})),(e,t)=>(0,s.R1)(n).length?((0,r.uX)(),(0,r.CE)("ul",pe,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)((0,s.R1)(n),(e=>((0,r.uX)(),(0,r.Wv)(me,{key:`${e.text}${e.link}`,item:e},null,8,["item"])))),128))])):(0,r.Q3)("",!0)}});const ge={class:"sidebar"};var ye=(0,r.pM)({__name:"Sidebar",setup(e){return(e,t)=>((0,r.uX)(),(0,r.CE)("aside",ge,[(0,r.bF)(P),(0,r.RG)(e.$slots,"top"),(0,r.bF)(ve),(0,r.RG)(e.$slots,"bottom")]))}}),be=(0,r.pM)({__name:"Layout",setup(e){const t=(0,c.BV)(),n=(0,c.R7)(),a=(0,g.To)(),l=(0,r.EW)((()=>!1!==n.value.navbar&&!1!==a.value.navbar)),u=(0,g.em)(),d=(0,s.KR)(!1),f=e=>{d.value="boolean"==typeof e?e:!d.value},h={x:0,y:0},m=e=>{h.x=e.changedTouches[0].clientX,h.y=e.changedTouches[0].clientY},p=e=>{const t=e.changedTouches[0].clientX-h.x,n=e.changedTouches[0].clientY-h.y;Math.abs(t)>Math.abs(n)&&Math.abs(t)>40&&(t>0&&h.x<=80?f(!0):f(!1))},v=(0,r.EW)((()=>[{"no-navbar":!l.value,"no-sidebar":!u.value.length,"sidebar-open":d.value},n.value.pageClass]));let y;(0,r.sV)((()=>{const e=(0,c.rd)();y=e.afterEach((()=>{f(!1)}))})),(0,r.hi)((()=>{y()}));const b=(0,g.MK)(),w=b.resolve,k=b.pending;return(e,a)=>((0,r.uX)(),(0,r.CE)("div",{class:(0,o.C4)(["theme-container",v.value]),onTouchstart:m,onTouchend:p},[(0,r.RG)(e.$slots,"navbar",{},(()=>[l.value?((0,r.uX)(),(0,r.Wv)(Q,{key:0,onToggleSidebar:f},{before:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"navbar-before")])),after:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"navbar-after")])),_:3})):(0,r.Q3)("",!0)])),(0,r.Lk)("div",{class:"sidebar-mask",onClick:a[0]||(a[0]=e=>f(!1))}),(0,r.RG)(e.$slots,"sidebar",{},(()=>[(0,r.bF)(ye,null,{top:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"sidebar-top")])),bottom:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"sidebar-bottom")])),_:3})])),(0,r.RG)(e.$slots,"page",{},(()=>[(0,s.R1)(n).home?((0,r.uX)(),(0,r.Wv)(_,{key:0})):((0,r.uX)(),(0,r.Wv)(i.eB,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:(0,s.R1)(w),onBeforeLeave:(0,s.R1)(k)},{default:(0,r.k6)((()=>[((0,r.uX)(),(0,r.Wv)(de,{key:(0,s.R1)(t).path},{top:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"page-top")])),"content-top":(0,r.k6)((()=>[(0,r.RG)(e.$slots,"page-content-top")])),"content-bottom":(0,r.k6)((()=>[(0,r.RG)(e.$slots,"page-content-bottom")])),bottom:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"page-bottom")])),_:3}))])),_:3},8,["onBeforeEnter","onBeforeLeave"]))]))],34))}})},6262:function(e,t){t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},8731:function(e,t,n){var r=n(967),o=n(2090),s=n(3751),i=n(641),a=n(1901),l=n(953),u=n(3246),c=n(5220),d=(0,l.IJ)(a.U),f=c.LA,h=([e,t,n=""])=>{const r=`head > ${e}${Object.entries(t).map((([e,t])=>(0,u.Kg)(t)?`[${e}=${JSON.stringify(t)}]`:!0===t?`[${e}]`:"")).join("")}`;return Array.from(document.querySelectorAll(r)).find((e=>e.innerText===n))||null},m=([e,t,n])=>{if(!(0,u.Kg)(e))return null;const r=document.createElement(e);return(0,u.Qd)(t)&&Object.entries(t).forEach((([e,t])=>{(0,u.Kg)(t)?r.setAttribute(e,t):!0===t&&r.setAttribute(e,"")})),(0,u.Kg)(n)&&r.appendChild(document.createTextNode(n)),r},p=s.m1;(async()=>{const e=p({name:"Vuepress",setup(){(()=>{const e=(0,r.Tl)(),t=(0,r.Nj)();let n=[];const o=()=>{document.documentElement.lang=t.value;const r=(()=>{const t=[];return e.value.forEach((e=>{const n=m(e);n&&t.push(n)})),t})();n.forEach(((e,t)=>{const o=r.findIndex((t=>e.isEqualNode(t)));-1===o?(e.remove(),delete n[t]):r.splice(o,1)})),r.forEach((e=>document.head.appendChild(e))),n=[...n.filter((e=>!!e)),...r]};(0,i.Gt)(r.q3,o),(0,i.sV)((()=>{e.value.forEach((e=>{const t=h(e);t&&n.push(t)})),(0,i.wB)(e,o,{immediate:!1})}))})();for(const e of o.B)e.setup?.();const e=o.B.flatMap((({rootComponents:e=[]})=>e.map((e=>(0,i.h)(e))))),t=(0,r.h0)();return()=>[(0,i.h)(t.value),e]}}),t=(()=>{const e=(0,c.aE)({history:f((0,u.TY)("/ion/")),routes:[{name:"vuepress-route",path:"/:catchAll(.*)",components:{}}],scrollBehavior:(e,t,n)=>n||(e.hash?{el:e.hash}:{top:0})});return e.beforeResolve((async(e,t)=>{if(e.path!==t.path||t===c.Ps){const t=(0,r.ie)(e.path);if(t.path!==e.path)return t.path;const n=await t.loader();e.meta={...t.meta,_pageChunk:n}}else e.path===t.path&&(e.meta=t.meta)})),e})();(e=>{e.component("ClientOnly",r.YX),e.component("Content",r.UC),e.component("RouteLink",r.Wt)})(e),((e,t,n)=>{const o=(0,i.EW)((()=>t.currentRoute.value.path)),s=(0,l.rY)(((e,n)=>({get(){return e(),t.currentRoute.value.meta._pageChunk},set(e){t.currentRoute.value.meta._pageChunk=e,n()}}))),a=(0,i.EW)((()=>r.K6.resolveLayouts(n))),u=(0,i.EW)((()=>r.K6.resolveRouteLocale(d.value.locales,o.value))),c=(0,i.EW)((()=>r.K6.resolveSiteLocaleData(d.value,u.value))),f=(0,i.EW)((()=>s.value.comp)),h=(0,i.EW)((()=>s.value.data)),m=(0,i.EW)((()=>h.value.frontmatter)),p=(0,i.EW)((()=>r.K6.resolvePageHeadTitle(h.value,c.value))),v=(0,i.EW)((()=>r.K6.resolvePageHead(p.value,m.value,c.value))),g=(0,i.EW)((()=>r.K6.resolvePageLang(h.value,c.value))),y=(0,i.EW)((()=>r.K6.resolvePageLayout(h.value,a.value))),b={layouts:a,pageData:h,pageComponent:f,pageFrontmatter:m,pageHead:v,pageHeadTitle:p,pageLang:g,pageLayout:y,redirects:r.cq,routeLocale:u,routePath:o,routes:r.JZ,siteData:d,siteLocaleData:c};e.provide(r.sW,b),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>m.value},$head:{get:()=>v.value},$headTitle:{get:()=>p.value},$lang:{get:()=>g.value},$page:{get:()=>h.value},$routeLocale:{get:()=>u.value},$site:{get:()=>d.value},$siteLocale:{get:()=>c.value},$withBase:{get:()=>r.cV}})})(e,t,o.B);for(const n of o.B)await(n.enhance?.({app:e,router:t,siteData:d}));return e.use(t),{app:e,router:t}})().then((({app:e,router:t})=>{t.isReady().then((()=>{e.mount("#app")}))}))},967:function(e,t,n){n.d(t,{BV:function(){return c},JZ:function(){return k},K6:function(){return M},Nj:function(){return h},R7:function(){return d},Tl:function(){return f},UC:function(){return C},Wt:function(){return O},YX:function(){return _},Ye:function(){return v},Zv:function(){return p},cV:function(){return x},cq:function(){return w},h0:function(){return m},ie:function(){return S},lq:function(){return a.lq},q3:function(){return b},rR:function(){return y},rU:function(){return g},rd:function(){return a.rd},re:function(){return T},sW:function(){return l}});var r=n(641),o=n(3246),s=n(3192),i=n(953),a=n(5220),l=Symbol(""),u=()=>{const e=(0,r.WQ)(l);if(!e)throw new Error("useClientData() is called without provider.");return e},c=()=>u().pageData,d=()=>u().pageFrontmatter,f=()=>u().pageHead,h=()=>u().pageLang,m=()=>u().pageLayout,p=()=>u().routeLocale,v=()=>u().routes,g=()=>u().siteData,y=()=>u().siteLocaleData,b=Symbol(""),w=(0,i.IJ)(s.c),k=(0,i.IJ)(s.J),E=e=>{const t=(0,o.UW)(e);if(k.value[t])return t;const n=encodeURI(t);return k.value[n]?n:w.value[t]||w.value[n]||t},S=e=>{const t=E(e);return{path:t,notFound:!1,...k.value[t]??{...k.value["/404.html"],notFound:!0}}},_=(0,r.pM)({name:"ClientOnly",setup(e,t){const n=(0,i.KR)(!1);return(0,r.sV)((()=>{n.value=!0})),()=>n.value?t.slots.default?.():null}}),C=(0,r.pM)({name:"Content",props:{path:{type:String,required:!1,default:""}},setup(e){const t=u().pageComponent,n=(0,r.EW)((()=>{if(!e.path)return t.value;const n=S(e.path);return(0,r.$V)((()=>n.loader().then((({comp:e})=>e))))}));return()=>(0,r.h)(n.value)}}),T=(e={})=>e,x=e=>(0,o.r3)(e)?e:`/ion/${(0,o.uv)(e)}`,O=({active:e=!1,activeClass:t="route-link-active",to:n,...o},{slots:s})=>{const i=(0,a.rd)(),l=E(n),u=l.startsWith("#")||l.startsWith("?")?l:x(l);return(0,r.h)("a",{...o,class:["route-link",{[t]:e}],href:u,onClick:(e={})=>{(e=>{if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget){const t=e.currentTarget.getAttribute("target");if(t?.match(/\b_blank\b/i))return}return e.preventDefault(),!0}})(e)?i.push(n).catch():Promise.resolve()}},s.default?.())};O.displayName="RouteLink",O.props={active:Boolean,activeClass:String,to:String};var M=(0,i.Kh)({resolveLayouts:e=>e.reduce(((e,t)=>({...e,...t.layouts})),{}),resolvePageHead:(e,t,n)=>{const r=(0,o.Kg)(t.description)?t.description:n.description,s=[...Array.isArray(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return(0,o.W8)(s)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter((e=>!!e)).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{const n=(0,o.Kg)(e.frontmatter.layout)?e.frontmatter.layout:"Layout";if(!t[n])throw new Error(`[vuepress] Cannot resolve layout: ${n}`);return t[n]},resolveRouteLocale:(e,t)=>(0,o.cq)(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t],head:[...e.locales[t]?.head??[],...e.head??[]]})})},3456:function(e,t,n){n.d(t,{BV:function(){return r.BV},R7:function(){return r.R7},Wt:function(){return r.Wt},YX:function(){return r.YX},Ye:function(){return r.Ye},Zv:function(){return r.Zv},cV:function(){return r.cV},ie:function(){return r.ie},lq:function(){return r.lq},rR:function(){return r.rR},rU:function(){return r.rU},rd:function(){return r.rd},re:function(){return r.re},sW:function(){return r.sW}});var r=n(967)},8627:function(e,t,n){n.d(t,{L4:function(){return l},eM:function(){return c},zn:function(){return u.zn},ie:function(){return d},s5:function(){return s},jq:function(){return i},uk:function(){return f}});var r=n(641),o=n(6209);const s=e=>{const t=(0,o.Zv)();return(0,r.EW)((()=>e[t.value]??{}))},i=()=>{const e=(0,o.Ye)();return(0,r.EW)((()=>Object.keys(e.value)))};var a=n(33);const l=(e,t)=>{const n=(t?._instance||(0,r.nI)())?.appContext.components;return!!n&&(e in n||(0,a.PT)(e)in n||(0,a.ZH)((0,a.PT)(e))in n)};var u=n(3246);Array.isArray,Object.entries,Object.fromEntries,Object.keys,Object.values;const c=e=>{return t=e,"/",(0,u.Kg)(t)&&t.startsWith("/");var t},d=(e,t)=>{if(c(e)||"string"!=typeof t)return(0,o.ie)(e);const n=t.slice(0,t.lastIndexOf("/"));return(0,o.ie)(new URL(`${n}/${encodeURI(e)}`,"http://.").pathname)},f=e=>new Promise((t=>setTimeout(t,e)))},6358:function(e,t,n){n.d(t,{A:function(){return a}});var r=n(6209),o=n(3073),s=n(9271);const i=async(e,t)=>{const{path:n,query:r}=e.currentRoute.value,{scrollBehavior:o}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:r,hash:t}),e.options.scrollBehavior=o};var a=(0,r.re)({setup(){(({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:a=5})=>{const l=(0,r.rd)();(0,o.MLh)("scroll",(0,s.Q0)((()=>{const n=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(n-0)u.some((t=>t.hash===e.hash))));for(let e=0;e=(t.parentElement?.offsetTop??0)-a,u=!r||n<(r.parentElement?.offsetTop??0)-a;if(!o||!u)continue;const d=decodeURIComponent(l.currentRoute.value.hash),f=decodeURIComponent(t.hash);if(d===f)return;if(s)for(let t=e+1;t!1!==e.value.backToTop&&d.value>100)),h=(0,i.EW)((()=>d.value/(u.value-c.value)*100));return(0,i.sV)((()=>{n.value=document.body})),()=>(0,i.h)(l.eB,{name:"back-to-top"},(()=>f.value?(0,i.h)("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[(0,i.h)("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":h.value},(0,i.h)("svg",(0,i.h)("circle",{cx:"26",cy:"26",r:"24",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-dasharray":`${Math.PI*h.value*.48} ${Math.PI*(100-h.value)*.48}`}))),(0,i.h)("div",{class:"back-to-top-icon"})]):null))}});var c=(0,r.re)({rootComponents:[u]})},3825:function(e,t,n){n.d(t,{A:function(){return c}});var r=n(6209),o=n(8627),s=n(3073),i=n(641);const a=/\b(?:Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i,l={"/":{}},u=['.theme-default-content div[class*="language-"] pre'];var c=(0,r.re)({setup:()=>{(({delay:e=500,duration:t=2e3,locales:n,selector:l,showInMobile:u})=>{const{copy:c,copied:d}=(0,s.iDZ)({legacy:!0,copiedDuring:t}),f=(0,o.s5)(n),h=(0,r.BV)(),m=e=>{if(!e.hasAttribute("copy-code-registered")){const t=document.createElement("button");t.type="button",t.classList.add("vp-copy-code-button"),t.innerHTML='
',t.setAttribute("aria-label",f.value.copy),t.setAttribute("data-copied",f.value.copied),e.parentElement&&e.parentElement.insertBefore(t,e),e.setAttribute("copy-code-registered","")}},p=()=>{(0,i.dY)().then((()=>(0,o.uk)(e))).then((()=>{l.forEach((e=>{document.querySelectorAll(e).forEach(m)}))}))},v=(e,t,n)=>{let{innerText:r=""}=t;/language-(shellscript|shell|bash|sh|zsh)/.test(e.classList.toString())&&(r=r.replace(/^ *(\$|>) /gm,"")),c(r).then((()=>{n.classList.add("copied"),(0,i.wB)(d,(()=>{n.classList.remove("copied"),n.blur()}),{once:!0})}))};(0,i.sV)((()=>{const e=!("undefined"!=typeof window&&window.navigator&&"userAgent"in window.navigator&&a.test(navigator.userAgent))||u;e&&p(),(0,s.MLh)("click",(e=>{const t=e.target;if(t.matches('div[class*="language-"] > button.copy')){const e=t.parentElement,n=t.nextElementSibling;n&&v(e,n,t)}else if(t.matches('div[class*="language-"] div.vp-copy-icon')){const e=t.parentElement,n=e.parentElement,r=e.nextElementSibling;r&&v(n,r,e)}})),(0,i.wB)((()=>h.value.path),(()=>{e&&p()}))}))})({selector:u,locales:l,duration:2e3,delay:500,showInMobile:!1})}})},3450:function(e,t,n){n.d(t,{A:function(){return l}});var r=n(641),o=n(6209);const s=(0,r.h)("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[(0,r.h)("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),(0,r.h)("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),i=(0,r.pM)({name:"ExternalLinkIcon",props:{locales:{type:Object,default:()=>({})}},setup(e){const t=(0,o.Zv)(),n=(0,r.EW)((()=>e.locales[t.value]??{openInNewWindow:"open in new window"}));return()=>(0,r.h)("span",[s,(0,r.h)("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),a={"/":{openInNewWindow:"open in new window"}};var l=(0,o.re)({enhance({app:e}){e.component("ExternalLinkIcon",(0,r.h)(i,{locales:a}))}})},5436:function(e,t,n){n.d(t,{A:function(){return m}});var r=n(8627),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},s=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(g.container)if(g.container instanceof Object)t=(e=o({},e,g.container)).width-e.left-e.right-2*g.margin,n=e.height-e.top-e.bottom-2*g.margin;else{var r=(i(g.container)?g.container:document.querySelector(g.container)).getBoundingClientRect(),s=r.width,l=r.height,u=r.left,c=r.top;e=o({},e,{width:s,height:l,left:u,top:c})}t=t||e.width-2*g.margin,n=n||e.height-2*g.margin;var d=y.zoomedHd||y.original,f=a(d)?t:d.naturalWidth||t,h=a(d)?n:d.naturalHeight||n,m=d.getBoundingClientRect(),p=m.top,v=m.left,b=m.width,w=m.height,k=Math.min(Math.max(b,f),t)/b,E=Math.min(Math.max(w,h),n)/w,S=Math.min(k,E),_="scale("+S+") translate3d("+((t-b)/2-v+g.margin+e.left)/S+"px, "+((n-w)/2-p+g.margin+e.top)/S+"px, 0)";y.zoomed.style.transform=_,y.zoomedHd&&(y.zoomedHd.style.transform=_)};return new r((function(n){if(e&&-1===h.indexOf(e))n(w);else if(y.zoomed)n(w);else{if(e)y.original=e;else{if(!(h.length>0))return void n(w);var r=h;y.original=r[0]}if(y.original.dispatchEvent(u("medium-zoom:open",{detail:{zoom:w}})),v=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,p=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,s=t.height,i=e.cloneNode(),a=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+a+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=s+"px",i.style.transform="",i}(y.original),document.body.appendChild(b),g.template){var o=i(g.template)?g.template:document.querySelector(g.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){p=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(u("medium-zoom:opened",{detail:{zoom:w}})),n(w)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(s),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var s=setInterval((function(){y.zoomedHd.complete&&(clearInterval(s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var a=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}))},d=function(){return new r((function(e){!p&&y.original?(p=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(u("medium-zoom:close",{detail:{zoom:w}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(b),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),p=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(u("medium-zoom:closed",{detail:{zoom:w}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(w)}))):e(w)}))},f=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():c({target:e})},h=[],m=[],p=!1,v=0,g=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?g=t:(t||"string"==typeof t)&&s(t);var b=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((g=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},g)).background);document.addEventListener("click",(function(e){var t=e.target;t!==b?-1!==h.indexOf(t)&&f({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!p&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(v-e)>g.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var w={open:c,close:d,toggle:f,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(b.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},g.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return g=o({},g,t),h.forEach((function(e){e.dispatchEvent(u("medium-zoom:update",{detail:{zoom:w}}))})),w},clone:function(){return e(o({},g,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:s,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):h;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(u("medium-zoom:detach",{detail:{zoom:w}}))})),h=h.filter((function(e){return-1===r.indexOf(e)})),w},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),m.push({type:"medium-zoom:"+e,listener:t,options:n}),w},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return h.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),m=m.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),w},getOptions:function(){return g},getImages:function(){return h},getZoomedImage:function(){return y.original}};return w},d=n(6209);const f=Symbol("mediumZoom"),h={};var m=(0,d.re)({enhance({app:e,router:t}){const n=c(h);n.refresh=(e=".theme-default-content > img, .theme-default-content :not(a) > img")=>{n.detach(),n.attach(e)},e.provide(f,n),t.afterEach((()=>{(0,r.uk)(300).then((()=>n.refresh()))}))}})},1599:function(e,t,n){n.d(t,{A:function(){return p}});var r=n(6209),o=n(641);const s={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=s.isStarted();e=i(e,s.settings.minimum,1),s.status=1===e?null:e;const n=s.render(!t),r=n.querySelector(s.settings.barSelector),o=s.settings.speed,c=s.settings.easing;return n.offsetWidth,l((t=>{u(r,{transform:"translate3d("+a(e)+"%,0,0)",transition:"all "+o+"ms "+c}),1===e?(u(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout((function(){u(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout((function(){s.remove(),t()}),o)}),o)):setTimeout((()=>t()),o)})),s},isStarted:()=>"number"==typeof s.status,start:()=>{s.status||s.set(0);const e=()=>{setTimeout((()=>{s.status&&(s.trickle(),e())}),s.settings.trickleSpeed)};return s.settings.trickle&&e(),s},done:e=>e||s.status?s.inc(.3+.5*Math.random()).set(1):s,inc:e=>{let t=s.status;return t?("number"!=typeof e&&(e=(1-t)*i(Math.random()*t,.1,.95)),t=i(t+e,0,.994),s.set(t)):s.start()},trickle:()=>s.inc(Math.random()*s.settings.trickleRate),render:e=>{if(s.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=s.settings.template;const n=t.querySelector(s.settings.barSelector),r=e?"-100":a(s.status||0),o=document.querySelector(s.settings.parent);return u(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&d(o,"nprogress-custom-parent"),o?.appendChild(t),t},remove:()=>{f(document.documentElement,"nprogress-busy"),f(document.querySelector(s.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&m(e)},isRendered:()=>!!document.getElementById("nprogress")},i=(e,t,n)=>en?n:e,a=e=>100*(-1+e),l=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),1===e.length&&t()}}(),u=function(){const e=["Webkit","O","Moz","ms"],t={};function n(n,r,o){var s;s=(s=r).replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),r=t[s]??=function(t){const n=document.body.style;if(t in n)return t;let r=e.length;const o=t.charAt(0).toUpperCase()+t.slice(1);let s;for(;r--;)if(s=e[r]+o,s in n)return s;return t}(s),n.style[r]=o}return function(e,t){for(const r in t){const o=t[r];void 0!==o&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,r,o)}}}(),c=(e,t)=>("string"==typeof e?e:h(e)).indexOf(" "+t+" ")>=0,d=(e,t)=>{const n=h(e),r=n+t;c(n,t)||(e.className=r.substring(1))},f=(e,t)=>{const n=h(e);if(!c(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},h=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),m=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};var p=(0,r.re)({setup(){(0,o.sV)((()=>{const e=(0,r.rd)(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach((e=>{t.has(e.path)||s.start()})),e.afterEach((e=>{t.add(e.path),s.done()}))}))}})},8973:function(e,t,n){n.d(t,{A:function(){return p}});var r=n(641),o=n(6209),s=n(953),i=n(3246);var a=n(8752);const l=(0,s.KR)(a.b),u=/[^\x00-\x7F]/,c=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),d=(e,t)=>{const n=t.join(" "),r=e.split(/\s+/g).map((e=>e.trim())).filter((e=>!!e));if(u.test(e))return r.some((e=>n.toLowerCase().indexOf(e)>-1));const o=e.endsWith(" ");return new RegExp(r.map(((e,t)=>r.length!==t+1||o?`(?=.*\\b${c(e)}\\b)`:`(?=.*\\b${c(e)})`)).join("")+".+","gi").test(n)},f=(0,r.pM)({name:"SearchBox",props:{locales:{type:Object,default:()=>({})},hotKeys:{type:Array,default:()=>[]},maxSuggestions:{type:Number,default:5}},setup(e){const{locales:t,hotKeys:n,maxSuggestions:a}=(0,s.QW)(e),u=(0,o.rd)(),c=(0,o.Zv)(),f=l,h=(0,s.KR)(null),m=(0,s.KR)(!1),p=(0,s.KR)(""),v=(0,r.EW)((()=>t.value[c.value]??{})),g=(({searchIndex:e,routeLocale:t,query:n,maxSuggestions:o})=>{const s=(0,r.EW)((()=>e.value.filter((e=>e.pathLocale===t.value))));return(0,r.EW)((()=>{const e=n.value.trim().toLowerCase();if(!e)return[];const t=[],r=(n,s)=>{d(e,[s.title])&&t.push({link:`${n.path}#${s.slug}`,title:n.title,header:s.title});for(const e of s.children){if(t.length>=o.value)return;r(n,e)}};for(const n of s.value){if(t.length>=o.value)break;if(d(e,[n.title,...n.extraFields]))t.push({link:n.path,title:n.title});else for(const e of n.headers){if(t.length>=o.value)break;r(n,e)}}return t}))})({searchIndex:f,routeLocale:c,query:p,maxSuggestions:a}),{focusIndex:y,focusNext:b,focusPrev:w}=(e=>{const t=(0,s.KR)(0);return{focusIndex:t,focusNext:()=>{t.value{t.value>0?t.value-=1:t.value=e.value.length-1}}})(g);(({input:e,hotKeys:t})=>{if(0===t.value.length)return;const n=n=>{var r;e.value&&(!((e,t)=>t.some((t=>{if((0,i.Kg)(t))return t===e.key;const{key:n,ctrl:r=!1,shift:o=!1,alt:s=!1}=t;return n===e.key&&r===e.ctrlKey&&o===e.shiftKey&&s===e.altKey})))(n,t.value)||(r=n.target)instanceof Element&&document.activeElement===r&&(["TEXTAREA","SELECT","INPUT"].includes(r.tagName)||r.hasAttribute("contenteditable"))||(n.preventDefault(),e.value.focus()))};(0,r.sV)((()=>{document.addEventListener("keydown",n)})),(0,r.xo)((()=>{document.removeEventListener("keydown",n)}))})({input:h,hotKeys:n});const k=(0,r.EW)((()=>m.value&&!!g.value.length)),E=e=>{if(!k.value)return;const t=g.value[e];t&&u.push(t.link).then((()=>{p.value="",y.value=0}))};return()=>(0,r.h)("form",{class:"search-box",role:"search"},[(0,r.h)("input",{ref:h,type:"search",placeholder:v.value.placeholder,autocomplete:"off",spellcheck:!1,value:p.value,onFocus:()=>m.value=!0,onBlur:()=>m.value=!1,onInput:e=>p.value=e.target.value,onKeydown:e=>{switch(e.key){case"ArrowUp":k.value&&w();break;case"ArrowDown":k.value&&b();break;case"Enter":e.preventDefault(),E(y.value)}}}),k.value&&(0,r.h)("ul",{class:"suggestions",onMouseleave:()=>y.value=-1},g.value.map((({link:e,title:t,header:n},o)=>(0,r.h)("li",{class:["suggestion",{focus:y.value===o}],onMouseenter:()=>y.value=o,onMousedown:()=>E(o)},(0,r.h)("a",{href:e,onClick:e=>e.preventDefault()},[(0,r.h)("span",{class:"page-title"},t),n&&(0,r.h)("span",{class:"page-header"},`> ${n}`)])))))])}}),h={},m=["s","/"];var p=(0,o.re)({enhance({app:e}){e.component("SearchBox",(e=>(0,r.h)(f,{locales:h,hotKeys:m,maxSuggestions:10,...e})))}})},8735:function(e,t,n){n.d(t,{_f:function(){return u},WK:function(){return a},dy:function(){return s},To:function(){return l}});var r=n(7961);const o=(0,n(953).KR)(r.K),s=()=>o;var i=n(641);const a=Symbol(""),l=()=>{const e=(0,i.WQ)(a);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},u=(e,t)=>{const{locales:n,...r}=e;return{...r,...n?.[t]}}},5496:function(e,t,n){var r=n(641),o=n(6209),s=n(8735);t.A=(0,o.re)({enhance({app:e}){const t=(0,s.dy)(),n=e._context.provides[o.sW],i=(0,r.EW)((()=>(0,s._f)(t.value,n.routeLocale.value)));e.provide(s.WK,i),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return i.value}}})}})},3246:function(e,t,n){n.d(t,{Kg:function(){return h},Qd:function(){return l},TY:function(){return c},UW:function(){return u},W8:function(){return s},cq:function(){return f},r3:function(){return i},uv:function(){return d},zn:function(){return a}});var r=["link","meta","script","style","noscript","template"],o=["title","base"],s=e=>{const t=new Set,n=[];return e.forEach((e=>{const s=(([e,t,n])=>o.includes(e)?e:r.includes(e)?"meta"===e&&t.name?`${e}.${t.name}`:"template"===e&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map((([e,t])=>"boolean"==typeof t?t?[e,""]:null:[e,t])).filter((e=>null!=e)).sort((([e],[t])=>e.localeCompare(t))),n]):null)(e);s&&!t.has(s)&&(t.add(s),n.push(e))})),n},i=e=>/^(https?:)?\/\//.test(e),a=e=>/^[a-z][a-z0-9+.-]*:/.test(e),l=e=>"[object Object]"===Object.prototype.toString.call(e),u=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let r=t.replace(/(^|\/)README.md$/i,"$1index.html");return r.endsWith(".md")?r=r.substring(0,r.length-3)+".html":r.endsWith(".html")||(r+=".html"),r.endsWith("/index.html")&&(r=r.substring(0,r.length-10)),r+n.join("")},c=e=>"/"===e[e.length-1]?e.slice(0,-1):e,d=e=>"/"===e[0]?e.slice(1):e,f=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>{const n=t.split("/").length-e.split("/").length;return 0!==n?n:t.length-e.length}));for(const e of n)if(t.startsWith(e))return e;return"/"},h=e=>"string"==typeof e},8216:function(e,t,n){n.d(t,{bq:function(){return M},fv:function(){return c},i$:function(){return S},D2:function(){return u},Zp:function(){return m},MK:function(){return y},em:function(){return E},dy:function(){return i},To:function(){return a},ZI:function(){return N}});var r=n(3073),o=n(641),s=n(8735);const i=()=>(0,s.dy)(),a=()=>(0,s.To)(),l=Symbol(""),u=()=>{const e=(0,o.WQ)(l);if(!e)throw new Error("useDarkMode() is called without provider.");return e},c=()=>{const e=a(),t=(0,r.Nk8)(),n=(0,r.rXt)("vuepress-color-scheme",e.value.colorMode),s=(0,o.EW)({get(){return e.value.colorModeSwitch?"auto"===n.value?t.value:"dark"===n.value:"dark"===e.value.colorMode},set(e){e===t.value?n.value="auto":n.value=e?"dark":"light"}});(0,o.Gt)(l,s),d(s)},d=e=>{const t=(t=e.value)=>{const n=window?.document.querySelector("html");n?.classList.toggle("dark",t)};(0,o.sV)((()=>{(0,o.wB)(e,t,{immediate:!0})})),(0,o.hi)((()=>t()))};var f=n(8627),h=n(6209);const m=()=>{const e=(0,h.rd)(),t=(0,h.lq)();return n=>{if(n)if((0,f.eM)(n))t.path!==n&&e.push(n);else if((0,f.zn)(n))window&&window.open(n);else{const r=t.path.slice(0,t.path.lastIndexOf("/"));e.push(new URL(`${r}/${encodeURI(n)}`,"http://.").pathname)}}};let p=null,v=null;const g={wait:()=>p,pending:()=>{p=new Promise((e=>v=e))},resolve:()=>{v?.(),p=null,v=null}},y=()=>g;var b=n(3246),w=n(5146);const k=Symbol("sidebarItems"),E=()=>{const e=(0,o.WQ)(k);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},S=()=>{const e=a(),t=(0,h.R7)(),n=(0,h.BV)(),r=(0,h.lq)(),s=(0,o.EW)((()=>_(t.value,e.value,n.value,r.path)));(0,o.Gt)(k,s)},_=(e,t,n,r)=>{const o=e.sidebar??t.sidebar??"auto",s=e.sidebarDepth??t.sidebarDepth??2;return e.home||!1===o?[]:"auto"===o?T(n,s):Array.isArray(o)?x(n,r,o,s):(0,b.Qd)(o)?O(n,r,o,s):[]},C=(e,t)=>t>0?e.map((e=>((e,t)=>({text:e.title,link:e.link,children:C(e.children,t)}))(e,t-1))):[],T=(e,t)=>[{text:e.title,children:C(e.headers,t)}],x=(e,t,n,r)=>{const o=n=>{let s;if(s=(0,b.Kg)(n)?(0,w.eU)(n):n,s.children)return{...s,children:s.children.map((e=>o(e)))};if(s.link===t){const t=1===e.headers[0]?.level?e.headers[0].children:e.headers;return{...s,children:C(t,r)}}return s};return n.map((e=>o(e)))},O=(e,t,n,r)=>{const o=n[(0,b.cq)(n,t)]??[];return"heading"===o?T(e,r):x(e,t,o,r)};var M;!function(e){e.MOBILE="mobile"}(M||(M={}));const L={[M.MOBILE]:Number.parseInt("719px"?.replace("px",""),10)},N=(e,t)=>{const n=L[e];Number.isInteger(n)&&((0,r.MLh)("orientationchange",(()=>t(n)),!1),(0,r.MLh)("resize",(()=>t(n)),!1),(0,o.sV)((()=>{t(n)})))}},443:function(e,t,n){n.d(t,{A:function(){return b}});var r=n(8627),o=n(641),s=n(6209),i=n(33),a=(0,o.pM)({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>((0,o.uX)(),(0,o.CE)("span",{class:(0,i.C4)(["badge",e.type]),style:(0,i.Tr)({verticalAlign:e.vertical})},[(0,o.RG)(t.$slots,"default",{},(()=>[(0,o.eW)((0,i.v_)(e.text),1)]))],6))}}),l=n(3073),u=n(953);const c=(0,o.pM)({name:"CodeGroup",slots:Object,setup(e,{slots:t}){const n=(0,u.KR)([]),r=(0,u.KR)(-1),s=(0,l.rXt)("vuepress-code-group",{}),i=(0,o.EW)((()=>n.value.map((e=>e.innerText)).join(",")));(0,o.sV)((()=>{(0,o.wB)((()=>s.value[i.value]),((e=-1)=>{r.value!==e&&(r.value=e)}),{immediate:!0}),(0,o.wB)(r,(e=>{s.value[i.value]!==e&&(s.value[i.value]=e)}))}));return()=>{const e=(t.default?.()||[]).filter((e=>"CodeGroupItem"===e.type.name)).map((e=>(null===e.props&&(e.props={}),e)));return 0===e.length?null:(r.value<0||r.value>e.length-1?(r.value=e.findIndex((e=>""===e.props.active||!0===e.props.active)),-1===r.value&&(r.value=0)):e.forEach(((e,t)=>{e.props.active=t===r.value})),(0,o.h)("div",{class:"code-group"},[(0,o.h)("div",{class:"code-group__nav",role:"tablist"},e.map(((e,t)=>{const s=t===r.value;return(0,o.h)("button",{ref:e=>{e&&(n.value[t]=e)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":s},role:"tab",ariaSelected:s,onClick:()=>r.value=t,onKeydown:e=>((e,t)=>{" "===e.key||"Enter"===e.key?(e.preventDefault(),r.value=t):"ArrowRight"===e.key?(e.preventDefault(),((e=r.value)=>{e{r.value=e>0?e-1:n.value.length-1,n.value[r.value].focus()})(t))})(e,t)},e.props.title)}))),e]))}}});var d=(0,o.pM)({name:"CodeGroupItem",__name:"CodeGroupItem",props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>((0,o.uX)(),(0,o.CE)("div",{class:(0,i.C4)(["code-group-item",{"code-group-item__active":e.active}]),role:"tabpanel"},[(0,o.RG)(t.$slots,"default")],2))}}),f=n(8216),h=n(3567);const m={class:"theme-container"},p={class:"page"},v={class:"theme-default-content"},g=(0,o.Lk)("h1",null,"404",-1);var y=(0,o.pM)({__name:"NotFound",setup(e){var t,n,r;const a=(0,s.Zv)(),l=(0,f.To)(),c=null!=(t=l.value.notFound)?t:["Not Found"],d=null!=(n=l.value.home)?n:a.value,h=null!=(r=l.value.backToHome)?r:"Back to home";return(e,t)=>((0,o.uX)(),(0,o.CE)("div",m,[(0,o.Lk)("main",p,[(0,o.Lk)("div",v,[g,(0,o.Lk)("blockquote",null,(0,i.v_)(c[Math.floor(Math.random()*c.length)]),1),(0,o.bF)((0,u.R1)(s.Wt),{to:(0,u.R1)(d)},{default:(0,o.k6)((()=>[(0,o.eW)((0,i.v_)((0,u.R1)(h)),1)])),_:1},8,["to"])])])]))}}),b=(0,s.re)({enhance({app:e,router:t}){(0,r.L4)("Badge")||e.component("Badge",a),(0,r.L4)("CodeGroup")||e.component("CodeGroup",c),(0,r.L4)("CodeGroupItem")||e.component("CodeGroupItem",d),e.component("AutoLinkExternalIcon",(()=>{const t=e.component("ExternalLinkIcon");return t?(0,o.h)(t):null})),e.component("NavbarSearch",(()=>{const t=e.component("Docsearch")||e.component("SearchBox");return t?(0,o.h)(t):null}));const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...e)=>(await(0,f.MK)().wait(),n(...e))},setup(){(0,f.fv)(),(0,f.i$)()},layouts:{Layout:h.A,NotFound:y}})},5146:function(e,t,n){n.d(t,{eU:function(){return o},w8:function(){return i},lL:function(){return c},DA:function(){return l}});var r=n(6209);const o=e=>{const{notFound:t,meta:n,path:o}=(0,r.ie)(e);return t?{text:o,link:o}:{text:n.title||o,link:o}},s=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),i=(e,t)=>!(!e.link||!((e,t)=>t.hash===e||s(t.path)===s(e))(e.link,t))||!!e.children&&e.children.some((e=>i(e,t)));var a=n(3246);const l=e=>!(0,a.r3)(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,u={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},c=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:r,editLinkPattern:o})=>{if(!r)return null;const s=(({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=l(e);return null!==n?u[n]:null})({docsRepo:e,editLinkPattern:o});return s?s.replace(/:repo/,(0,a.r3)(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,(0,a.uv)(`${(0,a.TY)(n)}/${r}`)):null}},3073:function(e,t,n){n.d(t,{iDZ:function(){return m},Lhy:function(){return S},MLh:function(){return c},Nk8:function(){return E},rXt:function(){return k},l4h:function(){return _},lWr:function(){return C}});var r=n(9271),o=n(641),s=n(953),i=!1;function a(e){var t;const n=(0,r.BA)(e);return null!=(t=null==n?void 0:n.$el)?t:n}const l=r.oc?window:void 0,u=(r.oc&&window.document,r.oc?window.navigator:void 0);function c(...e){let t,n,s,i;if("string"==typeof e[0]||Array.isArray(e[0])?([n,s,i]=e,t=l):[t,n,s,i]=e,!t)return r.lQ;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const u=[],c=()=>{u.forEach((e=>e())),u.length=0},d=(0,o.wB)((()=>[a(t),(0,r.BA)(i)]),(([e,t])=>{if(c(),!e)return;const o=(0,r.Gv)(t)?{...t}:t;u.push(...n.flatMap((t=>s.map((n=>((e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)))(e,t,n,o))))))}),{immediate:!0,flush:"post"}),f=()=>{d(),c()};return(0,r.Uo)(f),f}function d(e){const t=function(){const e=(0,s.KR)(!1),t=(0,o.nI)();return t&&(0,o.sV)((()=>{e.value=!0}),i?null:t),e}();return(0,o.EW)((()=>(t.value,Boolean(e()))))}function f(e,t={}){const{window:n=l}=t,i=d((()=>n&&"matchMedia"in n&&"function"==typeof n.matchMedia));let a;const u=(0,s.KR)(!1),c=e=>{u.value=e.matches},f=()=>{a&&("removeEventListener"in a?a.removeEventListener("change",c):a.removeListener(c))},h=(0,o.nT)((()=>{i.value&&(f(),a=n.matchMedia((0,r.BA)(e)),"addEventListener"in a?a.addEventListener("change",c):a.addListener(c),u.value=a.matches)}));return(0,r.Uo)((()=>{h(),f(),a=void 0})),u}function h(e,t={}){const{controls:n=!1,navigator:o=u}=t,i=d((()=>o&&"permissions"in o));let a;const l="string"==typeof e?{name:e}:e,f=(0,s.KR)(),h=()=>{a&&(f.value=a.state)},m=(0,r.Jv)((async()=>{if(i.value){if(!a)try{a=await o.permissions.query(l),c(a,"change",h),h()}catch(e){f.value="prompt"}return a}}));return m(),n?{state:f,isSupported:i,query:m}:f}function m(e={}){const{navigator:t=u,read:n=!1,source:i,copiedDuring:a=1500,legacy:l=!1}=e,f=d((()=>t&&"clipboard"in t)),m=h("clipboard-read"),p=h("clipboard-write"),v=(0,o.EW)((()=>f.value||l)),g=(0,s.KR)(""),y=(0,s.KR)(!1),b=(0,r.TO)((()=>y.value=!1),a);function w(e){return"granted"===e||"prompt"===e}return v.value&&n&&c(["copy","cut"],(function(){var e,n,r;f.value&&w(m.value)?t.clipboard.readText().then((e=>{g.value=e})):g.value=null!=(r=null==(n=null==(e=null==document?void 0:document.getSelection)?void 0:e.call(document))?void 0:n.toString())?r:""})),{isSupported:v,text:g,copied:y,copy:async function(e=(0,r.BA)(i)){v.value&&null!=e&&(f.value&&w(p.value)?await t.clipboard.writeText(e):function(e){const t=document.createElement("textarea");t.value=null!=e?e:"",t.style.position="absolute",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),t.remove()}(e),g.value=e,y.value=!0,b.start())}}}r.oc&&window.location;const p="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},v="__vueuse_ssr_handlers__",g=y();function y(){return v in p||(p[v]=p[v]||{}),p[v]}const b={boolean:{read:e=>"true"===e,write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},w="vueuse-storage";function k(e,t,n,i={}){var a;const{flush:u="pre",deep:d=!0,listenToStorageChanges:f=!0,writeDefaults:h=!0,mergeDefaults:m=!1,shallow:p,window:v=l,eventFilter:y,onError:k=(e=>{console.error(e)}),initOnMounted:E}=i,S=(p?s.IJ:s.KR)("function"==typeof t?t():t);if(!n)try{n=function(e,t){return g[e]||t}("getDefaultStorage",(()=>{var e;return null==(e=l)?void 0:e.localStorage}))()}catch(e){k(e)}if(!n)return S;const _=(0,r.BA)(t),C=function(e){return null==e?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":"boolean"==typeof e?"boolean":"string"==typeof e?"string":"object"==typeof e?"object":Number.isNaN(e)?"any":"number"}(_),T=null!=(a=i.serializer)?a:b[C],{pause:x,resume:O}=(0,r.Hr)(S,(()=>function(t){try{const r=n.getItem(e);if(null==t)M(r,null),n.removeItem(e);else{const o=T.write(t);r!==o&&(n.setItem(e,o),M(r,o))}}catch(e){k(e)}}(S.value)),{flush:u,deep:d,eventFilter:y});function M(t,r){v&&v.dispatchEvent(new CustomEvent(w,{detail:{key:e,oldValue:t,newValue:r,storageArea:n}}))}function L(t){if(!t||t.storageArea===n)if(t&&null==t.key)S.value=_;else if(!t||t.key===e){x();try{(null==t?void 0:t.newValue)!==T.write(S.value)&&(S.value=function(t){const r=t?t.newValue:n.getItem(e);if(null==r)return h&&null!=_&&n.setItem(e,T.write(_)),_;if(!t&&m){const e=T.read(r);return"function"==typeof m?m(e,_):"object"!==C||Array.isArray(e)?e:{..._,...e}}return"string"!=typeof r?r:T.read(r)}(t))}catch(e){k(e)}finally{t?(0,o.dY)(O):O()}}}function N(e){L(e.detail)}return v&&f&&(0,r.rd)((()=>{c(v,"storage",L),c(v,w,N),E&&L()})),E||L(),S}function E(e){return f("(prefers-color-scheme: dark)",e)}function S(e,t={width:0,height:0},n={}){const{window:i=l,box:u="content-box"}=n,c=(0,o.EW)((()=>{var t,n;return null==(n=null==(t=a(e))?void 0:t.namespaceURI)?void 0:n.includes("svg")})),f=(0,s.KR)(t.width),h=(0,s.KR)(t.height),{stop:m}=function(e,t,n={}){const{window:s=l,...i}=n;let u;const c=d((()=>s&&"ResizeObserver"in s)),f=()=>{u&&(u.disconnect(),u=void 0)},h=(0,o.EW)((()=>Array.isArray(e)?e.map((e=>a(e))):[a(e)])),m=(0,o.wB)(h,(e=>{if(f(),c.value&&s){u=new ResizeObserver(t);for(const t of e)t&&u.observe(t,i)}}),{immediate:!0,flush:"post"}),p=()=>{f(),m()};return(0,r.Uo)(p),{isSupported:c,stop:p}}(e,(([t])=>{const n="border-box"===u?t.borderBoxSize:"content-box"===u?t.contentBoxSize:t.devicePixelContentBoxSize;if(i&&c.value){const t=a(e);if(t){const e=i.getComputedStyle(t);f.value=Number.parseFloat(e.width),h.value=Number.parseFloat(e.height)}}else if(n){const e=Array.isArray(n)?n:[n];f.value=e.reduce(((e,{inlineSize:t})=>e+t),0),h.value=e.reduce(((e,{blockSize:t})=>e+t),0)}else f.value=t.contentRect.width,h.value=t.contentRect.height}),n);(0,r.rd)((()=>{const n=a(e);n&&(f.value="offsetWidth"in n?n.offsetWidth:t.width,h.value="offsetHeight"in n?n.offsetHeight:t.height)}));const p=(0,o.wB)((()=>a(e)),(e=>{f.value=e?t.width:0,h.value=e?t.height:0}));return{width:f,height:h,stop:function(){m(),p()}}}Number.POSITIVE_INFINITY;function _(e={}){const{window:t=l,behavior:n="auto"}=e;if(!t)return{x:(0,s.KR)(0),y:(0,s.KR)(0)};const r=(0,s.KR)(t.scrollX),i=(0,s.KR)(t.scrollY),a=(0,o.EW)({get(){return r.value},set(e){scrollTo({left:e,behavior:n})}}),u=(0,o.EW)({get(){return i.value},set(e){scrollTo({top:e,behavior:n})}});return c(t,"scroll",(()=>{r.value=t.scrollX,i.value=t.scrollY}),{capture:!1,passive:!0}),{x:a,y:u}}function C(e={}){const{window:t=l,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:i=Number.POSITIVE_INFINITY,listenOrientation:a=!0,includeScrollbar:u=!0}=e,d=(0,s.KR)(n),h=(0,s.KR)(i),m=()=>{t&&(u?(d.value=t.innerWidth,h.value=t.innerHeight):(d.value=t.document.documentElement.clientWidth,h.value=t.document.documentElement.clientHeight))};if(m(),(0,r.rd)(m),c("resize",m,{passive:!0}),a){const e=f("(orientation: portrait)");(0,o.wB)(e,(()=>m()))}return{width:d,height:h}}r.D_},9271:function(e,t,n){n.d(t,{Jv:function(){return g},D_:function(){return v},oc:function(){return a},Gv:function(){return u},lQ:function(){return c},Hr:function(){return w},BA:function(){return i},rd:function(){return k},Uo:function(){return s},Q0:function(){return y},TO:function(){return E},eY:function(){return S}});var r=n(953),o=n(641);function s(e){return!!(0,r.o5)()&&((0,r.jr)(e),!0)}function i(e){return"function"==typeof e?e():(0,r.R1)(e)}const a="undefined"!=typeof window&&"undefined"!=typeof document,l=("undefined"!=typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),Object.prototype.toString),u=e=>"[object Object]"===l.call(e),c=()=>{};function d(e,t){return function(...n){return new Promise(((r,o)=>{Promise.resolve(e((()=>t.apply(this,n)),{fn:t,thisArg:this,args:n})).then(r).catch(o)}))}}const f=e=>e();function h(e){const t=Object.create(null);return n=>t[n]||(t[n]=e(n))}const m=/\B([A-Z])/g,p=(h((e=>e.replace(m,"-$1").toLowerCase())),/-(\w)/g);function v(e){return e}function g(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const e=t;t=void 0,e&&await e},n}function y(e,t=200,n={}){return d(function(e,t={}){let n,r,o=c;const s=e=>{clearTimeout(e),o(),o=c};return a=>{const l=i(e),u=i(t.maxWait);return n&&s(n),l<=0||void 0!==u&&u<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise(((e,i)=>{o=t.rejectOnCancel?i:e,u&&!r&&(r=setTimeout((()=>{n&&s(n),r=null,e(a())}),u)),n=setTimeout((()=>{r&&s(r),r=null,e(a())}),l)}))}}(t,n),e)}function b(e,t,n={}){const{eventFilter:r=f,...s}=n;return(0,o.wB)(e,d(r,t),s)}function w(e,t,n={}){const{eventFilter:o,...s}=n,{eventFilter:i,pause:a,resume:l,isActive:u}=function(e=f){const t=(0,r.KR)(!0);return{isActive:(0,r.tB)(t),pause:function(){t.value=!1},resume:function(){t.value=!0},eventFilter:(...n)=>{t.value&&e(...n)}}}(o);return{stop:b(e,t,{...s,eventFilter:i}),pause:a,resume:l,isActive:u}}function k(e,t=!0,n){!function(e){return e||(0,o.nI)()}()?t?e():(0,o.dY)(e):(0,o.sV)(e,n)}function E(e,t,n={}){const{immediate:o=!0}=n,l=(0,r.KR)(!1);let u=null;function c(){u&&(clearTimeout(u),u=null)}function d(){l.value=!1,c()}function f(...n){c(),l.value=!0,u=setTimeout((()=>{l.value=!1,u=null,e(...n)}),i(t))}return o&&(l.value=!0,a&&f()),s(d),{isPending:(0,r.tB)(l),start:f,stop:d}}function S(e=!1,t={}){const{truthyValue:n=!0,falsyValue:o=!1}=t,s=(0,r.i9)(e),a=(0,r.KR)(e);function l(e){if(arguments.length)return a.value=e,a.value;{const e=i(n);return a.value=a.value===e?i(o):e,a.value}}return s?l:[a,l]}h((e=>e.replace(p,((e,t)=>t?t.toUpperCase():""))))},6285:function(e,t,n){n.d(t,{c9:function(){return lr}});class r extends Error{}class o extends r{constructor(e){super(`Invalid DateTime: ${e.toMessage()}`)}}class s extends r{constructor(e){super(`Invalid Interval: ${e.toMessage()}`)}}class i extends r{constructor(e){super(`Invalid Duration: ${e.toMessage()}`)}}class a extends r{}class l extends r{constructor(e){super(`Invalid unit ${e}`)}}class u extends r{}class c extends r{constructor(){super("Zone is an abstract class")}}const d="numeric",f="short",h="long",m={year:d,month:d,day:d},p={year:d,month:f,day:d},v={year:d,month:f,day:d,weekday:f},g={year:d,month:h,day:d},y={year:d,month:h,day:d,weekday:h},b={hour:d,minute:d},w={hour:d,minute:d,second:d},k={hour:d,minute:d,second:d,timeZoneName:f},E={hour:d,minute:d,second:d,timeZoneName:h},S={hour:d,minute:d,hourCycle:"h23"},_={hour:d,minute:d,second:d,hourCycle:"h23"},C={hour:d,minute:d,second:d,hourCycle:"h23",timeZoneName:f},T={hour:d,minute:d,second:d,hourCycle:"h23",timeZoneName:h},x={year:d,month:d,day:d,hour:d,minute:d},O={year:d,month:d,day:d,hour:d,minute:d,second:d},M={year:d,month:f,day:d,hour:d,minute:d},L={year:d,month:f,day:d,hour:d,minute:d,second:d},N={year:d,month:f,day:d,weekday:f,hour:d,minute:d},R={year:d,month:h,day:d,hour:d,minute:d,timeZoneName:f},$={year:d,month:h,day:d,hour:d,minute:d,second:d,timeZoneName:f},I={year:d,month:h,day:d,weekday:h,hour:d,minute:d,timeZoneName:h},W={year:d,month:h,day:d,weekday:h,hour:d,minute:d,second:d,timeZoneName:h};class A{get type(){throw new c}get name(){throw new c}get ianaName(){return this.name}get isUniversal(){throw new c}offsetName(e,t){throw new c}formatOffset(e,t){throw new c}offset(e){throw new c}equals(e){throw new c}get isValid(){throw new c}}let D=null;class F extends A{static get instance(){return null===D&&(D=new F),D}get type(){return"system"}get name(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return Ye(e,t,n)}formatOffset(e,t){return tt(this.offset(e),t)}offset(e){return-new Date(e).getTimezoneOffset()}equals(e){return"system"===e.type}get isValid(){return!0}}let V={};const z={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};let j={};class P extends A{static create(e){return j[e]||(j[e]=new P(e)),j[e]}static resetCache(){j={},V={}}static isValidSpecifier(e){return this.isValidZone(e)}static isValidZone(e){if(!e)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(),!0}catch(e){return!1}}constructor(e){super(),this.zoneName=e,this.valid=P.isValidZone(e)}get type(){return"iana"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(e,{format:t,locale:n}){return Ye(e,t,n,this.name)}formatOffset(e,t){return tt(this.offset(e),t)}offset(e){const t=new Date(e);if(isNaN(t))return NaN;const n=(r=this.name,V[r]||(V[r]=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:r,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"})),V[r]);var r;let[o,s,i,a,l,u,c]=n.formatToParts?function(e,t){const n=e.formatToParts(t),r=[];for(let e=0;e=0?f:1e3+f,(He({year:o,month:s,day:i,hour:24===l?0:l,minute:u,second:c,millisecond:0})-d)/6e4}equals(e){return"iana"===e.type&&e.name===this.name}get isValid(){return this.valid}}let Z={},B={};function U(e,t={}){const n=JSON.stringify([e,t]);let r=B[n];return r||(r=new Intl.DateTimeFormat(e,t),B[n]=r),r}let q={},H={},G=null,K={};function X(e,t,n,r){const o=e.listingMode();return"error"===o?null:"en"===o?n(t):r(t)}class Y{constructor(e,t,n){this.padTo=n.padTo||0,this.floor=n.floor||!1;const{padTo:r,floor:o,...s}=n;if(!t||Object.keys(s).length>0){const t={useGrouping:!1,...n};n.padTo>0&&(t.minimumIntegerDigits=n.padTo),this.inf=function(e,t={}){const n=JSON.stringify([e,t]);let r=q[n];return r||(r=new Intl.NumberFormat(e,t),q[n]=r),r}(e,t)}}format(e){if(this.inf){const t=this.floor?Math.floor(e):e;return this.inf.format(t)}return Ve(this.floor?Math.floor(e):Ze(e,3),this.padTo)}}class Q{constructor(e,t,n){let r;if(this.opts=n,this.originalZone=void 0,this.opts.timeZone)this.dt=e;else if("fixed"===e.zone.type){const t=e.offset/60*-1,n=t>=0?`Etc/GMT+${t}`:`Etc/GMT${t}`;0!==e.offset&&P.create(n).valid?(r=n,this.dt=e):(r="UTC",this.dt=0===e.offset?e:e.setZone("UTC").plus({minutes:e.offset}),this.originalZone=e.zone)}else"system"===e.zone.type?this.dt=e:"iana"===e.zone.type?(this.dt=e,r=e.zone.name):(r="UTC",this.dt=e.setZone("UTC").plus({minutes:e.offset}),this.originalZone=e.zone);const o={...this.opts};o.timeZone=o.timeZone||r,this.dtf=U(t,o)}format(){return this.originalZone?this.formatToParts().map((({value:e})=>e)).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){const e=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?e.map((e=>{if("timeZoneName"===e.type){const t=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...e,value:t}}return e})):e}resolvedOptions(){return this.dtf.resolvedOptions()}}class J{constructor(e,t,n){this.opts={style:"long",...n},!t&&$e()&&(this.rtf=function(e,t={}){const{base:n,...r}=t,o=JSON.stringify([e,r]);let s=H[o];return s||(s=new Intl.RelativeTimeFormat(e,t),H[o]=s),s}(e,n))}format(e,t){return this.rtf?this.rtf.format(e,t):function(e,t,n="always",r=!1){const o={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},s=-1===["hours","minutes","seconds"].indexOf(e);if("auto"===n&&s){const n="days"===e;switch(t){case 1:return n?"tomorrow":`next ${o[e][0]}`;case-1:return n?"yesterday":`last ${o[e][0]}`;case 0:return n?"today":`this ${o[e][0]}`}}const i=Object.is(t,-0)||t<0,a=Math.abs(t),l=1===a,u=o[e],c=r?l?u[1]:u[2]||u[1]:l?o[e][0]:e;return i?`${a} ${c} ago`:`in ${a} ${c}`}(t,e,this.opts.numeric,"long"!==this.opts.style)}formatToParts(e,t){return this.rtf?this.rtf.formatToParts(e,t):[]}}const ee={firstDay:1,minimalDays:4,weekend:[6,7]};class te{static fromOpts(e){return te.create(e.locale,e.numberingSystem,e.outputCalendar,e.weekSettings,e.defaultToEN)}static create(e,t,n,r,o=!1){const s=e||me.defaultLocale,i=s||(o?"en-US":G||(G=(new Intl.DateTimeFormat).resolvedOptions().locale,G)),a=t||me.defaultNumberingSystem,l=n||me.defaultOutputCalendar,u=De(r)||me.defaultWeekSettings;return new te(i,a,l,u,s)}static resetCache(){G=null,B={},q={},H={}}static fromObject({locale:e,numberingSystem:t,outputCalendar:n,weekSettings:r}={}){return te.create(e,t,n,r)}constructor(e,t,n,r,o){const[s,i,a]=function(e){const t=e.indexOf("-x-");-1!==t&&(e=e.substring(0,t));const n=e.indexOf("-u-");if(-1===n)return[e];{let t,r;try{t=U(e).resolvedOptions(),r=e}catch(o){const s=e.substring(0,n);t=U(s).resolvedOptions(),r=s}const{numberingSystem:o,calendar:s}=t;return[r,o,s]}}(e);this.locale=s,this.numberingSystem=t||i||null,this.outputCalendar=n||a||null,this.weekSettings=r,this.intl=function(e,t,n){return n||t?(e.includes("-u-")||(e+="-u"),n&&(e+=`-ca-${n}`),t&&(e+=`-nu-${t}`),e):e}(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=o,this.fastNumbersCached=null}get fastNumbers(){var e;return null==this.fastNumbersCached&&(this.fastNumbersCached=(!(e=this).numberingSystem||"latn"===e.numberingSystem)&&("latn"===e.numberingSystem||!e.locale||e.locale.startsWith("en")||"latn"===new Intl.DateTimeFormat(e.intl).resolvedOptions().numberingSystem)),this.fastNumbersCached}listingMode(){const e=this.isEnglish(),t=!(null!==this.numberingSystem&&"latn"!==this.numberingSystem||null!==this.outputCalendar&&"gregory"!==this.outputCalendar);return e&&t?"en":"intl"}clone(e){return e&&0!==Object.getOwnPropertyNames(e).length?te.create(e.locale||this.specifiedLocale,e.numberingSystem||this.numberingSystem,e.outputCalendar||this.outputCalendar,De(e.weekSettings)||this.weekSettings,e.defaultToEN||!1):this}redefaultToEN(e={}){return this.clone({...e,defaultToEN:!0})}redefaultToSystem(e={}){return this.clone({...e,defaultToEN:!1})}months(e,t=!1){return X(this,e,it,(()=>{const n=t?{month:e,day:"numeric"}:{month:e},r=t?"format":"standalone";return this.monthsCache[r][e]||(this.monthsCache[r][e]=function(e){const t=[];for(let n=1;n<=12;n++){const r=lr.utc(2009,n,1);t.push(e(r))}return t}((e=>this.extract(e,n,"month")))),this.monthsCache[r][e]}))}weekdays(e,t=!1){return X(this,e,ct,(()=>{const n=t?{weekday:e,year:"numeric",month:"long",day:"numeric"}:{weekday:e},r=t?"format":"standalone";return this.weekdaysCache[r][e]||(this.weekdaysCache[r][e]=function(e){const t=[];for(let n=1;n<=7;n++){const r=lr.utc(2016,11,13+n);t.push(e(r))}return t}((e=>this.extract(e,n,"weekday")))),this.weekdaysCache[r][e]}))}meridiems(){return X(this,void 0,(()=>dt),(()=>{if(!this.meridiemCache){const e={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[lr.utc(2016,11,13,9),lr.utc(2016,11,13,19)].map((t=>this.extract(t,e,"dayperiod")))}return this.meridiemCache}))}eras(e){return X(this,e,pt,(()=>{const t={era:e};return this.eraCache[e]||(this.eraCache[e]=[lr.utc(-40,1,1),lr.utc(2017,1,1)].map((e=>this.extract(e,t,"era")))),this.eraCache[e]}))}extract(e,t,n){const r=this.dtFormatter(e,t).formatToParts().find((e=>e.type.toLowerCase()===n));return r?r.value:null}numberFormatter(e={}){return new Y(this.intl,e.forceSimple||this.fastNumbers,e)}dtFormatter(e,t={}){return new Q(e,this.intl,t)}relFormatter(e={}){return new J(this.intl,this.isEnglish(),e)}listFormatter(e={}){return function(e,t={}){const n=JSON.stringify([e,t]);let r=Z[n];return r||(r=new Intl.ListFormat(e,t),Z[n]=r),r}(this.intl,e)}isEnglish(){return"en"===this.locale||"en-us"===this.locale.toLowerCase()||new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:Ie()?function(e){let t=K[e];if(!t){const n=new Intl.Locale(e);t="getWeekInfo"in n?n.getWeekInfo():n.weekInfo,K[e]=t}return t}(this.locale):ee}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(e){return this.locale===e.locale&&this.numberingSystem===e.numberingSystem&&this.outputCalendar===e.outputCalendar}}let ne=null;class re extends A{static get utcInstance(){return null===ne&&(ne=new re(0)),ne}static instance(e){return 0===e?re.utcInstance:new re(e)}static parseSpecifier(e){if(e){const t=e.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(t)return new re(Qe(t[1],t[2]))}return null}constructor(e){super(),this.fixed=e}get type(){return"fixed"}get name(){return 0===this.fixed?"UTC":`UTC${tt(this.fixed,"narrow")}`}get ianaName(){return 0===this.fixed?"Etc/UTC":`Etc/GMT${tt(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(e,t){return tt(this.fixed,t)}get isUniversal(){return!0}offset(){return this.fixed}equals(e){return"fixed"===e.type&&e.fixed===this.fixed}get isValid(){return!0}}class oe extends A{constructor(e){super(),this.zoneName=e}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}}function se(e,t){if(Le(e)||null===e)return t;if(e instanceof A)return e;if("string"==typeof e){const n=e.toLowerCase();return"default"===n?t:"local"===n||"system"===n?F.instance:"utc"===n||"gmt"===n?re.utcInstance:re.parseSpecifier(n)||P.create(e)}return Ne(e)?re.instance(e):"object"==typeof e&&"offset"in e&&"function"==typeof e.offset?e:new oe(e)}let ie,ae=()=>Date.now(),le="system",ue=null,ce=null,de=null,fe=60,he=null;class me{static get now(){return ae}static set now(e){ae=e}static set defaultZone(e){le=e}static get defaultZone(){return se(le,F.instance)}static get defaultLocale(){return ue}static set defaultLocale(e){ue=e}static get defaultNumberingSystem(){return ce}static set defaultNumberingSystem(e){ce=e}static get defaultOutputCalendar(){return de}static set defaultOutputCalendar(e){de=e}static get defaultWeekSettings(){return he}static set defaultWeekSettings(e){he=De(e)}static get twoDigitCutoffYear(){return fe}static set twoDigitCutoffYear(e){fe=e%100}static get throwOnInvalid(){return ie}static set throwOnInvalid(e){ie=e}static resetCaches(){te.resetCache(),P.resetCache()}}class pe{constructor(e,t){this.reason=e,this.explanation=t}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}}const ve=[0,31,59,90,120,151,181,212,243,273,304,334],ge=[0,31,60,91,121,152,182,213,244,274,305,335];function ye(e,t){return new pe("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function be(e,t,n){const r=new Date(Date.UTC(e,t-1,n));e<100&&e>=0&&r.setUTCFullYear(r.getUTCFullYear()-1900);const o=r.getUTCDay();return 0===o?7:o}function we(e,t,n){return n+(Be(e)?ge:ve)[t-1]}function ke(e,t){const n=Be(e)?ge:ve,r=n.findIndex((e=>eKe(r,t,n)?(l=r+1,u=1):l=r,{weekYear:l,weekNumber:u,weekday:a,...nt(e)}}function _e(e,t=4,n=1){const{weekYear:r,weekNumber:o,weekday:s}=e,i=Ee(be(r,1,t),n),a=Ue(r);let l,u=7*o+s-i-7+t;u<1?(l=r-1,u+=Ue(l)):u>a?(l=r+1,u-=Ue(r)):l=r;const{month:c,day:d}=ke(l,u);return{year:l,month:c,day:d,...nt(e)}}function Ce(e){const{year:t,month:n,day:r}=e;return{year:t,ordinal:we(t,n,r),...nt(e)}}function Te(e){const{year:t,ordinal:n}=e,{month:r,day:o}=ke(t,n);return{year:t,month:r,day:o,...nt(e)}}function xe(e,t){if(!Le(e.localWeekday)||!Le(e.localWeekNumber)||!Le(e.localWeekYear)){if(!Le(e.weekday)||!Le(e.weekNumber)||!Le(e.weekYear))throw new a("Cannot mix locale-based week fields with ISO-based week fields");return Le(e.localWeekday)||(e.weekday=e.localWeekday),Le(e.localWeekNumber)||(e.weekNumber=e.localWeekNumber),Le(e.localWeekYear)||(e.weekYear=e.localWeekYear),delete e.localWeekday,delete e.localWeekNumber,delete e.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}return{minDaysInFirstWeek:4,startOfWeek:1}}function Oe(e){const t=Re(e.year),n=Fe(e.month,1,12),r=Fe(e.day,1,qe(e.year,e.month));return t?n?!r&&ye("day",e.day):ye("month",e.month):ye("year",e.year)}function Me(e){const{hour:t,minute:n,second:r,millisecond:o}=e,s=Fe(t,0,23)||24===t&&0===n&&0===r&&0===o,i=Fe(n,0,59),a=Fe(r,0,59),l=Fe(o,0,999);return s?i?a?!l&&ye("millisecond",o):ye("second",r):ye("minute",n):ye("hour",t)}function Le(e){return void 0===e}function Ne(e){return"number"==typeof e}function Re(e){return"number"==typeof e&&e%1==0}function $e(){try{return"undefined"!=typeof Intl&&!!Intl.RelativeTimeFormat}catch(e){return!1}}function Ie(){try{return"undefined"!=typeof Intl&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch(e){return!1}}function We(e,t,n){if(0!==e.length)return e.reduce(((e,r)=>{const o=[t(r),r];return e&&n(e[0],o[0])===e[0]?e:o}),null)[1]}function Ae(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function De(e){if(null==e)return null;if("object"!=typeof e)throw new u("Week settings must be an object");if(!Fe(e.firstDay,1,7)||!Fe(e.minimalDays,1,7)||!Array.isArray(e.weekend)||e.weekend.some((e=>!Fe(e,1,7))))throw new u("Invalid week settings");return{firstDay:e.firstDay,minimalDays:e.minimalDays,weekend:Array.from(e.weekend)}}function Fe(e,t,n){return Re(e)&&e>=t&&e<=n}function Ve(e,t=2){let n;return n=e<0?"-"+(""+-e).padStart(t,"0"):(""+e).padStart(t,"0"),n}function ze(e){return Le(e)||null===e||""===e?void 0:parseInt(e,10)}function je(e){return Le(e)||null===e||""===e?void 0:parseFloat(e)}function Pe(e){if(!Le(e)&&null!==e&&""!==e){const t=1e3*parseFloat("0."+e);return Math.floor(t)}}function Ze(e,t,n=!1){const r=10**t;return(n?Math.trunc:Math.round)(e*r)/r}function Be(e){return e%4==0&&(e%100!=0||e%400==0)}function Ue(e){return Be(e)?366:365}function qe(e,t){const n=(r=t-1)-12*Math.floor(r/12)+1;var r;return 2===n?Be(e+(t-n)/12)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][n-1]}function He(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t),t.setUTCFullYear(e.year,e.month-1,e.day)),+t}function Ge(e,t,n){return-Ee(be(e,1,t),n)+t-1}function Ke(e,t=4,n=1){const r=Ge(e,t,n),o=Ge(e+1,t,n);return(Ue(e)-r+o)/7}function Xe(e){return e>99?e:e>me.twoDigitCutoffYear?1900+e:2e3+e}function Ye(e,t,n,r=null){const o=new Date(e),s={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};r&&(s.timeZone=r);const i={timeZoneName:t,...s},a=new Intl.DateTimeFormat(n,i).formatToParts(o).find((e=>"timezonename"===e.type.toLowerCase()));return a?a.value:null}function Qe(e,t){let n=parseInt(e,10);Number.isNaN(n)&&(n=0);const r=parseInt(t,10)||0;return 60*n+(n<0||Object.is(n,-0)?-r:r)}function Je(e){const t=Number(e);if("boolean"==typeof e||""===e||Number.isNaN(t))throw new u(`Invalid unit value ${e}`);return t}function et(e,t){const n={};for(const r in e)if(Ae(e,r)){const o=e[r];if(null==o)continue;n[t(r)]=Je(o)}return n}function tt(e,t){const n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),o=e>=0?"+":"-";switch(t){case"short":return`${o}${Ve(n,2)}:${Ve(r,2)}`;case"narrow":return`${o}${n}${r>0?`:${r}`:""}`;case"techie":return`${o}${Ve(n,2)}${Ve(r,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function nt(e){return function(e,t){return["hour","minute","second","millisecond"].reduce(((t,n)=>(t[n]=e[n],t)),{})}(e)}const rt=["January","February","March","April","May","June","July","August","September","October","November","December"],ot=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],st=["J","F","M","A","M","J","J","A","S","O","N","D"];function it(e){switch(e){case"narrow":return[...st];case"short":return[...ot];case"long":return[...rt];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}const at=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],lt=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],ut=["M","T","W","T","F","S","S"];function ct(e){switch(e){case"narrow":return[...ut];case"short":return[...lt];case"long":return[...at];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const dt=["AM","PM"],ft=["Before Christ","Anno Domini"],ht=["BC","AD"],mt=["B","A"];function pt(e){switch(e){case"narrow":return[...mt];case"short":return[...ht];case"long":return[...ft];default:return null}}function vt(e,t){let n="";for(const r of e)r.literal?n+=r.val:n+=t(r.val);return n}const gt={D:m,DD:p,DDD:g,DDDD:y,t:b,tt:w,ttt:k,tttt:E,T:S,TT:_,TTT:C,TTTT:T,f:x,ff:M,fff:R,ffff:I,F:O,FF:L,FFF:$,FFFF:W};class yt{static create(e,t={}){return new yt(e,t)}static parseFormat(e){let t=null,n="",r=!1;const o=[];for(let s=0;s0&&o.push({literal:r||/^\s+$/.test(n),val:n}),t=null,n="",r=!r):r||i===t?n+=i:(n.length>0&&o.push({literal:/^\s+$/.test(n),val:n}),n=i,t=i)}return n.length>0&&o.push({literal:r||/^\s+$/.test(n),val:n}),o}static macroTokenToFormatOpts(e){return gt[e]}constructor(e,t){this.opts=t,this.loc=e,this.systemLoc=null}formatWithSystemDefault(e,t){return null===this.systemLoc&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(e,{...this.opts,...t}).format()}dtFormatter(e,t={}){return this.loc.dtFormatter(e,{...this.opts,...t})}formatDateTime(e,t){return this.dtFormatter(e,t).format()}formatDateTimeParts(e,t){return this.dtFormatter(e,t).formatToParts()}formatInterval(e,t){return this.dtFormatter(e.start,t).dtf.formatRange(e.start.toJSDate(),e.end.toJSDate())}resolvedOptions(e,t){return this.dtFormatter(e,t).resolvedOptions()}num(e,t=0){if(this.opts.forceSimple)return Ve(e,t);const n={...this.opts};return t>0&&(n.padTo=t),this.loc.numberFormatter(n).format(e)}formatDateTimeFromString(e,t){const n="en"===this.loc.listingMode(),r=this.loc.outputCalendar&&"gregory"!==this.loc.outputCalendar,o=(t,n)=>this.loc.extract(e,t,n),s=t=>e.isOffsetFixed&&0===e.offset&&t.allowZ?"Z":e.isValid?e.zone.formatOffset(e.ts,t.format):"",i=(t,r)=>n?function(e,t){return it(t)[e.month-1]}(e,t):o(r?{month:t}:{month:t,day:"numeric"},"month"),a=(t,r)=>n?function(e,t){return ct(t)[e.weekday-1]}(e,t):o(r?{weekday:t}:{weekday:t,month:"long",day:"numeric"},"weekday"),l=t=>{const n=yt.macroTokenToFormatOpts(t);return n?this.formatWithSystemDefault(e,n):t},u=t=>n?function(e,t){return pt(t)[e.year<0?0:1]}(e,t):o({era:t},"era");return vt(yt.parseFormat(t),(t=>{switch(t){case"S":return this.num(e.millisecond);case"u":case"SSS":return this.num(e.millisecond,3);case"s":return this.num(e.second);case"ss":return this.num(e.second,2);case"uu":return this.num(Math.floor(e.millisecond/10),2);case"uuu":return this.num(Math.floor(e.millisecond/100));case"m":return this.num(e.minute);case"mm":return this.num(e.minute,2);case"h":return this.num(e.hour%12==0?12:e.hour%12);case"hh":return this.num(e.hour%12==0?12:e.hour%12,2);case"H":return this.num(e.hour);case"HH":return this.num(e.hour,2);case"Z":return s({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return s({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return s({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return e.zone.offsetName(e.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return e.zone.offsetName(e.ts,{format:"long",locale:this.loc.locale});case"z":return e.zoneName;case"a":return n?function(e){return dt[e.hour<12?0:1]}(e):o({hour:"numeric",hourCycle:"h12"},"dayperiod");case"d":return r?o({day:"numeric"},"day"):this.num(e.day);case"dd":return r?o({day:"2-digit"},"day"):this.num(e.day,2);case"c":case"E":return this.num(e.weekday);case"ccc":return a("short",!0);case"cccc":return a("long",!0);case"ccccc":return a("narrow",!0);case"EEE":return a("short",!1);case"EEEE":return a("long",!1);case"EEEEE":return a("narrow",!1);case"L":return r?o({month:"numeric",day:"numeric"},"month"):this.num(e.month);case"LL":return r?o({month:"2-digit",day:"numeric"},"month"):this.num(e.month,2);case"LLL":return i("short",!0);case"LLLL":return i("long",!0);case"LLLLL":return i("narrow",!0);case"M":return r?o({month:"numeric"},"month"):this.num(e.month);case"MM":return r?o({month:"2-digit"},"month"):this.num(e.month,2);case"MMM":return i("short",!1);case"MMMM":return i("long",!1);case"MMMMM":return i("narrow",!1);case"y":return r?o({year:"numeric"},"year"):this.num(e.year);case"yy":return r?o({year:"2-digit"},"year"):this.num(e.year.toString().slice(-2),2);case"yyyy":return r?o({year:"numeric"},"year"):this.num(e.year,4);case"yyyyyy":return r?o({year:"numeric"},"year"):this.num(e.year,6);case"G":return u("short");case"GG":return u("long");case"GGGGG":return u("narrow");case"kk":return this.num(e.weekYear.toString().slice(-2),2);case"kkkk":return this.num(e.weekYear,4);case"W":return this.num(e.weekNumber);case"WW":return this.num(e.weekNumber,2);case"n":return this.num(e.localWeekNumber);case"nn":return this.num(e.localWeekNumber,2);case"ii":return this.num(e.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(e.localWeekYear,4);case"o":return this.num(e.ordinal);case"ooo":return this.num(e.ordinal,3);case"q":return this.num(e.quarter);case"qq":return this.num(e.quarter,2);case"X":return this.num(Math.floor(e.ts/1e3));case"x":return this.num(e.ts);default:return l(t)}}))}formatDurationFromString(e,t){const n=e=>{switch(e[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},r=yt.parseFormat(t),o=r.reduce(((e,{literal:t,val:n})=>t?e:e.concat(n)),[]);return vt(r,(e=>t=>{const r=n(t);return r?this.num(e.get(r),t.length):t})(e.shiftTo(...o.map(n).filter((e=>e)))))}}const bt=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function wt(...e){const t=e.reduce(((e,t)=>e+t.source),"");return RegExp(`^${t}$`)}function kt(...e){return t=>e.reduce((([e,n,r],o)=>{const[s,i,a]=o(t,r);return[{...e,...s},i||n,a]}),[{},null,1]).slice(0,2)}function Et(e,...t){if(null==e)return[null,null];for(const[n,r]of t){const t=n.exec(e);if(t)return r(t)}return[null,null]}function St(...e){return(t,n)=>{const r={};let o;for(o=0;ovoid 0!==e&&(t||e&&c)?-e:e;return[{years:f(je(n)),months:f(je(r)),weeks:f(je(o)),days:f(je(s)),hours:f(je(i)),minutes:f(je(a)),seconds:f(je(l),"-0"===l),milliseconds:f(Pe(u),d)}]}const Vt={GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function zt(e,t,n,r,o,s,i){const a={year:2===t.length?Xe(ze(t)):ze(t),month:ot.indexOf(n)+1,day:ze(r),hour:ze(o),minute:ze(s)};return i&&(a.second=ze(i)),e&&(a.weekday=e.length>3?at.indexOf(e)+1:lt.indexOf(e)+1),a}const jt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function Pt(e){const[,t,n,r,o,s,i,a,l,u,c,d]=e,f=zt(t,o,r,n,s,i,a);let h;return h=l?Vt[l]:u?0:Qe(c,d),[f,new re(h)]}const Zt=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,Bt=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,Ut=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function qt(e){const[,t,n,r,o,s,i,a]=e;return[zt(t,o,r,n,s,i,a),re.utcInstance]}function Ht(e){const[,t,n,r,o,s,i,a]=e;return[zt(t,a,n,r,o,s,i),re.utcInstance]}const Gt=wt(/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,xt),Kt=wt(/(\d{4})-?W(\d\d)(?:-?(\d))?/,xt),Xt=wt(/(\d{4})-?(\d{3})/,xt),Yt=wt(Tt),Qt=kt((function(e,t){return[{year:Rt(e,t),month:Rt(e,t+1,1),day:Rt(e,t+2,1)},null,t+3]}),$t,It,Wt),Jt=kt(Ot,$t,It,Wt),en=kt(Mt,$t,It,Wt),tn=kt($t,It,Wt),nn=kt($t),rn=wt(/(\d{4})-(\d\d)-(\d\d)/,Nt),on=wt(Lt),sn=kt($t,It,Wt),an="Invalid Duration",ln={weeks:{days:7,hours:168,minutes:10080,seconds:604800,milliseconds:6048e5},days:{hours:24,minutes:1440,seconds:86400,milliseconds:864e5},hours:{minutes:60,seconds:3600,milliseconds:36e5},minutes:{seconds:60,milliseconds:6e4},seconds:{milliseconds:1e3}},un={years:{quarters:4,months:12,weeks:52,days:365,hours:8760,minutes:525600,seconds:31536e3,milliseconds:31536e6},quarters:{months:3,weeks:13,days:91,hours:2184,minutes:131040,seconds:7862400,milliseconds:78624e5},months:{weeks:4,days:30,hours:720,minutes:43200,seconds:2592e3,milliseconds:2592e6},...ln},cn={years:{quarters:4,months:12,weeks:52.1775,days:365.2425,hours:8765.82,minutes:525949.2,seconds:525949.2*60,milliseconds:525949.2*60*1e3},quarters:{months:3,weeks:13.044375,days:91.310625,hours:2191.455,minutes:131487.3,seconds:525949.2*60/4,milliseconds:7889237999.999999},months:{weeks:4.3481250000000005,days:30.436875,hours:730.485,minutes:43829.1,seconds:2629746,milliseconds:2629746e3},...ln},dn=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],fn=dn.slice(0).reverse();function hn(e,t,n=!1){const r={values:n?t.values:{...e.values,...t.values||{}},loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy,matrix:t.matrix||e.matrix};return new vn(r)}function mn(e,t){let n=t.milliseconds??0;for(const r of fn.slice(1))t[r]&&(n+=t[r]*e[r].milliseconds);return n}function pn(e,t){const n=mn(e,t)<0?-1:1;dn.reduceRight(((r,o)=>{if(Le(t[o]))return r;if(r){const s=t[r]*n,i=e[o][r],a=Math.floor(s/i);t[o]+=a*n,t[r]-=a*i*n}return o}),null),dn.reduce(((n,r)=>{if(Le(t[r]))return n;if(n){const o=t[n]%1;t[n]-=o,t[r]+=o*e[n][r]}return r}),null)}class vn{constructor(e){const t="longterm"===e.conversionAccuracy||!1;let n=t?cn:un;e.matrix&&(n=e.matrix),this.values=e.values,this.loc=e.loc||te.create(),this.conversionAccuracy=t?"longterm":"casual",this.invalid=e.invalid||null,this.matrix=n,this.isLuxonDuration=!0}static fromMillis(e,t){return vn.fromObject({milliseconds:e},t)}static fromObject(e,t={}){if(null==e||"object"!=typeof e)throw new u("Duration.fromObject: argument expected to be an object, got "+(null===e?"null":typeof e));return new vn({values:et(e,vn.normalizeUnit),loc:te.fromObject(t),conversionAccuracy:t.conversionAccuracy,matrix:t.matrix})}static fromDurationLike(e){if(Ne(e))return vn.fromMillis(e);if(vn.isDuration(e))return e;if("object"==typeof e)return vn.fromObject(e);throw new u(`Unknown duration argument ${e} of type ${typeof e}`)}static fromISO(e,t){const[n]=function(e){return Et(e,[Dt,Ft])}(e);return n?vn.fromObject(n,t):vn.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static fromISOTime(e,t){const[n]=function(e){return Et(e,[At,nn])}(e);return n?vn.fromObject(n,t):vn.invalid("unparsable",`the input "${e}" can't be parsed as ISO 8601`)}static invalid(e,t=null){if(!e)throw new u("need to specify a reason the Duration is invalid");const n=e instanceof pe?e:new pe(e,t);if(me.throwOnInvalid)throw new i(n);return new vn({invalid:n})}static normalizeUnit(e){const t={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[e?e.toLowerCase():e];if(!t)throw new l(e);return t}static isDuration(e){return e&&e.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(e,t={}){const n={...t,floor:!1!==t.round&&!1!==t.floor};return this.isValid?yt.create(this.loc,n).formatDurationFromString(this,e):an}toHuman(e={}){if(!this.isValid)return an;const t=dn.map((t=>{const n=this.values[t];return Le(n)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...e,unit:t.slice(0,-1)}).format(n)})).filter((e=>e));return this.loc.listFormatter({type:"conjunction",style:e.listStyle||"narrow",...e}).format(t)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let e="P";return 0!==this.years&&(e+=this.years+"Y"),0===this.months&&0===this.quarters||(e+=this.months+3*this.quarters+"M"),0!==this.weeks&&(e+=this.weeks+"W"),0!==this.days&&(e+=this.days+"D"),0===this.hours&&0===this.minutes&&0===this.seconds&&0===this.milliseconds||(e+="T"),0!==this.hours&&(e+=this.hours+"H"),0!==this.minutes&&(e+=this.minutes+"M"),0===this.seconds&&0===this.milliseconds||(e+=Ze(this.seconds+this.milliseconds/1e3,3)+"S"),"P"===e&&(e+="T0S"),e}toISOTime(e={}){if(!this.isValid)return null;const t=this.toMillis();return t<0||t>=864e5?null:(e={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...e,includeOffset:!1},lr.fromMillis(t,{zone:"UTC"}).toISOTime(e))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?mn(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(e){if(!this.isValid)return this;const t=vn.fromDurationLike(e),n={};for(const e of dn)(Ae(t.values,e)||Ae(this.values,e))&&(n[e]=t.get(e)+this.get(e));return hn(this,{values:n},!0)}minus(e){if(!this.isValid)return this;const t=vn.fromDurationLike(e);return this.plus(t.negate())}mapUnits(e){if(!this.isValid)return this;const t={};for(const n of Object.keys(this.values))t[n]=Je(e(this.values[n],n));return hn(this,{values:t},!0)}get(e){return this[vn.normalizeUnit(e)]}set(e){return this.isValid?hn(this,{values:{...this.values,...et(e,vn.normalizeUnit)}}):this}reconfigure({locale:e,numberingSystem:t,conversionAccuracy:n,matrix:r}={}){return hn(this,{loc:this.loc.clone({locale:e,numberingSystem:t}),matrix:r,conversionAccuracy:n})}as(e){return this.isValid?this.shiftTo(e).get(e):NaN}normalize(){if(!this.isValid)return this;const e=this.toObject();return pn(this.matrix,e),hn(this,{values:e},!0)}rescale(){return this.isValid?hn(this,{values:function(e){const t={};for(const[n,r]of Object.entries(e))0!==r&&(t[n]=r);return t}(this.normalize().shiftToAll().toObject())},!0):this}shiftTo(...e){if(!this.isValid)return this;if(0===e.length)return this;e=e.map((e=>vn.normalizeUnit(e)));const t={},n={},r=this.toObject();let o;for(const s of dn)if(e.indexOf(s)>=0){o=s;let e=0;for(const t in n)e+=this.matrix[t][s]*n[t],n[t]=0;Ne(r[s])&&(e+=r[s]);const i=Math.trunc(e);t[s]=i,n[s]=(1e3*e-1e3*i)/1e3}else Ne(r[s])&&(n[s]=r[s]);for(const e in n)0!==n[e]&&(t[o]+=e===o?n[e]:n[e]/this.matrix[o][e]);return pn(this.matrix,t),hn(this,{values:t},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;const e={};for(const t of Object.keys(this.values))e[t]=0===this.values[t]?0:-this.values[t];return hn(this,{values:e},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return null===this.invalid}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(e){if(!this.isValid||!e.isValid)return!1;if(!this.loc.equals(e.loc))return!1;for(const r of dn)if(t=this.values[r],n=e.values[r],!(void 0===t||0===t?void 0===n||0===n:t===n))return!1;var t,n;return!0}}const gn="Invalid Interval";class yn{constructor(e){this.s=e.start,this.e=e.end,this.invalid=e.invalid||null,this.isLuxonInterval=!0}static invalid(e,t=null){if(!e)throw new u("need to specify a reason the Interval is invalid");const n=e instanceof pe?e:new pe(e,t);if(me.throwOnInvalid)throw new s(n);return new yn({invalid:n})}static fromDateTimes(e,t){const n=ur(e),r=ur(t),o=function(e,t){return e&&e.isValid?t&&t.isValid?te}isBefore(e){return!!this.isValid&&this.e<=e}contains(e){return!!this.isValid&&this.s<=e&&this.e>e}set({start:e,end:t}={}){return this.isValid?yn.fromDateTimes(e||this.s,t||this.e):this}splitAt(...e){if(!this.isValid)return[];const t=e.map(ur).filter((e=>this.contains(e))).sort(((e,t)=>e.toMillis()-t.toMillis())),n=[];let{s:r}=this,o=0;for(;r+this.e?this.e:e;n.push(yn.fromDateTimes(r,s)),r=s,o+=1}return n}splitBy(e){const t=vn.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];let n,{s:r}=this,o=1;const s=[];for(;re*o)));n=+e>+this.e?this.e:e,s.push(yn.fromDateTimes(r,n)),r=n,o+=1}return s}divideEqually(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]}overlaps(e){return this.e>e.s&&this.s=e.e}equals(e){return!(!this.isValid||!e.isValid)&&this.s.equals(e.s)&&this.e.equals(e.e)}intersection(e){if(!this.isValid)return this;const t=this.s>e.s?this.s:e.s,n=this.e=n?null:yn.fromDateTimes(t,n)}union(e){if(!this.isValid)return this;const t=this.se.e?this.e:e.e;return yn.fromDateTimes(t,n)}static merge(e){const[t,n]=e.sort(((e,t)=>e.s-t.s)).reduce((([e,t],n)=>t?t.overlaps(n)||t.abutsStart(n)?[e,t.union(n)]:[e.concat([t]),n]:[e,n]),[[],null]);return n&&t.push(n),t}static xor(e){let t=null,n=0;const r=[],o=e.map((e=>[{time:e.s,type:"s"},{time:e.e,type:"e"}])),s=Array.prototype.concat(...o).sort(((e,t)=>e.time-t.time));for(const e of s)n+="s"===e.type?1:-1,1===n?t=e.time:(t&&+t!=+e.time&&r.push(yn.fromDateTimes(t,e.time)),t=null);return yn.merge(r)}difference(...e){return yn.xor([this].concat(e)).map((e=>this.intersection(e))).filter((e=>e&&!e.isEmpty()))}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:gn}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(e=m,t={}){return this.isValid?yt.create(this.s.loc.clone(t),e).formatInterval(this):gn}toISO(e){return this.isValid?`${this.s.toISO(e)}/${this.e.toISO(e)}`:gn}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:gn}toISOTime(e){return this.isValid?`${this.s.toISOTime(e)}/${this.e.toISOTime(e)}`:gn}toFormat(e,{separator:t=" – "}={}){return this.isValid?`${this.s.toFormat(e)}${t}${this.e.toFormat(e)}`:gn}toDuration(e,t){return this.isValid?this.e.diff(this.s,e,t):vn.invalid(this.invalidReason)}mapEndpoints(e){return yn.fromDateTimes(e(this.s),e(this.e))}}class bn{static hasDST(e=me.defaultZone){const t=lr.now().setZone(e).set({month:12});return!e.isUniversal&&t.offset!==t.set({month:6}).offset}static isValidIANAZone(e){return P.isValidZone(e)}static normalizeZone(e){return se(e,me.defaultZone)}static getStartOfWeek({locale:e=null,locObj:t=null}={}){return(t||te.create(e)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:e=null,locObj:t=null}={}){return(t||te.create(e)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:e=null,locObj:t=null}={}){return(t||te.create(e)).getWeekendDays().slice()}static months(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:o="gregory"}={}){return(r||te.create(t,n,o)).months(e)}static monthsFormat(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null,outputCalendar:o="gregory"}={}){return(r||te.create(t,n,o)).months(e,!0)}static weekdays(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||te.create(t,n,null)).weekdays(e)}static weekdaysFormat(e="long",{locale:t=null,numberingSystem:n=null,locObj:r=null}={}){return(r||te.create(t,n,null)).weekdays(e,!0)}static meridiems({locale:e=null}={}){return te.create(e).meridiems()}static eras(e="short",{locale:t=null}={}){return te.create(t,null,"gregory").eras(e)}static features(){return{relative:$e(),localeWeek:Ie()}}}function wn(e,t){const n=e=>e.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),r=n(t)-n(e);return Math.floor(vn.fromMillis(r).as("days"))}const kn={arab:"[٠-٩]",arabext:"[۰-۹]",bali:"[᭐-᭙]",beng:"[০-৯]",deva:"[०-९]",fullwide:"[0-9]",gujr:"[૦-૯]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[០-៩]",knda:"[೦-೯]",laoo:"[໐-໙]",limb:"[᥆-᥏]",mlym:"[൦-൯]",mong:"[᠐-᠙]",mymr:"[၀-၉]",orya:"[୦-୯]",tamldec:"[௦-௯]",telu:"[౦-౯]",thai:"[๐-๙]",tibt:"[༠-༩]",latn:"\\d"},En={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},Sn=kn.hanidec.replace(/[\[|\]]/g,"").split("");function _n({numberingSystem:e},t=""){return new RegExp(`${kn[e||"latn"]}${t}`)}function Cn(e,t=(e=>e)){return{regex:e,deser:([e])=>t(function(e){let t=parseInt(e,10);if(isNaN(t)){t="";for(let n=0;n=n&&r<=o&&(t+=r-n)}}return parseInt(t,10)}return t}(e))}}const Tn=`[ ${String.fromCharCode(160)}]`,xn=new RegExp(Tn,"g");function On(e){return e.replace(/\./g,"\\.?").replace(xn,Tn)}function Mn(e){return e.replace(/\./g,"").replace(xn," ").toLowerCase()}function Ln(e,t){return null===e?null:{regex:RegExp(e.map(On).join("|")),deser:([n])=>e.findIndex((e=>Mn(n)===Mn(e)))+t}}function Nn(e,t){return{regex:e,deser:([,e,t])=>Qe(e,t),groups:t}}function Rn(e){return{regex:e,deser:([e])=>e}}const $n={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};let In=null;function Wn(e,t){return Array.prototype.concat(...e.map((e=>function(e,t){if(e.literal)return e;const n=Dn(yt.macroTokenToFormatOpts(e.val),t);return null==n||n.includes(void 0)?e:n}(e,t))))}function An(e,t,n){const r=Wn(yt.parseFormat(n),e),o=r.map((t=>function(e,t){const n=_n(t),r=_n(t,"{2}"),o=_n(t,"{3}"),s=_n(t,"{4}"),i=_n(t,"{6}"),a=_n(t,"{1,2}"),l=_n(t,"{1,3}"),u=_n(t,"{1,6}"),c=_n(t,"{1,9}"),d=_n(t,"{2,4}"),f=_n(t,"{4,6}"),h=e=>{return{regex:RegExp((t=e.val,t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"))),deser:([e])=>e,literal:!0};var t},m=(m=>{if(e.literal)return h(m);switch(m.val){case"G":return Ln(t.eras("short"),0);case"GG":return Ln(t.eras("long"),0);case"y":return Cn(u);case"yy":case"kk":return Cn(d,Xe);case"yyyy":case"kkkk":return Cn(s);case"yyyyy":return Cn(f);case"yyyyyy":return Cn(i);case"M":case"L":case"d":case"H":case"h":case"m":case"q":case"s":case"W":return Cn(a);case"MM":case"LL":case"dd":case"HH":case"hh":case"mm":case"qq":case"ss":case"WW":return Cn(r);case"MMM":return Ln(t.months("short",!0),1);case"MMMM":return Ln(t.months("long",!0),1);case"LLL":return Ln(t.months("short",!1),1);case"LLLL":return Ln(t.months("long",!1),1);case"o":case"S":return Cn(l);case"ooo":case"SSS":return Cn(o);case"u":return Rn(c);case"uu":return Rn(a);case"uuu":case"E":case"c":return Cn(n);case"a":return Ln(t.meridiems(),0);case"EEE":return Ln(t.weekdays("short",!1),1);case"EEEE":return Ln(t.weekdays("long",!1),1);case"ccc":return Ln(t.weekdays("short",!0),1);case"cccc":return Ln(t.weekdays("long",!0),1);case"Z":case"ZZ":return Nn(new RegExp(`([+-]${a.source})(?::(${r.source}))?`),2);case"ZZZ":return Nn(new RegExp(`([+-]${a.source})(${r.source})?`),2);case"z":return Rn(/[a-z_+-/]{1,256}?/i);case" ":return Rn(/[^\S\n\r]/);default:return h(m)}})(e)||{invalidReason:"missing Intl.DateTimeFormat.formatToParts support"};return m.token=e,m}(t,e))),s=o.find((e=>e.invalidReason));if(s)return{input:t,tokens:r,invalidReason:s.invalidReason};{const[e,n]=function(e){return[`^${e.map((e=>e.regex)).reduce(((e,t)=>`${e}(${t.source})`),"")}$`,e]}(o),s=RegExp(e,"i"),[i,l]=function(e,t,n){const r=e.match(t);if(r){const e={};let t=1;for(const o in n)if(Ae(n,o)){const s=n[o],i=s.groups?s.groups+1:1;!s.literal&&s.token&&(e[s.token.val[0]]=s.deser(r.slice(t,t+i))),t+=i}return[r,e]}return[r,{}]}(t,s,n),[u,c,d]=l?function(e){let t,n=null;return Le(e.z)||(n=P.create(e.z)),Le(e.Z)||(n||(n=new re(e.Z)),t=e.Z),Le(e.q)||(e.M=3*(e.q-1)+1),Le(e.h)||(e.h<12&&1===e.a?e.h+=12:12===e.h&&0===e.a&&(e.h=0)),0===e.G&&e.y&&(e.y=-e.y),Le(e.u)||(e.S=Pe(e.u)),[Object.keys(e).reduce(((t,n)=>{const r=(e=>{switch(e){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}})(n);return r&&(t[r]=e[n]),t}),{}),n,t]}(l):[null,null,void 0];if(Ae(l,"a")&&Ae(l,"H"))throw new a("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:r,regex:s,rawMatches:i,matches:l,result:u,zone:c,specificOffset:d}}}function Dn(e,t){if(!e)return null;const n=yt.create(t,e).dtFormatter((In||(In=lr.fromMillis(1555555555555)),In)),r=n.formatToParts(),o=n.resolvedOptions();return r.map((t=>function(e,t,n){const{type:r,value:o}=e;if("literal"===r){const e=/^\s+$/.test(o);return{literal:!e,val:e?" ":o}}const s=t[r];let i=r;"hour"===r&&(i=null!=t.hour12?t.hour12?"hour12":"hour24":null!=t.hourCycle?"h11"===t.hourCycle||"h12"===t.hourCycle?"hour12":"hour24":n.hour12?"hour12":"hour24");let a=$n[i];if("object"==typeof a&&(a=a[s]),a)return{literal:!1,val:a}}(t,e,o)))}const Fn="Invalid DateTime",Vn=864e13;function zn(e){return new pe("unsupported zone",`the zone "${e.name}" is not supported`)}function jn(e){return null===e.weekData&&(e.weekData=Se(e.c)),e.weekData}function Pn(e){return null===e.localWeekData&&(e.localWeekData=Se(e.c,e.loc.getMinDaysInFirstWeek(),e.loc.getStartOfWeek())),e.localWeekData}function Zn(e,t){const n={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new lr({...n,...t,old:n})}function Bn(e,t,n){let r=e-60*t*1e3;const o=n.offset(r);if(t===o)return[r,t];r-=60*(o-t)*1e3;const s=n.offset(r);return o===s?[r,o]:[e-60*Math.min(o,s)*1e3,Math.max(o,s)]}function Un(e,t){const n=new Date(e+=60*t*1e3);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds(),millisecond:n.getUTCMilliseconds()}}function qn(e,t,n){return Bn(He(e),t,n)}function Hn(e,t){const n=e.o,r=e.c.year+Math.trunc(t.years),o=e.c.month+Math.trunc(t.months)+3*Math.trunc(t.quarters),s={...e.c,year:r,month:o,day:Math.min(e.c.day,qe(r,o))+Math.trunc(t.days)+7*Math.trunc(t.weeks)},i=vn.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),a=He(s);let[l,u]=Bn(a,n,e.zone);return 0!==i&&(l+=i,u=e.zone.offset(l)),{ts:l,o:u}}function Gn(e,t,n,r,o,s){const{setZone:i,zone:a}=n;if(e&&0!==Object.keys(e).length||t){const r=t||a,o=lr.fromObject(e,{...n,zone:r,specificOffset:s});return i?o:o.setZone(a)}return lr.invalid(new pe("unparsable",`the input "${o}" can't be parsed as ${r}`))}function Kn(e,t,n=!0){return e.isValid?yt.create(te.create("en-US"),{allowZ:n,forceSimple:!0}).formatDateTimeFromString(e,t):null}function Xn(e,t){const n=e.c.year>9999||e.c.year<0;let r="";return n&&e.c.year>=0&&(r+="+"),r+=Ve(e.c.year,n?6:4),t?(r+="-",r+=Ve(e.c.month),r+="-",r+=Ve(e.c.day)):(r+=Ve(e.c.month),r+=Ve(e.c.day)),r}function Yn(e,t,n,r,o,s){let i=Ve(e.c.hour);return t?(i+=":",i+=Ve(e.c.minute),0===e.c.millisecond&&0===e.c.second&&n||(i+=":")):i+=Ve(e.c.minute),0===e.c.millisecond&&0===e.c.second&&n||(i+=Ve(e.c.second),0===e.c.millisecond&&r||(i+=".",i+=Ve(e.c.millisecond,3))),o&&(e.isOffsetFixed&&0===e.offset&&!s?i+="Z":e.o<0?(i+="-",i+=Ve(Math.trunc(-e.o/60)),i+=":",i+=Ve(Math.trunc(-e.o%60))):(i+="+",i+=Ve(Math.trunc(e.o/60)),i+=":",i+=Ve(Math.trunc(e.o%60)))),s&&(i+="["+e.zone.ianaName+"]"),i}const Qn={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},Jn={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},er={ordinal:1,hour:0,minute:0,second:0,millisecond:0},tr=["year","month","day","hour","minute","second","millisecond"],nr=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],rr=["year","ordinal","hour","minute","second","millisecond"];function or(e){switch(e.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return function(e){const t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[e.toLowerCase()];if(!t)throw new l(e);return t}(e)}}function sr(e,t){const n=se(t.zone,me.defaultZone),r=te.fromObject(t),o=me.now();let s,i;if(Le(e.year))s=o;else{for(const t of tr)Le(e[t])&&(e[t]=Qn[t]);const t=Oe(e)||Me(e);if(t)return lr.invalid(t);const r=n.offset(o);[s,i]=qn(e,r,n)}return new lr({ts:s,zone:n,loc:r,o:i})}function ir(e,t,n){const r=!!Le(n.round)||n.round,o=(e,o)=>(e=Ze(e,r||n.calendary?0:2,!0),t.loc.clone(n).relFormatter(n).format(e,o)),s=r=>n.calendary?t.hasSame(e,r)?0:t.startOf(r).diff(e.startOf(r),r).get(r):t.diff(e,r).get(r);if(n.unit)return o(s(n.unit),n.unit);for(const e of n.units){const t=s(e);if(Math.abs(t)>=1)return o(t,e)}return o(e>t?-0:0,n.units[n.units.length-1])}function ar(e){let t,n={};return e.length>0&&"object"==typeof e[e.length-1]?(n=e[e.length-1],t=Array.from(e).slice(0,e.length-1)):t=Array.from(e),[n,t]}class lr{constructor(e){const t=e.zone||me.defaultZone;let n=e.invalid||(Number.isNaN(e.ts)?new pe("invalid input"):null)||(t.isValid?null:zn(t));this.ts=Le(e.ts)?me.now():e.ts;let r=null,o=null;if(!n)if(e.old&&e.old.ts===this.ts&&e.old.zone.equals(t))[r,o]=[e.old.c,e.old.o];else{const e=t.offset(this.ts);r=Un(this.ts,e),n=Number.isNaN(r.year)?new pe("invalid input"):null,r=n?null:r,o=n?null:e}this._zone=t,this.loc=e.loc||te.create(),this.invalid=n,this.weekData=null,this.localWeekData=null,this.c=r,this.o=o,this.isLuxonDateTime=!0}static now(){return new lr({})}static local(){const[e,t]=ar(arguments),[n,r,o,s,i,a,l]=t;return sr({year:n,month:r,day:o,hour:s,minute:i,second:a,millisecond:l},e)}static utc(){const[e,t]=ar(arguments),[n,r,o,s,i,a,l]=t;return e.zone=re.utcInstance,sr({year:n,month:r,day:o,hour:s,minute:i,second:a,millisecond:l},e)}static fromJSDate(e,t={}){const n=(r=e,"[object Date]"===Object.prototype.toString.call(r)?e.valueOf():NaN);var r;if(Number.isNaN(n))return lr.invalid("invalid input");const o=se(t.zone,me.defaultZone);return o.isValid?new lr({ts:n,zone:o,loc:te.fromObject(t)}):lr.invalid(zn(o))}static fromMillis(e,t={}){if(Ne(e))return e<-Vn||e>Vn?lr.invalid("Timestamp out of range"):new lr({ts:e,zone:se(t.zone,me.defaultZone),loc:te.fromObject(t)});throw new u(`fromMillis requires a numerical input, but received a ${typeof e} with value ${e}`)}static fromSeconds(e,t={}){if(Ne(e))return new lr({ts:1e3*e,zone:se(t.zone,me.defaultZone),loc:te.fromObject(t)});throw new u("fromSeconds requires a numerical input")}static fromObject(e,t={}){e=e||{};const n=se(t.zone,me.defaultZone);if(!n.isValid)return lr.invalid(zn(n));const r=te.fromObject(t),o=et(e,or),{minDaysInFirstWeek:s,startOfWeek:i}=xe(o,r),l=me.now(),u=Le(t.specificOffset)?n.offset(l):t.specificOffset,c=!Le(o.ordinal),d=!Le(o.year),f=!Le(o.month)||!Le(o.day),h=d||f,m=o.weekYear||o.weekNumber;if((h||c)&&m)throw new a("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(f&&c)throw new a("Can't mix ordinal dates with month/day");const p=m||o.weekday&&!h;let v,g,y=Un(l,u);p?(v=nr,g=Jn,y=Se(y,s,i)):c?(v=rr,g=er,y=Ce(y)):(v=tr,g=Qn);let b=!1;for(const e of v)Le(o[e])?o[e]=b?g[e]:y[e]:b=!0;const w=p?function(e,t=4,n=1){const r=Re(e.weekYear),o=Fe(e.weekNumber,1,Ke(e.weekYear,t,n)),s=Fe(e.weekday,1,7);return r?o?!s&&ye("weekday",e.weekday):ye("week",e.weekNumber):ye("weekYear",e.weekYear)}(o,s,i):c?function(e){const t=Re(e.year),n=Fe(e.ordinal,1,Ue(e.year));return t?!n&&ye("ordinal",e.ordinal):ye("year",e.year)}(o):Oe(o),k=w||Me(o);if(k)return lr.invalid(k);const E=p?_e(o,s,i):c?Te(o):o,[S,_]=qn(E,u,n),C=new lr({ts:S,zone:n,o:_,loc:r});return o.weekday&&h&&e.weekday!==C.weekday?lr.invalid("mismatched weekday",`you can't specify both a weekday of ${o.weekday} and a date of ${C.toISO()}`):C}static fromISO(e,t={}){const[n,r]=function(e){return Et(e,[Gt,Qt],[Kt,Jt],[Xt,en],[Yt,tn])}(e);return Gn(n,r,t,"ISO 8601",e)}static fromRFC2822(e,t={}){const[n,r]=function(e){return Et(function(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}(e),[jt,Pt])}(e);return Gn(n,r,t,"RFC 2822",e)}static fromHTTP(e,t={}){const[n,r]=function(e){return Et(e,[Zt,qt],[Bt,qt],[Ut,Ht])}(e);return Gn(n,r,t,"HTTP",t)}static fromFormat(e,t,n={}){if(Le(e)||Le(t))throw new u("fromFormat requires an input string and a format");const{locale:r=null,numberingSystem:o=null}=n,s=te.fromOpts({locale:r,numberingSystem:o,defaultToEN:!0}),[i,a,l,c]=function(e,t,n){const{result:r,zone:o,specificOffset:s,invalidReason:i}=An(e,t,n);return[r,o,s,i]}(s,e,t);return c?lr.invalid(c):Gn(i,a,n,`format ${t}`,e,l)}static fromString(e,t,n={}){return lr.fromFormat(e,t,n)}static fromSQL(e,t={}){const[n,r]=function(e){return Et(e,[rn,Qt],[on,sn])}(e);return Gn(n,r,t,"SQL",e)}static invalid(e,t=null){if(!e)throw new u("need to specify a reason the DateTime is invalid");const n=e instanceof pe?e:new pe(e,t);if(me.throwOnInvalid)throw new o(n);return new lr({invalid:n})}static isDateTime(e){return e&&e.isLuxonDateTime||!1}static parseFormatForOpts(e,t={}){const n=Dn(e,te.fromObject(t));return n?n.map((e=>e?e.val:null)).join(""):null}static expandFormat(e,t={}){return Wn(yt.parseFormat(e),te.fromObject(t)).map((e=>e.val)).join("")}get(e){return this[e]}get isValid(){return null===this.invalid}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?jn(this).weekYear:NaN}get weekNumber(){return this.isValid?jn(this).weekNumber:NaN}get weekday(){return this.isValid?jn(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?Pn(this).weekday:NaN}get localWeekNumber(){return this.isValid?Pn(this).weekNumber:NaN}get localWeekYear(){return this.isValid?Pn(this).weekYear:NaN}get ordinal(){return this.isValid?Ce(this.c).ordinal:NaN}get monthShort(){return this.isValid?bn.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?bn.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?bn.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?bn.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return!this.isOffsetFixed&&(this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];const e=864e5,t=6e4,n=He(this.c),r=this.zone.offset(n-e),o=this.zone.offset(n+e),s=this.zone.offset(n-r*t),i=this.zone.offset(n-o*t);if(s===i)return[this];const a=n-s*t,l=n-i*t,u=Un(a,s),c=Un(l,i);return u.hour===c.hour&&u.minute===c.minute&&u.second===c.second&&u.millisecond===c.millisecond?[Zn(this,{ts:a}),Zn(this,{ts:l})]:[this]}get isInLeapYear(){return Be(this.year)}get daysInMonth(){return qe(this.year,this.month)}get daysInYear(){return this.isValid?Ue(this.year):NaN}get weeksInWeekYear(){return this.isValid?Ke(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?Ke(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(e={}){const{locale:t,numberingSystem:n,calendar:r}=yt.create(this.loc.clone(e),e).resolvedOptions(this);return{locale:t,numberingSystem:n,outputCalendar:r}}toUTC(e=0,t={}){return this.setZone(re.instance(e),t)}toLocal(){return this.setZone(me.defaultZone)}setZone(e,{keepLocalTime:t=!1,keepCalendarTime:n=!1}={}){if((e=se(e,me.defaultZone)).equals(this.zone))return this;if(e.isValid){let r=this.ts;if(t||n){const t=e.offset(this.ts),n=this.toObject();[r]=qn(n,t,e)}return Zn(this,{ts:r,zone:e})}return lr.invalid(zn(e))}reconfigure({locale:e,numberingSystem:t,outputCalendar:n}={}){return Zn(this,{loc:this.loc.clone({locale:e,numberingSystem:t,outputCalendar:n})})}setLocale(e){return this.reconfigure({locale:e})}set(e){if(!this.isValid)return this;const t=et(e,or),{minDaysInFirstWeek:n,startOfWeek:r}=xe(t,this.loc),o=!Le(t.weekYear)||!Le(t.weekNumber)||!Le(t.weekday),s=!Le(t.ordinal),i=!Le(t.year),l=!Le(t.month)||!Le(t.day),u=i||l,c=t.weekYear||t.weekNumber;if((u||s)&&c)throw new a("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(l&&s)throw new a("Can't mix ordinal dates with month/day");let d;o?d=_e({...Se(this.c,n,r),...t},n,r):Le(t.ordinal)?(d={...this.toObject(),...t},Le(t.day)&&(d.day=Math.min(qe(d.year,d.month),d.day))):d=Te({...Ce(this.c),...t});const[f,h]=qn(d,this.o,this.zone);return Zn(this,{ts:f,o:h})}plus(e){return this.isValid?Zn(this,Hn(this,vn.fromDurationLike(e))):this}minus(e){return this.isValid?Zn(this,Hn(this,vn.fromDurationLike(e).negate())):this}startOf(e,{useLocaleWeeks:t=!1}={}){if(!this.isValid)return this;const n={},r=vn.normalizeUnit(e);switch(r){case"years":n.month=1;case"quarters":case"months":n.day=1;case"weeks":case"days":n.hour=0;case"hours":n.minute=0;case"minutes":n.second=0;case"seconds":n.millisecond=0}if("weeks"===r)if(t){const e=this.loc.getStartOfWeek(),{weekday:t}=this;tthis.valueOf(),i=function(e,t,n,r){let[o,s,i,a]=function(e,t,n){const r=[["years",(e,t)=>t.year-e.year],["quarters",(e,t)=>t.quarter-e.quarter+4*(t.year-e.year)],["months",(e,t)=>t.month-e.month+12*(t.year-e.year)],["weeks",(e,t)=>{const n=wn(e,t);return(n-n%7)/7}],["days",wn]],o={},s=e;let i,a;for(const[l,u]of r)n.indexOf(l)>=0&&(i=l,o[l]=u(e,t),a=s.plus(o),a>t?(o[l]--,(e=s.plus(o))>t&&(a=e,o[l]--,e=s.plus(o))):e=a);return[e,o,a,i]}(e,t,n);const l=t-o,u=n.filter((e=>["hours","minutes","seconds","milliseconds"].indexOf(e)>=0));0===u.length&&(i0?vn.fromMillis(l,r).shiftTo(...u).plus(c):c}(s?this:e,s?e:this,o,r);var a;return s?i.negate():i}diffNow(e="milliseconds",t={}){return this.diff(lr.now(),e,t)}until(e){return this.isValid?yn.fromDateTimes(this,e):this}hasSame(e,t,n){if(!this.isValid)return!1;const r=e.valueOf(),o=this.setZone(e.zone,{keepLocalTime:!0});return o.startOf(t,n)<=r&&r<=o.endOf(t,n)}equals(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)}toRelative(e={}){if(!this.isValid)return null;const t=e.base||lr.fromObject({},{zone:this.zone}),n=e.padding?thise.valueOf()),Math.min)}static max(...e){if(!e.every(lr.isDateTime))throw new u("max requires all arguments be DateTimes");return We(e,(e=>e.valueOf()),Math.max)}static fromFormatExplain(e,t,n={}){const{locale:r=null,numberingSystem:o=null}=n;return An(te.fromOpts({locale:r,numberingSystem:o,defaultToEN:!0}),e,t)}static fromStringExplain(e,t,n={}){return lr.fromFormatExplain(e,t,n)}static get DATE_SHORT(){return m}static get DATE_MED(){return p}static get DATE_MED_WITH_WEEKDAY(){return v}static get DATE_FULL(){return g}static get DATE_HUGE(){return y}static get TIME_SIMPLE(){return b}static get TIME_WITH_SECONDS(){return w}static get TIME_WITH_SHORT_OFFSET(){return k}static get TIME_WITH_LONG_OFFSET(){return E}static get TIME_24_SIMPLE(){return S}static get TIME_24_WITH_SECONDS(){return _}static get TIME_24_WITH_SHORT_OFFSET(){return C}static get TIME_24_WITH_LONG_OFFSET(){return T}static get DATETIME_SHORT(){return x}static get DATETIME_SHORT_WITH_SECONDS(){return O}static get DATETIME_MED(){return M}static get DATETIME_MED_WITH_SECONDS(){return L}static get DATETIME_MED_WITH_WEEKDAY(){return N}static get DATETIME_FULL(){return R}static get DATETIME_FULL_WITH_SECONDS(){return $}static get DATETIME_HUGE(){return I}static get DATETIME_HUGE_WITH_SECONDS(){return W}}function ur(e){if(lr.isDateTime(e))return e;if(e&&e.valueOf&&Ne(e.valueOf()))return lr.fromJSDate(e);if(e&&"object"==typeof e)return lr.fromObject(e);throw new u(`Unknown datetime argument: ${e}, of type ${typeof e}`)}},5220:function(e,t,n){n.d(t,{LA:function(){return q},Ps:function(){return G},aE:function(){return Ne},lq:function(){return $e},rd:function(){return Re}});var r=n(641),o=n(953);const s="undefined"!=typeof document;const i=Object.assign;function a(e,t){const n={};for(const r in t){const o=t[r];n[r]=u(o)?o.map(e):e(o)}return n}const l=()=>{},u=Array.isArray,c=/#/g,d=/&/g,f=/\//g,h=/=/g,m=/\?/g,p=/\+/g,v=/%5B/g,g=/%5D/g,y=/%5E/g,b=/%60/g,w=/%7B/g,k=/%7C/g,E=/%7D/g,S=/%20/g;function _(e){return encodeURI(""+e).replace(k,"|").replace(v,"[").replace(g,"]")}function C(e){return _(e).replace(p,"%2B").replace(S,"+").replace(c,"%23").replace(d,"%26").replace(b,"`").replace(w,"{").replace(E,"}").replace(y,"^")}function T(e){return null==e?"":function(e){return _(e).replace(c,"%23").replace(m,"%3F")}(e).replace(f,"%2F")}function x(e){try{return decodeURIComponent(""+e)}catch(e){}return""+e}const O=/\/$/,M=e=>e.replace(O,"");function L(e,t,n="/"){let r,o={},s="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,a>-1?a:t.length),o=e(s)),a>-1&&(r=r||t.slice(0,a),i=t.slice(a,t.length)),r=function(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];".."!==o&&"."!==o||r.push("");let s,i,a=n.length-1;for(s=0;s1&&a--}return n.slice(0,a).join("/")+"/"+r.slice(s).join("/")}(null!=r?r:t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:x(i)}}function N(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function R(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function $(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!I(e[n],t[n]))return!1;return!0}function I(e,t){return u(e)?W(e,t):u(t)?W(t,e):e===t}function W(e,t){return u(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}var A,D;!function(e){e.pop="pop",e.push="push"}(A||(A={})),function(e){e.back="back",e.forward="forward",e.unknown=""}(D||(D={}));const F=/^[^#]+#/;function V(e,t){return e.replace(F,"#")+t}const z=()=>({left:window.scrollX,top:window.scrollY});function j(e,t){return(history.state?history.state.position-t:-1)+e}const P=new Map;let Z=()=>location.protocol+"//"+location.host;function B(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let t=o.includes(e.slice(s))?e.slice(s).length:1,n=o.slice(t);return"/"!==n[0]&&(n="/"+n),N(n,"")}return N(n,e)+r+o}function U(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?z():null}}function q(e){const t=function(e){const{history:t,location:n}=window,r={value:B(e,n)},o={value:t.state};function s(r,s,i){const a=e.indexOf("#"),l=a>-1?(n.host&&document.querySelector("base")?e:e.slice(a))+r:Z()+e+r;try{t[i?"replaceState":"pushState"](s,"",l),o.value=s}catch(e){console.error(e),n[i?"replace":"assign"](l)}}return o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:r,state:o,push:function(e,n){const a=i({},o.value,t.state,{forward:e,scroll:z()});s(a.current,a,!0),s(e,i({},U(r.value,e,null),{position:a.position+1},n),!1),r.value=e},replace:function(e,n){s(e,i({},t.state,U(o.value.back,e,o.value.forward,!0),n,{position:o.value.position}),!0),r.value=e}}}(e=function(e){if(!e)if(s){const t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),M(e)}(e)),n=function(e,t,n,r){let o=[],s=[],a=null;const l=({state:s})=>{const i=B(e,location),l=n.value,u=t.value;let c=0;if(s){if(n.value=i,t.value=s,a&&a===l)return void(a=null);c=u?s.position-u.position:0}else r(i);o.forEach((e=>{e(n.value,l,{delta:c,type:A.pop,direction:c?c>0?D.forward:D.back:D.unknown})}))};function u(){const{history:e}=window;e.state&&e.replaceState(i({},e.state,{scroll:z()}),"")}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:function(){a=n.value},listen:function(e){o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return s.push(t),t},destroy:function(){for(const e of s)e();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}}}(e,t.state,t.location,t.replace),r=i({location:"",base:e,go:function(e,t=!0){t||n.pauseListeners(),history.go(e)},createHref:V.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function H(e){return"string"==typeof e||"symbol"==typeof e}const G={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},K=Symbol("");var X;function Y(e,t){return i(new Error,{type:e,[K]:!0},t)}function Q(e,t){return e instanceof Error&&K in e&&(null==t||!!(e.type&t))}!function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"}(X||(X={}));const J="[^/]+?",ee={sensitive:!1,strict:!1,start:!0,end:!0},te=/[.+*?^${}()[\]/\\]/g;function ne(e,t){let n=0;for(;nt.length?1===t.length&&80===t[0]?1:-1:0}function re(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const se={type:0,value:""},ie=/[a-zA-Z0-9_]/;function ae(e,t,n){const r=function(e,t){const n=i({},ee,t),r=[];let o=n.start?"^":"";const s=[];for(const t of e){const e=t.length?[]:[90];n.strict&&!t.length&&(o+="/");for(let r=0;r1&&("*"===a||"+"===a)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:"*"===a||"+"===a,optional:"*"===a||"?"===a})):t("Invalid state to consume buffer"),u="")}function f(){u+=a}for(;li(e,t.meta)),{})}function fe(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function he(e,t){return t.children.some((t=>t===e||he(e,t)))}function me(e){const t={};if(""===e||"?"===e)return t;const n=("?"===e[0]?e.slice(1):e).split("&");for(let e=0;ee&&C(e))):[r&&C(r)]).forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))})):void 0!==r&&(t+=(t.length?"&":"")+n)}return t}function ve(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=u(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}const ge=Symbol(""),ye=Symbol(""),be=Symbol(""),we=Symbol(""),ke=Symbol("");function Ee(){let e=[];return{add:function(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}},list:()=>e.slice(),reset:function(){e=[]}}}function Se(e,t,n,r,o,s=(e=>e())){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((a,l)=>{const u=e=>{var s;!1===e?l(Y(4,{from:n,to:t})):e instanceof Error?l(e):"string"==typeof(s=e)||s&&"object"==typeof s?l(Y(2,{from:t,to:e})):(i&&r.enterCallbacks[o]===i&&"function"==typeof e&&i.push(e),a())},c=s((()=>e.call(r&&r.instances[o],t,n,u)));let d=Promise.resolve(c);e.length<3&&(d=d.then(u)),d.catch((e=>l(e)))}))}function _e(e,t,n,r,o=(e=>e())){const s=[];for(const a of e)for(const e in a.components){let l=a.components[e];if("beforeRouteEnter"===t||a.instances[e])if("object"==typeof(i=l)||"displayName"in i||"props"in i||"__vccOpts"in i){const i=(l.__vccOpts||l)[t];i&&s.push(Se(i,n,r,a,e,o))}else{let i=l();s.push((()=>i.then((s=>{if(!s)return Promise.reject(new Error(`Couldn't resolve component "${e}" at "${a.path}"`));const i=(l=s).__esModule||"Module"===l[Symbol.toStringTag]?s.default:s;var l;a.components[e]=i;const u=(i.__vccOpts||i)[t];return u&&Se(u,n,r,a,e,o)()}))))}}var i;return s}function Ce(e){const t=(0,r.WQ)(be),n=(0,r.WQ)(we),s=(0,r.EW)((()=>t.resolve((0,o.R1)(e.to)))),i=(0,r.EW)((()=>{const{matched:e}=s.value,{length:t}=e,r=e[t-1],o=n.matched;if(!r||!o.length)return-1;const i=o.findIndex(R.bind(null,r));if(i>-1)return i;const a=xe(e[t-2]);return t>1&&xe(r)===a&&o[o.length-1].path!==a?o.findIndex(R.bind(null,e[t-2])):i})),a=(0,r.EW)((()=>i.value>-1&&function(e,t){for(const n in t){const r=t[n],o=e[n];if("string"==typeof r){if(r!==o)return!1}else if(!u(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}(n.params,s.value.params))),c=(0,r.EW)((()=>i.value>-1&&i.value===n.matched.length-1&&$(n.params,s.value.params)));return{route:s,href:(0,r.EW)((()=>s.value.href)),isActive:a,isExactActive:c,navigate:function(n={}){return function(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||e.defaultPrevented||void 0!==e.button&&0!==e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}(n)?t[(0,o.R1)(e.replace)?"replace":"push"]((0,o.R1)(e.to)).catch(l):Promise.resolve()}}}const Te=(0,r.pM)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ce,setup(e,{slots:t}){const n=(0,o.Kh)(Ce(e)),{options:s}=(0,r.WQ)(be),i=(0,r.EW)((()=>({[Oe(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Oe(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const o=t.default&&t.default(n);return e.custom?o:(0,r.h)("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},o)}}});function xe(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Oe=(e,t,n)=>null!=e?e:null!=t?t:n;function Me(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const Le=(0,r.pM)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=(0,r.WQ)(ke),a=(0,r.EW)((()=>e.route||s.value)),l=(0,r.WQ)(ye,0),u=(0,r.EW)((()=>{let e=(0,o.R1)(l);const{matched:t}=a.value;let n;for(;(n=t[e])&&!n.components;)e++;return e})),c=(0,r.EW)((()=>a.value.matched[u.value]));(0,r.Gt)(ye,(0,r.EW)((()=>u.value+1))),(0,r.Gt)(ge,c),(0,r.Gt)(ke,a);const d=(0,o.KR)();return(0,r.wB)((()=>[d.value,c.value,e.name]),(([e,t,n],[r,o,s])=>{t&&(t.instances[n]=e,o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),!e||!t||o&&R(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const o=a.value,s=e.name,l=c.value,u=l&&l.components[s];if(!u)return Me(n.default,{Component:u,route:o});const f=l.props[s],h=f?!0===f?o.params:"function"==typeof f?f(o):f:null,m=(0,r.h)(u,i({},h,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(l.instances[s]=null)},ref:d}));return Me(n.default,{Component:m,route:o})||m}}});function Ne(e){const t=function(e,t){const n=[],r=new Map;function o(e,n,r){const u=!r,c=function(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:ue(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}(e);c.aliasOf=r&&r.record;const d=fe(t,e),f=[c];if("alias"in e){const t="string"==typeof e.alias?[e.alias]:e.alias;for(const e of t)f.push(i({},c,{components:r?r.record.components:c.components,path:e,aliasOf:r?r.record:c}))}let h,m;for(const t of f){const{path:i}=t;if(n&&"/"!==i[0]){const e=n.record.path,r="/"===e[e.length-1]?"":"/";t.path=n.record.path+(i&&r+i)}if(h=ae(t,n,d),r?r.alias.push(h):(m=m||h,m!==h&&m.alias.push(h),u&&e.name&&!ce(h)&&s(e.name)),c.children){const e=c.children;for(let t=0;t{s(m)}:l}function s(e){if(H(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(s),t.alias.forEach(s))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(s),e.alias.forEach(s))}}function a(e){let t=0;for(;t=0&&(e.record.path!==n[t].record.path||!he(e,n[t]));)t++;n.splice(t,0,e),e.record.name&&!ce(e)&&r.set(e.record.name,e)}return t=fe({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>o(e))),{addRoute:o,resolve:function(e,t){let o,s,a,l={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw Y(1,{location:e});a=o.record.name,l=i(le(t.params,o.keys.filter((e=>!e.optional)).concat(o.parent?o.parent.keys.filter((e=>e.optional)):[]).map((e=>e.name))),e.params&&le(e.params,o.keys.map((e=>e.name)))),s=o.stringify(l)}else if(null!=e.path)s=e.path,o=n.find((e=>e.re.test(s))),o&&(l=o.parse(s),a=o.record.name);else{if(o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw Y(1,{location:e,currentLocation:t});a=o.record.name,l=i({},t.params,e.params),s=o.stringify(l)}const u=[];let c=o;for(;c;)u.unshift(c.record),c=c.parent;return{name:a,path:s,params:l,matched:u,meta:de(u)}},removeRoute:s,getRoutes:function(){return n},getRecordMatcher:function(e){return r.get(e)}}}(e.routes,e),n=e.parseQuery||me,c=e.stringifyQuery||pe,d=e.history,f=Ee(),h=Ee(),m=Ee(),p=(0,o.IJ)(G);let v=G;s&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=a.bind(null,(e=>""+e)),b=a.bind(null,T),k=a.bind(null,x);function S(e,r){if(r=i({},r||p.value),"string"==typeof e){const o=L(n,e,r.path),s=t.resolve({path:o.path},r),a=d.createHref(o.fullPath);return i(o,s,{params:k(s.params),hash:x(o.hash),redirectedFrom:void 0,href:a})}let o;if(null!=e.path)o=i({},e,{path:L(n,e.path,r.path).path});else{const t=i({},e.params);for(const e in t)null==t[e]&&delete t[e];o=i({},e,{params:b(t)}),r.params=b(r.params)}const s=t.resolve(o,r),a=e.hash||"";s.params=g(k(s.params));const l=function(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}(c,i({},e,{hash:(u=a,_(u).replace(w,"{").replace(E,"}").replace(y,"^")),path:s.path}));var u;const f=d.createHref(l);return i({fullPath:l,hash:a,query:c===pe?ve(e.query):e.query||{}},s,{redirectedFrom:void 0,href:f})}function C(e){return"string"==typeof e?L(n,e,p.value.path):i({},e)}function O(e,t){if(v!==e)return Y(8,{from:t,to:e})}function M(e){return I(e)}function N(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let r="function"==typeof n?n(e):n;return"string"==typeof r&&(r=r.includes("?")||r.includes("#")?r=C(r):{path:r},r.params={}),i({query:e.query,hash:e.hash,params:null!=r.path?{}:e.params},r)}}function I(e,t){const n=v=S(e),r=p.value,o=e.state,s=e.force,a=!0===e.replace,l=N(n);if(l)return I(i(C(l),{state:"object"==typeof l?i({},o,l.state):o,force:s,replace:a}),t||n);const u=n;let d;return u.redirectedFrom=t,!s&&function(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&R(t.matched[r],n.matched[o])&&$(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}(c,r,n)&&(d=Y(16,{to:u,from:r}),ee(r,r,!0,!1)),(d?Promise.resolve(d):F(u,r)).catch((e=>Q(e)?Q(e,2)?e:J(e):X(e,u,r))).then((e=>{if(e){if(Q(e,2))return I(i({replace:a},C(e.to),{state:"object"==typeof e.to?i({},o,e.to.state):o,force:s}),t||u)}else e=Z(u,r,!0,a,o);return V(u,r,e),e}))}function W(e,t){const n=O(e,t);return n?Promise.reject(n):Promise.resolve()}function D(e){const t=oe.values().next().value;return t&&"function"==typeof t.runWithContext?t.runWithContext(e):e()}function F(e,t){let n;const[r,o,s]=function(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;iR(e,s)))?r.push(s):n.push(s));const a=e.matched[i];a&&(t.matched.find((e=>R(e,a)))||o.push(a))}return[n,r,o]}(e,t);n=_e(r.reverse(),"beforeRouteLeave",e,t);for(const o of r)o.leaveGuards.forEach((r=>{n.push(Se(r,e,t))}));const i=W.bind(null,e,t);return n.push(i),ie(n).then((()=>{n=[];for(const r of f.list())n.push(Se(r,e,t));return n.push(i),ie(n)})).then((()=>{n=_e(o,"beforeRouteUpdate",e,t);for(const r of o)r.updateGuards.forEach((r=>{n.push(Se(r,e,t))}));return n.push(i),ie(n)})).then((()=>{n=[];for(const r of s)if(r.beforeEnter)if(u(r.beforeEnter))for(const o of r.beforeEnter)n.push(Se(o,e,t));else n.push(Se(r.beforeEnter,e,t));return n.push(i),ie(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=_e(s,"beforeRouteEnter",e,t,D),n.push(i),ie(n)))).then((()=>{n=[];for(const r of h.list())n.push(Se(r,e,t));return n.push(i),ie(n)})).catch((e=>Q(e,8)?e:Promise.reject(e)))}function V(e,t,n){m.list().forEach((r=>D((()=>r(e,t,n)))))}function Z(e,t,n,r,o){const a=O(e,t);if(a)return a;const l=t===G,u=s?history.state:{};n&&(r||l?d.replace(e.fullPath,i({scroll:l&&u&&u.scroll},o)):d.push(e.fullPath,o)),p.value=e,ee(e,t,n,l),J()}let B;let U,q=Ee(),K=Ee();function X(e,t,n){J(e);const r=K.list();return r.length?r.forEach((r=>r(e,t,n))):console.error(e),Promise.reject(e)}function J(e){return U||(U=!e,B||(B=d.listen(((e,t,n)=>{if(!se.listening)return;const r=S(e),o=N(r);if(o)return void I(i(o,{replace:!0}),r).catch(l);v=r;const a=p.value;var u,c;s&&(u=j(a.fullPath,n.delta),c=z(),P.set(u,c)),F(r,a).catch((e=>Q(e,12)?e:Q(e,2)?(I(e.to,r).then((e=>{Q(e,20)&&!n.delta&&n.type===A.pop&&d.go(-1,!1)})).catch(l),Promise.reject()):(n.delta&&d.go(-n.delta,!1),X(e,r,a)))).then((e=>{(e=e||Z(r,a,!1))&&(n.delta&&!Q(e,8)?d.go(-n.delta,!1):n.type===A.pop&&Q(e,20)&&d.go(-1,!1)),V(r,a,e)})).catch(l)}))),q.list().forEach((([t,n])=>e?n(e):t())),q.reset()),e}function ee(t,n,o,i){const{scrollBehavior:a}=e;if(!s||!a)return Promise.resolve();const l=!o&&function(e){const t=P.get(e);return P.delete(e),t}(j(t.fullPath,0))||(i||!o)&&history.state&&history.state.scroll||null;return(0,r.dY)().then((()=>a(t,n,l))).then((e=>e&&function(e){let t;if("el"in e){const n=e.el,r="string"==typeof n&&n.startsWith("#"),o="string"==typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=function(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}(e))).catch((e=>X(e,t,n)))}const te=e=>d.go(e);let ne;const oe=new Set,se={currentRoute:p,listening:!0,addRoute:function(e,n){let r,o;return H(e)?(r=t.getRecordMatcher(e),o=n):o=e,t.addRoute(o,r)},removeRoute:function(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)},hasRoute:function(e){return!!t.getRecordMatcher(e)},getRoutes:function(){return t.getRoutes().map((e=>e.record))},resolve:S,options:e,push:M,replace:function(e){return M(i(C(e),{replace:!0}))},go:te,back:()=>te(-1),forward:()=>te(1),beforeEach:f.add,beforeResolve:h.add,afterEach:m.add,onError:K.add,isReady:function(){return U&&p.value!==G?Promise.resolve():new Promise(((e,t)=>{q.add([e,t])}))},install(e){e.component("RouterLink",Te),e.component("RouterView",Le),e.config.globalProperties.$router=this,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,o.R1)(p)}),s&&!ne&&p.value===G&&(ne=!0,M(d.location).catch((e=>{})));const t={};for(const e in G)Object.defineProperty(t,e,{get:()=>p.value[e],enumerable:!0});e.provide(be,this),e.provide(we,(0,o.Gc)(t)),e.provide(ke,p);const n=e.unmount;oe.add(e),e.unmount=function(){oe.delete(e),oe.size<1&&(v=G,B&&B(),B=null,p.value=G,ne=!1,U=!1),n()}}};function ie(e){return e.reduce(((e,t)=>e.then((()=>D(t)))),Promise.resolve())}return se}function Re(){return(0,r.WQ)(be)}function $e(){return(0,r.WQ)(we)}},6209:function(e,t,n){n.d(t,{BV:function(){return r.BV},R7:function(){return r.R7},Wt:function(){return r.Wt},YX:function(){return r.YX},Ye:function(){return r.Ye},Zv:function(){return r.Zv},cV:function(){return r.cV},ie:function(){return r.ie},lq:function(){return r.lq},rR:function(){return r.rR},rU:function(){return r.rU},rd:function(){return r.rd},re:function(){return r.re},sW:function(){return r.sW}});var r=n(3456)}}]); \ No newline at end of file diff --git a/assets/js/4475.f1641a0c.js.LICENSE.txt b/assets/js/4475.f1641a0c.js.LICENSE.txt new file mode 100644 index 00000000..4b9e7f40 --- /dev/null +++ b/assets/js/4475.f1641a0c.js.LICENSE.txt @@ -0,0 +1,30 @@ +/*! + * vue-router v4.3.0 + * (c) 2024 Eduardo San Martin Morote + * @license MIT + */ + +/*! #__NO_SIDE_EFFECTS__ */ + +/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */ + +/** +* @vue/reactivity v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ + +/** +* @vue/runtime-dom v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ + +/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ diff --git a/assets/js/CallbackWrapper.html.159d6ab7.js b/assets/js/CallbackWrapper.html.159d6ab7.js new file mode 100644 index 00000000..d4729e0b --- /dev/null +++ b/assets/js/CallbackWrapper.html.159d6ab7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[376],{1186:function(n,a,s){s.r(a),s.d(a,{comp:function(){return w},data:function(){return y}});var t=s(641);const p={id:"callback-wrapper",tabindex:"-1"},e={class:"header-anchor",href:"#callback-wrapper"},o=(0,t.Fv)('

The CallbackWrapper objects offers a convenient way to wrap a callable function.

import { CallbackWrapper } from "@aedart/support";\n\nconst wrapped = CallbackWrapper.make(() => {\n    return 'Hi there...';\n});\n\n// Later in your application\nwrapped.call(); // Hi there...\n
',2),c={class:"table-of-contents"},i=(0,t.Fv)('

Call

The call() method invokes the wrapped callback and returns its eventual output.

const wrapped = CallbackWrapper.make(() => {\n    return true;\n});\n\nwrapped.call(); // true\n

Arguments

There are several ways to specify arguments that must be applied for the wrapped callback, when call() is invoked.

Via make()

The static make() method allows you to specify arguments right away. This is useful, if you already know the arguments.

const wrapped = CallbackWrapper.make((firstname, lastname) => {\n    return `Hi ${firstname} ${lastname}`;\n}, 'Timmy', 'Jackson');\n\nwrapped.call(); // Hi Timmy Jackson\n

Via with()

In situations when you must add additional arguments, e.g. because you might not know all arguments up front, then you can use the with() method.

const wrapped = CallbackWrapper.make((firstname, lastname) => {\n    return `Hi ${firstname} ${lastname}`;\n}, 'Siw');\n\nwrapped\n    .with('Orion')\n    .call(); // Hi Siw Orion\n

Via arguments

Lastly, in situations when you must completely overwrite all arguments, then you can specify them via the arguments property.

const wrapped = CallbackWrapper.make((firstname, lastname) => {\n    return `Hi ${firstname} ${lastname}`;\n});\n\nwrapped.arguments = [ 'Alpha', 'Zero' ];\nwrapped\n    .call(); // Hi Alpha Zero\n

Binding

',15),l=(0,t.Lk)("code",null,"bind()",-1),u={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind",target:"_blank",rel:"noopener noreferrer"},r=(0,t.Lk)("code",null,"this",-1),k=(0,t.Fv)('
class A {\n    sayHi(name) {\n        return `Hi ${name}`;\n    }\n}\nconst instance = new A();\n\nconst wrapped = CallbackWrapper.make(function(name) {\n    return this.sayHi(name);\n});\n\nwrapped\n    .bind(instance)\n    .with('Akari')\n    .call(); // Hi Akari\n

Binding vs. Arrow Function

',2),d={class:"custom-container warning"},m=(0,t.Lk)("p",{class:"custom-container-title"},"WARNING",-1),v=(0,t.Lk)("code",null,"TypeError",-1),b={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions",target:"_blank",rel:"noopener noreferrer"},g=(0,t.Fv)('

// Callback Wrapper for arrow function...\nconst wrapped = CallbackWrapper.make(() => {\n    // ...not shown ...\n});\n\nwrapped\n    .bind(myObject)\n    .call(); // TypeError\n

✔️

// Callback Wrapper for normal function...\nconst wrapped = CallbackWrapper.make(function () {\n    // ...not shown ...\n});\n\nwrapped\n    .bind(myObject)\n    .call();\n
',4),h=(0,t.Fv)('

Misc.

If you need to determine if a value is a "callback wrapper" object, then you can use the isCallbackWrapper() util.

import { isCallbackWrapper, CallbackWrapper } from "@aedart/support";\n\nisCallbackWrapper(() => true); // false\nisCallbackWrapper(CallbackWrapper.make(() => true)); // true\n

Custom Callback Wrapper

isCallbackWrapper() can also accept custom implementation of a callback wrapper.

// Custom implementation of a callback wrapper\nconst custom = {\n    'callback': function() { /* not shown */ },\n    'binding': undefined,\n    'arguments': [],\n    'with': function() { /* not shown */ },\n    'hasArguments': function() { /* not shown */ },\n    'bind': function() { /* not shown */ },\n    'hasBinding': function() { /* not shown */ },\n    'call': function() { /* not shown */ },\n};\n\nisCallbackWrapper(custom); // true\n

See the source code of isCallbackWrapper() for additional details.

',7),f={};var w=(0,s(6262).A)(f,[["render",function(n,a){const s=(0,t.g2)("Badge"),f=(0,t.g2)("router-link"),w=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",p,[(0,t.Lk)("a",e,[(0,t.Lk)("span",null,[(0,t.eW)("Callback Wrapper "),(0,t.bF)(s,{type:"tip",text:"Available since v0.11",vertical:"middle"})])])]),o,(0,t.Lk)("nav",c,[(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#call"},{default:(0,t.k6)((()=>[(0,t.eW)("Call")])),_:1})]),(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#arguments"},{default:(0,t.k6)((()=>[(0,t.eW)("Arguments")])),_:1}),(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#via-make"},{default:(0,t.k6)((()=>[(0,t.eW)("Via make()")])),_:1})]),(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#via-with"},{default:(0,t.k6)((()=>[(0,t.eW)("Via with()")])),_:1})]),(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#via-arguments"},{default:(0,t.k6)((()=>[(0,t.eW)("Via arguments")])),_:1})])])]),(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#binding"},{default:(0,t.k6)((()=>[(0,t.eW)("Binding")])),_:1}),(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#binding-vs-arrow-function"},{default:(0,t.k6)((()=>[(0,t.eW)("Binding vs. Arrow Function")])),_:1})])])]),(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#misc"},{default:(0,t.k6)((()=>[(0,t.eW)("Misc.")])),_:1}),(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.bF)(f,{to:"#custom-callback-wrapper"},{default:(0,t.k6)((()=>[(0,t.eW)("Custom Callback Wrapper")])),_:1})])])])])]),i,(0,t.Lk)("p",null,[(0,t.eW)("Use "),l,(0,t.eW)(" to specify the callback's "),(0,t.Lk)("a",u,[r,(0,t.eW)(" value"),(0,t.bF)(w)]),(0,t.eW)(".")]),k,(0,t.Lk)("div",d,[m,(0,t.Lk)("p",null,[(0,t.eW)("It is not possible to apply a binding on an arrow function callback. Doing so can result in a "),v,(0,t.eW)(" or other unexpected behaviour. See "),(0,t.Lk)("a",b,[(0,t.eW)("Mozilla's documentation"),(0,t.bF)(w)]),(0,t.eW)(" for additional information.")]),g]),h])}]]);const y=JSON.parse('{"path":"/archive/current/packages/support/CallbackWrapper.html","title":"Callback Wrapper","lang":"en-GB","frontmatter":{"title":"Callback Wrapper","description":"Wrapper object for a callback","sidebarDepth":0},"headers":[{"level":2,"title":"Call","slug":"call","link":"#call","children":[]},{"level":2,"title":"Arguments","slug":"arguments","link":"#arguments","children":[{"level":3,"title":"Via make()","slug":"via-make","link":"#via-make","children":[]},{"level":3,"title":"Via with()","slug":"via-with","link":"#via-with","children":[]},{"level":3,"title":"Via arguments","slug":"via-arguments","link":"#via-arguments","children":[]}]},{"level":2,"title":"Binding","slug":"binding","link":"#binding","children":[{"level":3,"title":"Binding vs. Arrow Function","slug":"binding-vs-arrow-function","link":"#binding-vs-arrow-function","children":[]}]},{"level":2,"title":"Misc.","slug":"misc","link":"#misc","children":[{"level":3,"title":"Custom Callback Wrapper","slug":"custom-callback-wrapper","link":"#custom-callback-wrapper","children":[]}]}],"git":{"updatedTime":1710238944000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/CallbackWrapper.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/aliases.html.d906e91a.js b/assets/js/aliases.html.d906e91a.js new file mode 100644 index 00000000..55975dd4 --- /dev/null +++ b/assets/js/aliases.html.d906e91a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9994],{3981:function(n,s,a){a.r(s),a.d(s,{comp:function(){return k},data:function(){return m}});var e=a(641);const t=(0,e.Lk)("h1",{id:"aliases",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#aliases"},[(0,e.Lk)("span",null,"Aliases")])],-1),p=(0,e.Lk)("p",null,[(0,e.eW)('In this context, an "alias" is a proxy property or method inside a target class. It is responsible for forwarding interaction to the original property or method, inside the concern class instance. Aliases are created automatically by the '),(0,e.Lk)("code",null,"use()"),(0,e.eW)(" class decorator.")],-1),o={class:"table-of-contents"},c=(0,e.Lk)("h2",{id:"properties-methods",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#properties-methods"},[(0,e.Lk)("span",null,"Properties & Methods")])],-1),l=(0,e.Lk)("em",null,"aka. proxy properties or methods",-1),i=(0,e.Lk)("code",null,"PROVIDES",-1),u=(0,e.Fv)('

Consider the following example:

import { use, AbstractConcern } from "@aedart/support/concerns";\n\nclass Levels extends AbstractConcern {\n    get level() { /* ...not shown */ }\n    set level(value) { /* ...not shown */ }\n    clear() { /* ...not shown */ }\n}\n\n@use(Levels)\nclass Recorder {}\n

The aliasing mechanism will transform the target class into something that very roughly corresponds to this:

import {\n    use,\n    CONCERNS,\n    AbstractConcern\n} from "@aedart/support/concerns";\n\nclass Levels extends AbstractConcern {\n    get level() { /* ...not shown */ }\n    set level(value) { /* ...not shown */ }\n    clear(level) { /* ...not shown */ }\n}\n\nclass Recorder {\n    // ...private concerns container not shown...\n\n    // get level "alias"\n    get level() {\n        return this[CONCERNS].get(Levels)['level'];\n    }\n\n    // set level "alias"\n    set level(value) {\n        this[CONCERNS].get(Levels)['level'] = value;\n    }\n\n    // method clear "alias"\n    clear(...args) {\n        return this[CONCERNS].get(Levels)['clear'](...args);\n    }\n}\n
',4),r=(0,e.Fv)('

If property or method already exists

When a property or method from a concern already exists in the target class' prototype chain¹, then NO Alias is defined. Said differently, the use() class decorator does NOT overwrite a target class' properties or methods.

class Label extends AbstractConcern {\n    get name() { /* ...not shown.. */ }\n    set name(v) { /* ...not shown.. */ }\n}\n\n@use(Label) // Label's "name" property is NOT aliased\nclass Battery {\n\n    // Battery's get/set "name" remains untouched by concern\n    get name() { /* ...not shown.. */ }\n    set name(v) { /* ...not shown.. */ }\n}\n

¹: Inherited properties and methods are also respected.

',4),d={};var k=(0,a(6262).A)(d,[["render",function(n,s){const a=(0,e.g2)("router-link"),d=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,p,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#properties-methods"},{default:(0,e.k6)((()=>[(0,e.eW)("Properties & Methods")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#if-property-or-method-already-exists"},{default:(0,e.k6)((()=>[(0,e.eW)("If property or method already exists")])),_:1})])])]),c,(0,e.Lk)("p",null,[(0,e.eW)('When injecting a concern into a target class, the concern\'s public properties and methods are defined as "aliases" ('),l,(0,e.eW)("), in the target class' prototype ("),(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.bF)(d,{to:"/archive/current/packages/support/concerns/concernClass.html#customise-alias-members"},{default:(0,e.k6)((()=>[i,(0,e.eW)(" symbol")])),_:1}),(0,e.eW)(" for additional details")]),(0,e.eW)(").")]),u,(0,e.Lk)("p",null,[(0,e.eW)("See "),(0,e.bF)(d,{to:"/archive/current/packages/support/concerns/usage.html#manual-interaction"},{default:(0,e.k6)((()=>[(0,e.eW)("Manual interaction")])),_:1}),(0,e.eW)(" and "),(0,e.bF)(d,{to:"/archive/current/packages/support/concerns/conflictResolution.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Conflict Resolution")])),_:1}),(0,e.eW)(" for additional details.")]),r,(0,e.Lk)("p",null,[(0,e.eW)("See "),(0,e.bF)(d,{to:"/archive/current/packages/support/concerns/conflictResolution.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Conflict Resolution")])),_:1}),(0,e.eW)(" for additional details.")])])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/concerns/aliases.html","title":"Aliases","lang":"en-GB","frontmatter":{"title":"Aliases","description":"What are aliases","sidebarDepth":0},"headers":[{"level":2,"title":"Properties & Methods","slug":"properties-methods","link":"#properties-methods","children":[]},{"level":2,"title":"If property or method already exists","slug":"if-property-or-method-already-exists","link":"#if-property-or-method-already-exists","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/aliases.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/app.294c6513.js b/assets/js/app.294c6513.js new file mode 100644 index 00000000..10f4f83b --- /dev/null +++ b/assets/js/app.294c6513.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3524],{2090:function(e,t,r){r.d(t,{B:function(){return j}});var a=r(6358),s=r(3825),i=r(3450),l=r(5436),n=r(1599),c=r(5496),o=r(443),p=r(355),h=r(8973),u=r(641),d=r(953),g=r(3567),m=r(33),k=(0,u.pM)({name:"VersionDisclaimer",props:{type:{type:String,default:"info"},label:{type:String}},setup(e){const t=e.type,r=e.label;return{css:(0,u.EW)((()=>({"version-disclaimer":!0,[t]:!0}))),label:(0,u.EW)((()=>r||t.charAt(0).toUpperCase()+t.slice(1))),type:t}}}),v=(0,r(6262).A)(k,[["render",function(e,t,r,a,s,i){return(0,u.uX)(),(0,u.CE)("div",{class:(0,m.C4)(e.css)},[(0,u.Lk)("label",null,(0,m.v_)(e.label),1),(0,u.RG)(e.$slots,"default")],2)}]]),b=r(3456);function f(e,t){return t.startsWith("/")||(t="/"+t),(e+t).replaceAll("//","/")}function x(e,t){const r=t.nextFullPath;return e.value.path.startsWith(r)}class y{_name;_path;_archive=null;pages;constructor(e,t,r=[]){this._name=e,this._path=t,this.pages=r}static make(e,t,r=[]){return new this(e,t,r)}set name(e){this._name=e}get name(){return this._name}set path(e){this._path=e}get path(){return this._path}get fullPath(){return this.prefixWithArchivePath(this.path)}set archive(e){this._archive=e}get archive(){return this._archive}asNavigationItem(){return{text:this.name,link:this.fullPath}}asSidebarObject(){return{[this.fullPath]:this.sidebar()}}sidebar(){return this.resolvePages(this.pages)}resolvePages(e){return e.forEach(((e,t,r)=>{r[t]=this.resolvePage(e)})),e}resolvePage(e){return"string"==typeof e?this.prefixWillFullPath(e):Reflect.has(e,"children")&&0!==e.children.length?(e.children.forEach(((e,t,r)=>{r[t]=this.resolvePage(e)})),e):e}prefixWillFullPath(e){return f(this.fullPath,e)}prefixWithArchivePath(e){return f(null!==this.archive?this.archive.path:"",e)}}const C=y.make("v0.x","/v0x",[{text:"Version 0.x",collapsible:!0,children:["","upgrade-guide","contribution-guide","security","code-of-conduct","origin"]},{text:"Packages",collapsible:!0,children:["packages/",{text:"Container",collapsible:!0,children:["packages/container/","packages/container/prerequisites","packages/container/install","packages/container/container-instance","packages/container/bindings","packages/container/dependencies","packages/container/resolving","packages/container/contextual-bindings"]},{text:"Contracts",collapsible:!0,children:["packages/contracts/","packages/contracts/install"]},{text:"Support",collapsible:!0,children:["packages/support/","packages/support/install",{text:"Arrays",collapsible:!0,children:["packages/support/arrays/","packages/support/arrays/includesAll","packages/support/arrays/includesAny","packages/support/arrays/isArrayLike","packages/support/arrays/isConcatSpreadable","packages/support/arrays/isSafeArrayLike","packages/support/arrays/isTypedArray","packages/support/arrays/merge"]},{text:"Concerns",collapsible:!0,children:["packages/support/concerns/","packages/support/concerns/prerequisites","packages/support/concerns/concernClass","packages/support/concerns/usage","packages/support/concerns/aliases","packages/support/concerns/conflictResolution","packages/support/concerns/booting","packages/support/concerns/hooks","packages/support/concerns/edgeCases","packages/support/concerns/jsdoc"]},{text:"Exceptions",collapsible:!0,children:["packages/support/exceptions/","packages/support/exceptions/configureCustomError","packages/support/exceptions/configureStackTrace","packages/support/exceptions/getErrorMessage","packages/support/exceptions/customErrors"]},{text:"Facades",collapsible:!0,children:["packages/support/facades/"]},{text:"Meta",collapsible:!0,children:["packages/support/meta/","packages/support/meta/prerequisites","packages/support/meta/supported","packages/support/meta/setAndGet","packages/support/meta/inheritance","packages/support/meta/outsideChanges","packages/support/meta/tc39","packages/support/meta/targetMeta"]},{text:"Mixins",collapsible:!0,children:["packages/support/mixins/","packages/support/mixins/newMixin","packages/support/mixins/apply","packages/support/mixins/instanceof","packages/support/mixins/inheritance","packages/support/mixins/onward"]},{text:"Object",collapsible:!0,children:["packages/support/objects/","packages/support/objects/forget","packages/support/objects/forgetAll","packages/support/objects/get","packages/support/objects/has","packages/support/objects/hasAll","packages/support/objects/hasAny","packages/support/objects/hasUniqueId","packages/support/objects/isCloneable","packages/support/objects/isPopulatable","packages/support/objects/isset","packages/support/objects/merge","packages/support/objects/populate","packages/support/objects/set","packages/support/objects/uniqueId"]},{text:"Reflections",collapsible:!0,children:["packages/support/reflections/","packages/support/reflections/assertHasPrototypeProperty","packages/support/reflections/classLooksLike","packages/support/reflections/classOwnKeys","packages/support/reflections/getAllParentsOfClass","packages/support/reflections/getClassPropertyDescriptor","packages/support/reflections/getClassPropertyDescriptors","packages/support/reflections/getConstructorName","packages/support/reflections/getNameOrDesc","packages/support/reflections/getParentOfClass","packages/support/reflections/hasAllMethods","packages/support/reflections/hasMethod","packages/support/reflections/hasPrototypeProperty","packages/support/reflections/isCallable","packages/support/reflections/isClassConstructor","packages/support/reflections/isClassMethodReference","packages/support/reflections/isConstructor","packages/support/reflections/isKeySafe","packages/support/reflections/isKeyUnsafe","packages/support/reflections/isMethod","packages/support/reflections/isSubclass","packages/support/reflections/isSubclassOrLooksLike","packages/support/reflections/isWeakKind"]},{text:"Misc",collapsible:!0,children:["packages/support/misc/","packages/support/misc/descTag","packages/support/misc/empty","packages/support/misc/isKey","packages/support/misc/isPrimitive","packages/support/misc/isPropertyKey","packages/support/misc/isset","packages/support/misc/mergeKeys","packages/support/misc/toWeakRef"]},"packages/support/CallbackWrapper"]},{text:"Vuepress Utils",collapsible:!0,children:["packages/vuepress-utils/","packages/vuepress-utils/install",{text:"Navigation",collapsible:!0,children:["packages/vuepress-utils/navigation/archive"]},{text:"Plugins",collapsible:!0,children:["packages/vuepress-utils/plugins/last-updated"]},{text:"Components",collapsible:!0,children:["packages/vuepress-utils/components/version-disclaimer"]}]},"packages/xyz/"]}]),L=y.make("v1.x","/v1x",[{text:"Version 1.x",collapsible:!0,children:[""]}]),A=[L,C];var F=class{_name="Archive";_path="/archive";_current;_next;_collections=[];_currentLabel="current";_nextLabel="next";_currentPath="/current";_nextPath="/next";constructor(e,t,r=[]){this._current=e,this._next=t,this.collections=r}static make(e,t,r=[]){return new this(e,t,r)}set name(e){this._name=e}get name(){return this._name}set path(e){this._path=e}get path(){return this._path}set current(e){this._current=e}get current(){return this._current}set next(e){this._next=e}get next(){return this._next}set collections(e){e.forEach((e=>{e.archive=this})),this._collections=e}get collections(){return this.markCurrentAndNextCollections(this._collections)}set currentLabel(e){this._currentLabel=e}get currentLabel(){return this._currentLabel}set nextLabel(e){this._nextLabel=e}get nextLabel(){return this._nextLabel}set currentPath(e){this._currentPath=e}get currentPath(){return this._currentPath}get currentFullPath(){return f(this.path,this.currentPath)}set nextPath(e){this._nextPath=e}get nextPath(){return this._nextPath}get nextFullPath(){return f(this.path,this.nextPath)}asNavigationItem(){return{text:this.name,link:this.path,children:this.makeNavbarItemChildren()}}sidebarConfiguration(){let e={};return this.collections.forEach((t=>{e=Object.assign(e,t.asSidebarObject())})),e}makeNavbarItemChildren(){const e=[];return this.collections.forEach((t=>{e.push(t.asNavigationItem())})),e}markCurrentAndNextCollections(e){return e.forEach((e=>{e===this.next&&(e.name=this.nextLabel,e.path=this.nextPath),e===this.current&&(e.name=this.currentLabel,e.path=this.currentPath)})),e}}.make(C,L,A);const P=(0,u.Lk)("strong",null,"It has not yet been released!",-1),w=(0,u.Lk)("strong",null,"It is no longer supported!",-1);var I=(0,u.pM)({__name:"Layout",setup(e){const t=(0,b.BV)(),r=function(e,t){return(0,u.EW)((()=>x(e,t)))}(t,F),a=function(e,t,r=["/"]){return(0,u.EW)((()=>function(e,t,r=["/"]){const a=e.value.path;return!r.includes(a)&&a!==t.path+"/"&&!x(e,t)&&!function(e,t){const r=t.currentFullPath;return e.value.path.startsWith(r)}(e,t)}(e,t,r)))}(t,F);return(e,t)=>((0,u.uX)(),(0,u.Wv)(g.A,null,{"page-top":(0,u.k6)((()=>[(0,d.R1)(r)?((0,u.uX)(),(0,u.Wv)(v,{key:0},{default:(0,u.k6)((()=>[(0,u.eW)(" You are viewing documentation for an upcoming version. "),P,(0,u.eW)("! ")])),_:1})):(0,u.Q3)("",!0),(0,d.R1)(a)?((0,u.uX)(),(0,u.Wv)(v,{key:1,type:"danger",label:"Warning"},{default:(0,u.k6)((()=>[(0,u.eW)(" You are viewing documentation for an outdated version. "),w])),_:1})):(0,u.Q3)("",!0)])),_:1}))}}),M={enhance({app:e,router:t,siteData:r}){},setup(){},rootComponents:[],layouts:{Layout:I}};const j=[a.A,s.A,i.A,l.A,n.A,c.A,o.A,p.A,h.A,M]},3192:function(e,t,r){r.d(t,{J:function(){return s},c:function(){return a}});const a=JSON.parse("{}"),s=Object.fromEntries([["/",{loader:()=>r.e(4470).then(r.bind(r,5924)),meta:{title:""}}],["/archive/",{loader:()=>r.e(4470).then(r.bind(r,4546)),meta:{title:"Archive"}}],["/archive/not_available.html",{loader:()=>r.e(1711).then(r.bind(r,8193)),meta:{title:"Not Available"}}],["/archive/current/",{loader:()=>r.e(4470).then(r.bind(r,7367)),meta:{title:"Release Notes"}}],["/archive/current/code-of-conduct.html",{loader:()=>r.e(2846).then(r.bind(r,3208)),meta:{title:"Code of Conduct"}}],["/archive/current/contribution-guide.html",{loader:()=>r.e(4975).then(r.bind(r,9476)),meta:{title:"Contribution Guide"}}],["/archive/current/origin.html",{loader:()=>r.e(3066).then(r.bind(r,6885)),meta:{title:"Origin"}}],["/archive/current/security.html",{loader:()=>r.e(9414).then(r.bind(r,4250)),meta:{title:"Security Policy"}}],["/archive/current/upgrade-guide.html",{loader:()=>r.e(5815).then(r.bind(r,8472)),meta:{title:"Upgrade Guide"}}],["/archive/next/",{loader:()=>r.e(4470).then(r.bind(r,9635)),meta:{title:"Not Available"}}],["/archive/current/packages/",{loader:()=>r.e(4470).then(r.bind(r,7957)),meta:{title:"Introduction"}}],["/archive/current/packages/container/",{loader:()=>r.e(4470).then(r.bind(r,6286)),meta:{title:"Introduction"}}],["/archive/current/packages/container/bindings.html",{loader:()=>r.e(6030).then(r.bind(r,679)),meta:{title:"Bindings"}}],["/archive/current/packages/container/container-instance.html",{loader:()=>r.e(6305).then(r.bind(r,2635)),meta:{title:"Container Instance"}}],["/archive/current/packages/container/contextual-bindings.html",{loader:()=>r.e(6666).then(r.bind(r,65)),meta:{title:"Contextual Bindings"}}],["/archive/current/packages/container/dependencies.html",{loader:()=>r.e(8469).then(r.bind(r,9259)),meta:{title:"Dependencies"}}],["/archive/current/packages/container/install.html",{loader:()=>r.e(469).then(r.bind(r,4971)),meta:{title:"How to install"}}],["/archive/current/packages/container/prerequisites.html",{loader:()=>r.e(4261).then(r.bind(r,759)),meta:{title:"Prerequisites"}}],["/archive/current/packages/container/resolving.html",{loader:()=>r.e(1449).then(r.bind(r,1655)),meta:{title:"Resolving"}}],["/archive/current/packages/contracts/",{loader:()=>r.e(4470).then(r.bind(r,8272)),meta:{title:"Introduction"}}],["/archive/current/packages/contracts/install.html",{loader:()=>r.e(469).then(r.bind(r,1640)),meta:{title:"How to install"}}],["/archive/current/packages/support/CallbackWrapper.html",{loader:()=>r.e(376).then(r.bind(r,1186)),meta:{title:"Callback Wrapper"}}],["/archive/current/packages/support/",{loader:()=>r.e(4470).then(r.bind(r,9046)),meta:{title:"Introduction"}}],["/archive/current/packages/support/install.html",{loader:()=>r.e(469).then(r.bind(r,492)),meta:{title:"How to install"}}],["/archive/current/packages/vuepress-utils/",{loader:()=>r.e(4470).then(r.bind(r,5706)),meta:{title:"Introduction"}}],["/archive/current/packages/vuepress-utils/install.html",{loader:()=>r.e(469).then(r.bind(r,5335)),meta:{title:"How to install"}}],["/archive/current/packages/xyz/",{loader:()=>r.e(4470).then(r.bind(r,1389)),meta:{title:"XYZ (test package)"}}],["/archive/current/packages/support/arrays/",{loader:()=>r.e(4470).then(r.bind(r,2019)),meta:{title:"About Arrays"}}],["/archive/current/packages/support/arrays/includesAll.html",{loader:()=>r.e(4610).then(r.bind(r,5567)),meta:{title:"Includes All"}}],["/archive/current/packages/support/arrays/includesAny.html",{loader:()=>r.e(5943).then(r.bind(r,1465)),meta:{title:"Includes Any"}}],["/archive/current/packages/support/arrays/isArrayLike.html",{loader:()=>r.e(7044).then(r.bind(r,1199)),meta:{title:"Is Array Like"}}],["/archive/current/packages/support/arrays/isConcatSpreadable.html",{loader:()=>r.e(7627).then(r.bind(r,4801)),meta:{title:"Is Concat Spreadable"}}],["/archive/current/packages/support/arrays/isSafeArrayLike.html",{loader:()=>r.e(8071).then(r.bind(r,7240)),meta:{title:"Is Safe Array Like"}}],["/archive/current/packages/support/arrays/isTypedArray.html",{loader:()=>r.e(6805).then(r.bind(r,7187)),meta:{title:"Is Typed Array"}}],["/archive/current/packages/support/arrays/merge.html",{loader:()=>r.e(8802).then(r.bind(r,7260)),meta:{title:"Merge"}}],["/archive/current/packages/support/concerns/",{loader:()=>r.e(4470).then(r.bind(r,990)),meta:{title:"About Concerns"}}],["/archive/current/packages/support/concerns/aliases.html",{loader:()=>r.e(9994).then(r.bind(r,3981)),meta:{title:"Aliases"}}],["/archive/current/packages/support/concerns/booting.html",{loader:()=>r.e(86).then(r.bind(r,5008)),meta:{title:"Booting"}}],["/archive/current/packages/support/concerns/concernClass.html",{loader:()=>r.e(9628).then(r.bind(r,6482)),meta:{title:"Concern Class"}}],["/archive/current/packages/support/concerns/conflictResolution.html",{loader:()=>r.e(7428).then(r.bind(r,7321)),meta:{title:"Conflict Resolution"}}],["/archive/current/packages/support/concerns/edgeCases.html",{loader:()=>r.e(7920).then(r.bind(r,54)),meta:{title:"Edge Cases"}}],["/archive/current/packages/support/concerns/hooks.html",{loader:()=>r.e(2822).then(r.bind(r,6940)),meta:{title:"Hooks"}}],["/archive/current/packages/support/concerns/jsdoc.html",{loader:()=>r.e(6745).then(r.bind(r,7975)),meta:{title:"JSDoc"}}],["/archive/current/packages/support/concerns/prerequisites.html",{loader:()=>r.e(4261).then(r.bind(r,840)),meta:{title:"Prerequisites"}}],["/archive/current/packages/support/concerns/usage.html",{loader:()=>r.e(6333).then(r.bind(r,3623)),meta:{title:"Using Concerns"}}],["/archive/current/packages/support/exceptions/",{loader:()=>r.e(4470).then(r.bind(r,4535)),meta:{title:"About Exceptions"}}],["/archive/current/packages/support/exceptions/configureCustomError.html",{loader:()=>r.e(5807).then(r.bind(r,3866)),meta:{title:"Configure Custom Error"}}],["/archive/current/packages/support/exceptions/configureStackTrace.html",{loader:()=>r.e(3783).then(r.bind(r,2349)),meta:{title:"Configure Stack Trace"}}],["/archive/current/packages/support/exceptions/customErrors.html",{loader:()=>r.e(1816).then(r.bind(r,8394)),meta:{title:"Custom Errors"}}],["/archive/current/packages/support/exceptions/getErrorMessage.html",{loader:()=>r.e(9127).then(r.bind(r,5312)),meta:{title:"Get Error Message"}}],["/archive/current/packages/support/facades/",{loader:()=>r.e(4470).then(r.bind(r,9526)),meta:{title:"About Facades"}}],["/archive/current/packages/support/meta/",{loader:()=>r.e(4470).then(r.bind(r,332)),meta:{title:"About Meta"}}],["/archive/current/packages/support/meta/inheritance.html",{loader:()=>r.e(6406).then(r.bind(r,6501)),meta:{title:"Inheritance"}}],["/archive/current/packages/support/meta/outsideChanges.html",{loader:()=>r.e(5180).then(r.bind(r,1276)),meta:{title:"Outside Changes"}}],["/archive/current/packages/support/meta/prerequisites.html",{loader:()=>r.e(4261).then(r.bind(r,5265)),meta:{title:"Prerequisites"}}],["/archive/current/packages/support/meta/setAndGet.html",{loader:()=>r.e(3717).then(r.bind(r,3321)),meta:{title:"Set & Get"}}],["/archive/current/packages/support/meta/supported.html",{loader:()=>r.e(3248).then(r.bind(r,2302)),meta:{title:"Supported Elements"}}],["/archive/current/packages/support/meta/targetMeta.html",{loader:()=>r.e(676).then(r.bind(r,3037)),meta:{title:"Target Meta"}}],["/archive/current/packages/support/meta/tc39.html",{loader:()=>r.e(2021).then(r.bind(r,8338)),meta:{title:"TC39 Proposal"}}],["/archive/current/packages/support/misc/",{loader:()=>r.e(4470).then(r.bind(r,6892)),meta:{title:"About Misc."}}],["/archive/current/packages/support/misc/descTag.html",{loader:()=>r.e(9061).then(r.bind(r,9018)),meta:{title:"Desc. Tag"}}],["/archive/current/packages/support/misc/empty.html",{loader:()=>r.e(3295).then(r.bind(r,6616)),meta:{title:"Empty"}}],["/archive/current/packages/support/misc/isKey.html",{loader:()=>r.e(6529).then(r.bind(r,9845)),meta:{title:"Is Key"}}],["/archive/current/packages/support/misc/isPrimitive.html",{loader:()=>r.e(9383).then(r.bind(r,5615)),meta:{title:"Is Primitive"}}],["/archive/current/packages/support/misc/isPropertyKey.html",{loader:()=>r.e(5394).then(r.bind(r,9937)),meta:{title:"Is Property Key"}}],["/archive/current/packages/support/misc/isset.html",{loader:()=>r.e(9502).then(r.bind(r,8632)),meta:{title:"Isset"}}],["/archive/current/packages/support/misc/mergeKeys.html",{loader:()=>r.e(338).then(r.bind(r,903)),meta:{title:"Merge Keys"}}],["/archive/current/packages/support/misc/toWeakRef.html",{loader:()=>r.e(9912).then(r.bind(r,9904)),meta:{title:"To Weak Ref."}}],["/archive/current/packages/support/mixins/",{loader:()=>r.e(4470).then(r.bind(r,1205)),meta:{title:"About Mixins"}}],["/archive/current/packages/support/mixins/apply.html",{loader:()=>r.e(6262).then(r.bind(r,5126)),meta:{title:"Apply Mixins"}}],["/archive/current/packages/support/mixins/inheritance.html",{loader:()=>r.e(6406).then(r.bind(r,4661)),meta:{title:"Inheritance"}}],["/archive/current/packages/support/mixins/instanceof.html",{loader:()=>r.e(5646).then(r.bind(r,6192)),meta:{title:"Instanceof"}}],["/archive/current/packages/support/mixins/newMixin.html",{loader:()=>r.e(9495).then(r.bind(r,6251)),meta:{title:"New Mixin"}}],["/archive/current/packages/support/mixins/onward.html",{loader:()=>r.e(8411).then(r.bind(r,2231)),meta:{title:"Onward"}}],["/archive/current/packages/support/objects/",{loader:()=>r.e(4470).then(r.bind(r,3122)),meta:{title:"About Objects"}}],["/archive/current/packages/support/objects/forget.html",{loader:()=>r.e(4993).then(r.bind(r,8407)),meta:{title:"Forget"}}],["/archive/current/packages/support/objects/forgetAll.html",{loader:()=>r.e(7922).then(r.bind(r,8668)),meta:{title:"Forget All"}}],["/archive/current/packages/support/objects/get.html",{loader:()=>r.e(754).then(r.bind(r,9657)),meta:{title:"Get"}}],["/archive/current/packages/support/objects/has.html",{loader:()=>r.e(3246).then(r.bind(r,9586)),meta:{title:"Has"}}],["/archive/current/packages/support/objects/hasAll.html",{loader:()=>r.e(8423).then(r.bind(r,1747)),meta:{title:"Has All"}}],["/archive/current/packages/support/objects/hasAny.html",{loader:()=>r.e(9150).then(r.bind(r,4079)),meta:{title:"Has Any"}}],["/archive/current/packages/support/objects/hasUniqueId.html",{loader:()=>r.e(8852).then(r.bind(r,1862)),meta:{title:"Has Unique ID"}}],["/archive/current/packages/support/objects/isCloneable.html",{loader:()=>r.e(6247).then(r.bind(r,2572)),meta:{title:"Is Cloneable"}}],["/archive/current/packages/support/objects/isPopulatable.html",{loader:()=>r.e(6321).then(r.bind(r,6565)),meta:{title:"Is Populatable"}}],["/archive/current/packages/support/objects/isset.html",{loader:()=>r.e(9502).then(r.bind(r,906)),meta:{title:"Isset"}}],["/archive/current/packages/support/objects/merge.html",{loader:()=>r.e(8802).then(r.bind(r,5888)),meta:{title:"Merge"}}],["/archive/current/packages/support/objects/populate.html",{loader:()=>r.e(7902).then(r.bind(r,5766)),meta:{title:"Populate"}}],["/archive/current/packages/support/objects/set.html",{loader:()=>r.e(3518).then(r.bind(r,9819)),meta:{title:"Set"}}],["/archive/current/packages/support/objects/uniqueId.html",{loader:()=>r.e(6054).then(r.bind(r,7717)),meta:{title:"Unique ID"}}],["/archive/current/packages/support/reflections/",{loader:()=>r.e(4470).then(r.bind(r,1783)),meta:{title:"About reflections"}}],["/archive/current/packages/support/reflections/assertHasPrototypeProperty.html",{loader:()=>r.e(8925).then(r.bind(r,3644)),meta:{title:"Assert Has Prototype Prop."}}],["/archive/current/packages/support/reflections/classLooksLike.html",{loader:()=>r.e(2023).then(r.bind(r,1274)),meta:{title:"Class Looks Like"}}],["/archive/current/packages/support/reflections/classOwnKeys.html",{loader:()=>r.e(984).then(r.bind(r,5491)),meta:{title:"Class Own Keys"}}],["/archive/current/packages/support/reflections/getAllParentsOfClass.html",{loader:()=>r.e(3503).then(r.bind(r,7210)),meta:{title:"Get All Parents Of Class"}}],["/archive/current/packages/support/reflections/getClassPropertyDescriptor.html",{loader:()=>r.e(572).then(r.bind(r,463)),meta:{title:"Get Class Prop. Descriptor"}}],["/archive/current/packages/support/reflections/getClassPropertyDescriptors.html",{loader:()=>r.e(9443).then(r.bind(r,9595)),meta:{title:"Get Class Prop. Descriptors"}}],["/archive/current/packages/support/reflections/getConstructorName.html",{loader:()=>r.e(9583).then(r.bind(r,3252)),meta:{title:"Get Constructor Name"}}],["/archive/current/packages/support/reflections/getNameOrDesc.html",{loader:()=>r.e(1705).then(r.bind(r,2075)),meta:{title:"Get Name Or Desc. Tag"}}],["/archive/current/packages/support/reflections/getParentOfClass.html",{loader:()=>r.e(5067).then(r.bind(r,7836)),meta:{title:"Get Parent Of Class"}}],["/archive/current/packages/support/reflections/hasAllMethods.html",{loader:()=>r.e(1901).then(r.bind(r,11)),meta:{title:"Has All Methods"}}],["/archive/current/packages/support/reflections/hasMethod.html",{loader:()=>r.e(8483).then(r.bind(r,1451)),meta:{title:"Has Method"}}],["/archive/current/packages/support/reflections/hasPrototypeProperty.html",{loader:()=>r.e(3287).then(r.bind(r,6195)),meta:{title:"Has Prototype Property"}}],["/archive/current/packages/support/reflections/isCallable.html",{loader:()=>r.e(1936).then(r.bind(r,7760)),meta:{title:"Is Callable"}}],["/archive/current/packages/support/reflections/isClassConstructor.html",{loader:()=>r.e(3884).then(r.bind(r,5471)),meta:{title:"Is Class Constructor"}}],["/archive/current/packages/support/reflections/isClassMethodReference.html",{loader:()=>r.e(6366).then(r.bind(r,2579)),meta:{title:"Is Class Method Reference"}}],["/archive/current/packages/support/reflections/isConstructor.html",{loader:()=>r.e(8874).then(r.bind(r,4263)),meta:{title:"Is Constructor"}}],["/archive/current/packages/support/reflections/isKeySafe.html",{loader:()=>r.e(9088).then(r.bind(r,6536)),meta:{title:"Is Key Safe"}}],["/archive/current/packages/support/reflections/isKeyUnsafe.html",{loader:()=>r.e(4795).then(r.bind(r,715)),meta:{title:"Is Key Unsafe"}}],["/archive/current/packages/support/reflections/isMethod.html",{loader:()=>r.e(8533).then(r.bind(r,9043)),meta:{title:"Is Method"}}],["/archive/current/packages/support/reflections/isSubclass.html",{loader:()=>r.e(3082).then(r.bind(r,2408)),meta:{title:"Is Subclass"}}],["/archive/current/packages/support/reflections/isSubclassOrLooksLike.html",{loader:()=>r.e(4648).then(r.bind(r,5092)),meta:{title:"Is Subclass Or Looks Like"}}],["/archive/current/packages/support/reflections/isWeakKind.html",{loader:()=>r.e(9058).then(r.bind(r,6820)),meta:{title:"Is WeakKind"}}],["/archive/current/packages/vuepress-utils/components/version-disclaimer.html",{loader:()=>r.e(6368).then(r.bind(r,6679)),meta:{title:"Version Disclaimer"}}],["/archive/current/packages/vuepress-utils/navigation/archive.html",{loader:()=>r.e(3100).then(r.bind(r,4655)),meta:{title:"Archive"}}],["/archive/current/packages/vuepress-utils/plugins/last-updated.html",{loader:()=>r.e(8518).then(r.bind(r,4306)),meta:{title:"Last Updated"}}],["/404.html",{loader:()=>r.e(7490).then(r.bind(r,2632)),meta:{title:""}}]])},8752:function(e,t,r){r.d(t,{b:function(){return a}});const a=[{title:"Release Notes",headers:[{level:2,title:"Support Policy",slug:"support-policy",link:"#support-policy",children:[]},{level:2,title:"v0.x Highlights",slug:"v0-x-highlights",link:"#v0-x-highlights",children:[{level:3,title:"Service Container",slug:"service-container",link:"#service-container",children:[]},{level:3,title:"Facades",slug:"facades",link:"#facades",children:[]},{level:3,title:"Concerns",slug:"concerns",link:"#concerns",children:[]},{level:3,title:"Merge",slug:"merge",link:"#merge",children:[]},{level:3,title:"Mixins",slug:"mixins",link:"#mixins",children:[]},{level:3,title:'"Target" Meta Decorator',slug:"target-meta-decorator",link:"#target-meta-decorator",children:[]},{level:3,title:"Meta Decorator",slug:"meta-decorator",link:"#meta-decorator",children:[]},{level:3,title:"Support",slug:"support",link:"#support",children:[]},{level:3,title:"Vuepress Utils",slug:"vuepress-utils",link:"#vuepress-utils",children:[]}]}],path:"/archive/current/",pathLocale:"/",extraFields:["Ion Release Notes"]},{title:"Code of Conduct",headers:[{level:2,title:"Consequences",slug:"consequences",link:"#consequences",children:[]}],path:"/archive/current/code-of-conduct.html",pathLocale:"/",extraFields:["Code of Conduct - Ion"]},{title:"Contribution Guide",headers:[{level:2,title:"Bug Report",slug:"bug-report",link:"#bug-report",children:[]},{level:2,title:"Security Vulnerability",slug:"security-vulnerability",link:"#security-vulnerability",children:[]},{level:2,title:"Feature Request",slug:"feature-request",link:"#feature-request",children:[]},{level:2,title:"Fork, code and send pull-request",slug:"fork-code-and-send-pull-request",link:"#fork-code-and-send-pull-request",children:[]}],path:"/archive/current/contribution-guide.html",pathLocale:"/",extraFields:["How to contribute to Ion"]},{title:"Origin",headers:[{level:2,title:'Meaning of "Ion"',slug:"meaning-of-ion",link:"#meaning-of-ion",children:[]}],path:"/archive/current/origin.html",pathLocale:"/",extraFields:["The origin of Ion"]},{title:"Security Policy",headers:[{level:2,title:"How to report a vulnerability",slug:"how-to-report-a-vulnerability",link:"#how-to-report-a-vulnerability",children:[{level:3,title:"Public PGP Key",slug:"public-pgp-key",link:"#public-pgp-key",children:[]}]},{level:2,title:"Supported Versions",slug:"supported-versions",link:"#supported-versions",children:[]}],path:"/archive/current/security.html",pathLocale:"/",extraFields:["Security Policy of Athenaeum"]},{title:"Upgrade Guide",headers:[{level:2,title:"From v0.7.x- to v0.10.x",slug:"from-v0-7-x-to-v0-10-x",link:"#from-v0-7-x-to-v0-10-x",children:[{level:3,title:"Meta (types)",slug:"meta-types",link:"#meta-types",children:[]},{level:3,title:"Meta (targetMeta() and inheritTargetMeta())",slug:"meta-targetmeta-and-inherittargetmeta",link:"#meta-targetmeta-and-inherittargetmeta",children:[]}]},{level:2,title:"From v0.6.x to v0.7.x",slug:"from-v0-6-x-to-v0-7-x",link:"#from-v0-6-x-to-v0-7-x",children:[{level:3,title:"Node.js 20.11.0 Required",slug:"node-js-20-11-0-required",link:"#node-js-20-11-0-required",children:[]},{level:3,title:"Meta",slug:"meta",link:"#meta",children:[]},{level:3,title:"Vuepress Utils",slug:"vuepress-utils",link:"#vuepress-utils",children:[]}]},{level:2,title:"From v0.3.x to v0.4.x",slug:"from-v0-3-x-to-v0-4-x",link:"#from-v0-3-x-to-v0-4-x",children:[{level:3,title:"Rest Parameters for forgetAll(), hasAll() and hasAny()",slug:"rest-parameters-for-forgetall-hasall-and-hasany",link:"#rest-parameters-for-forgetall-hasall-and-hasany",children:[]}]},{level:2,title:"Onward",slug:"onward",link:"#onward",children:[]}],path:"/archive/current/upgrade-guide.html",pathLocale:"/",extraFields:["Ion Upgrade Guide"]},{title:"Introduction",headers:[{level:2,title:"Environment",slug:"environment",link:"#environment",children:[]},{level:2,title:"Available Since",slug:"available-since",link:"#available-since",children:[]},{level:2,title:"Not Released",slug:"not-released",link:"#not-released",children:[]},{level:2,title:"Not Published",slug:"not-published",link:"#not-published",children:[]}],path:"/archive/current/packages/",pathLocale:"/",extraFields:["Ion Packages"]},{title:"Introduction",headers:[{level:2,title:"Example",slug:"example",link:"#example",children:[{level:3,title:"Bindings",slug:"bindings",link:"#bindings",children:[]},{level:3,title:"Define Dependencies",slug:"define-dependencies",link:"#define-dependencies",children:[]},{level:3,title:"Resolve",slug:"resolve",link:"#resolve",children:[]},{level:3,title:"Onward",slug:"onward",link:"#onward",children:[]}]}],path:"/archive/current/packages/container/",pathLocale:"/",extraFields:["Ion Service Container package"]},{title:"Bindings",headers:[{level:2,title:"Basics",slug:"basics",link:"#basics",children:[{level:3,title:"Singletons",slug:"singletons",link:"#singletons",children:[]},{level:3,title:"Instances",slug:"instances",link:"#instances",children:[]}]},{level:2,title:"Identifiers",slug:"identifiers",link:"#identifiers",children:[]},{level:2,title:"concrete Types",slug:"concrete-types",link:"#concrete-types",children:[{level:3,title:"Constructors",slug:"constructors",link:"#constructors",children:[]},{level:3,title:"Factory Callbacks",slug:"factory-callbacks",link:"#factory-callbacks",children:[]}]},{level:2,title:"Extend Bindings",slug:"extend-bindings",link:"#extend-bindings",children:[]}],path:"/archive/current/packages/container/bindings.html",pathLocale:"/",extraFields:["Service Container Bindings"]},{title:"Container Instance",headers:[{level:2,title:"Destroy Existing Instance",slug:"destroy-existing-instance",link:"#destroy-existing-instance",children:[]}],path:"/archive/current/packages/container/container-instance.html",pathLocale:"/",extraFields:["How to obtain Service Container instance"]},{title:"Contextual Bindings",headers:[],path:"/archive/current/packages/container/contextual-bindings.html",pathLocale:"/",extraFields:["Define Contextual Bindings"]},{title:"Dependencies",headers:[{level:2,title:"Multiple Dependencies",slug:"multiple-dependencies",link:"#multiple-dependencies",children:[]}],path:"/archive/current/packages/container/dependencies.html",pathLocale:"/",extraFields:["How to define dependencies"]},{title:"How to install",headers:[{level:2,title:"npm",slug:"npm",link:"#npm",children:[]},{level:2,title:"yarn",slug:"yarn",link:"#yarn",children:[]},{level:2,title:"pnpm",slug:"pnpm",link:"#pnpm",children:[]}],path:"/archive/current/packages/container/install.html",pathLocale:"/",extraFields:["How to install Ion Service Container package"]},{title:"Prerequisites",headers:[],path:"/archive/current/packages/container/prerequisites.html",pathLocale:"/",extraFields:["Prerequisites for using service container."]},{title:"Resolving",headers:[{level:2,title:"The make() method",slug:"the-make-method",link:"#the-make-method",children:[{level:3,title:"Dependencies",slug:"dependencies",link:"#dependencies",children:[]},{level:3,title:"The args Argument",slug:"the-args-argument",link:"#the-args-argument",children:[]}]},{level:2,title:"The call() method",slug:"the-call-method",link:"#the-call-method",children:[{level:3,title:"Class Method Reference",slug:"class-method-reference",link:"#class-method-reference",children:[]},{level:3,title:"Callback Wrapper",slug:"callback-wrapper",link:"#callback-wrapper",children:[]},{level:3,title:"Callback",slug:"callback",link:"#callback",children:[]}]},{level:2,title:"Hooks",slug:"hooks",link:"#hooks",children:[{level:3,title:"before()",slug:"before",link:"#before",children:[]},{level:3,title:"after()",slug:"after",link:"#after",children:[]}]}],path:"/archive/current/packages/container/resolving.html",pathLocale:"/",extraFields:["Resolving Dependencies"]},{title:"Introduction",headers:[],path:"/archive/current/packages/contracts/",pathLocale:"/",extraFields:["Ion Support package"]},{title:"How to install",headers:[{level:2,title:"npm",slug:"npm",link:"#npm",children:[]},{level:2,title:"yarn",slug:"yarn",link:"#yarn",children:[]},{level:2,title:"pnpm",slug:"pnpm",link:"#pnpm",children:[]}],path:"/archive/current/packages/contracts/install.html",pathLocale:"/",extraFields:["How to install Ion Contracts package"]},{title:"Callback Wrapper",headers:[{level:2,title:"Call",slug:"call",link:"#call",children:[]},{level:2,title:"Arguments",slug:"arguments",link:"#arguments",children:[{level:3,title:"Via make()",slug:"via-make",link:"#via-make",children:[]},{level:3,title:"Via with()",slug:"via-with",link:"#via-with",children:[]},{level:3,title:"Via arguments",slug:"via-arguments",link:"#via-arguments",children:[]}]},{level:2,title:"Binding",slug:"binding",link:"#binding",children:[{level:3,title:"Binding vs. Arrow Function",slug:"binding-vs-arrow-function",link:"#binding-vs-arrow-function",children:[]}]},{level:2,title:"Misc.",slug:"misc",link:"#misc",children:[{level:3,title:"Custom Callback Wrapper",slug:"custom-callback-wrapper",link:"#custom-callback-wrapper",children:[]}]}],path:"/archive/current/packages/support/CallbackWrapper.html",pathLocale:"/",extraFields:["Wrapper object for a callback"]},{title:"Introduction",headers:[],path:"/archive/current/packages/support/",pathLocale:"/",extraFields:["Ion Support package"]},{title:"How to install",headers:[{level:2,title:"npm",slug:"npm",link:"#npm",children:[]},{level:2,title:"yarn",slug:"yarn",link:"#yarn",children:[]},{level:2,title:"pnpm",slug:"pnpm",link:"#pnpm",children:[]}],path:"/archive/current/packages/support/install.html",pathLocale:"/",extraFields:["How to install Ion Support package"]},{title:"Introduction",headers:[{level:2,title:"Navigation",slug:"navigation",link:"#navigation",children:[]},{level:2,title:"Plugins",slug:"plugins",link:"#plugins",children:[]},{level:2,title:"Components",slug:"components",link:"#components",children:[]}],path:"/archive/current/packages/vuepress-utils/",pathLocale:"/",extraFields:["Various helpers for your vuepress site"]},{title:"How to install",headers:[{level:2,title:"npm",slug:"npm",link:"#npm",children:[]},{level:2,title:"yarn",slug:"yarn",link:"#yarn",children:[]},{level:2,title:"pnpm",slug:"pnpm",link:"#pnpm",children:[]}],path:"/archive/current/packages/vuepress-utils/install.html",pathLocale:"/",extraFields:["How to install Vuepress Utils"]},{title:"XYZ (test package)",headers:[],path:"/archive/current/packages/xyz/",pathLocale:"/",extraFields:["XYZ Test Package"]},{title:"About Arrays",headers:[],path:"/archive/current/packages/support/arrays/",pathLocale:"/",extraFields:["Array utilities."]},{title:"Includes All",headers:[],path:"/archive/current/packages/support/arrays/includesAll.html",pathLocale:"/",extraFields:["Determine if array contains all values."]},{title:"Includes Any",headers:[],path:"/archive/current/packages/support/arrays/includesAny.html",pathLocale:"/",extraFields:["Determine if array contains some values."]},{title:"Is Array Like",headers:[],path:"/archive/current/packages/support/arrays/isArrayLike.html",pathLocale:"/",extraFields:["Determine if value is array-like."]},{title:"Is Concat Spreadable",headers:[],path:"/archive/current/packages/support/arrays/isConcatSpreadable.html",pathLocale:"/",extraFields:["Determine if object is concat spreadable."]},{title:"Is Safe Array Like",headers:[],path:"/archive/current/packages/support/arrays/isSafeArrayLike.html",pathLocale:"/",extraFields:['Determine if value is "safe" array-like.']},{title:"Is Typed Array",headers:[],path:"/archive/current/packages/support/arrays/isTypedArray.html",pathLocale:"/",extraFields:["Determine if object is a typed array."]},{title:"Merge",headers:[{level:2,title:"Deep Copy Objects",slug:"deep-copy-objects",link:"#deep-copy-objects",children:[]},{level:2,title:"When unable to merge values",slug:"when-unable-to-merge-values",link:"#when-unable-to-merge-values",children:[]},{level:2,title:"Merge Options",slug:"merge-options",link:"#merge-options",children:[{level:3,title:"transferFunctions",slug:"transferfunctions",link:"#transferfunctions",children:[]},{level:3,title:"callback",slug:"callback",link:"#callback",children:[]}]}],path:"/archive/current/packages/support/arrays/merge.html",pathLocale:"/",extraFields:["Merge multiple arrays into a new array."]},{title:"About Concerns",headers:[{level:2,title:"Example",slug:"example",link:"#example",children:[]}],path:"/archive/current/packages/support/concerns/",pathLocale:"/",extraFields:["Alternative mixin utility."]},{title:"Aliases",headers:[{level:2,title:"Properties & Methods",slug:"properties-methods",link:"#properties-methods",children:[]},{level:2,title:"If property or method already exists",slug:"if-property-or-method-already-exists",link:"#if-property-or-method-already-exists",children:[]}],path:"/archive/current/packages/support/concerns/aliases.html",pathLocale:"/",extraFields:["What are aliases"]},{title:"Booting",headers:[{level:2,title:"Manual Booting",slug:"manual-booting",link:"#manual-booting",children:[{level:3,title:"Boot All Concerns",slug:"boot-all-concerns",link:"#boot-all-concerns",children:[]}]}],path:"/archive/current/packages/support/concerns/booting.html",pathLocale:"/",extraFields:["How concerns are booted"]},{title:"Concern Class",headers:[{level:2,title:"Inherit from AbstractConcern",slug:"inherit-from-abstractconcern",link:"#inherit-from-abstractconcern",children:[{level:3,title:"Private Members",slug:"private-members",link:"#private-members",children:[]},{level:3,title:"Static Members",slug:"static-members",link:"#static-members",children:[]},{level:3,title:"Transpilers",slug:"transpilers",link:"#transpilers",children:[]}]},{level:2,title:'Customise "alias" members',slug:"customise-alias-members",link:"#customise-alias-members",children:[]},{level:2,title:"Concern Owner instance",slug:"concern-owner-instance",link:"#concern-owner-instance",children:[]},{level:2,title:"Constructor",slug:"constructor",link:"#constructor",children:[]}],path:"/archive/current/packages/support/concerns/concernClass.html",pathLocale:"/",extraFields:["How to define a new concern class."]},{title:"Conflict Resolution",headers:[{level:2,title:"Naming Conflicts",slug:"naming-conflicts",link:"#naming-conflicts",children:[]},{level:2,title:"Resolve Naming Conflicts",slug:"resolve-naming-conflicts",link:"#resolve-naming-conflicts",children:[]},{level:2,title:"Prevent Aliases",slug:"prevent-aliases",link:"#prevent-aliases",children:[]},{level:2,title:"Shorthand Configuration",slug:"shorthand-configuration",link:"#shorthand-configuration",children:[]}],path:"/archive/current/packages/support/concerns/conflictResolution.html",pathLocale:"/",extraFields:["How to deal with naming conflicts"]},{title:"Edge Cases",headers:[{level:2,title:"Getter & Setter declared in different concerns",slug:"getter-setter-declared-in-different-concerns",link:"#getter-setter-declared-in-different-concerns",children:[]},{level:2,title:"Inheritance vs. Concern members",slug:"inheritance-vs-concern-members",link:"#inheritance-vs-concern-members",children:[]},{level:2,title:"Concerns using other concerns",slug:"concerns-using-other-concerns",link:"#concerns-using-other-concerns",children:[]}],path:"/archive/current/packages/support/concerns/edgeCases.html",pathLocale:"/",extraFields:["A few edge cases when making or using concerns"]},{title:"Hooks",headers:[{level:2,title:"BEFORE Registration",slug:"before-registration",link:"#before-registration",children:[]},{level:2,title:"AFTER Registration",slug:"after-registration",link:"#after-registration",children:[]}],path:"/archive/current/packages/support/concerns/hooks.html",pathLocale:"/",extraFields:["How to use registration hooks"]},{title:"JSDoc",headers:[{level:2,title:"@mixin and @mixes",slug:"mixin-and-mixes",link:"#mixin-and-mixes",children:[]},{level:2,title:"@property",slug:"property",link:"#property",children:[]},{level:2,title:"@borrows",slug:"borrows",link:"#borrows",children:[]},{level:2,title:"@member",slug:"member",link:"#member",children:[]}],path:"/archive/current/packages/support/concerns/jsdoc.html",pathLocale:"/",extraFields:["A wat to document what concerns a targer class uses."]},{title:"Prerequisites",headers:[],path:"/archive/current/packages/support/concerns/prerequisites.html",pathLocale:"/",extraFields:["Prerequisites for using concerns."]},{title:"Using Concerns",headers:[{level:2,title:"Using Concerns",slug:"using-concerns",link:"#using-concerns",children:[]},{level:2,title:"Inheritance",slug:"inheritance",link:"#inheritance",children:[]},{level:2,title:"Manual interaction",slug:"manual-interaction",link:"#manual-interaction",children:[{level:3,title:"Determine if target uses concerns",slug:"determine-if-target-uses-concerns",link:"#determine-if-target-uses-concerns",children:[]}]}],path:"/archive/current/packages/support/concerns/usage.html",pathLocale:"/",extraFields:["How to use concerns."]},{title:"About Exceptions",headers:[],path:"/archive/current/packages/support/exceptions/",pathLocale:"/",extraFields:["Error & Exceptions utilities."]},{title:"Configure Custom Error",headers:[{level:2,title:"Arguments",slug:"arguments",link:"#arguments",children:[]}],path:"/archive/current/packages/support/exceptions/configureCustomError.html",pathLocale:"/",extraFields:["Configuration of custom errors."]},{title:"Configure Stack Trace",headers:[{level:2,title:"Arguments",slug:"arguments",link:"#arguments",children:[]}],path:"/archive/current/packages/support/exceptions/configureStackTrace.html",pathLocale:"/",extraFields:["Configuration error stack trace."]},{title:"Custom Errors",headers:[{level:2,title:"AbstractClassError",slug:"abstractclasserror",link:"#abstractclasserror",children:[]},{level:2,title:"LogicalError",slug:"logicalerror",link:"#logicalerror",children:[]}],path:"/archive/current/packages/support/exceptions/customErrors.html",pathLocale:"/",extraFields:["Predefined custom errors."]},{title:"Get Error Message",headers:[],path:"/archive/current/packages/support/exceptions/getErrorMessage.html",pathLocale:"/",extraFields:["Obtain error or default message."]},{title:"About Facades",headers:[{level:2,title:"Setup Facade's Service Container instance",slug:"setup-facade-s-service-container-instance",link:"#setup-facade-s-service-container-instance",children:[]},{level:2,title:"Define a Facade",slug:"define-a-facade",link:"#define-a-facade",children:[]},{level:2,title:"The obtain() method",slug:"the-obtain-method",link:"#the-obtain-method",children:[]},{level:2,title:"Testing",slug:"testing",link:"#testing",children:[]},{level:2,title:"Onward",slug:"onward",link:"#onward",children:[]}],path:"/archive/current/packages/support/facades/",pathLocale:"/",extraFields:["A static interface to classes"]},{title:"About Meta",headers:[],path:"/archive/current/packages/support/meta/",pathLocale:"/",extraFields:["Add arbitrary metadata on classes, methods and properties."]},{title:"Inheritance",headers:[{level:2,title:"Overwrites",slug:"overwrites",link:"#overwrites",children:[]}],path:"/archive/current/packages/support/meta/inheritance.html",pathLocale:"/",extraFields:["About metadata inheritance and overwrites."]},{title:"Outside Changes",headers:[],path:"/archive/current/packages/support/meta/outsideChanges.html",pathLocale:"/",extraFields:["About changes to metadata outside decorator scope."]},{title:"Prerequisites",headers:[],path:"/archive/current/packages/support/meta/prerequisites.html",pathLocale:"/",extraFields:["Prerequisites for using meta decorators."]},{title:"Set & Get",headers:[{level:2,title:"Set Metadata",slug:"set-metadata",link:"#set-metadata",children:[]},{level:2,title:"Get Metadata",slug:"get-metadata",link:"#get-metadata",children:[{level:3,title:"Default Value",slug:"default-value",link:"#default-value",children:[]}]},{level:2,title:"Callback",slug:"callback",link:"#callback",children:[]}],path:"/archive/current/packages/support/meta/setAndGet.html",pathLocale:"/",extraFields:["Defining and retrieving metadata."]},{title:"Supported Elements",headers:[],path:"/archive/current/packages/support/meta/supported.html",pathLocale:"/",extraFields:["Supported elements by meta decorators."]},{title:"Target Meta",headers:[{level:2,title:"Supported Elements",slug:"supported-elements",link:"#supported-elements",children:[]},{level:2,title:"Class Instance",slug:"class-instance",link:"#class-instance",children:[]},{level:2,title:"Method Reference",slug:"method-reference",link:"#method-reference",children:[]},{level:2,title:"Inheritance",slug:"inheritance",link:"#inheritance",children:[{level:3,title:"Static Methods",slug:"static-methods",link:"#static-methods",children:[]}]}],path:"/archive/current/packages/support/meta/targetMeta.html",pathLocale:"/",extraFields:["Associate metadata with a class instance or class method reference."]},{title:"TC39 Proposal",headers:[],path:"/archive/current/packages/support/meta/tc39.html",pathLocale:"/",extraFields:["In relation to TC39 Decorator Metadata proposal"]},{title:"About Misc.",headers:[],path:"/archive/current/packages/support/misc/",pathLocale:"/",extraFields:["Miscellaneous utility functions."]},{title:"Desc. Tag",headers:[],path:"/archive/current/packages/support/misc/descTag.html",pathLocale:"/",extraFields:["Object description tag"]},{title:"Empty",headers:[{level:2,title:"WeakMap and WeakSet",slug:"weakmap-and-weakset",link:"#weakmap-and-weakset",children:[]}],path:"/archive/current/packages/support/misc/empty.html",pathLocale:"/",extraFields:["Determine if value is empty"]},{title:"Is Key",headers:[],path:"/archive/current/packages/support/misc/isKey.html",pathLocale:"/",extraFields:["Determine if is a key or path identifier"]},{title:"Is Primitive",headers:[],path:"/archive/current/packages/support/misc/isPrimitive.html",pathLocale:"/",extraFields:["Determine if value is a primitive."]},{title:"Is Property Key",headers:[],path:"/archive/current/packages/support/misc/isPropertyKey.html",pathLocale:"/",extraFields:["Determine if key is a valid property key name."]},{title:"Isset",headers:[{level:2,title:"Multiple values",slug:"multiple-values",link:"#multiple-values",children:[]}],path:"/archive/current/packages/support/misc/isset.html",pathLocale:"/",extraFields:["Determine if value isset."]},{title:"Merge Keys",headers:[],path:"/archive/current/packages/support/misc/mergeKeys.html",pathLocale:"/",extraFields:["Merge keys into a single key."]},{title:"To Weak Ref.",headers:[],path:"/archive/current/packages/support/misc/toWeakRef.html",pathLocale:"/",extraFields:["Wrap object into a Weak Reference."]},{title:"About Mixins",headers:[],path:"/archive/current/packages/support/mixins/",pathLocale:"/",extraFields:['Abstract subclasses ("Mixins") utilities']},{title:"Apply Mixins",headers:[{level:2,title:"Extending Superclass",slug:"extending-superclass",link:"#extending-superclass",children:[]}],path:"/archive/current/packages/support/mixins/apply.html",pathLocale:"/",extraFields:["How to apply mixins."]},{title:"Inheritance",headers:[],path:"/archive/current/packages/support/mixins/inheritance.html",pathLocale:"/",extraFields:["How inheritance works."]},{title:"Instanceof",headers:[],path:"/archive/current/packages/support/mixins/instanceof.html",pathLocale:"/",extraFields:["Using instanceof operator."]},{title:"New Mixin",headers:[{level:2,title:"Constructor",slug:"constructor",link:"#constructor",children:[]}],path:"/archive/current/packages/support/mixins/newMixin.html",pathLocale:"/",extraFields:["How to defined a new Mixin class."]},{title:"Onward",headers:[],path:"/archive/current/packages/support/mixins/onward.html",pathLocale:"/",extraFields:["Where to read more about mixins."]},{title:"About Objects",headers:[],path:"/archive/current/packages/support/objects/",pathLocale:"/",extraFields:["Objects related utilities"]},{title:"Forget",headers:[],path:"/archive/current/packages/support/objects/forget.html",pathLocale:"/",extraFields:["Forget object key"]},{title:"Forget All",headers:[],path:"/archive/current/packages/support/objects/forgetAll.html",pathLocale:"/",extraFields:["Forget object all keys"]},{title:"Get",headers:[{level:2,title:"Default Value",slug:"default-value",link:"#default-value",children:[]}],path:"/archive/current/packages/support/objects/get.html",pathLocale:"/",extraFields:["Get object value from given path."]},{title:"Has",headers:[],path:"/archive/current/packages/support/objects/has.html",pathLocale:"/",extraFields:["Determine if object path is a property."]},{title:"Has All",headers:[],path:"/archive/current/packages/support/objects/hasAll.html",pathLocale:"/",extraFields:["Determine if all object paths are properties."]},{title:"Has Any",headers:[],path:"/archive/current/packages/support/objects/hasAny.html",pathLocale:"/",extraFields:["Determine if any object paths are properties."]},{title:"Has Unique ID",headers:[],path:"/archive/current/packages/support/objects/hasUniqueId.html",pathLocale:"/",extraFields:["Determine if object has a unique id."]},{title:"Is Cloneable",headers:[],path:"/archive/current/packages/support/objects/isCloneable.html",pathLocale:"/",extraFields:["Determine if object is cloneable."]},{title:"Is Populatable",headers:[],path:"/archive/current/packages/support/objects/isPopulatable.html",pathLocale:"/",extraFields:["Determine if object is populatable."]},{title:"Isset",headers:[],path:"/archive/current/packages/support/objects/isset.html",pathLocale:"/",extraFields:["Determine if object object paths are set and have values."]},{title:"Merge",headers:[{level:2,title:"Shallow Copied Types",slug:"shallow-copied-types",link:"#shallow-copied-types",children:[]},{level:2,title:"Unsafe Keys",slug:"unsafe-keys",link:"#unsafe-keys",children:[]},{level:2,title:"Merge Options",slug:"merge-options",link:"#merge-options",children:[{level:3,title:"depth",slug:"depth",link:"#depth",children:[]},{level:3,title:"skip",slug:"skip",link:"#skip",children:[]},{level:3,title:"overwriteWithUndefined",slug:"overwritewithundefined",link:"#overwritewithundefined",children:[]},{level:3,title:"useCloneable",slug:"usecloneable",link:"#usecloneable",children:[]},{level:3,title:"mergeArrays",slug:"mergearrays",link:"#mergearrays",children:[]},{level:3,title:"arrayMergeOptions",slug:"arraymergeoptions",link:"#arraymergeoptions",children:[]},{level:3,title:"callback",slug:"callback",link:"#callback",children:[]}]}],path:"/archive/current/packages/support/objects/merge.html",pathLocale:"/",extraFields:["Merge multiple objects into a new object."]},{title:"Populate",headers:[{level:2,title:"Arguments",slug:"arguments",link:"#arguments",children:[]},{level:2,title:"Limit keys to populate",slug:"limit-keys-to-populate",link:"#limit-keys-to-populate",children:[]},{level:2,title:"Source Keys Callback",slug:"source-keys-callback",link:"#source-keys-callback",children:[]},{level:2,title:"When keys do not exist",slug:"when-keys-do-not-exist",link:"#when-keys-do-not-exist",children:[]}],path:"/archive/current/packages/support/objects/populate.html",pathLocale:"/",extraFields:["Populate target object."]},{title:"Set",headers:[],path:"/archive/current/packages/support/objects/set.html",pathLocale:"/",extraFields:["Set value in object path."]},{title:"Unique ID",headers:[],path:"/archive/current/packages/support/objects/uniqueId.html",pathLocale:"/",extraFields:["Set value in object path."]},{title:"About reflections",headers:[],path:"/archive/current/packages/support/reflections/",pathLocale:"/",extraFields:["Reflection utilities."]},{title:"Assert Has Prototype Prop.",headers:[],path:"/archive/current/packages/support/reflections/assertHasPrototypeProperty.html",pathLocale:"/",extraFields:['Assert that object has a "prototype" property.']},{title:"Class Looks Like",headers:[{level:2,title:"Arguments",slug:"arguments",link:"#arguments",children:[]},{level:2,title:"Class Blueprint",slug:"class-blueprint",link:"#class-blueprint",children:[]},{level:2,title:"Recursive",slug:"recursive",link:"#recursive",children:[]}],path:"/archive/current/packages/support/reflections/classLooksLike.html",pathLocale:"/",extraFields:["Determine if a class looks like blueprint."]},{title:"Class Own Keys",headers:[{level:2,title:"Limitation",slug:"limitation",link:"#limitation",children:[]}],path:"/archive/current/packages/support/reflections/classOwnKeys.html",pathLocale:"/",extraFields:["Get property keys of target class."]},{title:"Get All Parents Of Class",headers:[],path:"/archive/current/packages/support/reflections/getAllParentsOfClass.html",pathLocale:"/",extraFields:["Get all parents of a class"]},{title:"Get Class Prop. Descriptor",headers:[],path:"/archive/current/packages/support/reflections/getClassPropertyDescriptor.html",pathLocale:"/",extraFields:["Get property descriptor of target class property."]},{title:"Get Class Prop. Descriptors",headers:[],path:"/archive/current/packages/support/reflections/getClassPropertyDescriptors.html",pathLocale:"/",extraFields:["Get all property descriptors of target class."]},{title:"Get Constructor Name",headers:[],path:"/archive/current/packages/support/reflections/getConstructorName.html",pathLocale:"/",extraFields:["Get name of target class' constructor"]},{title:"Get Name Or Desc. Tag",headers:[],path:"/archive/current/packages/support/reflections/getNameOrDesc.html",pathLocale:"/",extraFields:["Get name of target class' constructor, or description tag"]},{title:"Get Parent Of Class",headers:[],path:"/archive/current/packages/support/reflections/getParentOfClass.html",pathLocale:"/",extraFields:["Get parent class."]},{title:"Has All Methods",headers:[],path:"/archive/current/packages/support/reflections/hasAllMethods.html",pathLocale:"/",extraFields:["Determine if target has all methods"]},{title:"Has Method",headers:[],path:"/archive/current/packages/support/reflections/hasMethod.html",pathLocale:"/",extraFields:["Determine if target has method"]},{title:"Has Prototype Property",headers:[],path:"/archive/current/packages/support/reflections/hasPrototypeProperty.html",pathLocale:"/",extraFields:['Determine if "prototype" property exists.']},{title:"Is Callable",headers:[],path:"/archive/current/packages/support/reflections/isCallable.html",pathLocale:"/",extraFields:["Determine if value is callable."]},{title:"Is Class Constructor",headers:[],path:"/archive/current/packages/support/reflections/isClassConstructor.html",pathLocale:"/",extraFields:["Determine if value is a class constructor."]},{title:"Is Class Method Reference",headers:[],path:"/archive/current/packages/support/reflections/isClassMethodReference.html",pathLocale:"/",extraFields:["Determine if value is a class method reference"]},{title:"Is Constructor",headers:[],path:"/archive/current/packages/support/reflections/isConstructor.html",pathLocale:"/",extraFields:["Determine if value is a constructor."]},{title:"Is Key Safe",headers:[{level:2,title:"isKeySafe",slug:"iskeysafe",link:"#iskeysafe",children:[]}],path:"/archive/current/packages/support/reflections/isKeySafe.html",pathLocale:"/",extraFields:["Determine if a property key is safe."]},{title:"Is Key Unsafe",headers:[],path:"/archive/current/packages/support/reflections/isKeyUnsafe.html",pathLocale:"/",extraFields:["Determine if a property key is unsafe."]},{title:"Is Method",headers:[],path:"/archive/current/packages/support/reflections/isMethod.html",pathLocale:"/",extraFields:["Determine if property is a method in target"]},{title:"Is Subclass",headers:[],path:"/archive/current/packages/support/reflections/isSubclass.html",pathLocale:"/",extraFields:["Determine if target is a subclass of another class."]},{title:"Is Subclass Or Looks Like",headers:[],path:"/archive/current/packages/support/reflections/isSubclassOrLooksLike.html",pathLocale:"/",extraFields:["Determine if target is a subclass of another class, or looks like blueprint"]},{title:"Is WeakKind",headers:[],path:"/archive/current/packages/support/reflections/isWeakKind.html",pathLocale:"/",extraFields:['Determine if object is of a "weak" kind.']},{title:"Version Disclaimer",headers:[{level:2,title:"Properties",slug:"properties",link:"#properties",children:[{level:3,title:"type (optional)",slug:"type-optional",link:"#type-optional",children:[]},{level:3,title:"label (optional)",slug:"label-optional",link:"#label-optional",children:[]}]},{level:2,title:"Extend Default Layout",slug:"extend-default-layout",link:"#extend-default-layout",children:[]},{level:2,title:"Client Config",slug:"client-config",link:"#client-config",children:[]}],path:"/archive/current/packages/vuepress-utils/components/version-disclaimer.html",pathLocale:"/",extraFields:["A simple notice container"]},{title:"Archive",headers:[{level:2,title:"Directory Structure",slug:"directory-structure",link:"#directory-structure",children:[]},{level:2,title:"Collections",slug:"collections",link:"#collections",children:[]},{level:2,title:"Archive Instance",slug:"archive-instance",link:"#archive-instance",children:[{level:3,title:"Name & Path",slug:"name-path",link:"#name-path",children:[]},{level:3,title:"Current & Next",slug:"current-next",link:"#current-next",children:[]}]},{level:2,title:"Vuepress Config File",slug:"vuepress-config-file",link:"#vuepress-config-file",children:[]},{level:2,title:"Onward",slug:"onward",link:"#onward",children:[]}],path:"/archive/current/packages/vuepress-utils/navigation/archive.html",pathLocale:"/",extraFields:["Archive Structure and Navigation"]},{title:"Last Updated",headers:[{level:2,title:"How to use",slug:"how-to-use",link:"#how-to-use",children:[]},{level:2,title:"Format",slug:"format",link:"#format",children:[]}],path:"/archive/current/packages/vuepress-utils/plugins/last-updated.html",pathLocale:"/",extraFields:["Last Updated Date Vuepress plugins"]}]},1901:function(e,t,r){r.d(t,{U:function(){return a}});const a=JSON.parse('{"base":"/ion/","lang":"en-GB","title":"Ion","description":"Ion Official Documentation","head":[["link",{"rel":"apple-touch-icon","sizes":"180x180","href":"/ion/images/icon/apple-touch-icon.png"}],["link",{"rel":"icon","type":"image/png","sizes":"32x32","href":"/ion/images/icon/favicon-32x32.png"}],["link",{"rel":"icon","type":"image/png","sizes":"16x16","href":"/ion/images/icon/favicon-16x16.png"}],["link",{"rel":"manifest","href":"/ion/site.webmanifest"}]],"locales":{}}')},7961:function(e,t,r){r.d(t,{K:function(){return a}});const a=JSON.parse('{"repo":"aedart/ion","colorMode":"light","logo":"/images/icon/apple-touch-icon.png","editLink":true,"editLinkText":"Edit page","docsRepo":"https://github.com/aedart/ion","docsBranch":"main","docsDir":"docs","lastUpdated":true,"lastUpdatedText":"Last Updated","navbar":[{"text":"Packages","link":"/archive/current/packages/"},{"text":"Archive","link":"/archive","children":[{"text":"next","link":"/archive/next"},{"text":"current","link":"/archive/current"}]},{"text":"Changelog","link":"https://github.com/aedart/ion/blob/main/CHANGELOG.md"}],"sidebar":{"/archive/next":[{"text":"Version 1.x","collapsible":true,"children":["/archive/next/"]}],"/archive/current":[{"text":"Version 0.x","collapsible":true,"children":["/archive/current/","/archive/current/upgrade-guide","/archive/current/contribution-guide","/archive/current/security","/archive/current/code-of-conduct","/archive/current/origin"]},{"text":"Packages","collapsible":true,"children":["/archive/current/packages/",{"text":"Container","collapsible":true,"children":["/archive/current/packages/container/","/archive/current/packages/container/prerequisites","/archive/current/packages/container/install","/archive/current/packages/container/container-instance","/archive/current/packages/container/bindings","/archive/current/packages/container/dependencies","/archive/current/packages/container/resolving","/archive/current/packages/container/contextual-bindings"]},{"text":"Contracts","collapsible":true,"children":["/archive/current/packages/contracts/","/archive/current/packages/contracts/install"]},{"text":"Support","collapsible":true,"children":["/archive/current/packages/support/","/archive/current/packages/support/install",{"text":"Arrays","collapsible":true,"children":["/archive/current/packages/support/arrays/","/archive/current/packages/support/arrays/includesAll","/archive/current/packages/support/arrays/includesAny","/archive/current/packages/support/arrays/isArrayLike","/archive/current/packages/support/arrays/isConcatSpreadable","/archive/current/packages/support/arrays/isSafeArrayLike","/archive/current/packages/support/arrays/isTypedArray","/archive/current/packages/support/arrays/merge"]},{"text":"Concerns","collapsible":true,"children":["/archive/current/packages/support/concerns/","/archive/current/packages/support/concerns/prerequisites","/archive/current/packages/support/concerns/concernClass","/archive/current/packages/support/concerns/usage","/archive/current/packages/support/concerns/aliases","/archive/current/packages/support/concerns/conflictResolution","/archive/current/packages/support/concerns/booting","/archive/current/packages/support/concerns/hooks","/archive/current/packages/support/concerns/edgeCases","/archive/current/packages/support/concerns/jsdoc"]},{"text":"Exceptions","collapsible":true,"children":["/archive/current/packages/support/exceptions/","/archive/current/packages/support/exceptions/configureCustomError","/archive/current/packages/support/exceptions/configureStackTrace","/archive/current/packages/support/exceptions/getErrorMessage","/archive/current/packages/support/exceptions/customErrors"]},{"text":"Facades","collapsible":true,"children":["/archive/current/packages/support/facades/"]},{"text":"Meta","collapsible":true,"children":["/archive/current/packages/support/meta/","/archive/current/packages/support/meta/prerequisites","/archive/current/packages/support/meta/supported","/archive/current/packages/support/meta/setAndGet","/archive/current/packages/support/meta/inheritance","/archive/current/packages/support/meta/outsideChanges","/archive/current/packages/support/meta/tc39","/archive/current/packages/support/meta/targetMeta"]},{"text":"Mixins","collapsible":true,"children":["/archive/current/packages/support/mixins/","/archive/current/packages/support/mixins/newMixin","/archive/current/packages/support/mixins/apply","/archive/current/packages/support/mixins/instanceof","/archive/current/packages/support/mixins/inheritance","/archive/current/packages/support/mixins/onward"]},{"text":"Object","collapsible":true,"children":["/archive/current/packages/support/objects/","/archive/current/packages/support/objects/forget","/archive/current/packages/support/objects/forgetAll","/archive/current/packages/support/objects/get","/archive/current/packages/support/objects/has","/archive/current/packages/support/objects/hasAll","/archive/current/packages/support/objects/hasAny","/archive/current/packages/support/objects/hasUniqueId","/archive/current/packages/support/objects/isCloneable","/archive/current/packages/support/objects/isPopulatable","/archive/current/packages/support/objects/isset","/archive/current/packages/support/objects/merge","/archive/current/packages/support/objects/populate","/archive/current/packages/support/objects/set","/archive/current/packages/support/objects/uniqueId"]},{"text":"Reflections","collapsible":true,"children":["/archive/current/packages/support/reflections/","/archive/current/packages/support/reflections/assertHasPrototypeProperty","/archive/current/packages/support/reflections/classLooksLike","/archive/current/packages/support/reflections/classOwnKeys","/archive/current/packages/support/reflections/getAllParentsOfClass","/archive/current/packages/support/reflections/getClassPropertyDescriptor","/archive/current/packages/support/reflections/getClassPropertyDescriptors","/archive/current/packages/support/reflections/getConstructorName","/archive/current/packages/support/reflections/getNameOrDesc","/archive/current/packages/support/reflections/getParentOfClass","/archive/current/packages/support/reflections/hasAllMethods","/archive/current/packages/support/reflections/hasMethod","/archive/current/packages/support/reflections/hasPrototypeProperty","/archive/current/packages/support/reflections/isCallable","/archive/current/packages/support/reflections/isClassConstructor","/archive/current/packages/support/reflections/isClassMethodReference","/archive/current/packages/support/reflections/isConstructor","/archive/current/packages/support/reflections/isKeySafe","/archive/current/packages/support/reflections/isKeyUnsafe","/archive/current/packages/support/reflections/isMethod","/archive/current/packages/support/reflections/isSubclass","/archive/current/packages/support/reflections/isSubclassOrLooksLike","/archive/current/packages/support/reflections/isWeakKind"]},{"text":"Misc","collapsible":true,"children":["/archive/current/packages/support/misc/","/archive/current/packages/support/misc/descTag","/archive/current/packages/support/misc/empty","/archive/current/packages/support/misc/isKey","/archive/current/packages/support/misc/isPrimitive","/archive/current/packages/support/misc/isPropertyKey","/archive/current/packages/support/misc/isset","/archive/current/packages/support/misc/mergeKeys","/archive/current/packages/support/misc/toWeakRef"]},"/archive/current/packages/support/CallbackWrapper"]},{"text":"Vuepress Utils","collapsible":true,"children":["/archive/current/packages/vuepress-utils/","/archive/current/packages/vuepress-utils/install",{"text":"Navigation","collapsible":true,"children":["/archive/current/packages/vuepress-utils/navigation/archive"]},{"text":"Plugins","collapsible":true,"children":["/archive/current/packages/vuepress-utils/plugins/last-updated"]},{"text":"Components","collapsible":true,"children":["/archive/current/packages/vuepress-utils/components/version-disclaimer"]}]},"/archive/current/packages/xyz/"]}]},"locales":{"/":{"selectLanguageName":"English"}},"colorModeSwitch":true,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebarDepth":2,"contributors":true,"contributorsText":"Contributors","notFound":["There\'s nothing here.","How did we get here?","That\'s a Four-Oh-Four.","Looks like we\'ve got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}')},2950:function(e,t,r){r.d(t,{A:function(){return n}});var a=r(641),s=r(6167),i=r(3456),l=r(6285),n=(0,a.pM)({__name:"LastUpdatedPlugin",setup(e){return(0,a.sV)((()=>{var e,t,r,s;const n=(0,i.BV)(),c=null!=(t=null==(e=n.value.git)?void 0:e.updatedTime)?t:null;if(!c)return;let o=null!=(r=n.value.lastUpdatedDateFormat)?r:"yyyy-LL-dd HH:mm:ss",p=null!=(s=n.value.lastUpdatedDateOptions)?s:{},h=l.c9.fromMillis(c,p).toFormat(o);(0,a.dY)((()=>{var e;const t=document.querySelector(".last-updated > span.meta-item-info");if(!t)return void console.warn("Unable to find .last-updated DOM element");t.innerHTML=h;let r=null!=(e=l.c9.fromMillis(c).toRelative())?e:"";t.setAttribute("title",r)}))})),(e,t)=>((0,a.uX)(),(0,a.Wv)(s.A))}})}},function(e){e.O(0,[6622,4475],(function(){return 8731,e(e.s=8731)})),e.O()}]); \ No newline at end of file diff --git a/assets/js/apply.html.1fa5dcc0.js b/assets/js/apply.html.1fa5dcc0.js new file mode 100644 index 00000000..6f424d38 --- /dev/null +++ b/assets/js/apply.html.1fa5dcc0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6262],{5126:function(n,s,a){a.r(s),a.d(s,{comp:function(){return p},data:function(){return c}});var e=a(641);const i=[(0,e.Fv)('

Applying Mixins

To apply one or more mixins, use the mix() function and call width() with the mixins you wish to apply to a superclass.

import { mix } from "@aedart/support/mixins";\nimport {\n    RectangleMixin,\n    DescMixin\n} from "@acme/mixins";\n\nclass Box extends mix().with(\n    RectangleMixin,\n    DescMixin\n) {\n    // ...remaining not shown...\n}\n

Extending Superclass

To extend a superclass and apply mixins onto it, pass the superclass as argument for the mix() function.

class Shape {\n    // ...not shown...\n}\n\nclass Box extends mix(Shape).with(\n    RectangleMixin,\n    DescMixin\n) {\n    // ...remaining not shown...\n}\n

Note

By default, if you do not provide mix() with a superclass, an empty class is automatically created. It is the equivalent of the following:

class Box extends mix(class {}).with(\n    MyMixinA,\n    MyMixinB,\n    MyMixinC,\n) {\n    // ...\n}\n
',7)],t={};var p=(0,a(6262).A)(t,[["render",function(n,s){return(0,e.uX)(),(0,e.CE)("div",null,i)}]]);const c=JSON.parse('{"path":"/archive/current/packages/support/mixins/apply.html","title":"Apply Mixins","lang":"en-GB","frontmatter":{"title":"Apply Mixins","description":"How to apply mixins.","sidebarDepth":0},"headers":[{"level":2,"title":"Extending Superclass","slug":"extending-superclass","link":"#extending-superclass","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/mixins/apply.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/archive.html.b243c4ec.js b/assets/js/archive.html.b243c4ec.js new file mode 100644 index 00000000..bd65947f --- /dev/null +++ b/assets/js/archive.html.b243c4ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3100],{4655:function(n,s,e){e.r(s),e.d(s,{comp:function(){return m},data:function(){return k}});var a=e(641);const t=(0,a.Lk)("h1",{id:"archive",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#archive"},[(0,a.Lk)("span",null,"Archive")])],-1),i=(0,a.Lk)("p",null,[(0,a.eW)("The "),(0,a.Lk)("code",null,"Archive"),(0,a.eW)(' component is a helper that keeps track of collections of pages in an "archive" ('),(0,a.Lk)("em",null,"exactly like this site"),(0,a.eW)('). It operates on the notion that there is always a "current" and "next" collection of pages. It can be used to structure documentation for various versions of your application, components, packages...etc.')],-1),o={class:"table-of-contents"},c=(0,a.Fv)('

Directory Structure

The following illustrates a possible archive structure of your documentation. Notice the "current" and "next" directories. These two directories are essential for the Archive component. Their names can be configured (shown later). Each of the directories contains a collection of pages.

/.vuepress\n    /my_archive\n        index.ts\n        v3x.ts\n        v4x.ts\n        v5x.ts\n        ...\n    client.ts\n    config.ts\n\n/my_archive\n    /current\n        README.md\n        ...\n    /next\n        README.md\n        ...\n    /v4x\n        README.md\n        ...\n    /v3x\n        README.md\n        ...\n    README.md\n

 









 


 









Collections

Each Archive component is dependent on having its structure defined by means of PagesCollection components. As such, to represent the "current" collection, you must create a new PagesCollection instance. Use the static make() method to create a new instance. It accepts 3 arguments:

  • name: string Name or title of the collection.
  • path: string The relative path in the archive to the collection.
  • pages: SidebarConfigArray = [] An array of pages or group of pages. Each page's path is relative to the collection's path.
// E.g. inside /.vuepress/my_archive/v5x.ts\nimport {PagesCollection} from "@aedart/vuepress-utils/navigation";\n\nexport default PagesCollection.make('v5.x', '/v5x', [\n    {\n        text: 'Version 5.x',\n        collapsible: true,\n        children: [\n            '',\n            'contribution-guide',\n            'security',\n            'code-of-conduct',\n        ]\n    },\n    {\n        text: 'Packages',\n        collapsible: true,\n        children: [\n            'packages/',\n\n            // ...remaining not shown here...\n        ]\n    },\n\n    // ...etc\n]);\n

PagesCollection `path`

The path argument of a pages collection will automatically be changed, by the Archive component, if the collection is marked as the "current" or "next" collection (covered in next section).

Archive Instance

Once you have your "current" and "next" collections defined, you can create a new Archive instance. Use the static make() method to create a new instance. It accepts 3 arguments:

  • current: PagesCollection The collection to be marked as the "current".
  • next: PagesCollection The collection to be marked as the "next".
  • collections: PagesCollection[] = [] Array of all available collections, including "next" and "current".
// E.g. inside /.vuepress/my_archive/index.ts\nimport {PagesCollection} from "@aedart/vuepress-utils/contracts";\nimport {Archive} from "@aedart/vuepress-utils/navigation";\nimport v3x from "./v3x.ts";\nimport v4x from "./v4x.ts";\nimport v5x from "./v5x.ts";\nimport v6x from "./v6x.ts";\n\n// Defined the "current" colelction \nconst CURRENT: PagesCollection = v5x;\n\n// Defined the "next" colelction\nconst NEXT: PagesCollection = v6x;\n\n// Define all collections... next and current should also be part of this...\nconst ALL: PagesCollection[] = [\n    NEXT,\n    CURRENT,\n    v4x,\n    v3x,\n    // ... etc\n];\n\n// Finally, create and export your archive with "current" and "next" \nconst archive = Archive.make(CURRENT, NEXT, ALL);\narchive.path = '/my_archive';\n\nexport default archive;\n

Name & Path

As shown in the previous example, the archive's path was set to /my_archive by explicitly setting the path property. You can do the same for its name:

// ...previous not shown ... \nconst archive = Archive.make(CURRENT, NEXT, ALL);\narchive.name = 'Good old stuff';\narchive.path = '/old_stuff';\n

WARNING

Your archive's directory structure must match the specified path or vuepress will not be able to find it and display a "404 Not Found".

/old_stuff\n    /current\n        README.md\n        ...\n    /next\n        README.md\n        ...\n    ...\n
 







Current & Next

Whenever a collection is marked as "current" or "next", its path is automatically changed to /current or /next. This means that the full path of those collections will be the archive's path + current or next, e.g.

  • /archive/current
  • /archive/next

To change these paths, specify the currentPath and nextPath properties in your Archive instance.

archive.currentPath = '/live'\narchive.nextPath = '/upcoming'\n

WARNING

When you change the "current" and "next" paths in your archive, then the directory structure MUST reflect these names. From the above example, the archive's directory structure should now be the following:

/my_archive\n    /live\n        README.md\n        ...\n    /upcoming\n        README.md\n        ...\n    ...\n

 


 



Labels

You may also change the labels for "current" and "next", in a similar way as for changing their paths.

archive.currentLabel = 'Live'\narchive.nextLabel = 'What\\'s Next?'\n

Vuepress Config File

',26),l={href:"https://v2.vuepress.vuejs.org/guide/configuration.html#config-file",target:"_blank",rel:"noopener noreferrer"},p=(0,a.Lk)("code",null,"theme",-1),r=(0,a.Lk)("code",null,"asNavigationItem()",-1),u=(0,a.Lk)("code",null,"sidebarConfiguration()",-1),d=(0,a.Fv)('
import {defineUserConfig} from 'vuepress';\nimport defaultTheme from "@vuepress/theme-default"\nimport archive from './my_archive'\n\nexport default defineUserConfig({\n    \n    // ...other settings not shown...\n\n    theme: defaultTheme({\n        \n        // ... other theme settings not shown ...\n        \n        navbar: [\n            archive.asNavigationItem(),\n        ],\n\n        sidebar: archive.sidebarConfiguration()\n    }),\n});\n

Onward

Use can review the source code and configuration of this site, as a complete example of how the Archive component can be used.

',3),v={};var m=(0,e(6262).A)(v,[["render",function(n,s){const e=(0,a.g2)("router-link"),v=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[t,i,(0,a.Lk)("nav",o,[(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#directory-structure"},{default:(0,a.k6)((()=>[(0,a.eW)("Directory Structure")])),_:1})]),(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#collections"},{default:(0,a.k6)((()=>[(0,a.eW)("Collections")])),_:1})]),(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#archive-instance"},{default:(0,a.k6)((()=>[(0,a.eW)("Archive Instance")])),_:1}),(0,a.Lk)("ul",null,[(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#name-path"},{default:(0,a.k6)((()=>[(0,a.eW)("Name & Path")])),_:1})]),(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#current-next"},{default:(0,a.k6)((()=>[(0,a.eW)("Current & Next")])),_:1})])])]),(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#vuepress-config-file"},{default:(0,a.k6)((()=>[(0,a.eW)("Vuepress Config File")])),_:1})]),(0,a.Lk)("li",null,[(0,a.bF)(e,{to:"#onward"},{default:(0,a.k6)((()=>[(0,a.eW)("Onward")])),_:1})])])]),c,(0,a.Lk)("p",null,[(0,a.eW)("To put it all together, in your "),(0,a.Lk)("a",l,[(0,a.eW)("Config File"),(0,a.bF)(v)]),(0,a.eW)(", import your archive instance. Inside your "),p,(0,a.eW)(" settings, you can create a dropdown representation of your archive, by invoking the "),r,(0,a.eW)(" method. A sidebar configuration can be created via the "),u,(0,a.eW)(" method.")]),d])}]]);const k=JSON.parse('{"path":"/archive/current/packages/vuepress-utils/navigation/archive.html","title":"Archive","lang":"en-GB","frontmatter":{"title":"Archive","description":"Archive Structure and Navigation","sidebarDepth":0},"headers":[{"level":2,"title":"Directory Structure","slug":"directory-structure","link":"#directory-structure","children":[]},{"level":2,"title":"Collections","slug":"collections","link":"#collections","children":[]},{"level":2,"title":"Archive Instance","slug":"archive-instance","link":"#archive-instance","children":[{"level":3,"title":"Name & Path","slug":"name-path","link":"#name-path","children":[]},{"level":3,"title":"Current & Next","slug":"current-next","link":"#current-next","children":[]}]},{"level":2,"title":"Vuepress Config File","slug":"vuepress-config-file","link":"#vuepress-config-file","children":[]},{"level":2,"title":"Onward","slug":"onward","link":"#onward","children":[]}],"git":{"updatedTime":1706259575000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1},{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/vuepress-utils/navigation/archive.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/assertHasPrototypeProperty.html.c96dd651.js b/assets/js/assertHasPrototypeProperty.html.c96dd651.js new file mode 100644 index 00000000..72a280eb --- /dev/null +++ b/assets/js/assertHasPrototypeProperty.html.c96dd651.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8925],{3644:function(e,t,a){a.r(t),a.d(t,{comp:function(){return u},data:function(){return d}});var s=a(641);const n={id:"asserthasprototypeproperty",tabindex:"-1"},r={class:"header-anchor",href:"#asserthasprototypeproperty"},o=(0,s.Lk)("code",null,"assertHasPrototypeProperty",-1),p=(0,s.Lk)("p",null,[(0,s.eW)("Assert that given target object has a "),(0,s.Lk)("code",null,"prototype"),(0,s.eW)(" property defined. Throws a "),(0,s.Lk)("code",null,"TypeError"),(0,s.eW)(" if target object does not have a "),(0,s.Lk)("code",null,"prototype"),(0,s.eW)(" property")],-1),l=(0,s.Lk)("code",null,"hasPrototypeProperty",-1),c=(0,s.Fv)('
import { assertHasPrototypeProperty } from '@aedart/support/reflections';\n\nassertHasPrototypeProperty({ __proto__: null }); // TypeError\n
',1),i={};var u=(0,a(6262).A)(i,[["render",function(e,t){const a=(0,s.g2)("Badge"),i=(0,s.g2)("RouteLink");return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("h1",n,[(0,s.Lk)("a",r,[(0,s.Lk)("span",null,[o,(0,s.eW)(),(0,s.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),p,(0,s.Lk)("p",null,[(0,s.Lk)("em",null,[(0,s.eW)("See "),(0,s.bF)(i,{to:"/archive/current/packages/support/reflections/hasPrototypeProperty.html"},{default:(0,s.k6)((()=>[l])),_:1}),(0,s.eW)(" for details.")])]),c])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/reflections/assertHasPrototypeProperty.html","title":"Assert Has Prototype Prop.","lang":"en-GB","frontmatter":{"title":"Assert Has Prototype Prop.","description":"Assert that object has a \\"prototype\\" property.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/assertHasPrototypeProperty.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/bindings.html.c03df7ed.js b/assets/js/bindings.html.c03df7ed.js new file mode 100644 index 00000000..5310eac0 --- /dev/null +++ b/assets/js/bindings.html.c03df7ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6030],{679:function(n,s,a){a.r(s),a.d(s,{comp:function(){return x},data:function(){return L}});var e=a(641);const t=(0,e.Lk)("h1",{id:"bindings",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#bindings"},[(0,e.Lk)("span",null,"Bindings")])],-1),o={class:"table-of-contents"},c=(0,e.Fv)('

Basics

The bind() method is used to register bindings in the Service Container. It accepts three arguments:

  • identifier: Identifier - (see Identifiers).
  • concrete: FactoryCallback | Constructor - The value to be resolved from the container.
  • shared: boolean = false - (optional - see Singletons).
import { CookieStorage } from "@acme/storage";\n\ncontainer.bind('storage', CookieStorage);\n
',4),i=(0,e.Lk)("code",null,"concrete",-1),p=(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.Lk)("a",{href:"#constructors"},"Constructors")],-1),l=(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.Lk)("a",{href:"#factory-callbacks"},"Factory Callbacks")],-1),r=(0,e.Fv)('

You can also use bindIf() to register a binding. The method will ONLY register the binding, if one has not already been registered for the given identifier.

container.bindIf('storage', CookieStorage);\n

Singletons

If you wish to register a "shared" binding, use the singleton() method. It ensures that the binding is only resolved once. This means that the same object instance or value is returned, each time that it is requested resolved. Invoking the singleton() is the equivalent to invoking bind() with the shared argument set to true.

import { ApiClient } from "@acme/api";\n\ncontainer.singleton('api_client', ApiClient);\n

The singletonIf() method is similar to bindIf(). It will only register a "shared" binding, if one has not already been registered.

container.singletonIf('api_client', ApiClient);\n

Instances

You can also register existing object instances in the Service Container. This is done via the instance() method. Whenever the binding is requested resolved, the same instance is returned each time.

import { ApiClient } from "@acme/api";\n\nconst client = new ApiClient();\n\ncontainer.instance('api_client', client);\n

Identifiers

To ensure that the Service Container is able to resolve the correct object instances or values, the binding identifiers must be unique. The following types are supported as binding identifiers:

  • string
  • symbol
  • number
  • object (not null)
  • Class Constructor
  • Callback
',13),u={class:"custom-container tip"},d=(0,e.Lk)("p",{class:"custom-container-title"},"TIP",-1),k=(0,e.Lk)("em",null,"should",-1),v={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol",target:"_blank",rel:"noopener noreferrer"},m={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes",target:"_blank",rel:"noopener noreferrer"},b=(0,e.Fv)('
// Somewhere in your application\nexport const STORAGE = Symbol('app_storage');\n
import { CookieStorage } from "@acme/storage";\nimport { STORAGE } from "@acme/services";\n\ncontainer.bind(STORAGE, CookieStorage);\n
',2),g=(0,e.Fv)('

concrete Types

The concrete argument for the bind(), bindIf(), singleton() and singletonIf() methods accepts the following types:

  • Class constructor
  • "Factory" callback

Constructors

',4),h=(0,e.Lk)("code",null,"concrete",-1),f=(0,e.Fv)('
class TextRecorder {}\n\ncontainer.bind('recorder', TextRecorder);\n\n// Later in your application\nconst recorder = container.make('recorder');\n\nconsole.log(recorder instanceof TextRecorder); // true\n

Factory Callbacks

If you need more advanced resolve logic, then you can specify a callback as the concrete argument value. When requested resolved, the callback is invoked and the Service Container instance is passed as argument to the callback. This allows you to perform other kinds of resolve logic.

class TextRecorder {\n    constructor(config) {\n        this.config = config;\n    }\n}\n\ncontainer.bind('recorder', (container) => {\n    const config = container.make('my_recorder_config');\n    \n    return new TextRecorder(config);\n});\n

Although the above example shows an object instance being returned by the factory callback, any kind of value can be returned by the callback.

container.bind('my_message', () => 'Hi there...');\n\n// Later in your application\nconst msg = container.make('my_message'); // Hi there...\n

Arguments

',7),y=(0,e.Lk)("code",null,"make()",-1),j=(0,e.Fv)('
class User {\n    constructor(name) {\n        this.name = name;\n    }\n}\n\ncontainer.bind('user', (container, ...args) => {\n    return new User(...args);\n});\n\n// Later in your application\nconst user = container.make('user', 'Maya');\n\nconsole.log(user.name); // Maya\n

Extend Bindings

The extend() method can be used to decorate or configure object instances that have been resolved. The method accepts the following arguments:

  • identifier: Identifier - the target binding identifier.
  • callback: ExtendCallback - callback that is responsible for modifying the resolved instance.
container.extend('user', (resolved, container) => {\n    return DecoratedUser(resolved);\n});\n
',5),w={};var x=(0,a(6262).A)(w,[["render",function(n,s){const a=(0,e.g2)("router-link"),w=(0,e.g2)("RouteLink"),x=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#basics"},{default:(0,e.k6)((()=>[(0,e.eW)("Basics")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#singletons"},{default:(0,e.k6)((()=>[(0,e.eW)("Singletons")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#instances"},{default:(0,e.k6)((()=>[(0,e.eW)("Instances")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#identifiers"},{default:(0,e.k6)((()=>[(0,e.eW)("Identifiers")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#concrete-types"},{default:(0,e.k6)((()=>[(0,e.eW)("concrete Types")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#constructors"},{default:(0,e.k6)((()=>[(0,e.eW)("Constructors")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#factory-callbacks"},{default:(0,e.k6)((()=>[(0,e.eW)("Factory Callbacks")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#extend-bindings"},{default:(0,e.k6)((()=>[(0,e.eW)("Extend Bindings")])),_:1})])])]),c,(0,e.Lk)("p",null,[(0,e.eW)("When the binding is "),(0,e.bF)(w,{to:"/archive/current/packages/container/resolving.html"},{default:(0,e.k6)((()=>[(0,e.eW)("resolved")])),_:1}),(0,e.eW)(" from the Service Container, the "),i,(0,e.eW)(" value is returned. Either as a new class instance ("),p,(0,e.eW)("), or the value returned from a callback ("),l,(0,e.eW)(").")]),r,(0,e.Lk)("div",u,[d,(0,e.Lk)("p",null,[(0,e.eW)("To ensure that identifiers are truly unique, you "),k,(0,e.eW)(" use "),(0,e.Lk)("a",v,[(0,e.eW)("symbols"),(0,e.bF)(x)]),(0,e.eW)(" or "),(0,e.Lk)("a",m,[(0,e.eW)("class constructors"),(0,e.bF)(x)]),(0,e.eW)(" as binding identifiers.")]),b]),g,(0,e.Lk)("p",null,[(0,e.eW)("When registering a binding using a class constructor as the "),h,(0,e.eW)(" argument value, a new instance of that class is instantiated and returned, when requested "),(0,e.bF)(w,{to:"/archive/current/packages/container/resolving.html"},{default:(0,e.k6)((()=>[(0,e.eW)("resolved")])),_:1}),(0,e.eW)(".")]),f,(0,e.Lk)("p",null,[(0,e.eW)("The factory callback is also provided with any arguments that are passed on to the "),(0,e.bF)(w,{to:"/archive/current/packages/container/resolving.html#the-make-method"},{default:(0,e.k6)((()=>[y,(0,e.eW)(" method")])),_:1}),(0,e.eW)(".")]),j])}]]);const L=JSON.parse('{"path":"/archive/current/packages/container/bindings.html","title":"Bindings","lang":"en-GB","frontmatter":{"description":"Service Container Bindings","sidebarDepth":0},"headers":[{"level":2,"title":"Basics","slug":"basics","link":"#basics","children":[{"level":3,"title":"Singletons","slug":"singletons","link":"#singletons","children":[]},{"level":3,"title":"Instances","slug":"instances","link":"#instances","children":[]}]},{"level":2,"title":"Identifiers","slug":"identifiers","link":"#identifiers","children":[]},{"level":2,"title":"concrete Types","slug":"concrete-types","link":"#concrete-types","children":[{"level":3,"title":"Constructors","slug":"constructors","link":"#constructors","children":[]},{"level":3,"title":"Factory Callbacks","slug":"factory-callbacks","link":"#factory-callbacks","children":[]}]},{"level":2,"title":"Extend Bindings","slug":"extend-bindings","link":"#extend-bindings","children":[]}],"git":{"updatedTime":1712579653000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":4}]},"filePathRelative":"archive/current/packages/container/bindings.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/booting.html.eb728ae1.js b/assets/js/booting.html.eb728ae1.js new file mode 100644 index 00000000..24567b29 --- /dev/null +++ b/assets/js/booting.html.eb728ae1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[86],{5008:function(n,s,a){a.r(s),a.d(s,{comp:function(){return d},data:function(){return k}});var e=a(641);const t=(0,e.Lk)("h1",{id:"booting",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#booting"},[(0,e.Lk)("span",null,"Booting")])],-1),o=(0,e.Lk)("em",null,"ONLY",-1),c={href:"https://en.wikipedia.org/wiki/Lazy_initialization",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Fv)('
class ContactsApi extends AbstractConcern {\n    get users() { /* ...not shown here... */}\n}\n\n@use(ContactsApi) // Concern is NOT instantiated\nclass UsersRegistry {}\n\nconst users = (new UsersRegistry()).users; // Concern is instantiated\n

Manual Booting

You can use the bootConcerns() utility to manually boot concerns. It accepts the following arguments:

  • instance: object|Owner - The target class instance that uses the concerns.
  • ...concerns: ConcernConstructor[] - List of concern classes to instantiate (aka. boot).
import { use, bootConcerns } from "@aedart/support/concerns";\n\n@use(\n    ConcernA,\n    ConcernB,\n    ConcernC,\n)\nclass Target {\n    constructor() {\n        bootConcerns(this, ConcernA, ConcernB);\n    }\n}\n\nconst instance = new Target(); // ConcernA and ConcernB are instantiated\n
',5),i={class:"custom-container warning"},l=(0,e.Fv)('

WARNING

If you attempt to boot a concern that has already been booted, a BootError will be thrown!

To determine if a concern has already been booted, use the concern container's hasBooted() method.

import {\n    getContainer,\n    bootConcerns\n} from "@aedart/support/concerns";\n\nclass Record extends ApiService {\n    constructor() {\n        super();\n        \n        if (!getContainer(this).hasBooted(ApiConnection)) {\n            bootConcerns(this, ApiConnection);\n        }\n    }\n}\n
',4),u=(0,e.Fv)('

Boot All Concerns

If you wish to boot all concerns, use the bootAllConcerns() utility.

import { use, bootAllConcerns } from "@aedart/support/concerns";\n\n@use(\n    ConcernA,\n    ConcernB,\n    ConcernC,\n)\nclass Target {\n    constructor() {\n        bootAllConcerns(this);\n    }\n}\n\nconst instance = new Target(); // All concerns are initialised\n
',3),r={};var d=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),r=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("By default, a concern class is "),o,(0,e.eW)(' instantiated when you interact with its properties or methods, which have been "aliased" into a target class ('),(0,e.Lk)("em",null,[(0,e.eW)("aka. "),(0,e.Lk)("a",c,[(0,e.eW)("lazy booting"),(0,e.bF)(a)])]),(0,e.eW)(").")]),p,(0,e.Lk)("div",i,[l,(0,e.Lk)("p",null,[(0,e.eW)("See "),(0,e.bF)(r,{to:"/archive/current/packages/support/concerns/usage.html#manual-interaction"},{default:(0,e.k6)((()=>[(0,e.eW)("Manual interaction")])),_:1}),(0,e.eW)(" for details.")])]),u])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/concerns/booting.html","title":"Booting","lang":"en-GB","frontmatter":{"title":"Booting","description":"How concerns are booted","sidebarDepth":0},"headers":[{"level":2,"title":"Manual Booting","slug":"manual-booting","link":"#manual-booting","children":[{"level":3,"title":"Boot All Concerns","slug":"boot-all-concerns","link":"#boot-all-concerns","children":[]}]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/booting.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/classLooksLike.html.efaf58a0.js b/assets/js/classLooksLike.html.efaf58a0.js new file mode 100644 index 00000000..19c70490 --- /dev/null +++ b/assets/js/classLooksLike.html.efaf58a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[2023],{1274:function(s,n,a){a.r(n),a.d(n,{comp:function(){return r},data:function(){return k}});var e=a(641);const t={id:"classlookslike",tabindex:"-1"},p={class:"header-anchor",href:"#classlookslike"},o=(0,e.Lk)("code",null,"classLooksLike",-1),c=(0,e.Lk)("p",null,[(0,e.eW)("Determines if a target class "),(0,e.Lk)("em",null,'"looks like"'),(0,e.eW)(' the provided class "blueprint".')],-1),l={class:"table-of-contents"},i=(0,e.Fv)('

Arguments

classLooksLike() accepts the following arguments:

  • target: object - the target class object.
  • blueprint: ClassBlueprint - a blueprint that defines the expected members of a class (see Class Blueprint for details.).
import { classLooksLike } from '@aedart/support/reflections';\n\nclass A {}\n\nclass B {\n    foo() {}\n}\n\nconst blueprint = { members: [ 'foo' ] };\n\nclassLooksLike(A, blueprint); // false\nclassLooksLike(B, blueprint); // true\n

Class Blueprint

The class "blueprint" is an object that defines the expected members (property keys) of a target class. All defined members must exist in target class' prototype, before the classLooksLike() returns true.

You can specify either or both of the following properties in a class blueprint object:

  • members: PropertyKey[] - (optional) Properties or methods expected to exist in class' prototype.
  • staticMembers: PropertyKey[] - (optional) Properties or methods expected to exist in class as static members.

Note: If you do not specify either members or staticMembers, then a TypeError is thrown.

class A {\n    foo() {}\n\n    bar() {}\n}\n\nclass B {\n    foo() {}\n    \n    static bar() {}\n}\n\nconst blueprint = { members: [ 'foo' ], staticMembers: [ 'bar' ] };\n\nclassLooksLike(A, blueprint); // false\nclassLooksLike(B, blueprint); // true\n

Recursive

classLooksLike() traverses target class' prototype chain. This means that you can compare a subclass against a blueprint and inherited members will automatically be included in the check.

class A {\n    foo() {}\n}\n\nclass B extends A {\n    bar() {}\n}\n\nconst blueprint = { members: [ 'foo', 'bar' ]};\n\nclassLooksLike(A, blueprint); // false\nclassLooksLike(B, blueprint); // true\n
',13),u={};var r=(0,a(6262).A)(u,[["render",function(s,n){const a=(0,e.g2)("Badge"),u=(0,e.g2)("router-link");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c,(0,e.Lk)("nav",l,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"#arguments"},{default:(0,e.k6)((()=>[(0,e.eW)("Arguments")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"#class-blueprint"},{default:(0,e.k6)((()=>[(0,e.eW)("Class Blueprint")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"#recursive"},{default:(0,e.k6)((()=>[(0,e.eW)("Recursive")])),_:1})])])]),i])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/reflections/classLooksLike.html","title":"Class Looks Like","lang":"en-GB","frontmatter":{"title":"Class Looks Like","description":"Determine if a class looks like blueprint.","sidebarDepth":0},"headers":[{"level":2,"title":"Arguments","slug":"arguments","link":"#arguments","children":[]},{"level":2,"title":"Class Blueprint","slug":"class-blueprint","link":"#class-blueprint","children":[]},{"level":2,"title":"Recursive","slug":"recursive","link":"#recursive","children":[]}],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/classLooksLike.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/classOwnKeys.html.ad046074.js b/assets/js/classOwnKeys.html.ad046074.js new file mode 100644 index 00000000..4102dc4d --- /dev/null +++ b/assets/js/classOwnKeys.html.ad046074.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[984],{5491:function(s,n,a){a.r(n),a.d(n,{comp:function(){return l},data:function(){return r}});var e=a(641);const t={id:"classownkeys",tabindex:"-1"},o={class:"header-anchor",href:"#classownkeys"},c=(0,e.Lk)("code",null,"classOwnKeys",-1),p=(0,e.Fv)('

Returns property keys that are defined target class's prototype. It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class
  • recursive: boolean = false - (optional) If true, then target's prototype chain is traversed and all property keys are returned.
import { classOwnKeys } from '@aedart/support/reflections';\n\nclass A {\n    foo() {}\n}\n\nclass B extends A {\n    get bar() {}\n}\n\nclassOwnKeys(B); // [ 'constructor', 'bar' ]\nclassOwnKeys(B, true); // [ 'constructor', 'foo', 'bar' ]\n

Caution

classOwnKeys() throws TypeError if target does not have a prototype property.

Limitation

The classOwnKeys() function does not return static members of a target class.

',6),i={};var l=(0,a(6262).A)(i,[["render",function(s,n){const a=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",o,[(0,e.Lk)("span",null,[c,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),p])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/classOwnKeys.html","title":"Class Own Keys","lang":"en-GB","frontmatter":{"title":"Class Own Keys","description":"Get property keys of target class.","sidebarDepth":0},"headers":[{"level":2,"title":"Limitation","slug":"limitation","link":"#limitation","children":[]}],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/classOwnKeys.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/code-of-conduct.html.bac34c39.js b/assets/js/code-of-conduct.html.bac34c39.js new file mode 100644 index 00000000..6c980999 --- /dev/null +++ b/assets/js/code-of-conduct.html.bac34c39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[2846],{3208:function(e,n,o){o.r(n),o.d(n,{comp:function(){return i},data:function(){return r}});var t=o(641);const a=[(0,t.Fv)('

Code of Conduct

Be nice... be fair! Writing free Open Source software often means spending time developing after-hours, and in weekends. Chances are pretty good that you yourself are involved in one or many Open Source projects and already know how time-consuming it can be. In any case, the following constitutes the code of conduct used by Ion:

  • Be patient, nice and fair.
  • Be helpful and constructive.
  • Your words and actions must be free of harassment, harmful deeds or remarks, and malicious intent.
  • Respect the opinions of others, even if they contradict yours.

Consequences

Participants can be subject to consequences, if the code of conduct is not upheld. Such consequences include, but not limited to, warnings, and banning from further participation.

',5)],c={};var i=(0,o(6262).A)(c,[["render",function(e,n){return(0,t.uX)(),(0,t.CE)("div",null,a)}]]);const r=JSON.parse('{"path":"/archive/current/code-of-conduct.html","title":"Code of Conduct","lang":"en-GB","frontmatter":{"description":"Code of Conduct - Ion","sidebarDepth":0},"headers":[{"level":2,"title":"Consequences","slug":"consequences","link":"#consequences","children":[]}],"git":{"updatedTime":1679232326000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/code-of-conduct.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/concernClass.html.28be5543.js b/assets/js/concernClass.html.28be5543.js new file mode 100644 index 00000000..2a0c5d5f --- /dev/null +++ b/assets/js/concernClass.html.28be5543.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9628],{6482:function(n,s,a){a.r(s),a.d(s,{comp:function(){return R},data:function(){return P}});var e=a(641);const t=(0,e.Lk)("h1",{id:"concern-class",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#concern-class"},[(0,e.Lk)("span",null,"Concern Class")])],-1),o=(0,e.Lk)("p",null,"This chapter shows how to create a new concern class.",-1),c={class:"table-of-contents"},i=(0,e.Fv)('

Inherit from AbstractConcern

To create a new concern class, you can inherit from the AbstractConcern class.

import { AbstractConcern } from "@aedart/support/concerns";\n\nclass MyConcern extends AbstractConcern {\n    \n    get message() { /* ...not shown */ }\n    set message(message) { /* ...not shown */ }\n    \n    foo() { /* ...not shown */ }\n    \n    [MY_SYMBOL]() { /* ...not shown */ }\n}\n
',3),p=(0,e.Lk)("em",null,"all property keys",-1),l=(0,e.Lk)("a",{href:"#customise-alias-members"},'Customise "alias" members',-1),r=(0,e.Fv)('

Private Members

Note

Private methods and properties are NEVER "aliased" into a target class.

Static Members

Note

Static methods and properties are NOT "aliased" into target class.

At the moment, such a feature is not supported by the concerns' mechanism.This may become available in the future, but presently you SHOULD NOT rely on static members becoming available for aliasing.

Transpilers

',5),u={class:"custom-container warning"},d=(0,e.Lk)("p",{class:"custom-container-title"},"Caution",-1),k={href:"https://babeljs.io/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.typescriptlang.org/",target:"_blank",rel:"noopener noreferrer"},v=(0,e.Lk)("code",null,"constructor",-1),b=(0,e.Fv)('
class A {\n    foo = 'bar';\n}\n

becomes like the following, after it has been transpiled:

class A {\n    constructor() {\n        this.foo = 'bar';\n    }\n}\n
',3),h={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get",target:"_blank",rel:"noopener noreferrer"},g={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set",target:"_blank",rel:"noopener noreferrer"},f=(0,e.Fv)('
class A {\n    #foo = 'bar';\n    \n    get foo() {\n        return this.#foo\n    }\n\n    set foo(v) {\n        this.#foo = v;\n    }\n}\n
',1),w=(0,e.Lk)("h2",{id:"customise-alias-members",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#customise-alias-members"},[(0,e.Lk)("span",null,'Customise "alias" members')])],-1),y=(0,e.Lk)("em",null,"should",-1),L=(0,e.Lk)("code",null,"PROVIDES",-1),W=(0,e.Fv)('
import { AbstractConcern, PROVIDES } from "@aedart/support/concerns";\n\nclass MyConcern extends AbstractConcern {\n    \n    get message() { /* ...not shown */ }\n    set message(message) { /* ...not shown */ }\n    foo() { /* ...not shown */ }\n    [MY_SYMBOL]() { /* ...not shown */ }\n    \n    static [PROVIDES]() {\n        // Make "message" and "foo" available for aliasing...\n        return [\n            'message',\n            'foo'\n        ];\n    }\n}\n
',1),C={class:"custom-container warning"},F=(0,e.Lk)("p",{class:"custom-container-title"},"WARNING",-1),j=(0,e.Lk)("code",null,"PROVIDES",-1),_=(0,e.Lk)("em",null,"should",-1),S={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties",target:"_blank",rel:"noopener noreferrer"},x=(0,e.Lk)("h2",{id:"concern-owner-instance",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#concern-owner-instance"},[(0,e.Lk)("span",null,"Concern Owner instance")])],-1),A=(0,e.Lk)("code",null,"concernOwner",-1),O=(0,e.Lk)("code",null,"concernOwner",-1),M={href:"https://en.wikipedia.org/wiki/Fluent_interface",target:"_blank",rel:"noopener noreferrer"},T=(0,e.Fv)('
class ConcernsPeople extends AbstractConcern {\n    with(value) {\n        // ...not shown here...\n\n        return this.concernOwner;\n    }\n}\n\n@use(ConcernsPeople)\nclass Invitation {\n    invite() { /* ...not shown here... */ }\n}\n\nconst party = new Invitation();\nparty\n    .with('Anna')\n    .with('Anders')\n    .with('Ulla')\n    .with('Jimmy')\n    .invite();\n

Constructor

Should you require initialisation logic, then you can overwrite the constructor in your concern class. A concern's constructor is only given the target class instance as argument.

',3),q=(0,e.Fv)('
class Recording extends AbstractConcern {\n    constructor(owner) {\n        super(owner);\n        \n        // ...perform your initialisation here...\n    }\n}\n
',1),I={};var R=(0,a(6262).A)(I,[["render",function(n,s){const a=(0,e.g2)("router-link"),I=(0,e.g2)("RouteLink"),R=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,o,(0,e.Lk)("nav",c,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#inherit-from-abstractconcern"},{default:(0,e.k6)((()=>[(0,e.eW)("Inherit from AbstractConcern")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#private-members"},{default:(0,e.k6)((()=>[(0,e.eW)("Private Members")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#static-members"},{default:(0,e.k6)((()=>[(0,e.eW)("Static Members")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#transpilers"},{default:(0,e.k6)((()=>[(0,e.eW)("Transpilers")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#customise-alias-members"},{default:(0,e.k6)((()=>[(0,e.eW)('Customise "alias" members')])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#concern-owner-instance"},{default:(0,e.k6)((()=>[(0,e.eW)("Concern Owner instance")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#constructor"},{default:(0,e.k6)((()=>[(0,e.eW)("Constructor")])),_:1})])])]),i,(0,e.Lk)("p",null,[(0,e.eW)("By default, all the public properties and methods ("),p,(0,e.eW)(") are made available for "),(0,e.bF)(I,{to:"/archive/current/packages/support/concerns/aliases.html"},{default:(0,e.k6)((()=>[(0,e.eW)('"aliasing"')])),_:1}),(0,e.eW)(" into a target class. To configure which members should be made available for aliasing, see "),l,(0,e.eW)(".")]),r,(0,e.Lk)("div",u,[d,(0,e.Lk)("p",null,[(0,e.eW)("Some transpilers, like "),(0,e.Lk)("a",k,[(0,e.eW)("Babel"),(0,e.bF)(R)]),(0,e.eW)(" and "),(0,e.Lk)("a",m,[(0,e.eW)("TypeScript"),(0,e.bF)(R)]),(0,e.eW)(", automatically move property declarations into the class' "),v,(0,e.eW)(". For instance:")]),b,(0,e.Lk)("p",null,[(0,e.eW)('When this happens, properties cannot be "aliased". The concern mechanisms relies on the class\' prototype for reading what properties are available. To overcome such an issue, you can use '),(0,e.Lk)("a",h,[(0,e.eW)("getters"),(0,e.bF)(R)]),(0,e.eW)(" and "),(0,e.Lk)("a",g,[(0,e.eW)("setters"),(0,e.bF)(R)]),(0,e.eW)(" instead.")]),f]),w,(0,e.Lk)("p",null,[(0,e.eW)("If you wish to customise what properties and methods "),y,(0,e.eW)(" be available for "),(0,e.bF)(I,{to:"/archive/current/packages/support/concerns/aliases.html"},{default:(0,e.k6)((()=>[(0,e.eW)("aliasing")])),_:1}),(0,e.eW)(" when used by a target class, overwrite the static "),L,(0,e.eW)(" method.")]),W,(0,e.Lk)("div",C,[F,(0,e.Lk)("p",null,[(0,e.eW)("Even if you do customise what properties and methods are available for aliasing, the returned property keys of the "),j,(0,e.eW)(" method can be overruled, via "),(0,e.bF)(I,{to:"/archive/current/packages/support/concerns/conflictResolution.html"},{default:(0,e.k6)((()=>[(0,e.eW)("conflict resolution")])),_:1}),(0,e.eW)("!")]),(0,e.Lk)("p",null,[(0,e.eW)("If you truly wish to prevent certain properties or methods from being aliased into a target class, then you "),_,(0,e.eW)(" declare them as "),(0,e.Lk)("a",S,[(0,e.eW)("private"),(0,e.bF)(R)]),(0,e.eW)(".")])]),x,(0,e.Lk)("p",null,[(0,e.eW)("The "),A,(0,e.eW)(" property gives you direct access to the target class instance, in your concern. This allows you to create interaction between the target instance and your concern, which can be usefully in any number of situations. For instance, you can use the "),O,(0,e.eW)(" to create a "),(0,e.Lk)("a",M,[(0,e.eW)("fluent design"),(0,e.bF)(R)]),(0,e.eW)(" of your utilities.")]),T,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See "),(0,e.bF)(I,{to:"/archive/current/packages/support/concerns/booting.html"},{default:(0,e.k6)((()=>[(0,e.eW)("booting")])),_:1}),(0,e.eW)(" for additional information.")])]),q])}]]);const P=JSON.parse('{"path":"/archive/current/packages/support/concerns/concernClass.html","title":"Concern Class","lang":"en-GB","frontmatter":{"title":"Concern Class","description":"How to define a new concern class.","sidebarDepth":0},"headers":[{"level":2,"title":"Inherit from AbstractConcern","slug":"inherit-from-abstractconcern","link":"#inherit-from-abstractconcern","children":[{"level":3,"title":"Private Members","slug":"private-members","link":"#private-members","children":[]},{"level":3,"title":"Static Members","slug":"static-members","link":"#static-members","children":[]},{"level":3,"title":"Transpilers","slug":"transpilers","link":"#transpilers","children":[]}]},{"level":2,"title":"Customise \\"alias\\" members","slug":"customise-alias-members","link":"#customise-alias-members","children":[]},{"level":2,"title":"Concern Owner instance","slug":"concern-owner-instance","link":"#concern-owner-instance","children":[]},{"level":2,"title":"Constructor","slug":"constructor","link":"#constructor","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/concernClass.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/configureCustomError.html.ef9b6e9e.js b/assets/js/configureCustomError.html.ef9b6e9e.js new file mode 100644 index 00000000..e6525f7a --- /dev/null +++ b/assets/js/configureCustomError.html.ef9b6e9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5807],{3866:function(n,s,e){e.r(s),e.d(s,{comp:function(){return i},data:function(){return u}});var a=e(641);const t=(0,a.Fv)('

configureCustomError

Configures a custom error by automatically setting the error's name property to the class' constructor name.

Arguments

configureCustomError() accepts the following arguments:

  • error: Error - the custom error instance
  • captureStackTrace: boolean = false (optional) Captures and sets error's stack trace¹.
',5),o=(0,a.Lk)("code",null,"configureStackTrace()",-1),r=(0,a.Fv)('
import { configureCustomError } from "@aedart/support/exceptions";\n\nclass MyError extends Error {\n    constructor(message, options) {\n        super(message, options);\n\n        configureCustomError(this);\n    }\n}\n
',1),c={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#custom_error_types",target:"_blank",rel:"noopener noreferrer"},p={};var i=(0,e(6262).A)(p,[["render",function(n,s){const e=(0,a.g2)("RouteLink"),p=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[t,(0,a.Lk)("p",null,[(0,a.eW)("¹: "),(0,a.Lk)("em",null,[(0,a.eW)("See "),(0,a.bF)(e,{to:"/archive/current/packages/support/exceptions/configureStackTrace.html"},{default:(0,a.k6)((()=>[o])),_:1}),(0,a.eW)(" for details.")])]),r,(0,a.Lk)("p",null,[(0,a.eW)("See "),(0,a.Lk)("a",c,[(0,a.eW)("Mozilla's documentation on Custom Error Types"),(0,a.bF)(p)]),(0,a.eW)(" for additional information.")])])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/exceptions/configureCustomError.html","title":"Configure Custom Error","lang":"en-GB","frontmatter":{"title":"Configure Custom Error","description":"Configuration of custom errors.","sidebarDepth":0},"headers":[{"level":2,"title":"Arguments","slug":"arguments","link":"#arguments","children":[]}],"git":{"updatedTime":1709649075000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/exceptions/configureCustomError.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/configureStackTrace.html.a35c72c3.js b/assets/js/configureStackTrace.html.a35c72c3.js new file mode 100644 index 00000000..1890fe47 --- /dev/null +++ b/assets/js/configureStackTrace.html.a35c72c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3783],{2349:function(n,a,s){s.r(a),s.d(a,{comp:function(){return g},data:function(){return v}});var e=s(641);const t=(0,e.Lk)("h1",{id:"configurestacktrace",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#configurestacktrace"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"configureStackTrace")])])],-1),r={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Lk)("code",null,"stack",-1),c=(0,e.Fv)('

Arguments

The function accepts an Error as argument.

import { configureStackTrace } from "@aedart/support/exceptions";\n\nclass MyError extends Error {\n    constructor(message, options) {\n        super(message, options);\n\n        configureStackTrace(this);\n    }\n}\n
',3),p={class:"custom-container warning"},i=(0,e.Lk)("p",{class:"custom-container-title"},"WARNING",-1),u=(0,e.Lk)("code",null,"stack",-1),l={href:"https://github.com/tc39/proposal-error-stacks",target:"_blank",rel:"noopener noreferrer"},d=(0,e.Lk)("code",null,"stack",-1),k=(0,e.Lk)("code",null,"configureStackTrace()",-1),m={};var g=(0,s(6262).A)(m,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Captures a new stack trace and sets given Error's "),(0,e.Lk)("a",r,[o,(0,e.bF)(s)]),(0,e.eW)(" property.")]),c,(0,e.Lk)("div",p,[i,(0,e.Lk)("p",null,[(0,e.eW)("The "),u,(0,e.eW)(" is "),(0,e.Lk)("a",l,[(0,e.eW)("not yet an official feature"),(0,e.bF)(s)]),(0,e.eW)(", even though it's supported by many major browsers and Node.js. If you are working with custom errors, you might not need to capture and set the "),d,(0,e.eW)(" property. Therefore, you should only use "),k,(0,e.eW)(" in situations when your JavaScript environment does not support stack traces in custom errors.")])])])}]]);const v=JSON.parse('{"path":"/archive/current/packages/support/exceptions/configureStackTrace.html","title":"Configure Stack Trace","lang":"en-GB","frontmatter":{"title":"Configure Stack Trace","description":"Configuration error stack trace.","sidebarDepth":0},"headers":[{"level":2,"title":"Arguments","slug":"arguments","link":"#arguments","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/exceptions/configureStackTrace.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/conflictResolution.html.653ec4d9.js b/assets/js/conflictResolution.html.653ec4d9.js new file mode 100644 index 00000000..c2a79fac --- /dev/null +++ b/assets/js/conflictResolution.html.653ec4d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7428],{7321:function(n,s,a){a.r(s),a.d(s,{comp:function(){return p},data:function(){return l}});var e=a(641);const t=(0,e.Lk)("h1",{id:"conflict-resolution",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#conflict-resolution"},[(0,e.Lk)("span",null,"Conflict Resolution")])],-1),o={class:"table-of-contents"},c=(0,e.Fv)('

Naming Conflicts

A concern class may ONLY occur once in a target class' prototype chain. This is a core feature of the concerns mechanism and cannot be circumvented. However, sometimes you may find yourself in situations where different injected concern classes define the same property or method name. When this happens an AliasConflictError is thrown.

class Label extends AbstractConcern {\n    get name() { /* ...not shown.. */ }\n    set name(v) { /* ...not shown.. */ }\n}\n\nclass Category extends AbstractConcern {\n    get name() { /* ...not shown.. */ }\n    set name(v) { /* ...not shown.. */ }\n}\n\n@use(\n    Label,\n    Category // AliasConflictError: Alias "name" for property ...\n)\nclass Battery {}\n

Resolve Naming Conflicts

To resolve the previous shown naming conflict, you can specify custom "aliases" when injecting a concern class, via an injection configuration object.

// ... Label and Category concerns not shown ...\n\n@use(\n    Label,\n    {\n        concern: Category,\n        aliases: {\n            'name': 'category' // Alias Category's "name" property as "category"\n        }\n    }\n)\nclass Battery {}\n\nconst instance = new Battery();\ninstance.name = 'AAA';\ninstance.category = 'Rechargeable';\n

The aliases option is key-value record, where;

  • key = property key in the concern class.
  • value = property key (alias) to define in the target class.

Prevent Aliases

To prevent a concern class from defining any aliases inside a target class, set the allowAliases option to false.

import { getConcernsContainer } from "@aedart/support/concerns";\n\n@use(\n    Label,\n    {\n        concern: Category,\n        allowAliases: false // Category's "name" is NOT aliased in target\n    }\n)\nclass Battery {}\n\nconst instance = new Battery();\ninstance.name = 'AA';\n\n// Interact with Category concern to set "name"\ngetConcernsContainer(instance).get(Category).name = 'Rechargeable';\n

Shorthand Configuration

You can also use a shorthand version to specify a concern injection configuration, via an array. The first array value must always be the concern class that must be injected. The second value can either be an aliases object, or boolean value for setting the allowAliases option.

@use(\n    Label,\n    [Category, {\n        'name': 'category'\n    }]\n)\nclass Battery {}\n

And to prevent a concern from defining aliases in a target:

@use(\n    Label,\n    [Category, false]\n)\nclass Battery {}\n
',16),i={};var p=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,e.g2)("router-link");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#naming-conflicts"},{default:(0,e.k6)((()=>[(0,e.eW)("Naming Conflicts")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#resolve-naming-conflicts"},{default:(0,e.k6)((()=>[(0,e.eW)("Resolve Naming Conflicts")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#prevent-aliases"},{default:(0,e.k6)((()=>[(0,e.eW)("Prevent Aliases")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#shorthand-configuration"},{default:(0,e.k6)((()=>[(0,e.eW)("Shorthand Configuration")])),_:1})])])]),c])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/concerns/conflictResolution.html","title":"Conflict Resolution","lang":"en-GB","frontmatter":{"title":"Conflict Resolution","description":"How to deal with naming conflicts","sidebarDepth":0},"headers":[{"level":2,"title":"Naming Conflicts","slug":"naming-conflicts","link":"#naming-conflicts","children":[]},{"level":2,"title":"Resolve Naming Conflicts","slug":"resolve-naming-conflicts","link":"#resolve-naming-conflicts","children":[]},{"level":2,"title":"Prevent Aliases","slug":"prevent-aliases","link":"#prevent-aliases","children":[]},{"level":2,"title":"Shorthand Configuration","slug":"shorthand-configuration","link":"#shorthand-configuration","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/conflictResolution.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/container-instance.html.0c106a57.js b/assets/js/container-instance.html.0c106a57.js new file mode 100644 index 00000000..69d68132 --- /dev/null +++ b/assets/js/container-instance.html.0c106a57.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6305],{2635:function(n,a,e){e.r(a),e.d(a,{comp:function(){return p},data:function(){return l}});var s=e(641);const t=(0,s.Fv)('

Container Instance

The Service Container can be instantiated like any other regular class. This allows you to use the container in isolation, without application-wide side effects.

import { Container } from "@aedart/container";\n\nconst container = new Container();\n
',3),i={href:"https://en.wikipedia.org/wiki/Singleton_pattern",target:"_blank",rel:"noopener noreferrer"},o=(0,s.Lk)("code",null,"getInstance()",-1),c=(0,s.Fv)('

The getInstance() method will automatically create a new Service Container instance and store a static reference to it, if no previous instance was created. Otherwise, the method will return the existing instance.

const container = Container.getInstance();\n

Destroy Existing Instance

In situations when you need to destroy the existing singleton instance, call the static setInstance() method with null as argument.

Container.setInstance(null); // Existing singleton instance is now lost...\n
',5),r={};var p=(0,e(6262).A)(r,[["render",function(n,a){const e=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,(0,s.Lk)("p",null,[(0,s.eW)("However, if you want the use the same Service Container instance across your entire application, then you can obtain a "),(0,s.Lk)("a",i,[(0,s.eW)("singleton"),(0,s.bF)(e)]),(0,s.eW)(" instance, via the static method "),o,(0,s.eW)(".")]),c])}]]);const l=JSON.parse('{"path":"/archive/current/packages/container/container-instance.html","title":"Container Instance","lang":"en-GB","frontmatter":{"description":"How to obtain Service Container instance","sidebarDepth":0},"headers":[{"level":2,"title":"Destroy Existing Instance","slug":"destroy-existing-instance","link":"#destroy-existing-instance","children":[]}],"git":{"updatedTime":1712565858000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/container/container-instance.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/contextual-bindings.html.fa8c9ec2.js b/assets/js/contextual-bindings.html.fa8c9ec2.js new file mode 100644 index 00000000..145d7ddb --- /dev/null +++ b/assets/js/contextual-bindings.html.fa8c9ec2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6666],{65:function(n,s,a){a.r(s),a.d(s,{comp:function(){return p},data:function(){return c}});var e=a(641);const t=[(0,e.Fv)('

Contextual Bindings

In situations when multiple classes make use of the same dependency, but you wish to inject a different component or value on some of those classes, then you can make use of "context binding". The when() method allows you to specify (overwrite) the implementation to be resolved and injected, for a given target class.

container.when(ApiService)\n        .needs('storage')\n        .give(CookieStorage);\n\ncontainer.when(UsersRepository, BooksRepository)\n        .needs('api_client')\n        .give(() => {\n           return new AcmeApiClient(); \n        });\n

To illustrate the usefulness of contextual binding a bit further, consider the following example:

@dependency('storage')\nclass A {\n    // ...not shown...\n}\n\n@dependency('storage')\nclass B {\n    // ...not shown...\n}\n\n@dependency('storage')\nclass C {\n    // ...not shown...\n}\n\n@dependency('storage')\nclass D {\n    // ...not shown...\n}\n\n// Register "default" storage binding\ncontainer.singleton('storage', CookieStorage);\n\n// Register contextual binding for C and D\ncontainer.when(C, D)\n    .needs('storage')\n    .give(() => {\n        return new CloudStorage('s3');\n    });\n

In the above shown example, all classes define the same binding identifier ("storage") as a dependency. By default, a "storage" binding is registered in the Service Container, which ensures that when the classes are resolved, a CookieStorage component instance is injected into each target class instance.

However, classes C and D require a different implementation, than the one offered by the "storage" binding. To achieve this, and without overwriting the default "storage" binding, a new contextual binding is registered that affects only classes C and D. When they are resolved, a different implementation of injected into the target classes.

const c = container.make(C);\nconsole.log(c.storage); // CloudStorage\n
',8)],o={};var p=(0,a(6262).A)(o,[["render",function(n,s){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const c=JSON.parse('{"path":"/archive/current/packages/container/contextual-bindings.html","title":"Contextual Bindings","lang":"en-GB","frontmatter":{"description":"Define Contextual Bindings","sidebarDepth":0},"headers":[],"git":{"updatedTime":1712583788000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/container/contextual-bindings.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/contribution-guide.html.eb251cb2.js b/assets/js/contribution-guide.html.eb251cb2.js new file mode 100644 index 00000000..808abc3b --- /dev/null +++ b/assets/js/contribution-guide.html.eb251cb2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4975],{9476:function(e,t,r){r.r(t),r.d(t,{comp:function(){return q},data:function(){return F}});var n=r(641);const l=(0,n.Lk)("h1",{id:"contribution-guide",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#contribution-guide"},[(0,n.Lk)("span",null,"Contribution Guide")])],-1),o={href:"https://en.wikipedia.org/wiki/Software_bug",target:"_blank",rel:"noopener noreferrer"},i={class:"table-of-contents"},a=(0,n.Lk)("h2",{id:"bug-report",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#bug-report"},[(0,n.Lk)("span",null,"Bug Report")])],-1),u={href:"https://github.com/aedart/ion/issues/new/choose",target:"_blank",rel:"noopener noreferrer"},s=(0,n.Fv)('
  • Where is the defect located
  • A good, short and precise description of the defect (Why is it a defect)
  • How to replicate the defect
  • (A possible solution for how to resolve the defect)

When time permits it, I will review your issue and take action upon it.

Security Vulnerability

',3),d=(0,n.Lk)("h2",{id:"feature-request",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#feature-request"},[(0,n.Lk)("span",null,"Feature Request")])],-1),c={href:"https://github.com/aedart/ion/issues/new/choose",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/aedart/ion/discussions",target:"_blank",rel:"noopener noreferrer"},p=(0,n.Lk)("h2",{id:"fork-code-and-send-pull-request",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#fork-code-and-send-pull-request"},[(0,n.Lk)("span",null,"Fork, code and send pull-request")])],-1),k=(0,n.Lk)("p",null,"If you wish to fix a bug, add new feature, or perhaps change an existing, then please follow this guideline",-1),f=(0,n.Lk)("li",null,"Fork this project",-1),g=(0,n.Lk)("li",null,"Create a new local development branch for the given fix, addition or change",-1),b=(0,n.Lk)("li",null,"Write your code / changes",-1),y=(0,n.Lk)("li",null,[(0,n.eW)("Create executable test-cases ("),(0,n.Lk)("em",null,"prove that your changes are solid!"),(0,n.eW)(")")],-1),m=(0,n.Lk)("li",null,"Commit and push your changes to your fork-repository",-1),L=(0,n.Lk)("li",null,[(0,n.eW)("Send a pull-request with your changes ("),(0,n.Lk)("em",null,'please check "Allow edits from maintainers"'),(0,n.eW)(")")],-1),v={href:"https://en.wikipedia.org/wiki/Beer",target:"_blank",rel:"noopener noreferrer"},W=(0,n.Lk)("p",null,[(0,n.eW)("As soon as I receive the pull-request ("),(0,n.Lk)("em",null,"and have time for it"),(0,n.eW)("), I will review your changes and merge them into this project. If not, I will inform you why I choose not to.")],-1),w={};var q=(0,r(6262).A)(w,[["render",function(e,t){const r=(0,n.g2)("ExternalLinkIcon"),w=(0,n.g2)("router-link"),q=(0,n.g2)("RouteLink");return(0,n.uX)(),(0,n.CE)("div",null,[l,(0,n.Lk)("p",null,[(0,n.eW)("Have you found a defect ( "),(0,n.Lk)("a",o,[(0,n.eW)("bug or design flaw"),(0,n.bF)(r)]),(0,n.eW)(" ), or do you wish improvements? In the following sections, you might find some useful information on how you can help this project. In any case, I thank you for taking the time to help me improve this project's deliverables and overall quality.")]),(0,n.Lk)("nav",i,[(0,n.Lk)("ul",null,[(0,n.Lk)("li",null,[(0,n.bF)(w,{to:"#bug-report"},{default:(0,n.k6)((()=>[(0,n.eW)("Bug Report")])),_:1})]),(0,n.Lk)("li",null,[(0,n.bF)(w,{to:"#security-vulnerability"},{default:(0,n.k6)((()=>[(0,n.eW)("Security Vulnerability")])),_:1})]),(0,n.Lk)("li",null,[(0,n.bF)(w,{to:"#feature-request"},{default:(0,n.k6)((()=>[(0,n.eW)("Feature Request")])),_:1})]),(0,n.Lk)("li",null,[(0,n.bF)(w,{to:"#fork-code-and-send-pull-request"},{default:(0,n.k6)((()=>[(0,n.eW)("Fork, code and send pull-request")])),_:1})])])]),a,(0,n.Lk)("p",null,[(0,n.eW)("If you have found a bug, please report it on "),(0,n.Lk)("a",u,[(0,n.eW)("GitHub"),(0,n.bF)(r)]),(0,n.eW)(". When reporting the bug, do consider the following:")]),s,(0,n.Lk)("p",null,[(0,n.eW)("Please read the "),(0,n.bF)(q,{to:"/archive/current/security.html"},{default:(0,n.k6)((()=>[(0,n.eW)("Security Policy")])),_:1}),(0,n.eW)(".")]),d,(0,n.Lk)("p",null,[(0,n.eW)("If you have an idea for a new feature or perhaps changing an existing, feel free to create a "),(0,n.Lk)("a",c,[(0,n.eW)("feature request"),(0,n.bF)(r)]),(0,n.eW)(". Should you feel unsure whether your idea is good or not, then perhaps you could start a "),(0,n.Lk)("a",h,[(0,n.eW)("discussion"),(0,n.bF)(r)]),(0,n.eW)(".")]),p,k,(0,n.Lk)("ul",null,[f,g,b,y,m,L,(0,n.Lk)("li",null,[(0,n.Lk)("em",null,[(0,n.eW)("Drink a "),(0,n.Lk)("a",v,[(0,n.eW)("Beer"),(0,n.bF)(r)]),(0,n.eW)(" - you earned it")]),(0,n.eW)(" 😃")])]),W])}]]);const F=JSON.parse('{"path":"/archive/current/contribution-guide.html","title":"Contribution Guide","lang":"en-GB","frontmatter":{"description":"How to contribute to Ion","sidebarDepth":0},"headers":[{"level":2,"title":"Bug Report","slug":"bug-report","link":"#bug-report","children":[]},{"level":2,"title":"Security Vulnerability","slug":"security-vulnerability","link":"#security-vulnerability","children":[]},{"level":2,"title":"Feature Request","slug":"feature-request","link":"#feature-request","children":[]},{"level":2,"title":"Fork, code and send pull-request","slug":"fork-code-and-send-pull-request","link":"#fork-code-and-send-pull-request","children":[]}],"git":{"updatedTime":1679232326000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/contribution-guide.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/customErrors.html.49a0442d.js b/assets/js/customErrors.html.49a0442d.js new file mode 100644 index 00000000..ecfdbe0c --- /dev/null +++ b/assets/js/customErrors.html.49a0442d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1816],{8394:function(s,n,a){a.r(n),a.d(n,{comp:function(){return u},data:function(){return d}});var e=a(641);const t=(0,e.Lk)("h1",{id:"custom-errors",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#custom-errors"},[(0,e.Lk)("span",null,"Custom Errors")])],-1),o={class:"table-of-contents"},r=(0,e.Fv)('

AbstractClassError

The AbstractClassError is intended to be thrown whenever an abstract class is attempted instantiated directly.

import { AbstractClassError } from "@aedart/support/exceptions";\n\n/**\n * @abstract\n */\nclass MyAbstractClass {\n    constructor() {\n        if (new.target === MyAbstractClass) {\n            throw new AbstractClassError(MyAbstractClass);\n        }\n    }\n}\n\nconst instance = new MyAbstractClass(); // AbstractClassError\n

LogicalError

To be thrown whenever there is an error in the programming logic.

',5),c={href:"https://www.php.net/manual/en/class.logicexception",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Lk)("code",null,"LogicException",-1),l=(0,e.Fv)('
import { LogicalError } from "@aedart/support/exceptions";\n\nfunction print(person) {\n    if (printer === undefined) {\n        throw new LogicalError('Printer is missing, unable to print people');\n    }\n}\n
',1),i={};var u=(0,a(6262).A)(i,[["render",function(s,n){const a=(0,e.g2)("router-link"),i=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#abstractclasserror"},{default:(0,e.k6)((()=>[(0,e.eW)("AbstractClassError")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#logicalerror"},{default:(0,e.k6)((()=>[(0,e.eW)("LogicalError")])),_:1})])])]),r,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("Inspired by PHP's "),(0,e.Lk)("a",c,[p,(0,e.bF)(i)])])]),l])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/exceptions/customErrors.html","title":"Custom Errors","lang":"en-GB","frontmatter":{"title":"Custom Errors","description":"Predefined custom errors.","sidebarDepth":0},"headers":[{"level":2,"title":"AbstractClassError","slug":"abstractclasserror","link":"#abstractclasserror","children":[]},{"level":2,"title":"LogicalError","slug":"logicalerror","link":"#logicalerror","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/exceptions/customErrors.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/dependencies.html.15552877.js b/assets/js/dependencies.html.15552877.js new file mode 100644 index 00000000..b9638152 --- /dev/null +++ b/assets/js/dependencies.html.15552877.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8469],{9259:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return k}});var e=a(641);const t=(0,e.Lk)("h1",{id:"dependencies",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#dependencies"},[(0,e.Lk)("span",null,"Dependencies")])],-1),i=(0,e.Lk)("code",null,"dependencies()",-1),p=(0,e.Fv)('
import { dependencies } from "@aedart/support/container";\n\n@dependencies('engine')\nexport default class Car\n{\n    engine = undefined;\n    \n    constructor(engine) {\n        this.engine = engine;\n    }\n}\n
',1),c={class:"custom-container tip"},o=(0,e.Fv)('

No automatic injection

The dependencies() decorator does not automatically inject anything into your class. It will only associate binding identifiers with the target class, as metadata. This means that you can instantiate a new instance of the class, without any side effects (dependencies must be manually given as arguments to the target class).

const car = new Car();\nconsole.log(car.engine); // undefined\n
',3),l=(0,e.Lk)("code",null,"make()",-1),d=(0,e.Fv)('

Multiple Dependencies

The dependencies() decorator accepts an arbitrary amount of binding identifiers. This allows you to define multiple dependencies in a single call.

@dependencies(\n    'warehouse_manager',\n    'api_client',\n    'events'\n)\nexport default class Warehouse\n{\n    manager = undefined;\n    apiClient = undefined;\n    eventDispatcher = undefined;\n    \n    constructor(manager, apiClient, dispatcher) {\n        this.manager = manager;\n        this.apiClient = apiClient;\n        this.eventDispatcher = dispatcher;\n    }\n}\n
',3),r={};var u=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("In order for the Service Container to be able to automatically inject dependencies, when "),(0,e.bF)(a,{to:"/archive/current/packages/container/resolving.html"},{default:(0,e.k6)((()=>[(0,e.eW)("resolving")])),_:1}),(0,e.eW)(" components, you must first define them on a target class. The "),i,(0,e.eW)(" decorator is used for this purpose.")]),p,(0,e.Lk)("div",c,[o,(0,e.Lk)("p",null,[(0,e.eW)("The Service Container's "),(0,e.bF)(a,{to:"/archive/current/packages/container/resolving.html#the-make-method"},{default:(0,e.k6)((()=>[l,(0,e.eW)(" method")])),_:1}),(0,e.eW)(" is responsible for reading the defined dependencies, resolve them, and inject them into the target class.")])]),d])}]]);const k=JSON.parse('{"path":"/archive/current/packages/container/dependencies.html","title":"Dependencies","lang":"en-GB","frontmatter":{"description":"How to define dependencies","sidebarDepth":0},"headers":[{"level":2,"title":"Multiple Dependencies","slug":"multiple-dependencies","link":"#multiple-dependencies","children":[]}],"git":{"updatedTime":1712571124000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/container/dependencies.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/descTag.html.704e225b.js b/assets/js/descTag.html.704e225b.js new file mode 100644 index 00000000..638521f0 --- /dev/null +++ b/assets/js/descTag.html.704e225b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9061],{9018:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return i}});var t=s(641);const e=(0,t.Fv)('

descTag

Return the default string description of an object.

import { descTag } from '@aedart/support/misc';\n\ndescTag('foo'); // [object String]\ndescTag(3); // [object Number]\ndescTag([1, 2, 3]); // [object Array]\ndescTag(true); // [object Boolean]\n// ... etc\n

The method is a shorthand for the following:

Object.prototype.toString.call(/* your value */);\n
',5),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag",target:"_blank",rel:"noopener noreferrer"},o={};var c=(0,s(6262).A)(o,[["render",function(n,a){const s=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[e,(0,t.Lk)("p",null,[(0,t.eW)("See "),(0,t.Lk)("a",p,[(0,t.eW)("Mozilla's documentation"),(0,t.bF)(s)]),(0,t.eW)(" for additional information.")])])}]]);const i=JSON.parse('{"path":"/archive/current/packages/support/misc/descTag.html","title":"Desc. Tag","lang":"en-GB","frontmatter":{"title":"Desc. Tag","description":"Object description tag","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/descTag.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/edgeCases.html.b8f147f4.js b/assets/js/edgeCases.html.b8f147f4.js new file mode 100644 index 00000000..be3b316e --- /dev/null +++ b/assets/js/edgeCases.html.b8f147f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7920],{54:function(n,s,a){a.r(s),a.d(s,{comp:function(){return r},data:function(){return d}});var e=a(641);const t=(0,e.Lk)("h1",{id:"edge-cases",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#edge-cases"},[(0,e.Lk)("span",null,"Edge Cases")])],-1),c={class:"table-of-contents"},p=(0,e.Fv)('

Getter & Setter declared in different concerns

It is not possible to define a property's getter and setter methods in separate concerns, and thereafter use them in a target class. Despite serving different purposes, the getter and setter share the same property name and are therefore treated as being one and the same property key. The following example will therefore always lead to an AliasConflictError being thrown.

import { AbstractConcern, use } from "@aedart/support/concerns";\n\nclass A extends AbstractConcern {\n    get title() { /* ...not shown.. */ }\n}\n\nclass B extends AbstractConcern {\n    set title(value) { /* ...not shown.. */ }\n}\n\n@use(\n    A,\n    B // AliasConflictError - "title" property from A!\n)\nclass Person {}\n
',3),o=(0,e.Lk)("em",null,"if you intend for such a property to be readable and writable.",-1),i=(0,e.Fv)('

Inheritance vs. Concern members

The concerns mechanism will never overwrite existing methods or properties inside a target class - not even when those methods or properties are inherited from a parent class.

import { AbstractConcern, use } from "@aedart/support/concerns";\n\nclass Connection extends AbstractConcern {\n    driver() {\n        return 'special';\n    }\n}\n\nclass Api {\n    driver() {\n        return 'default';\n    }\n}\n\n@user(Connection) // driver() is NOT aliased - method inherited from Api class!\nclass SailBoat extends Api {}\n\nconst instance = new SailBoat();\ninstance.driver(); // default\n
',3),l=(0,e.Fv)('
import { AbstractConcern, use } from "@aedart/support/concerns";\n\nclass Connection extends AbstractConcern {\n    driver() {\n        return 'special';\n    }\n}\n\nclass Api {\n    driver() {\n        return 'default';\n    }\n}\n\n@user(\n    [Connection, {\n        'driver': 'specialDriver' // alias "driver" as "specialDriver"\n    }]\n)\nclass SailBoat extends Api {\n    \n    // Overwrite inherited method\n    driver() {\n        // Invoke the "specialDriver"... \n        return this.specialDriver();\n    }\n}\n\nconst instance = new SailBoat();\ninstance.driver(); // special\n

Concerns using other concerns

A concern can use other concerns classes. However, depending on your complexity, doing so may impact performance. Consider the following example:

import { AbstractConcern, use } from "@aedart/support/concerns";\n\nclass Ping extends AbstractConcern {\n    ping() {\n        return 'ping';\n    }\n}\n\n@use(Ping)\nclass Pong extends AbstractConcern {\n    pong() {\n        return 'pong';\n    }\n}\n\n@use(Pong)\nclass Game {}\n\nconst instance = new Game();\n\ninstance.ping(); // ping\ninstance.pong(); // pong\n

In the above shown example, whenever the ping() method is invoked, the call stack will be similar to the following:

Game (instance).ping() -> Pong (instance).ping() -> Ping (instance).ping()\n\n("->" represents concerns container instance)\n

In some isolated cases, this might be acceptable for you. Nevertheless, if your application makes heavy use of concerns using other concerns, then your application's overall performance could suffer. You should consider merging multiple concern classes into a single class, if it is reasonable and possible. Alternatively, you can also consider extending existing concern classes. For instance:

import { AbstractConcern, use } from "@aedart/support/concerns";\n\nclass Ping extends AbstractConcern {\n    ping() {\n        return 'ping';\n    }\n}\n\n// Extend Ping concern...\nclass Pong extends Ping {\n    pong() {\n        return 'pong';\n    }\n}\n\n@use(Pong)\nclass Game {}\n\nconst instance = new Game();\n\ninstance.ping(); // ping\ninstance.pong(); // pong\n

Now, whenever the ping() method is invoked, the call stack is slightly reduced:

Game (instance).ping() -> Pong (instance).ping()\n\n("->" represents concerns container instance)\n
',10),u={};var r=(0,a(6262).A)(u,[["render",function(n,s){const a=(0,e.g2)("router-link"),u=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",c,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#getter-setter-declared-in-different-concerns"},{default:(0,e.k6)((()=>[(0,e.eW)("Getter & Setter declared in different concerns")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#inheritance-vs-concern-members"},{default:(0,e.k6)((()=>[(0,e.eW)("Inheritance vs. Concern members")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#concerns-using-other-concerns"},{default:(0,e.k6)((()=>[(0,e.eW)("Concerns using other concerns")])),_:1})])])]),p,(0,e.Lk)("p",null,[(0,e.eW)("You can resolve the above shown issue via a "),(0,e.bF)(u,{to:"/archive/current/packages/support/concerns/conflictResolution.html#resolve-naming-conflicts"},{default:(0,e.k6)((()=>[(0,e.eW)("custom alias")])),_:1}),(0,e.eW)(". But, it is advisable to design your concerns such that the offer appropriate getter and setter methods for a property, in one and the same concern - "),o]),i,(0,e.Lk)("p",null,[(0,e.eW)("The only way to resolve the above shown issue, is by making use of a "),(0,e.bF)(u,{to:"/archive/current/packages/support/concerns/conflictResolution.html#resolve-naming-conflicts"},{default:(0,e.k6)((()=>[(0,e.eW)("custom alias")])),_:1}),(0,e.eW)(" and manually overwrite the inherited method. E.g.")]),l])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/concerns/edgeCases.html","title":"Edge Cases","lang":"en-GB","frontmatter":{"title":"Edge Cases","description":"A few edge cases when making or using concerns","sidebarDepth":0},"headers":[{"level":2,"title":"Getter & Setter declared in different concerns","slug":"getter-setter-declared-in-different-concerns","link":"#getter-setter-declared-in-different-concerns","children":[]},{"level":2,"title":"Inheritance vs. Concern members","slug":"inheritance-vs-concern-members","link":"#inheritance-vs-concern-members","children":[]},{"level":2,"title":"Concerns using other concerns","slug":"concerns-using-other-concerns","link":"#concerns-using-other-concerns","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/edgeCases.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/empty.html.9e33f6c2.js b/assets/js/empty.html.9e33f6c2.js new file mode 100644 index 00000000..820e0a21 --- /dev/null +++ b/assets/js/empty.html.9e33f6c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3295],{6616:function(n,s,a){a.r(s),a.d(s,{comp:function(){return f},data:function(){return b}});var t=a(641);const p=(0,t.Lk)("h1",{id:"empty",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#empty"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"empty")])])],-1),e=(0,t.Lk)("p",null,"Determine if value is empty.",-1),c=(0,t.Lk)("code",null,"isset()",-1),o=(0,t.Fv)('
import { empty } from '@aedart/support/misc';\n\nempty(''); // true\nempty(false); // true\nempty(0); // true\nempty(0n); // true\nempty(NaN); // true\nempty(null); // true\nempty(undefined); // true\nempty([]); // true\nempty({}); // true\nempty(new Set()); // true\nempty(new Map()); // true\nempty(new Int8Array()); // true\n\nempty(' '); // false\nempty('a'); // false\nempty(true); // false\nempty(1); // false\nempty(1n); // false\nempty(-1); // false\nempty(Infinity); // false\nempty([ 1 ]); // false\nempty({ name: 'Jimmy' }); // false\nempty((new Set()).add('a')); // false\nempty((new Map).set('foo', 'bar')); // false\nempty(new Date()); // false\nempty(function() {}); // false\nempty(Symbol('my-symbol')); // false\n\nlet typedArr = new Int8Array(1);\ntypedArr[0] = 1;\nempty(typedArr); // false\n

WeakMap and WeakSet

',2),l={class:"custom-container warning"},u=(0,t.Lk)("p",{class:"custom-container-title"},"Caution",-1),i=(0,t.Lk)("code",null,"empty()",-1),k={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap",target:"_blank",rel:"noopener noreferrer"},r=(0,t.Lk)("code",null,"WeakMap",-1),m={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet",target:"_blank",rel:"noopener noreferrer"},d=(0,t.Lk)("code",null,"WeakSet",-1),v={};var f=(0,a(6262).A)(v,[["render",function(n,s){const a=(0,t.g2)("RouteLink"),v=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[p,e,(0,t.Lk)("p",null,[(0,t.Lk)("em",null,[(0,t.eW)("See also "),(0,t.bF)(a,{to:"/archive/current/packages/support/misc/isset.html"},{default:(0,t.k6)((()=>[c])),_:1}),(0,t.eW)(".")])]),o,(0,t.Lk)("div",l,[u,(0,t.Lk)("p",null,[i,(0,t.eW)(" is not able to determine if a "),(0,t.Lk)("a",k,[r,(0,t.bF)(v)]),(0,t.eW)(" or "),(0,t.Lk)("a",m,[d,(0,t.bF)(v)]),(0,t.eW)(" is empty.")])])])}]]);const b=JSON.parse('{"path":"/archive/current/packages/support/misc/empty.html","title":"Empty","lang":"en-GB","frontmatter":{"title":"Empty","description":"Determine if value is empty","sidebarDepth":0},"headers":[{"level":2,"title":"WeakMap and WeakSet","slug":"weakmap-and-weakset","link":"#weakmap-and-weakset","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/empty.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/forget.html.522dfd63.js b/assets/js/forget.html.522dfd63.js new file mode 100644 index 00000000..8b0e3ba3 --- /dev/null +++ b/assets/js/forget.html.522dfd63.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4993],{8407:function(n,s,a){a.r(s),a.d(s,{comp:function(){return i},data:function(){return u}});var e=a(641);const t=(0,e.Lk)("h1",{id:"forget",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#forget"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"forget")])])],-1),p=(0,e.Lk)("em",null,"delete",-1),o={href:"https://lodash.com/docs/4.17.15#unset",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"unset",-1),c=(0,e.Fv)('
import { forget } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        c: {\n            age: 24\n        }\n    },\n};\n\nforget(target, 'b.c');\n\nconsole.log(target); // { a: 1234, b: {} }\n
',1),l={};var i=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Remove ("),p,(0,e.eW)(") a value in object at given path. "),(0,e.Lk)("em",null,[(0,e.eW)("Method is an alias for "),(0,e.Lk)("a",o,[(0,e.eW)("Lodash "),r,(0,e.bF)(a)]),(0,e.eW)(".")])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/objects/forget.html","title":"Forget","lang":"en-GB","frontmatter":{"title":"Forget","description":"Forget object key","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/forget.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/forgetAll.html.58d8e9c1.js b/assets/js/forgetAll.html.58d8e9c1.js new file mode 100644 index 00000000..edf9f941 --- /dev/null +++ b/assets/js/forgetAll.html.58d8e9c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7922],{8668:function(n,s,a){a.r(s),a.d(s,{comp:function(){return o},data:function(){return l}});var t=a(641);const e=[(0,t.Fv)('

forgetAll

Remove (deletes) all values in object, at given paths.

import { forgetAll } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        c: {\n            age: 24\n        }\n    },\n};\n\nforgetAll(target, [ 'a', 'b.c.age' ]);\n\nconsole.log(target); // { b: { c: {} } }\n
',3)],p={};var o=(0,a(6262).A)(p,[["render",function(n,s){return(0,t.uX)(),(0,t.CE)("div",null,e)}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/objects/forgetAll.html","title":"Forget All","lang":"en-GB","frontmatter":{"title":"Forget All","description":"Forget object all keys","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/forgetAll.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/get.html.cb27b757.js b/assets/js/get.html.cb27b757.js new file mode 100644 index 00000000..6659a9aa --- /dev/null +++ b/assets/js/get.html.cb27b757.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[754],{9657:function(n,a,s){s.r(a),s.d(a,{comp:function(){return r},data:function(){return u}});var e=s(641);const t=(0,e.Lk)("h1",{id:"get",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#get"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"get")])])],-1),p={href:"https://lodash.com/docs/4.17.15#get",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Lk)("code",null,"get",-1),l=(0,e.Lk)("code",null,"set()",-1),c=(0,e.Fv)('
import { get } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        c: {\n            age: 24\n        }\n    },\n};\n\nlet age = get(target, 'b.c.age');\nconsole.log(age); // 24\n

Default Value

You can also specify a default value to be returned, if the resolved value is undefined.

const target = {\n    a: 1234,\n    b: {\n        c: {\n            age: undefined\n        }\n    },\n};\n\n// Returns default value...\nlet age = get(target, 'b.c.age', 20);\nconsole.log(age); // 20\n
',4),i={};var r=(0,s(6262).A)(i,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon"),i=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Get value in object at given path. "),(0,e.Lk)("em",null,[(0,e.eW)("Method is an alias for "),(0,e.Lk)("a",p,[(0,e.eW)("Lodash "),o,(0,e.bF)(s)]),(0,e.eW)(".")])]),(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See also "),(0,e.bF)(i,{to:"/archive/current/packages/support/objects/set.html"},{default:(0,e.k6)((()=>[l])),_:1}),(0,e.eW)(".")])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/objects/get.html","title":"Get","lang":"en-GB","frontmatter":{"title":"Get","description":"Get object value from given path.","sidebarDepth":0},"headers":[{"level":2,"title":"Default Value","slug":"default-value","link":"#default-value","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/get.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getAllParentsOfClass.html.fe69b65f.js b/assets/js/getAllParentsOfClass.html.fe69b65f.js new file mode 100644 index 00000000..fc49e205 --- /dev/null +++ b/assets/js/getAllParentsOfClass.html.fe69b65f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3503],{7210:function(s,n,a){a.r(n),a.d(n,{comp:function(){return r},data:function(){return u}});var e=a(641);const t={id:"getallparentsofclass",tabindex:"-1"},l={class:"header-anchor",href:"#getallparentsofclass"},c=(0,e.Lk)("code",null,"getAllParentsOfClass",-1),p=(0,e.Fv)('

Returns all parents of target class. It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • includeTarget: boolean = false - (optional) If true, then given target is included in the output as the first element.
import { getAllParentsOfClass } from '@aedart/support/reflections';\n\nclass A {}\n\nclass B extends A {}\n\nclass C extends B {}\n\ngetAllParentsOfClass(C); // [ B, A ]\ngetAllParentsOfClass(C, true); // [ C, B, A ]\n
',3),o=(0,e.Lk)("code",null,"getParentOfClass()",-1),i={};var r=(0,a(6262).A)(i,[["render",function(s,n){const a=(0,e.g2)("Badge"),i=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",l,[(0,e.Lk)("span",null,[c,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),p,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See also "),(0,e.bF)(i,{to:"/archive/current/packages/support/reflections/getParentOfClass.html"},{default:(0,e.k6)((()=>[o])),_:1}),(0,e.eW)(".")])])])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/reflections/getAllParentsOfClass.html","title":"Get All Parents Of Class","lang":"en-GB","frontmatter":{"title":"Get All Parents Of Class","description":"Get all parents of a class","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getAllParentsOfClass.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getClassPropertyDescriptor.html.8da3ab1f.js b/assets/js/getClassPropertyDescriptor.html.8da3ab1f.js new file mode 100644 index 00000000..f86e7b6b --- /dev/null +++ b/assets/js/getClassPropertyDescriptor.html.8da3ab1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[572],{463:function(s,n,a){a.r(n),a.d(n,{comp:function(){return u},data:function(){return d}});var e=a(641);const t={id:"getclasspropertydescriptor",tabindex:"-1"},p={class:"header-anchor",href:"#getclasspropertydescriptor"},o=(0,e.Lk)("code",null,"getClassPropertyDescriptor",-1),c={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"PropertyDescriptor",-1),i=(0,e.Fv)('

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • key: PropertyKey - Name of the property.
import { getClassPropertyDescriptor } from '@aedart/support/reflections';\n\nclass A {\n    set name(v) {}\n    get name() {}\n}\n\ngetClassPropertyDescriptor(A, 'name'); // see "output"...\n

The above show example results in the given output:

const output = {\n    get: function () { /* ...Not shown... */ },\n    set: function (v) { /* ..Not shown... */ },\n    enumerable: false,\n    configurable: true\n};\n

Note

getClassPropertyDescriptor() returns undefined if requested key does not exist in class' prototype.

Caution

getClassPropertyDescriptor() throws TypeError if target does not have a prototype property.

',7),l={};var u=(0,a(6262).A)(l,[["render",function(s,n){const a=(0,e.g2)("Badge"),l=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Returns "),(0,e.Lk)("a",c,[r,(0,e.bF)(l)]),(0,e.eW)(", from target's prototype that matches given property key.")]),i])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/reflections/getClassPropertyDescriptor.html","title":"Get Class Prop. Descriptor","lang":"en-GB","frontmatter":{"title":"Get Class Prop. Descriptor","description":"Get property descriptor of target class property.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getClassPropertyDescriptor.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getClassPropertyDescriptors.html.27c05d0b.js b/assets/js/getClassPropertyDescriptors.html.27c05d0b.js new file mode 100644 index 00000000..8102d1b6 --- /dev/null +++ b/assets/js/getClassPropertyDescriptors.html.27c05d0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9443],{9595:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return d}});var t=a(641);const e={id:"getclasspropertydescriptors",tabindex:"-1"},p={class:"header-anchor",href:"#getclasspropertydescriptors"},o=(0,t.Lk)("code",null,"getClassPropertyDescriptors",-1),c={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor",target:"_blank",rel:"noopener noreferrer"},l=(0,t.Lk)("code",null,"descriptors",-1),i=(0,t.Fv)('

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class.
  • recursive: boolean = false - (optional) If true, then target's parent prototypes are traversed. Descriptors are merged, such that the top-most class' descriptors are returned.
import { getClassPropertyDescriptors } from '@aedart/support/reflections';\n\nclass A {\n    set name(v) {}\n    get name() {}\n    bar() {}\n    [MY_SYMBOL]() {}\n}\n\ngetClassPropertyDescriptors(A); // { bar: {...}, name: {...}, [MY_SYMBOL]: {...} }\n

When recursive is set to true, then all property descriptors are returned from the target class' prototype chain.

import { getClassPropertyDescriptors } from '@aedart/support/reflections';\n\nclass A {\n    set name(v) {}\n    get name() {}\n    foo() {}\n    [MY_SYMBOL]() {}\n}\n\nclass B extends A {\n    set bar(v) {}\n    get bar() {}\n}\n\ngetClassPropertyDescriptors(B, true);\n// { bar: {...}, foo: {...}, name: {...}, [MY_SYMBOL]: {...} }\n

Caution

getClassPropertyDescriptors() throws TypeError if target does not have a prototype property.

',6),r={};var u=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,t.g2)("Badge"),r=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,t.Lk)("p",null,[(0,t.eW)("Returns all property "),(0,t.Lk)("a",c,[l,(0,t.bF)(r)]),(0,t.eW)(" that are defined target's prototype.")]),i])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/reflections/getClassPropertyDescriptors.html","title":"Get Class Prop. Descriptors","lang":"en-GB","frontmatter":{"title":"Get Class Prop. Descriptors","description":"Get all property descriptors of target class.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getClassPropertyDescriptors.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getConstructorName.html.8b21384d.js b/assets/js/getConstructorName.html.8b21384d.js new file mode 100644 index 00000000..5e05a149 --- /dev/null +++ b/assets/js/getConstructorName.html.8b21384d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9583],{3252:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return i}});var t=a(641);const e={id:"getconstructorname",tabindex:"-1"},o={class:"header-anchor",href:"#getconstructorname"},c=(0,t.Lk)("code",null,"getConstructorName",-1),p=(0,t.Fv)('

Returns target class' constructor name, if available.

It accepts the following arguments:

  • target: ConstructorOrAbstractConstructor - The target class
  • defaultValue: string|null = null - (optional) A default string value to return if target has no constructor name.
import { getConstructorName } from '@aedart/support/reflections';\n\nclass Box {}\n\ngetConstructorName(Box); // Box\ngetConstructorName(class {}); // null\ngetConstructorName(class {}, 'MyBox'); // MyBox\n
',4),r={};var l=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,t.g2)("Badge");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",o,[(0,t.Lk)("span",null,[c,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),p])}]]);const i=JSON.parse('{"path":"/archive/current/packages/support/reflections/getConstructorName.html","title":"Get Constructor Name","lang":"en-GB","frontmatter":{"title":"Get Constructor Name","description":"Get name of target class\' constructor","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getConstructorName.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getErrorMessage.html.b3a46b8e.js b/assets/js/getErrorMessage.html.b3a46b8e.js new file mode 100644 index 00000000..540cea56 --- /dev/null +++ b/assets/js/getErrorMessage.html.b3a46b8e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9127],{5312:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return u}});var e=a(641);const t=(0,e.Lk)("h1",{id:"geterrormessage",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#geterrormessage"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"getErrorMessage")])])],-1),o=(0,e.Lk)("code",null,"message",-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"Error",-1),c=(0,e.Fv)('
import { getErrorMessage } from "@aedart/support/exceptions";\n\ntry {\n    throw new Error('Something went wrong!');\n} catch(e) {\n    const msg = getErrorMessage(e, 'unknown error'); // Something went wrong! \n}\n\n// ---------------------------------------------------------------------------\n\ntry {\n    throw 'Something went wrong!';\n} catch(e) {\n    const msg = getErrorMessage(e, 'unknown error'); // unknown error \n}\n
',1),i={};var l=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Returns an Error's "),o,(0,e.eW)(", if an "),(0,e.Lk)("a",p,[r,(0,e.bF)(a)]),(0,e.eW)(" instance is provided. Otherwise, a default message is returned.")]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/exceptions/getErrorMessage.html","title":"Get Error Message","lang":"en-GB","frontmatter":{"title":"Get Error Message","description":"Obtain error or default message.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/exceptions/getErrorMessage.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getNameOrDesc.html.687020eb.js b/assets/js/getNameOrDesc.html.687020eb.js new file mode 100644 index 00000000..67bccd38 --- /dev/null +++ b/assets/js/getNameOrDesc.html.687020eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1705],{2075:function(a,n,s){s.r(n),s.d(n,{comp:function(){return r},data:function(){return l}});var e=s(641);const t={id:"getnameordesc",tabindex:"-1"},c={class:"header-anchor",href:"#getnameordesc"},o=(0,e.Lk)("code",null,"getNameOrDesc",-1),p=(0,e.Fv)('
import { getNameOrDesc } from '@aedart/support/reflections';\n\nclass ApiService {}\n\ngetNameOrDesc(ApiService); // ApiService\ngetNameOrDesc(class {});   // [object Function]\n
',1),i={};var r=(0,s(6262).A)(i,[["render",function(a,n){const s=(0,e.g2)("Badge"),i=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",c,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(s,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Returns target class' "),(0,e.bF)(i,{to:"/archive/current/packages/support/reflections/getConstructorName.html"},{default:(0,e.k6)((()=>[(0,e.eW)("constructor name")])),_:1}),(0,e.eW)(", or "),(0,e.bF)(i,{to:"/archive/current/packages/support/misc/descTag.html"},{default:(0,e.k6)((()=>[(0,e.eW)("description tag")])),_:1}),(0,e.eW)(" if name is not available.")]),p])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/reflections/getNameOrDesc.html","title":"Get Name Or Desc. Tag","lang":"en-GB","frontmatter":{"title":"Get Name Or Desc. Tag","description":"Get name of target class\' constructor, or description tag","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getNameOrDesc.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/getParentOfClass.html.bb3ce886.js b/assets/js/getParentOfClass.html.bb3ce886.js new file mode 100644 index 00000000..3f221605 --- /dev/null +++ b/assets/js/getParentOfClass.html.bb3ce886.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5067],{7836:function(s,n,a){a.r(n),a.d(n,{comp:function(){return r},data:function(){return u}});var e=a(641);const t={id:"getparentofclass",tabindex:"-1"},l={class:"header-anchor",href:"#getparentofclass"},p=(0,e.Lk)("code",null,"getParentOfClass",-1),c=(0,e.Fv)('

Returns the parent class of given target class, or null if class does not have a parent.

import { getParentOfClass } from '@aedart/support/reflections';\n\nclass A {}\n\nclass B extends A {}\n\nclass C extends B {}\n\ngetParentOfClass(A); // null\ngetParentOfClass(B); // A\ngetParentOfClass(C); // B\n
',2),o=(0,e.Lk)("code",null,"getAllParentsOfClass()",-1),i={};var r=(0,a(6262).A)(i,[["render",function(s,n){const a=(0,e.g2)("Badge"),i=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",l,[(0,e.Lk)("span",null,[p,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See also "),(0,e.bF)(i,{to:"/archive/current/packages/support/reflections/getAllParentsOfClass.html"},{default:(0,e.k6)((()=>[o])),_:1}),(0,e.eW)(".")])])])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/reflections/getParentOfClass.html","title":"Get Parent Of Class","lang":"en-GB","frontmatter":{"title":"Get Parent Of Class","description":"Get parent class.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/getParentOfClass.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/has.html.4debffef.js b/assets/js/has.html.4debffef.js new file mode 100644 index 00000000..130670c2 --- /dev/null +++ b/assets/js/has.html.4debffef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3246],{9586:function(n,s,a){a.r(s),a.d(s,{comp:function(){return i},data:function(){return u}});var e=a(641);const t=(0,e.Lk)("h1",{id:"has",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#has"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"has")])])],-1),p={href:"https://lodash.com/docs/4.17.15#hasIn",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Lk)("code",null,"hasIn",-1),l=(0,e.Lk)("code",null,"isset()",-1),r=(0,e.Fv)('
import { has } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        c: {\n            age: 24\n        }\n    },\n};\n\nlet result = has(target, 'b.c.age');\nconsole.log(result); // true\n
',1),c={};var i=(0,a(6262).A)(c,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),c=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Determine if path is a property of given object. "),(0,e.Lk)("em",null,[(0,e.eW)("Method is an alias for "),(0,e.Lk)("a",p,[(0,e.eW)("Lodash "),o,(0,e.bF)(a)]),(0,e.eW)(".")])]),(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See also "),(0,e.bF)(c,{to:"/archive/current/packages/support/objects/isset.html"},{default:(0,e.k6)((()=>[l])),_:1}),(0,e.eW)(".")])]),r])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/objects/has.html","title":"Has","lang":"en-GB","frontmatter":{"title":"Has","description":"Determine if object path is a property.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/has.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasAll.html.ccff6c37.js b/assets/js/hasAll.html.ccff6c37.js new file mode 100644 index 00000000..07dba59f --- /dev/null +++ b/assets/js/hasAll.html.ccff6c37.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8423],{1747:function(n,s,a){a.r(s),a.d(s,{comp:function(){return i},data:function(){return r}});var t=a(641);const p=(0,t.Lk)("h1",{id:"hasall",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#hasall"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"hasAll")])])],-1),e=(0,t.Lk)("p",null,"Determine if all paths are properties of given object.",-1),o=(0,t.Lk)("code",null,"isset()",-1),l=(0,t.Fv)('
import { hasAll } from "@aedart/support/objects";\n\nconst mySymbol = Symbol('my-symbol');\nconst target = {\n    a: 1234,\n    b: {\n        name: 'Sven',\n        c: {\n            age: 24,\n            [mySymbol]: true\n        }\n    },\n    d: [\n        { name: 'Jane'},\n        { name: 'Ashley'},\n    ],\n};\n\nconst paths = [\n    'a',\n    'b.name',\n    'b.c.age',\n    ['b', 'c', mySymbol],\n    'd[0]',\n    'd[1].name',\n];\n\nlet result = hasAll(target, paths);\nconsole.log(result); // true\n
',1),c={};var i=(0,a(6262).A)(c,[["render",function(n,s){const a=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[p,e,(0,t.Lk)("p",null,[(0,t.Lk)("em",null,[(0,t.eW)("See also "),(0,t.bF)(a,{to:"/archive/current/packages/support/objects/isset.html"},{default:(0,t.k6)((()=>[o])),_:1}),(0,t.eW)(".")])]),l])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/objects/hasAll.html","title":"Has All","lang":"en-GB","frontmatter":{"title":"Has All","description":"Determine if all object paths are properties.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/hasAll.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasAllMethods.html.42db66cc.js b/assets/js/hasAllMethods.html.42db66cc.js new file mode 100644 index 00000000..554950f8 --- /dev/null +++ b/assets/js/hasAllMethods.html.42db66cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1901],{11:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return r}});var t=a(641);const e={id:"hasallmethods",tabindex:"-1"},o={class:"header-anchor",href:"#hasallmethods"},p=(0,t.Lk)("code",null,"hasAllMethods",-1),c=(0,t.Fv)('

Determine if given target object contains all given methods.

It accepts the following arguments:

  • target: object - The target.
  • ...methods: PropertyKey[] - Names of the methods to check for.
import { hasAllMethods } from '@aedart/support/reflections';\n\nconst a = {\n    foo: () => { /* ...not shown... */ },\n    bar: () => { /* ...not shown... */ },\n}\n\nhasAllMethods(a, 'foo', 'bar'); // true\nhasAllMethods(a, 'foo', 'bar', 'zar'); // false\n
',4),l=(0,t.Lk)("code",null,"hasMethod()",-1),i={};var u=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,t.g2)("Badge"),i=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",o,[(0,t.Lk)("span",null,[p,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c,(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(i,{to:"/archive/current/packages/support/reflections/hasMethod.html"},{default:(0,t.k6)((()=>[l])),_:1}),(0,t.eW)(".")])])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/hasAllMethods.html","title":"Has All Methods","lang":"en-GB","frontmatter":{"title":"Has All Methods","description":"Determine if target has all methods","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710155538000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/reflections/hasAllMethods.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasAny.html.6704b902.js b/assets/js/hasAny.html.6704b902.js new file mode 100644 index 00000000..beb431b0 --- /dev/null +++ b/assets/js/hasAny.html.6704b902.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9150],{4079:function(n,s,a){a.r(s),a.d(s,{comp:function(){return o},data:function(){return c}});var e=a(641);const t=[(0,e.Fv)('

hasAny

Determine if any paths are properties of given object.

import { hasAny } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        name: 'Sven',\n        c: {\n            age: 24\n        }\n    }\n};\n\nconst paths = [\n    'z', // does not exist\n    'b.c.name', // does not exist\n    'b.c.age', // exist\n];\n\nlet result = hasAny(target, paths);\nconsole.log(result); // true\n
',3)],p={};var o=(0,a(6262).A)(p,[["render",function(n,s){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const c=JSON.parse('{"path":"/archive/current/packages/support/objects/hasAny.html","title":"Has Any","lang":"en-GB","frontmatter":{"title":"Has Any","description":"Determine if any object paths are properties.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/hasAny.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasMethod.html.04c1131e.js b/assets/js/hasMethod.html.04c1131e.js new file mode 100644 index 00000000..f613df89 --- /dev/null +++ b/assets/js/hasMethod.html.04c1131e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8483],{1451:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return r}});var t=a(641);const e={id:"hasmethod",tabindex:"-1"},o={class:"header-anchor",href:"#hasmethod"},p=(0,t.Lk)("code",null,"hasMethod",-1),c=(0,t.Fv)('

Determine if given target object contains method.

It accepts the following arguments:

  • target: object - The target.
  • method: PropertyKey - Name of the method to check for.
import { hasMethod } from '@aedart/support/reflections';\n\nconst a = {\n    foo: () => { /* ...not shown... */ },\n    bar: () => { /* ...not shown... */ },\n}\n\nhasMethod(a, 'foo'); // true\nhasMethod(a, 'bar'); // true\nhasMethod(a, 'zar'); // false\n
',4),i=(0,t.Lk)("code",null,"isMethod()",-1),l={};var u=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,t.g2)("Badge"),l=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",o,[(0,t.Lk)("span",null,[p,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c,(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(l,{to:"/archive/current/packages/support/reflections/isMethod.html"},{default:(0,t.k6)((()=>[i])),_:1}),(0,t.eW)(".")])])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/hasMethod.html","title":"Has Method","lang":"en-GB","frontmatter":{"title":"Has Method","description":"Determine if target has method","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710155538000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/reflections/hasMethod.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasPrototypeProperty.html.89ee5d31.js b/assets/js/hasPrototypeProperty.html.89ee5d31.js new file mode 100644 index 00000000..e91f9aa1 --- /dev/null +++ b/assets/js/hasPrototypeProperty.html.89ee5d31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3287],{6195:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return r}});var t=a(641);const p={id:"hasprototypeproperty",tabindex:"-1"},o={class:"header-anchor",href:"#hasprototypeproperty"},e=(0,t.Lk)("code",null,"hasPrototypeProperty",-1),c=(0,t.Fv)('

Determines if object has a prototype property defined and that it is not null or undefined.

import { hasPrototypeProperty } from '@aedart/support/reflections';\n\nhasPrototypeProperty(null); // false\nhasPrototypeProperty(Object.create(null)); // false\nhasPrototypeProperty({ __proto__: undefined }); // false\nhasPrototypeProperty({ prototype: null }); // false\nhasPrototypeProperty(() => true); // false\n\nhasPrototypeProperty(Object.create({ prototype: {} })); // true\nhasPrototypeProperty({ __proto__: function() {} }); // true\nhasPrototypeProperty(function() {}); // true\nhasPrototypeProperty(class {}); // true\n
',2),u={};var l=(0,a(6262).A)(u,[["render",function(n,s){const a=(0,t.g2)("Badge");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",p,[(0,t.Lk)("a",o,[(0,t.Lk)("span",null,[e,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/hasPrototypeProperty.html","title":"Has Prototype Property","lang":"en-GB","frontmatter":{"title":"Has Prototype Property","description":"Determine if \\"prototype\\" property exists.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/hasPrototypeProperty.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hasUniqueId.html.f01d682a.js b/assets/js/hasUniqueId.html.f01d682a.js new file mode 100644 index 00000000..0f046b89 --- /dev/null +++ b/assets/js/hasUniqueId.html.f01d682a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8852],{1862:function(n,a,s){s.r(a),s.d(a,{comp:function(){return r},data:function(){return d}});var e=s(641);const t={id:"hasuniqueid",tabindex:"-1"},i={class:"header-anchor",href:"#hasuniqueid"},p=(0,e.Lk)("code",null,"hasUniqueId",-1),o=(0,e.Lk)("p",null,"Determine if an object has a unique id.",-1),c=(0,e.Lk)("code",null,"uniqueId",-1),u=(0,e.Fv)('
import { hasUniqueId } from "@aedart/support/objects";\n\nconst target = {\n    name: 'Ursula'\n};\n\nconsole.log(hasUniqueId(target)); // false\n
',1),l={};var r=(0,s(6262).A)(l,[["render",function(n,a){const s=(0,e.g2)("Badge"),l=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[p,(0,e.eW)(),(0,e.bF)(s,{type:"tip",text:"Available since v0.6",vertical:"middle"})])])]),o,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See "),(0,e.bF)(l,{to:"/archive/current/packages/support/objects/uniqueId.html"},{default:(0,e.k6)((()=>[c])),_:1}),(0,e.eW)(" for additional details.")])]),u])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/objects/hasUniqueId.html","title":"Has Unique ID","lang":"en-GB","frontmatter":{"title":"Has Unique ID","description":"Determine if object has a unique id.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/hasUniqueId.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/hooks.html.ba015dd6.js b/assets/js/hooks.html.ba015dd6.js new file mode 100644 index 00000000..edb4ea9e --- /dev/null +++ b/assets/js/hooks.html.ba015dd6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[2822],{6940:function(n,s,a){a.r(s),a.d(s,{comp:function(){return r},data:function(){return l}});var t=a(641);const e=(0,t.Lk)("h1",{id:"hooks",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#hooks"},[(0,t.Lk)("span",null,"Hooks")])],-1),o=(0,t.Lk)("p",null,"Concerns offer a few hook methods. These can be used to perform advanced setup or initialisation logic.",-1),p={class:"table-of-contents"},c=(0,t.Fv)('

BEFORE Registration

To perform pre-registration logic, use the static BEFORE method in your concern class. This hook method is invoked before the concern container and aliases are defined in the target class.

The method accepts the following arguments:

  • target: UsesConcerns - the target class (class constructor!).
import { BEFORE } from "@aedart/contracts/support/concerns";\nimport { AbstractConcern } from "@aedart/support/concerns";\nimport { isSubclass } from '@aedart/support/reflections';\n\nimport { JobHandler } from '@acme/jobs';\n\nclass RecordsJobs extends AbstractConcern {\n    \n    static [BEFORE](target) {\n        // E.g. prevent this concern from being used by all kinds of targets...\n        if (!isSubclass(target, JobHandler)) {\n            throw new TypeError('RecordsJobs can only be used by JobHandler');\n        }\n    }\n}\n

AFTER Registration

To perform post-registration logic, use the static AFTER method in your concern class. This method is invoked after the concern container and aliases have been defined in target's prototype.

The method accepts the following arguments:

  • target: UsesConcerns - the target class (class constructor!).
import { AFTER } from "@aedart/contracts/support/concerns";\nimport { AbstractConcern } from "@aedart/support/concerns";\n\nimport { ApiConnection } from '@acme/api';\n\nclass RecordsJobs extends AbstractConcern {\n    \n    static [AFTER](target) {\n        // E.g. init or setup static resources...\n        ApiConnection.init();\n    }\n}\n
',10),i={};var r=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,t.g2)("router-link");return(0,t.uX)(),(0,t.CE)("div",null,[e,o,(0,t.Lk)("nav",p,[(0,t.Lk)("ul",null,[(0,t.Lk)("li",null,[(0,t.bF)(a,{to:"#before-registration"},{default:(0,t.k6)((()=>[(0,t.eW)("BEFORE Registration")])),_:1})]),(0,t.Lk)("li",null,[(0,t.bF)(a,{to:"#after-registration"},{default:(0,t.k6)((()=>[(0,t.eW)("AFTER Registration")])),_:1})])])]),c])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/concerns/hooks.html","title":"Hooks","lang":"en-GB","frontmatter":{"title":"Hooks","description":"How to use registration hooks","sidebarDepth":0},"headers":[{"level":2,"title":"BEFORE Registration","slug":"before-registration","link":"#before-registration","children":[]},{"level":2,"title":"AFTER Registration","slug":"after-registration","link":"#after-registration","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/hooks.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/includesAll.html.dedc848a.js b/assets/js/includesAll.html.dedc848a.js new file mode 100644 index 00000000..61bd177c --- /dev/null +++ b/assets/js/includesAll.html.dedc848a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4610],{5567:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return l}});var t=s(641);const e=[(0,t.Fv)('

includesAll

Determines if an array includes all values.

import { includesAll } from '@aedart/support/arrays';\n\nconst arr = [ 1, 2, 3 ];\n\nincludesAll(arr, [ 1, 2 ]); // true\nincludesAll(arr, [ 1, 4 ]); // false\n
',3)],p={};var c=(0,s(6262).A)(p,[["render",function(n,a){return(0,t.uX)(),(0,t.CE)("div",null,e)}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/arrays/includesAll.html","title":"Includes All","lang":"en-GB","frontmatter":{"title":"Includes All","description":"Determine if array contains all values.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/includesAll.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/includesAny.html.2465015b.js b/assets/js/includesAny.html.2465015b.js new file mode 100644 index 00000000..16b95edd --- /dev/null +++ b/assets/js/includesAny.html.2465015b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5943],{1465:function(n,s,a){a.r(s),a.d(s,{comp:function(){return c},data:function(){return o}});var e=a(641);const t=[(0,e.Fv)('

includesAny

Determines if an array includes some values.

import { includesAny } from '@aedart/support/arrays';\n\nconst arr = [ 1, 2, 3 ];\n\nincludesAll(arr, [ 4, 2 ]); // true\nincludesAll(arr, [ 5, 5 ]); // false\n
',3)],p={};var c=(0,a(6262).A)(p,[["render",function(n,s){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const o=JSON.parse('{"path":"/archive/current/packages/support/arrays/includesAny.html","title":"Includes Any","lang":"en-GB","frontmatter":{"title":"Includes Any","description":"Determine if array contains some values.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/includesAny.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/index.html.3cddfd92.js b/assets/js/index.html.3cddfd92.js new file mode 100644 index 00000000..690771c1 --- /dev/null +++ b/assets/js/index.html.3cddfd92.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4470],{7367:function(n,a,s){s.r(a),s.d(a,{comp:function(){return N},data:function(){return P}});var e=s(641);const t=(0,e.Lk)("h1",{id:"release-notes",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#release-notes"},[(0,e.Lk)("span",null,"Release Notes")])],-1),i={class:"custom-container danger"},o=(0,e.Lk)("p",{class:"custom-container-title"},"DANGER",-1),p=(0,e.Lk)("p",null,[(0,e.eW)("Ion is still in development. You "),(0,e.Lk)("em",null,"SHOULD NOT"),(0,e.eW)(" use any of the packages in a production environment. Breaking changes "),(0,e.Lk)("em",null,[(0,e.Lk)("strong",null,"MUST")]),(0,e.eW)(" be expected for all "),(0,e.Lk)("code",null,"v0.x"),(0,e.eW)(" releases!")],-1),c={href:"https://github.com/aedart/ion/blob/main/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Lk)("code",null,"CHANGELOG.md",-1),r={class:"table-of-contents"},u=(0,e.Fv)('

Support Policy

VersionTypeScriptECMA ScriptReleaseSecurity Fixes Until
1.x5.0 - ?TBDTBDTBD
0.x*5.0ES2022ongoing releasesuntil v1.x release

*: current supported version.

TBD: "To be decided".

v0.x Highlights

',5),d={id:"service-container",tabindex:"-1"},k={class:"header-anchor",href:"#service-container"},m=(0,e.Fv)('

An adaptation of Laravel's Service Container that offers a way to with powerful tool to manage dependencies and perform dependency injection.

import { Container } from "@aedart/container";\n\ncontainer.bind('storage', () => {\n    return new CloudService('s3');\n});\n\n// Later in your application.\nconst storage = container.make('storage');\n
',2),v={id:"facades",tabindex:"-1"},b={class:"header-anchor",href:"#facades"},h=(0,e.Fv)('

Adaptation of Laravel's Facade component. It acts as an interface or gateway to an underlying object that is resolved from the Service Container.

import { Facade } from "@aedart/support/facades";\n\nexport default class ApiFacade extends Facade\n{\n    static getIdentifier()\n    {\n        return 'api_client';\n    }\n}\n\n// Later in your application\nconst promise = ApiFacade.obtain().fetch('https://acme.com/api/users');\n
',2),g={id:"concerns",tabindex:"-1"},f={class:"header-anchor",href:"#concerns"},y=(0,e.Fv)('
import { use, AbstractConcern } from "@aedart/support/concerns";\n\n// A concern class...\nclass Role extends AbstractConcern {\n    addRole(name) {\n        /* ...not shown... */\n    }\n}\n\n// Use concern in target class...\n@use(Role)\nclass User {}\n\n// Later in your application...\nconst user = new User();\nuser.addRole('maintainer');\nuser.addRole('supporter');\n
',1),L={id:"merge",tabindex:"-1"},w={class:"header-anchor",href:"#merge"},x={href:"https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy",target:"_blank",rel:"noopener noreferrer"},F=(0,e.Fv)('
import { merge } from "@aedart/support/objects";\n\nconst a = {\n    'name': 'Alin',\n};\n\nconst b = {\n    'address': {\n        'street': 'Northern Street 1'\n    },\n};\n\nconst result = merge(a, b); // { 'name': 'Alin', 'address': { 'street': '...' } }\n
',1),A={id:"mixins",tabindex:"-1"},W={class:"header-anchor",href:"#mixins"},j={href:"https://github.com/justinfagnani/mixwith.js",target:"_blank",rel:"noopener noreferrer"},M=(0,e.Lk)("code",null,"mixwith.js",-1),D=(0,e.Fv)('
import { mix, Mixin } from "@aedart/support/mixins";\n\nconst NameMixin = Mixin((superclass) => class extends superclass {\n    #name;\n    \n    set name(value) {\n        this.#name = value;\n    }\n    \n    get name() {\n        return this.#name;\n    }\n});\n\nclass Item extends mix().with(\n    NameMixin\n) {}\n\n// ...Later in your application\nconst item = new Item();\nitem.name = 'My Item';\n\nconsole.log(item.name); // My Item\n
',1),E=(0,e.Lk)("code",null,"@aedart/support/mixins",-1),C={id:"target-meta-decorator",tabindex:"-1"},_={class:"header-anchor",href:"#target-meta-decorator"},S=(0,e.Fv)('
import {targetMeta, getTargetMeta} from '@aedart/support/meta';\n\nclass Service {\n\n    @targetMeta('desc', 'Seaches for cities')\n    search() {\n        // ...not shown...\n    }\n}\n\nconst instance = new Service();\n\n// ...later in your application...\ngetTargetMeta(instance.search, 'desc'); // Seaches for cities\n
',1),Z={id:"meta-decorator",tabindex:"-1"},I={class:"header-anchor",href:"#meta-decorator"},T=(0,e.Fv)('
import {meta, getMeta} from '@aedart/support/meta';\n\n@meta('description', 'Able to search for locations')\nclass Service {}\n\ngetMeta(Service, 'description'); // Able to search for locations\n
',1),R={id:"support",tabindex:"-1"},q={class:"header-anchor",href:"#support"},O={id:"vuepress-utils",tabindex:"-1"},U={class:"header-anchor",href:"#vuepress-utils"},B=(0,e.Lk)("code",null,"Archive",-1),H={};var N=(0,s(6262).A)(H,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon"),H=(0,e.g2)("router-link"),N=(0,e.g2)("Badge"),P=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("div",i,[o,p,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("Please review the "),(0,e.Lk)("a",c,[l,(0,e.bF)(s)]),(0,e.eW)(" for additional details.")])])]),(0,e.Lk)("nav",r,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#support-policy"},{default:(0,e.k6)((()=>[(0,e.eW)("Support Policy")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#v0-x-highlights"},{default:(0,e.k6)((()=>[(0,e.eW)("v0.x Highlights")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#service-container"},{default:(0,e.k6)((()=>[(0,e.eW)("Service Container "),(0,e.bF)(N,{type:"tip",text:"Available since v0.11"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#facades"},{default:(0,e.k6)((()=>[(0,e.eW)("Facades "),(0,e.bF)(N,{type:"tip",text:"Available since v0.11"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#concerns"},{default:(0,e.k6)((()=>[(0,e.eW)("Concerns "),(0,e.bF)(N,{type:"tip",text:"Available since v0.9"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#merge"},{default:(0,e.k6)((()=>[(0,e.eW)("Merge "),(0,e.bF)(N,{type:"tip",text:"Available since v0.9"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#mixins"},{default:(0,e.k6)((()=>[(0,e.eW)("Mixins "),(0,e.bF)(N,{type:"tip",text:"Available since v0.8"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#target-meta-decorator"},{default:(0,e.k6)((()=>[(0,e.eW)('"Target" Meta Decorator '),(0,e.bF)(N,{type:"tip",text:"Available since v0.7"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#meta-decorator"},{default:(0,e.k6)((()=>[(0,e.eW)("Meta Decorator "),(0,e.bF)(N,{type:"tip",text:"Available since v0.6"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#support"},{default:(0,e.k6)((()=>[(0,e.eW)("Support "),(0,e.bF)(N,{type:"tip",text:"Available since v0.3"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(H,{to:"#vuepress-utils"},{default:(0,e.k6)((()=>[(0,e.eW)("Vuepress Utils "),(0,e.bF)(N,{type:"tip",text:"Available since v0.1"})])),_:1})])])])])]),u,(0,e.Lk)("h3",d,[(0,e.Lk)("a",k,[(0,e.Lk)("span",null,[(0,e.eW)("Service Container "),(0,e.bF)(N,{type:"tip",text:"Available since v0.11"})])])]),m,(0,e.Lk)("p",null,[(0,e.eW)("For additional examples, see the "),(0,e.bF)(P,{to:"/archive/current/packages/container/"},{default:(0,e.k6)((()=>[(0,e.eW)("Service Container documentation")])),_:1}),(0,e.eW)(".")]),(0,e.Lk)("h3",v,[(0,e.Lk)("a",b,[(0,e.Lk)("span",null,[(0,e.eW)("Facades "),(0,e.bF)(N,{type:"tip",text:"Available since v0.11"})])])]),h,(0,e.Lk)("p",null,[(0,e.eW)("See the "),(0,e.bF)(P,{to:"/archive/current/packages/support/facades/"},{default:(0,e.k6)((()=>[(0,e.eW)("Facades documentation")])),_:1}),(0,e.eW)(" for additional details.")]),(0,e.Lk)("h3",g,[(0,e.Lk)("a",f,[(0,e.Lk)("span",null,[(0,e.eW)("Concerns "),(0,e.bF)(N,{type:"tip",text:"Available since v0.9"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Intended as an alternative to mixins, the "),(0,e.bF)(P,{to:"/archive/current/packages/support/concerns/"},{default:(0,e.k6)((()=>[(0,e.eW)("Concerns")])),_:1}),(0,e.eW)(" submodule offers a different way to overcome some of the limitations of single inheritance.")]),y,(0,e.Lk)("h3",L,[(0,e.Lk)("a",w,[(0,e.Lk)("span",null,[(0,e.eW)("Merge "),(0,e.bF)(N,{type:"tip",text:"Available since v0.9"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Objects "),(0,e.bF)(P,{to:"/archive/current/packages/support/objects/merge.html"},{default:(0,e.k6)((()=>[(0,e.eW)("merge")])),_:1}),(0,e.eW)(" utility, using "),(0,e.Lk)("a",x,[(0,e.eW)("deep copy"),(0,e.bF)(s)]),(0,e.eW)(".")]),F,(0,e.Lk)("h3",A,[(0,e.Lk)("a",W,[(0,e.Lk)("span",null,[(0,e.eW)("Mixins "),(0,e.bF)(N,{type:"tip",text:"Available since v0.8"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Adaptation of Justin Fagnani's "),(0,e.Lk)("a",j,[M,(0,e.bF)(s)]),(0,e.eW)(".")]),D,(0,e.Lk)("p",null,[(0,e.eW)("See details and more examples in the "),(0,e.bF)(P,{to:"/archive/current/packages/support/mixins/"},{default:(0,e.k6)((()=>[E,(0,e.eW)(" documentation")])),_:1}),(0,e.eW)(".")]),(0,e.Lk)("h3",C,[(0,e.Lk)("a",_,[(0,e.Lk)("span",null,[(0,e.eW)('"Target" Meta Decorator '),(0,e.bF)(N,{type:"tip",text:"Available since v0.7"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Associate arbitrary metadata directly with the target element that is being decorated. "),(0,e.Lk)("em",null,[(0,e.eW)("See "),(0,e.bF)(P,{to:"/archive/current/packages/support/meta/targetMeta.html"},{default:(0,e.k6)((()=>[(0,e.eW)("target meta decorator")])),_:1}),(0,e.eW)(" fro additional details.")])]),S,(0,e.Lk)("h3",Z,[(0,e.Lk)("a",I,[(0,e.Lk)("span",null,[(0,e.eW)("Meta Decorator "),(0,e.bF)(N,{type:"tip",text:"Available since v0.6"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.bF)(P,{to:"/archive/current/packages/support/meta/"},{default:(0,e.k6)((()=>[(0,e.eW)("meta decorator")])),_:1}),(0,e.eW)(" is able to associate arbitrary metadata with a class and its elements.")]),T,(0,e.Lk)("h3",R,[(0,e.Lk)("a",q,[(0,e.Lk)("span",null,[(0,e.eW)("Support "),(0,e.bF)(N,{type:"tip",text:"Available since v0.3"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("A package intended to contain various helpers and utilities. At the moment, the package comes with a few "),(0,e.bF)(P,{to:"/archive/current/packages/support/objects/"},{default:(0,e.k6)((()=>[(0,e.eW)("object utilities")])),_:1}),(0,e.eW)(". See "),(0,e.bF)(P,{to:"/archive/current/packages/support/"},{default:(0,e.k6)((()=>[(0,e.eW)("package documentation")])),_:1}),(0,e.eW)(" for more details.")]),(0,e.Lk)("h3",O,[(0,e.Lk)("a",U,[(0,e.Lk)("span",null,[(0,e.eW)("Vuepress Utils "),(0,e.bF)(N,{type:"tip",text:"Available since v0.1"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Utilities for vuepress sites, which includes an "),B,(0,e.eW)(" component for structuring documentation into an archive. See "),(0,e.bF)(P,{to:"/archive/current/packages/vuepress-utils/"},{default:(0,e.k6)((()=>[(0,e.eW)("package documentation")])),_:1}),(0,e.eW)(" for details.")])])}]]);const P=JSON.parse('{"path":"/archive/current/","title":"Release Notes","lang":"en-GB","frontmatter":{"title":"Release Notes","description":"Ion Release Notes","sidebarDepth":0},"headers":[{"level":2,"title":"Support Policy","slug":"support-policy","link":"#support-policy","children":[]},{"level":2,"title":"v0.x Highlights","slug":"v0-x-highlights","link":"#v0-x-highlights","children":[{"level":3,"title":"Service Container","slug":"service-container","link":"#service-container","children":[]},{"level":3,"title":"Facades","slug":"facades","link":"#facades","children":[]},{"level":3,"title":"Concerns","slug":"concerns","link":"#concerns","children":[]},{"level":3,"title":"Merge","slug":"merge","link":"#merge","children":[]},{"level":3,"title":"Mixins","slug":"mixins","link":"#mixins","children":[]},{"level":3,"title":"\\"Target\\" Meta Decorator","slug":"target-meta-decorator","link":"#target-meta-decorator","children":[]},{"level":3,"title":"Meta Decorator","slug":"meta-decorator","link":"#meta-decorator","children":[]},{"level":3,"title":"Support","slug":"support","link":"#support","children":[]},{"level":3,"title":"Vuepress Utils","slug":"vuepress-utils","link":"#vuepress-utils","children":[]}]}],"git":{"updatedTime":1712661024000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":9},{"name":"alin","email":"alin@rspsystems.com","commits":7}]},"filePathRelative":"archive/current/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},6286:function(n,a,s){s.r(a),s.d(a,{comp:function(){return m},data:function(){return v}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o=(0,e.Lk)("code",null,"@aedart/container",-1),p={href:"https://laravel.com/docs/11.x/container",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/laravel/framework/blob/11.x/src/Illuminate/Container/LICENSE.md",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Lk)("p",null,"The tools provided by this package give you a way to:",-1),r=(0,e.Lk)("li",null,"Manage class dependencies",-1),u={href:"https://en.wikipedia.org/wiki/Dependency_injection",target:"_blank",rel:"noopener noreferrer"},d=(0,e.Fv)('

Example

Bindings

Imagine that you have an Api client (or any component for that matter). Whenever it is needed, you want it to be injected into components that depend on it.

export default class ApiClient\n{\n    // ...implementation not shown...\n}\n

To ensure that dependency injection can be performed, you must first bind the component in the service container. Each binding requires a unique identifier, e.g. a string, symbol, number...etc.

import { Container } from "@aedart/container";\nimport { ApiClient } from "@acme/api";\n\nconst container = Container.getInstance();\n\n// Bind 'my_api_client' to the ApiClient component...\ncontainer.bind('my_api_client', ApiClient);\n

Define Dependencies

To define the dependencies of a component, use the dependencies() decorator. By itself, the decorator does not do anything more than to associate a component with one or more dependencies (binding identifiers). In other words, the decorator does not automatically inject anything into your class. It only registers the dependencies as metadata onto a class.

import { dependencies } from "@aedart/support/container";\n\n@dependencies('my_api_client')\nexport default class BookService\n{\n    apiClient;\n    \n    constructor(client) {\n        this.apiClient = client;\n    }\n    \n    // ...remaining not shown...\n}\n

Resolve

When you want to resolve a component, with all of its dependencies injected into it, use the service container's make() method.

import { Container } from "@aedart/container";\nimport { BookService } from "@acme/app/services";\n\nconst bookService = Container.getInstance().make(BookService);\n\nconsole.log(bookService.apiClient); // ApiClient\n

Onward

The above shown example illustrates the most basic usage of the service container. Throughout the remaining of this package's documentation, more examples and use-cases are covered.

',14),k={};var m=(0,s(6262).A)(k,[["render",function(n,a){const s=(0,e.g2)("Badge"),k=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"tip",text:"Available since v0.11",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Browser",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("The "),o,(0,e.eW)(" package offers an adaptation of "),(0,e.Lk)("a",p,[(0,e.eW)("Laravel's Service Container"),(0,e.bF)(k)]),(0,e.eW)(" ("),(0,e.Lk)("em",null,[(0,e.eW)("originally licensed under "),(0,e.Lk)("a",c,[(0,e.eW)("MIT"),(0,e.bF)(k)])]),(0,e.eW)(").")]),l,(0,e.Lk)("ul",null,[r,(0,e.Lk)("li",null,[(0,e.eW)("Perform "),(0,e.Lk)("a",u,[(0,e.eW)("dependency injection"),(0,e.bF)(k)])])]),d])}]]);const v=JSON.parse('{"path":"/archive/current/packages/container/","title":"Introduction","lang":"en-GB","frontmatter":{"title":"Introduction","description":"Ion Service Container package","sidebarDepth":0},"headers":[{"level":2,"title":"Example","slug":"example","link":"#example","children":[{"level":3,"title":"Bindings","slug":"bindings","link":"#bindings","children":[]},{"level":3,"title":"Define Dependencies","slug":"define-dependencies","link":"#define-dependencies","children":[]},{"level":3,"title":"Resolve","slug":"resolve","link":"#resolve","children":[]},{"level":3,"title":"Onward","slug":"onward","link":"#onward","children":[]}]}],"git":{"updatedTime":1712565593000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/packages/container/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},8272:function(n,a,s){s.r(a),s.d(a,{comp:function(){return l},data:function(){return r}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o=(0,e.Lk)("p",null,"The contracts package contains types, interfaces and unique identifiers.",-1),p=(0,e.Lk)("p",null,[(0,e.Lk)("em",null,"More information available at a later point...")],-1),c={};var l=(0,s(6262).A)(c,[["render",function(n,a){const s=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"tip",text:"Available since v0.3",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Browser",vertical:"middle"})])])]),o,p])}]]);const r=JSON.parse('{"path":"/archive/current/packages/contracts/","title":"Introduction","lang":"en-GB","frontmatter":{"title":"Introduction","description":"Ion Support package","sidebarDepth":0},"headers":[],"git":{"updatedTime":1680807921000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/contracts/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},7957:function(n,a,s){s.r(a),s.d(a,{comp:function(){return h},data:function(){return g}});var e=s(641);const t=(0,e.Lk)("h1",{id:"packages",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#packages"},[(0,e.Lk)("span",null,"Packages")])],-1),i=(0,e.Lk)("p",null,"In here, you will find documentation for the available packages. A few things that might be good to know:",-1),o={class:"table-of-contents"},p=(0,e.Lk)("h2",{id:"environment",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#environment"},[(0,e.Lk)("span",null,"Environment")])],-1),c=(0,e.Lk)("p",null,[(0,e.Lk)("em",null,"You are of course welcome to use a package in a different environment than its original intent, if it is possible.")],-1),l=(0,e.Lk)("h2",{id:"available-since",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#available-since"},[(0,e.Lk)("span",null,"Available Since")])],-1),r=(0,e.Lk)("em",null,"available since x.y.z",-1),u=(0,e.Lk)("em",null,"or feature",-1),d=(0,e.Lk)("h2",{id:"not-released",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#not-released"},[(0,e.Lk)("span",null,"Not Released")])],-1),k=(0,e.Lk)("strong",null,"not yet been released",-1),m=(0,e.Lk)("h2",{id:"not-published",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#not-published"},[(0,e.Lk)("span",null,"Not Published")])],-1),v=(0,e.Lk)("em",null,"if documentation is made available about the package!",-1),b={};var h=(0,s(6262).A)(b,[["render",function(n,a){const s=(0,e.g2)("router-link"),b=(0,e.g2)("Badge"),h=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,i,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#environment"},{default:(0,e.k6)((()=>[(0,e.eW)("Environment")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#available-since"},{default:(0,e.k6)((()=>[(0,e.eW)("Available Since")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#not-released"},{default:(0,e.k6)((()=>[(0,e.eW)("Not Released")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#not-published"},{default:(0,e.k6)((()=>[(0,e.eW)("Not Published")])),_:1})])])]),p,(0,e.Lk)("p",null,[(0,e.eW)("Badges are used to indicate the environment that a package is intended for, e.g. "),(0,e.bF)(b,{type:"success",text:"Node",vertical:"middle"}),(0,e.bF)(b,{type:"success",text:"Browser",vertical:"middle"}),(0,e.eW)(".")]),c,l,(0,e.Lk)("p",null,[(0,e.eW)('The "'),r,(0,e.eW)('" badge might also be displayed, if a package '),u,(0,e.eW)(" was released during a minor version. E.g. "),(0,e.bF)(b,{type:"tip",text:"Available since v1.5",vertical:"middle"}),(0,e.eW)(".")]),d,(0,e.Lk)("p",null,[(0,e.eW)("Sometimes, documentation might be available for a package that has "),k,(0,e.eW)(". Usually it is tagged with a "),(0,e.bF)(b,{type:"warning",text:"Not Released",vertical:"middle"}),(0,e.eW)(" badge, "),(0,e.Lk)("em",null,[(0,e.eW)("unless the package documentation is located in "),(0,e.bF)(h,{to:"/archive/next/"},{default:(0,e.k6)((()=>[(0,e.eW)('"next" release"')])),_:1}),(0,e.eW)(".")])]),m,(0,e.Lk)("p",null,[(0,e.eW)("In rare situations, a package might only exist in the mono-repository and not published to npm's registry. Such a package is either experimental or internal, which means that it might not ever be published. Usually, it will be tagged with "),(0,e.bF)(b,{type:"danger",text:"Internal (not published)",vertical:"middle"}),(0,e.bF)(b,{type:"danger",text:"Experimental",vertical:"middle"}),(0,e.eW)(", or similar badges, "),v])])}]]);const g=JSON.parse('{"path":"/archive/current/packages/","title":"Introduction","lang":"en-GB","frontmatter":{"title":"Introduction","description":"Ion Packages","sidebarDepth":0},"headers":[{"level":2,"title":"Environment","slug":"environment","link":"#environment","children":[]},{"level":2,"title":"Available Since","slug":"available-since","link":"#available-since","children":[]},{"level":2,"title":"Not Released","slug":"not-released","link":"#not-released","children":[]},{"level":2,"title":"Not Published","slug":"not-published","link":"#not-published","children":[]}],"git":{"updatedTime":1706895598000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":6}]},"filePathRelative":"archive/current/packages/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},2019:function(n,a,s){s.r(a),s.d(a,{comp:function(){return l},data:function(){return r}});var e=s(641);const t={id:"about-arrays",tabindex:"-1"},i={class:"header-anchor",href:"#about-arrays"},o=(0,e.Lk)("code",null,"@aedart/support/arrays",-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",target:"_blank",rel:"noopener noreferrer"},c={};var l=(0,s(6262).A)(c,[["render",function(n,a){const s=(0,e.g2)("Badge"),c=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("About Arrays "),(0,e.bF)(s,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[o,(0,e.eW)(" contains "),(0,e.Lk)("a",p,[(0,e.eW)("array"),(0,e.bF)(c)]),(0,e.eW)(" related utilities.")])])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/arrays/","title":"About Arrays","lang":"en-GB","frontmatter":{"title":"About Arrays","description":"Array utilities."},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},990:function(n,a,s){s.r(a),s.d(a,{comp:function(){return k},data:function(){return m}});var e=s(641);const t={id:"about-concerns",tabindex:"-1"},i={class:"header-anchor",href:"#about-concerns"},o={href:"https://www.php.net/manual/en/language.oop5.traits.php",target:"_blank",rel:"noopener noreferrer"},p={href:"https://javascript.info/mixins",target:"_blank",rel:"noopener noreferrer"},c={href:"https://en.wikipedia.org/wiki/Dependency_injection",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Lk)("code",null,"@aedart/support/concerns",-1),r={href:"https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)#Types",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Fv)('

In this context, a "concern" is a class that can be injected into a target class, by means of the use() class decorator. The public properties and methods of the concern class are then "aliased" into the target class' prototype. In other words, "proxy" properties and methods are defined in the target class. They forward any interaction to the original properties and methods in the concern class instance.

Example

import { use, AbstractConcern } from "@aedart/support/concerns";\n\n// A concern class...\nclass ConsolePrinter extends AbstractConcern {\n    print(message) {\n        console.log(message);\n    }\n}\n\n// Taget class that uses a concern...\n@use(ConsolePrinter)\nclass Person {\n    \n    sayHi(name) {\n        // Call method in concern\n        this.print(`Hi ${name}`);\n    }\n}\n\n// Later in your application...\nconst person = new Person();\nperson.sayHi('Atrid'); // Hi Astrid\n\nperson.print('Ho ho ho...'); // Ho ho ho...\n
',3),d={};var k=(0,s(6262).A)(d,[["render",function(n,a){const s=(0,e.g2)("Badge"),d=(0,e.g2)("ExternalLinkIcon"),k=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("About Concerns "),(0,e.bF)(s,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Inspired by PHP's "),(0,e.Lk)("a",o,[(0,e.eW)("Traits"),(0,e.bF)(d)]),(0,e.eW)(", traditional "),(0,e.Lk)("a",p,[(0,e.eW)("mixins"),(0,e.bF)(d)]),(0,e.eW)(", and a few concepts from "),(0,e.Lk)("a",c,[(0,e.eW)("dependency injection"),(0,e.bF)(d)]),(0,e.eW)(", the "),l,(0,e.eW)(" submodule offers an alternative approach to reducing some of the limitations of "),(0,e.Lk)("a",r,[(0,e.eW)("single inheritance"),(0,e.bF)(d)]),(0,e.eW)(".")]),u,(0,e.Lk)("p",null,[(0,e.eW)("See also "),(0,e.bF)(k,{to:"/archive/current/packages/support/mixins/"},{default:(0,e.k6)((()=>[(0,e.eW)('"Real" mixins')])),_:1}),(0,e.eW)(" as an alternative.")])])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/concerns/","title":"About Concerns","lang":"en-GB","frontmatter":{"title":"About Concerns","description":"Alternative mixin utility.","sidebarDepth":0},"headers":[{"level":2,"title":"Example","slug":"example","link":"#example","children":[]}],"git":{"updatedTime":1709647122000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/concerns/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},4535:function(n,a,s){s.r(a),s.d(a,{comp:function(){return l},data:function(){return r}});var e=s(641);const t={id:"exceptions",tabindex:"-1"},i={class:"header-anchor",href:"#exceptions"},o=(0,e.Lk)("code",null,"@aedart/support/exceptions",-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#custom_error_types",target:"_blank",rel:"noopener noreferrer"},c={};var l=(0,s(6262).A)(c,[["render",function(n,a){const s=(0,e.g2)("Badge"),c=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Exceptions "),(0,e.bF)(s,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[o,(0,e.eW)(" offers a few utilities for working with "),(0,e.Lk)("a",p,[(0,e.eW)("Custom Errors"),(0,e.bF)(c)]),(0,e.eW)(".")])])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/exceptions/","title":"About Exceptions","lang":"en-GB","frontmatter":{"title":"About Exceptions","description":"Error & Exceptions utilities."},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/exceptions/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},9526:function(n,a,s){s.r(a),s.d(a,{comp:function(){return L},data:function(){return w}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o=(0,e.Lk)("code",null,"@aedart/support/facades",-1),p={href:"https://laravel.com/docs/11.x/facades",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/laravel/framework/blob/11.x/src/Illuminate/Container/LICENSE.md",target:"_blank",rel:"noopener noreferrer"},l={href:"https://en.wikipedia.org/wiki/Facade_pattern",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("em",null,"or gateway",-1),u=(0,e.Fv)('
import { Container } from "@aedart/support/facades";\n\nconst service = Container.obtain().make('api_service');\n
',1),d={class:"table-of-contents"},k=(0,e.Fv)('

Setup Facade's Service Container instance

Before you can make use of facades, you must ensure that the Facade abstraction has a service container instance set. This can be done via the static setContainer() method.

import { Container } from "@aedart/container";\nimport { Facade } from "@aedart/support/facades";\n\n// Somewhere in your application's setup or boot logic...\nFacade.setContainer(Container.getInstance());\n

Consequently, if you need to unset the Service Container instance and make sure that the Facade abstraction is cleared of any previously resolved object instances, invoke the static destroy() method.

Facade.destroy();\n

Define a Facade

',6),m=(0,e.Lk)("code",null,"Facade",-1),v=(0,e.Fv)('
import { Facade } from "@aedart/support/facades";\n\nexport default class ApiFacade extends Facade\n{\n    static getIdentifier()\n    {\n        return 'api_client';\n    }\n}\n

If you are using TypeScript, then you can also specify the return type of the obtain() method, by declaring the underlying resolved object's type, for the internal type property (type property is not used for any other purpose).

import type { Identifier } from "@aedart/contracts/container";\nimport { Facade } from "@aedart/support/facades";\nimport type { AcmeApiClient } from "@acme/contracts/api";\n\nexport default class ApiFacade extends Facade\n{\n    protected static type: AcmeApiClient;\n    \n    public static getIdentifier(): Identifier\n    {\n        return 'api_client';\n    }\n}\n

The obtain() method

The obtain() is used to obtain the Facade's underlying object instance. Typically, you do not need to do anything more than to implement the getIdentifier() method in your concrete facade class. But, in some situations you might need to resolve a binding differently. Or, perhaps perform some kind of additional post-resolve logic, in order to make easier / simpler to work with the resolved object.

export default class LimitedApiFacade extends Facade\n{\n    static getIdentifier()\n    {\n        return 'api_client';\n    }\n\n    /**\n     * @return {import('@acme/contracts/api').AcmeApiClient}\n     */\n    static obtain()\n    {\n        const client = this.resolve(this.getIdentifier());\n        client.error_response_thresshold = 3;\n        client.ttl = 350;\n        \n        return client;\n    }\n}\n
const promise = LimitedApiFacade.obtain().fetch('https://acme.com/api/users');\n

Testing

When you need to test components that rely on Facades, you can register a "spy" (mocked object), via the static method spy(). Consider, for instance, that you have a users repository component that relies on a custom Api facade.

import { ApiFacade } from "@acme/facades";\n\nclass UsersRepository {\n    \n    fetch() {\n        return ApiFacade.obtain().fetch('https://acme.com/api/users');\n    }\n    \n    // ...remaining not shown...\n}\n

In your testing environment, you can specify a callback that can be used to create a fake object (mocked object) that must behave in a certain way, via the spy() method. The callback must return either of the following:

  • The Facade's underlying resolved object.
  • Or, a fake object that behaves as desired (in the context of your test).
ApiFacade.spy((container, identifier) => {\n    // ...mocking not shown ...\n\n    return myResolvedObject; // resolved or mocked object\n});\n

All subsequent calls to the facade's underlying object will be made to the registered "spy" object instead.

',14),b={href:"https://jasmine.github.io/",target:"_blank",rel:"noopener noreferrer"},h=(0,e.Lk)("code",null,"spy()",-1),g=(0,e.Fv)('
import { ApiFacade } from "@acme/facades";\nimport { UsersRepository } from "@app";\n\n// E.g. testing via Jasmine Framework...\ndescribe('@acme/api', () => {\n\n    // Test setup not shown in this example...\n    \n    afterEach(() => {\n        Facade.destroy();\n    });\n    \n    it('can obtain users', () => {\n\n        let mocked = null;\n        ApiFacade.spy((container, identifier) => {\n            const apiClient = container.get(identifier);\n\n            mocked = spyOn(apiClient, 'fetch')\n                .and\n                .returnValue([\n                    { id: 12, name: 'Jackie' },\n                    { id: 14, name: 'Lana' },\n                    // ...etc\n                ]);\n\n            // return the resolved api client...\n            return apiClient;\n        });\n\n        const repo = new UsersRepository();\n        const users = repo.fetch();\n        \n        expect(users)\n            .not\n            .toBeUndefined();\n\n        expect(mocked)\n            .toHaveBeenCalled();\n    });\n});\n

Onward

',2),f={href:"https://laravel.com/docs/11.x/facades#when-to-use-facades",target:"_blank",rel:"noopener noreferrer"},y={};var L=(0,s(6262).A)(y,[["render",function(n,a){const s=(0,e.g2)("Badge"),y=(0,e.g2)("ExternalLinkIcon"),L=(0,e.g2)("RouteLink"),w=(0,e.g2)("router-link");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"tip",text:"Available since v0.11",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Browser",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("The "),o,(0,e.eW)(" package is an adaptation of "),(0,e.Lk)("a",p,[(0,e.eW)("Laravel's Facades"),(0,e.bF)(y)]),(0,e.eW)(" ("),(0,e.Lk)("em",null,[(0,e.eW)("originally licensed under "),(0,e.Lk)("a",c,[(0,e.eW)("MIT"),(0,e.bF)(y)])]),(0,e.eW)("). In this context, a "),(0,e.Lk)("a",l,[(0,e.eW)("Facade"),(0,e.bF)(y)]),(0,e.eW)(" acts as an interface ("),r,(0,e.eW)(") to an underlying object instance, resolved from the "),(0,e.bF)(L,{to:"/archive/current/packages/container/"},{default:(0,e.k6)((()=>[(0,e.eW)("Service Container")])),_:1}),(0,e.eW)(".")]),u,(0,e.Lk)("nav",d,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(w,{to:"#setup-facade-s-service-container-instance"},{default:(0,e.k6)((()=>[(0,e.eW)("Setup Facade's Service Container instance")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(w,{to:"#define-a-facade"},{default:(0,e.k6)((()=>[(0,e.eW)("Define a Facade")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(w,{to:"#the-obtain-method"},{default:(0,e.k6)((()=>[(0,e.eW)("The obtain() method")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(w,{to:"#testing"},{default:(0,e.k6)((()=>[(0,e.eW)("Testing")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(w,{to:"#onward"},{default:(0,e.k6)((()=>[(0,e.eW)("Onward")])),_:1})])])]),k,(0,e.Lk)("p",null,[(0,e.eW)("To define your own Facade, extend the abstract "),m,(0,e.eW)(" class, and specify the target "),(0,e.bF)(L,{to:"/archive/current/packages/container/bindings.html#identifiers"},{default:(0,e.k6)((()=>[(0,e.eW)("binding identifier")])),_:1}),(0,e.eW)(".")]),v,(0,e.Lk)("p",null,[(0,e.eW)("The following example uses "),(0,e.Lk)("a",b,[(0,e.eW)("Jasmine"),(0,e.bF)(y)]),(0,e.eW)(" as testing framework. However, the "),h,(0,e.eW)(" method is not tied to any specific testing or object mocking framework. Feel free to use whatever testing tools or frameworks fits your purpose best.")]),g,(0,e.Lk)("p",null,[(0,e.eW)("Please consider reading Laravel's "),(0,e.Lk)("a",f,[(0,e.eW)('"When to Utilize Facades"'),(0,e.bF)(y)]),(0,e.eW)(", to gain an idea of when using Facades can be good, and when not.")])])}]]);const w=JSON.parse('{"path":"/archive/current/packages/support/facades/","title":"About Facades","lang":"en-GB","frontmatter":{"title":"About Facades","description":"A static interface to classes","sidebarDepth":0},"headers":[{"level":2,"title":"Setup Facade\'s Service Container instance","slug":"setup-facade-s-service-container-instance","link":"#setup-facade-s-service-container-instance","children":[]},{"level":2,"title":"Define a Facade","slug":"define-a-facade","link":"#define-a-facade","children":[]},{"level":2,"title":"The obtain() method","slug":"the-obtain-method","link":"#the-obtain-method","children":[]},{"level":2,"title":"Testing","slug":"testing","link":"#testing","children":[]},{"level":2,"title":"Onward","slug":"onward","link":"#onward","children":[]}],"git":{"updatedTime":1712656186000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/facades/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},9046:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return l}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o=(0,e.Lk)("p",null,"The support package offers various utilities.",-1),p={};var c=(0,s(6262).A)(p,[["render",function(n,a){const s=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"tip",text:"Available since v0.3",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Browser",vertical:"middle"})])])]),o])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/","title":"Introduction","lang":"en-GB","frontmatter":{"title":"Introduction","description":"Ion Support package","sidebarDepth":0},"headers":[],"git":{"updatedTime":1680807324000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/support/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},332:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return l}});var e=s(641);const t={id:"about-meta",tabindex:"-1"},i={class:"header-anchor",href:"#about-meta"},o=(0,e.Fv)('

Provides a decorator that is able to associate metadata with a class, its methods and properties.

import { meta, getMeta } from '@aedart/support/meta';\n\n@meta('service_alias', 'locationSearcher')\nclass Service {}\n\ngetMeta(Service, 'service_alias'); // locationSearcher\n
',2),p={};var c=(0,s(6262).A)(p,[["render",function(n,a){const s=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("About Meta "),(0,e.bF)(s,{type:"tip",text:"Available since v0.6",vertical:"middle"})])])]),o])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/meta/","title":"About Meta","lang":"en-GB","frontmatter":{"title":"About Meta","description":"Add arbitrary metadata on classes, methods and properties."},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},6892:function(n,a,s){s.r(a),s.d(a,{comp:function(){return o},data:function(){return p}});var e=s(641);const t=[(0,e.Lk)("h1",{id:"about-misc",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#about-misc"},[(0,e.Lk)("span",null,"About Misc.")])],-1),(0,e.Lk)("p",null,[(0,e.Lk)("code",null,"@aedart/support/misc"),(0,e.eW)(" offers miscellaneous utility functions.")],-1)],i={};var o=(0,s(6262).A)(i,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/support/misc/","title":"About Misc.","lang":"en-GB","frontmatter":{"title":"About Misc.","description":"Miscellaneous utility functions."},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":3},{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},1205:function(n,a,s){s.r(a),s.d(a,{comp:function(){return k},data:function(){return m}});var e=s(641);const t={id:"mixins",tabindex:"-1"},i={class:"header-anchor",href:"#mixins"},o=(0,e.Lk)("code",null,"@aedart/support/mixins",-1),p={href:"https://justinfagnani.com/author/justinfagnani/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/justinfagnani/mixwith.js",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Lk)("code",null,"mixwith.js",-1),r={href:"https://github.com/justinfagnani/mixwith.js?tab=Apache-2.0-1-ov-file#readme",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Fv)('
import { mix, Mixin } from "@aedart/support/mixins";\n\n// Define mixin\nconst NameMixin = Mixin((superclass) => class extends superclass {\n\n    #name;\n    \n    set name(value) {\n        this.#name = value;\n    }\n    \n    get name() {\n        return this.#name;\n    }\n});\n\n// Apply mixin...\nclass Item extends mix().with(\n    NameMixin\n) {\n    // ...not shown...    \n}\n\n// ...Later in your application\nconst item = new Item();\nitem.name = 'My Item';\n\nconsole.log(item.name); // My Item\n
',1),d={};var k=(0,s(6262).A)(d,[["render",function(n,a){const s=(0,e.g2)("Badge"),d=(0,e.g2)("ExternalLinkIcon"),k=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Mixins "),(0,e.bF)(s,{type:"tip",text:"Available since v0.8",vertical:"middle"})])])]),(0,e.Lk)("p",null,[o,(0,e.eW)(" offers an adaptation of "),(0,e.Lk)("a",p,[(0,e.eW)("Justin Fagnani's"),(0,e.bF)(d)]),(0,e.Lk)("a",c,[l,(0,e.bF)(d)]),(0,e.eW)(" package ("),(0,e.Lk)("em",null,[(0,e.eW)("originally licensed under "),(0,e.Lk)("a",r,[(0,e.eW)("Apache License 2.0"),(0,e.bF)(d)])]),(0,e.eW)(").")]),u,(0,e.Lk)("p",null,[(0,e.eW)("See also "),(0,e.bF)(k,{to:"/archive/current/packages/support/concerns/"},{default:(0,e.k6)((()=>[(0,e.eW)("Concerns")])),_:1}),(0,e.eW)(" as an alternative.")])])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/mixins/","title":"About Mixins","lang":"en-GB","frontmatter":{"title":"About Mixins","description":"Abstract subclasses (\\"Mixins\\") utilities","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709647075000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/mixins/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},3122:function(n,a,s){s.r(a),s.d(a,{comp:function(){return o},data:function(){return p}});var e=s(641);const t=[(0,e.Lk)("h1",{id:"about-objects",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#about-objects"},[(0,e.Lk)("span",null,"About Objects")])],-1),(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.Lk)("code",null,"@aedart/support/objects"),(0,e.eW)(" submodule offers object related utilities.")],-1)],i={};var o=(0,s(6262).A)(i,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/support/objects/","title":"About Objects","lang":"en-GB","frontmatter":{"title":"About Objects","description":"Objects related utilities"},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":4},{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},1783:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return l}});var e=s(641);const t={id:"reflections",tabindex:"-1"},i={class:"header-anchor",href:"#reflections"},o=(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.Lk)("code",null,"@aedart/support/reflections"),(0,e.eW)(" submodule offers a few reflection related utilities.")],-1),p={};var c=(0,s(6262).A)(p,[["render",function(n,a){const s=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Reflections "),(0,e.bF)(s,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),o])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/reflections/","title":"About reflections","lang":"en-GB","frontmatter":{"title":"About reflections","description":"Reflection utilities.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},5706:function(n,a,s){s.r(a),s.d(a,{comp:function(){return u},data:function(){return d}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o={href:"https://v2.vuepress.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Lk)("h2",{id:"navigation",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#navigation"},[(0,e.Lk)("span",null,"Navigation")])],-1),c=(0,e.Lk)("h2",{id:"plugins",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#plugins"},[(0,e.Lk)("span",null,"Plugins")])],-1),l=(0,e.Lk)("h2",{id:"components",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#components"},[(0,e.Lk)("span",null,"Components")])],-1),r={};var u=(0,s(6262).A)(r,[["render",function(n,a){const s=(0,e.g2)("Badge"),r=(0,e.g2)("ExternalLinkIcon"),u=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"tip",text:"Available since v0.1",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Node",vertical:"middle"}),(0,e.bF)(s,{type:"success",text:"Browser",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Contains a few utilities for "),(0,e.Lk)("a",o,[(0,e.eW)("Vuepress v2"),(0,e.bF)(r)]),(0,e.eW)(", which are also used for building this documentation site. Amongst them are:")]),p,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"/archive/current/packages/vuepress-utils/navigation/archive.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Archive")])),_:1})])]),c,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"/archive/current/packages/vuepress-utils/plugins/last-updated.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Last Updated")])),_:1})])]),l,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(u,{to:"/archive/current/packages/vuepress-utils/components/version-disclaimer.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Version Disclaimer")])),_:1})])])])}]]);const d=JSON.parse('{"path":"/archive/current/packages/vuepress-utils/","title":"Introduction","lang":"en-GB","frontmatter":{"title":"Introduction","description":"Various helpers for your vuepress site","sidebarDepth":0},"headers":[{"level":2,"title":"Navigation","slug":"navigation","link":"#navigation","children":[]},{"level":2,"title":"Plugins","slug":"plugins","link":"#plugins","children":[]},{"level":2,"title":"Components","slug":"components","link":"#components","children":[]}],"git":{"updatedTime":1680022561000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":4}]},"filePathRelative":"archive/current/packages/vuepress-utils/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},1389:function(n,a,s){s.r(a),s.d(a,{comp:function(){return c},data:function(){return l}});var e=s(641);const t={id:"introduction",tabindex:"-1"},i={class:"header-anchor",href:"#introduction"},o=(0,e.Lk)("p",null,[(0,e.Lk)("code",null,"@aedart/xyz"),(0,e.eW)(' is an internal package that is used for experiments, e.g. tinkering with decorators, proxies, or whatever might be "fun" to try out. The package is NOT published, nor is it intended to ever be published.')],-1),p={};var c=(0,s(6262).A)(p,[["render",function(n,a){const s=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",i,[(0,e.Lk)("span",null,[(0,e.eW)("Introduction "),(0,e.bF)(s,{type:"danger",text:"Internal (not published)",vertical:"middle"})])])]),o])}]]);const l=JSON.parse('{"path":"/archive/current/packages/xyz/","title":"XYZ (test package)","lang":"en-GB","frontmatter":{"title":"XYZ (test package)","description":"XYZ Test Package"},"headers":[],"git":{"updatedTime":1680022542000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":3}]},"filePathRelative":"archive/current/packages/xyz/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},4546:function(n,a,s){s.r(a),s.d(a,{comp:function(){return o},data:function(){return p}});var e=s(641);const t=[(0,e.Lk)("h1",{id:"archive",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#archive"},[(0,e.Lk)("span",null,"Archive")])],-1),(0,e.Lk)("p",null,'Here you can find documentation for previous versions of Ion. Please select the desired version via the "Archive" menu item located in the top-menu.',-1)],i={};var o=(0,s(6262).A)(i,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/","title":"Archive","lang":"en-GB","frontmatter":{},"headers":[],"git":{"updatedTime":1679150525000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},9635:function(n,a,s){s.r(a),s.d(a,{comp:function(){return o},data:function(){return p}});var e=s(641);const t=[(0,e.Lk)("h1",{id:"not-available",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#not-available"},[(0,e.Lk)("span",null,"Not Available")])],-1),(0,e.Lk)("p",null,[(0,e.Lk)("em",null,"The next version of Ion has yet to be designed and implemented. Come back at a later time to review the documentation...")],-1)],i={};var o=(0,s(6262).A)(i,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/next/","title":"Not Available","lang":"en-GB","frontmatter":{"title":"Not Available","description":"Next Ion Version","sidebarDepth":0},"headers":[],"git":{"updatedTime":1679232326000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":2}]},"filePathRelative":"archive/next/README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},5924:function(n,a,s){s.r(a),s.d(a,{comp:function(){return o},data:function(){return p}});var e=s(641);const t=[(0,e.Lk)("p",null,[(0,e.Lk)("em",null,"Work in progress. Ion is at a very early stage. Feel free to browse the available documentation...")],-1)],i={};var o=(0,s(6262).A)(i,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/","title":"","lang":"en-GB","frontmatter":{"home":true,"footer":"Copyright © 2023-present Alin Eugen Deac, License BSD-3-Clause","heroImage":"/images/icon/apple-touch-icon.png","actions":[{"text":"View Documentation","link":"/archive/current/","type":"primary"},{"text":"Packages","link":"/archive/current/packages/","type":"secondary"}]},"headers":[],"git":{"updatedTime":1679237873000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":4}]},"filePathRelative":"README.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/inheritance.html.ff09d1d0.js b/assets/js/inheritance.html.ff09d1d0.js new file mode 100644 index 00000000..e8f96c1b --- /dev/null +++ b/assets/js/inheritance.html.ff09d1d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6406],{6501:function(n,s,a){a.r(s),a.d(s,{comp:function(){return c},data:function(){return o}});var t=a(641);const e=[(0,t.Fv)('

Inheritance

Metadata is automatically inherited by subclasses.

import { meta, getMeta } from '@aedart/support/meta';\n\n@meta('service_alias', 'locationSearcher')\nclass Service {}\n\nclass CitySearcher extends Service {}\n\ngetMeta(CitySearcher, 'service_alias'); // locationSearcher\n

Overwrites

You can also overwrite the inherited metadata. The subclass that defines the metadata creates its own copy of the inherited metadata. The parent class' metadata remains untouched.

import { meta, getMeta } from '@aedart/support/meta';\n\nclass Service {\n    \n    @meta('search.desc', 'Searches for countries')\n    search() {\n        // ...not shown...\n    }\n}\n\nclass CitySearcher extends Service {\n\n    @meta('search.desc', 'Searches for cities')\n    search() {\n        // ...not shown...\n    }\n}\n\nconst service = new CitySearcher();\n\ngetMeta(CitySearcher, 'search.desc'); // Searches for cities\ngetMeta(Service, 'search.desc'); // Searches for countries\n
',6)],p={};var c=(0,a(6262).A)(p,[["render",function(n,s){return(0,t.uX)(),(0,t.CE)("div",null,e)}]]);const o=JSON.parse('{"path":"/archive/current/packages/support/meta/inheritance.html","title":"Inheritance","lang":"en-GB","frontmatter":{"title":"Inheritance","description":"About metadata inheritance and overwrites.","sidebarDepth":0},"headers":[{"level":2,"title":"Overwrites","slug":"overwrites","link":"#overwrites","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/inheritance.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},4661:function(n,s,a){a.r(s),a.d(s,{comp:function(){return c},data:function(){return o}});var t=a(641);const e=[(0,t.Fv)('

How inheritance works

To gain an overview of how inheritance works when applying mixins onto a superclass, consider the following example:

const MyMixin = Mixin((superclass) => class extends superclass {\n    constructor(...args) {\n        super(...args); // Invokes A's constructor\n    }\n    \n    // Overwrites A's foo() method\n    foo() {\n        return 'zam';\n    }\n\n    // Overwrites A's bar() method\n    bar() {\n        return super.bar(); // Invoke A's bar() method\n    }\n});\n\n// -------------------------------------------------------------------- //\n\nclass A {\n    foo() {\n        return 'foo';\n    }\n    \n    bar() {\n        return 'bar';\n    }\n}\n\n// -------------------------------------------------------------------- //\n\nclass B extends mix(A).with(\n    MyMixin\n) {\n    constructor(...args) {\n        super(...args); // Invokes MyMixin's constructor\n    }\n\n    // Overwrite MyMixin's foo()\n    foo() {\n        const msg = super.foo(); // Invoke MyMixin's bar() method\n\n        return `<${msg}>`;\n    }\n}\n\n// -------------------------------------------------------------------- //\n\nconst instance = new B();\n\nconsole.log(instance.foo()); // <zam>\nconsole.log(instance.bar()); // bar\n
',3)],p={};var c=(0,a(6262).A)(p,[["render",function(n,s){return(0,t.uX)(),(0,t.CE)("div",null,e)}]]);const o=JSON.parse('{"path":"/archive/current/packages/support/mixins/inheritance.html","title":"Inheritance","lang":"en-GB","frontmatter":{"title":"Inheritance","description":"How inheritance works.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/mixins/inheritance.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/install.html.649220ed.js b/assets/js/install.html.649220ed.js new file mode 100644 index 00000000..1909a858 --- /dev/null +++ b/assets/js/install.html.649220ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[469],{4971:function(a,n,e){e.r(n),e.d(n,{comp:function(){return r},data:function(){return p}});var s=e(641);const t=[(0,s.Fv)('

How to install

npm

npm install --save-peer @aedart/container\n

yarn

yarn add --peer @aedart/container\n

pnpm

pnpm add --save-peer @aedart/container\n
',7)],l={};var r=(0,e(6262).A)(l,[["render",function(a,n){return(0,s.uX)(),(0,s.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/container/install.html","title":"How to install","lang":"en-GB","frontmatter":{"description":"How to install Ion Service Container package","sidebarDepth":0},"headers":[{"level":2,"title":"npm","slug":"npm","link":"#npm","children":[]},{"level":2,"title":"yarn","slug":"yarn","link":"#yarn","children":[]},{"level":2,"title":"pnpm","slug":"pnpm","link":"#pnpm","children":[]}],"git":{"updatedTime":1712318316000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/container/install.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},1640:function(a,n,e){e.r(n),e.d(n,{comp:function(){return r},data:function(){return p}});var s=e(641);const t=[(0,s.Fv)('

How to install

npm

npm install --save-peer @aedart/contracts\n

yarn

yarn add --peer @aedart/contracts\n

pnpm

pnpm add --save-peer @aedart/contracts\n
',7)],l={};var r=(0,e(6262).A)(l,[["render",function(a,n){return(0,s.uX)(),(0,s.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/contracts/install.html","title":"How to install","lang":"en-GB","frontmatter":{"description":"How to install Ion Contracts package","sidebarDepth":0},"headers":[{"level":2,"title":"npm","slug":"npm","link":"#npm","children":[]},{"level":2,"title":"yarn","slug":"yarn","link":"#yarn","children":[]},{"level":2,"title":"pnpm","slug":"pnpm","link":"#pnpm","children":[]}],"git":{"updatedTime":1680807921000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/contracts/install.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},492:function(a,n,e){e.r(n),e.d(n,{comp:function(){return r},data:function(){return p}});var s=e(641);const t=[(0,s.Fv)('

How to install

npm

npm install --save-peer @aedart/support\n

yarn

yarn add --peer @aedart/support\n

pnpm

pnpm add --save-peer @aedart/support\n
',7)],l={};var r=(0,e(6262).A)(l,[["render",function(a,n){return(0,s.uX)(),(0,s.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/support/install.html","title":"How to install","lang":"en-GB","frontmatter":{"description":"How to install Ion Support package","sidebarDepth":0},"headers":[{"level":2,"title":"npm","slug":"npm","link":"#npm","children":[]},{"level":2,"title":"yarn","slug":"yarn","link":"#yarn","children":[]},{"level":2,"title":"pnpm","slug":"pnpm","link":"#pnpm","children":[]}],"git":{"updatedTime":1680807324000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/support/install.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},5335:function(a,n,e){e.r(n),e.d(n,{comp:function(){return r},data:function(){return p}});var s=e(641);const t=[(0,s.Fv)('

How to install

npm

npm install --save-dev @aedart/vuepress-utils\n

yarn

yarn add --dev @aedart/vuepress-utils\n

pnpm

pnpm add --save-dev @aedart/vuepress-utils\n
',7)],l={};var r=(0,e(6262).A)(l,[["render",function(a,n){return(0,s.uX)(),(0,s.CE)("div",null,t)}]]);const p=JSON.parse('{"path":"/archive/current/packages/vuepress-utils/install.html","title":"How to install","lang":"en-GB","frontmatter":{"description":"How to install Vuepress Utils","sidebarDepth":0},"headers":[{"level":2,"title":"npm","slug":"npm","link":"#npm","children":[]},{"level":2,"title":"yarn","slug":"yarn","link":"#yarn","children":[]},{"level":2,"title":"pnpm","slug":"pnpm","link":"#pnpm","children":[]}],"git":{"updatedTime":1706259575000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":3},{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/vuepress-utils/install.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/instanceof.html.46ee3113.js b/assets/js/instanceof.html.46ee3113.js new file mode 100644 index 00000000..81a538d3 --- /dev/null +++ b/assets/js/instanceof.html.46ee3113.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5646],{6192:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return u}});var e=a(641);const t=(0,e.Lk)("h1",{id:"instanceof-operator",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#instanceof-operator"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"instanceof"),(0,e.eW)(" Operator")])])],-1),p=(0,e.Lk)("code",null,"Mixin()",-1),o=(0,e.Lk)("code",null,"instanceof",-1),c=(0,e.Fv)('
// A regular mixin without "Mixin" decorator \nconst MixinA = (superclass) => class extends superclas {\n    // ...not shown...\n};\n\n// Mixin with "Mixin" decorator\nconst MixinB = Mixin((superclass) => class extends superclass {\n    // ...not shown...\n});\n\n// -------------------------------------------------------------------- //\n\nclass A {}\n\nclass B extends mix(A).with(\n    MixinA,\n    MixinB\n) {}\n\n// -------------------------------------------------------------------- //\n\nconst instance = new B();\n\nconsole.log(instance instanceof A); // true\nconsole.log(instance instanceof B); // true\nconsole.log(instance instanceof MixinA); // false\nconsole.log(instance instanceof MixinB); // true\n
',1),i={};var l=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("When you defined your mixins using the "),(0,e.bF)(a,{to:"/archive/current/packages/support/mixins/newMixin.html"},{default:(0,e.k6)((()=>[p,(0,e.eW)(" decorator function")])),_:1}),(0,e.eW)(", then it will support "),o,(0,e.eW)(" checks. Consider the following example:")]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/mixins/instanceof.html","title":"Instanceof","lang":"en-GB","frontmatter":{"title":"Instanceof","description":"Using instanceof operator.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/mixins/instanceof.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isArrayLike.html.4487815f.js b/assets/js/isArrayLike.html.4487815f.js new file mode 100644 index 00000000..bd710230 --- /dev/null +++ b/assets/js/isArrayLike.html.4487815f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7044],{1199:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return k}});var e=a(641);const t=(0,e.Lk)("h1",{id:"isarraylike",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#isarraylike"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"isArrayLike")])])],-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#array-like_objects",target:"_blank",rel:"noopener noreferrer"},o=(0,e.Lk)("code",null,"isArrayLike()",-1),c={href:"https://lodash.com/docs/4.17.15#isArrayLike",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Fv)('
import { isArrayLike } from '@aedart/support/arrays';\n\nisArrayLike([]); // true\nisArrayLike('abc'); // true\nisArrayLike(new String('abc')); // true\nisArrayLike({ length: 0 }); // true\nisArrayLike(new Int8Array()); // true\n\nisArrayLike({}); // false\nisArrayLike(function() {}); // false\nisArrayLike(new Boolean(true)); // false\nisArrayLike(123); // false\nisArrayLike(new Number(123)); // false\n// ...etc\n
',1),l=(0,e.Lk)("em",null,[(0,e.Lk)("code",null,"isSafeArrayLike()")],-1),r={};var u=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),r=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Determines if a value is "),(0,e.Lk)("a",p,[(0,e.eW)('"array-like"'),(0,e.bF)(a)]),(0,e.eW)(".")]),(0,e.Lk)("p",null,[(0,e.eW)("("),(0,e.Lk)("em",null,[o,(0,e.eW)(" is an alias for Lodash's "),(0,e.Lk)("a",c,[(0,e.eW)("isArrayLike"),(0,e.bF)(a)]),(0,e.eW)(".")]),(0,e.eW)(")")]),i,(0,e.Lk)("p",null,[(0,e.eW)("See also "),(0,e.bF)(r,{to:"/archive/current/packages/support/arrays/isSafeArrayLike.html"},{default:(0,e.k6)((()=>[l])),_:1}),(0,e.eW)(".")])])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/arrays/isArrayLike.html","title":"Is Array Like","lang":"en-GB","frontmatter":{"title":"Is Array Like","description":"Determine if value is array-like.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709813444000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/arrays/isArrayLike.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isCallable.html.84eaa115.js b/assets/js/isCallable.html.84eaa115.js new file mode 100644 index 00000000..c2d2702e --- /dev/null +++ b/assets/js/isCallable.html.84eaa115.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1936],{7760:function(n,s,a){a.r(s),a.d(s,{comp:function(){return k},data:function(){return d}});var t=a(641);const e={id:"iscallable",tabindex:"-1"},l={class:"header-anchor",href:"#iscallable"},o=(0,t.Lk)("code",null,"isCallable",-1),p=(0,t.Fv)('
import { isCallable } from "@aedart/support/reflections";\n\nisCallable(null); // false\nisCallable({}); // false\nisCallable([]); // false\nisCallable(class {}); // false\n\nisCallable(function() {}); // true\nisCallable(() => {}); // true\nisCallable(Array); // true\n\n

Acknowledgement

',2),c={href:"https://github.com/zloirock/core-js#function-iscallable-isconstructor-",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Lk)("em",null,"License MIT",-1),u=(0,t.Lk)("code",null,"isClassConstructor()",-1),r={};var k=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,t.g2)("Badge"),r=(0,t.g2)("RouteLink"),k=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",l,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),(0,t.Lk)("p",null,[(0,t.eW)('Determine if a value is "callable" - a function that is not a '),(0,t.bF)(r,{to:"/archive/current/packages/support/reflections/isClassConstructor.html"},{default:(0,t.k6)((()=>[(0,t.eW)("class constructor")])),_:1}),(0,t.eW)(".")]),p,(0,t.Lk)("p",null,[(0,t.eW)("The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the "),(0,t.Lk)("a",c,[(0,t.eW)("Function.isCallable / Function.isConstructor"),(0,t.bF)(k)]),(0,t.eW)(" proposal ("),i,(0,t.eW)(").")]),(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(r,{to:"/archive/current/packages/support/reflections/isClassConstructor.html"},{default:(0,t.k6)((()=>[u])),_:1}),(0,t.eW)(".")])])}]]);const d=JSON.parse('{"path":"/archive/current/packages/support/reflections/isCallable.html","title":"Is Callable","lang":"en-GB","frontmatter":{"title":"Is Callable","description":"Determine if value is callable.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710167835000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isCallable.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isClassConstructor.html.1dbf8d8c.js b/assets/js/isClassConstructor.html.1dbf8d8c.js new file mode 100644 index 00000000..76c19b89 --- /dev/null +++ b/assets/js/isClassConstructor.html.1dbf8d8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3884],{5471:function(s,n,a){a.r(n),a.d(n,{comp:function(){return w},data:function(){return _}});var t=a(641);const e={id:"isclassconstructor",tabindex:"-1"},o={class:"header-anchor",href:"#isclassconstructor"},c=(0,t.Lk)("code",null,"isClassConstructor",-1),l=(0,t.Lk)("p",null,[(0,t.eW)("The "),(0,t.Lk)("code",null,"isClassConstructor()"),(0,t.eW)(" is able to determine if a value is a class constructor.")],-1),p={class:"custom-container warning"},i=(0,t.Lk)("p",{class:"custom-container-title"},"Caution",-1),u=(0,t.Lk)("code",null,"isClassConstructor()",-1),r=(0,t.Lk)("code",null,"true",-1),k=(0,t.Lk)("code",null,"class",-1),d={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes",target:"_blank",rel:"noopener noreferrer"},m={class:"custom-container warning"},v=(0,t.Lk)("p",{class:"custom-container-title"},"Built-in Classes",-1),f=(0,t.Lk)("strong",null,"NOT",-1),b={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects",target:"_blank",rel:"noopener noreferrer"},C=(0,t.Lk)("code",null,"isConstructor()",-1),h=(0,t.Fv)('
import { isClassConstructor } from "@aedart/support/reflections";\n\nisClassConstructor(null); // false\nisClassConstructor({}); // false\nisClassConstructor([]); // false\nisClassConstructor(function() {}); // false\nisClassConstructor(() => {}); // false\nisClassConstructor(Array); // false\n\nclass A {}\nisClassConstructor(A); // true\nisClassConstructor(class {}); // true\n

Acknowledgement

',2),g={href:"https://github.com/zloirock/core-js#function-iscallable-isconstructor-",target:"_blank",rel:"noopener noreferrer"},L=(0,t.Lk)("em",null,"License MIT",-1),W=(0,t.Lk)("code",null,"isConstructor()",-1),y={};var w=(0,a(6262).A)(y,[["render",function(s,n){const a=(0,t.g2)("Badge"),y=(0,t.g2)("ExternalLinkIcon"),w=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",o,[(0,t.Lk)("span",null,[c,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),l,(0,t.Lk)("div",p,[i,(0,t.Lk)("p",null,[u,(0,t.eW)(" will only be able to return "),r,(0,t.eW)(" for classes that are defined using the "),k,(0,t.eW)(" keyword. See "),(0,t.Lk)("a",d,[(0,t.eW)("ES6 classes"),(0,t.bF)(y)]),(0,t.eW)(" for additional information.")])]),(0,t.Lk)("div",m,[v,(0,t.Lk)("p",null,[(0,t.eW)("This util is "),f,(0,t.eW)(" able to detect "),(0,t.Lk)("a",b,[(0,t.eW)("built-in classes"),(0,t.bF)(y)]),(0,t.eW)(". Use "),(0,t.bF)(w,{to:"/archive/current/packages/support/reflections/isConstructor.html"},{default:(0,t.k6)((()=>[C])),_:1}),(0,t.eW)(' if you wish to test for "constructable" functions / classes, including built-in classes.')])]),h,(0,t.Lk)("p",null,[(0,t.eW)("The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the "),(0,t.Lk)("a",g,[(0,t.eW)("Function.isCallable / Function.isConstructor"),(0,t.bF)(y)]),(0,t.eW)(" proposal ("),L,(0,t.eW)(").")]),(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(w,{to:"/archive/current/packages/support/reflections/isConstructor.html"},{default:(0,t.k6)((()=>[W])),_:1}),(0,t.eW)(".")])])}]]);const _=JSON.parse('{"path":"/archive/current/packages/support/reflections/isClassConstructor.html","title":"Is Class Constructor","lang":"en-GB","frontmatter":{"title":"Is Class Constructor","description":"Determine if value is a class constructor.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710169596000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/reflections/isClassConstructor.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isClassMethodReference.html.97742a21.js b/assets/js/isClassMethodReference.html.97742a21.js new file mode 100644 index 00000000..c2b7cc3b --- /dev/null +++ b/assets/js/isClassMethodReference.html.97742a21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6366],{2579:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return u}});var e=a(641);const t={id:"isclassmethodreference",tabindex:"-1"},o={class:"header-anchor",href:"#isclassmethodreference"},p=(0,e.Lk)("code",null,"isClassMethodReference",-1),c=(0,e.Fv)('

Determine if value is a "class method reference". A class method reference is an array with two values:

  • 0 = Constructor | object Target class constructor or class instance
  • 1 = PropertyKey Name of method (property key in target).
import { isClassMethodReference } from '@aedart/support/reflections';\n\nclass A {\n    age = 23;\n    \n    foo: () => { /* ...not shown... */ }\n}\n\nconst instance = new A();\n\nisClassMethodReference([ A, 'age' ]); // false\nisClassMethodReference([ instance, 'age' ]); // false\n\nisClassMethodReference([ A, 'foo' ]); // true\nisClassMethodReference([ instance, 'foo' ]); // true\n
',3),i={};var l=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",o,[(0,e.Lk)("span",null,[p,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.11",vertical:"middle"})])])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/reflections/isClassMethodReference.html","title":"Is Class Method Reference","lang":"en-GB","frontmatter":{"title":"Is Class Method Reference","description":"Determine if value is a class method reference","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710158947000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isClassMethodReference.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isCloneable.html.a8253de5.js b/assets/js/isCloneable.html.a8253de5.js new file mode 100644 index 00000000..b4b5509a --- /dev/null +++ b/assets/js/isCloneable.html.a8253de5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6247],{2572:function(n,s,a){a.r(s),a.d(s,{comp:function(){return i},data:function(){return u}});var e=a(641);const t={id:"iscloneable",tabindex:"-1"},p={class:"header-anchor",href:"#iscloneable"},o=(0,e.Lk)("code",null,"isCloneable",-1),c=(0,e.Fv)('

Determines if given object is "cloneable". In this context "cloneable" means that an object implements the Cloneable interface, and offers a clone() method.

See @aedart/constracts/support/objects/Cloneable for details.

import { isCloneable } from "@aedart/support/objects";\n\nclass A {};\n\nclass B {\n    clone() {\n        return new this();\n    }\n}\n\nisCloneable(null); // false\nisCloneable([]); // false\nisCloneable({}); // false\nisCloneable(new A()); // false\nisCloneable(new B()); // true\n
',3),l={};var i=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/objects/isCloneable.html","title":"Is Cloneable","lang":"en-GB","frontmatter":{"title":"Is Cloneable","description":"Determine if object is cloneable.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/isCloneable.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isConcatSpreadable.html.36d6883b.js b/assets/js/isConcatSpreadable.html.36d6883b.js new file mode 100644 index 00000000..7c6a9717 --- /dev/null +++ b/assets/js/isConcatSpreadable.html.36d6883b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7627],{4801:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return r}});var e=a(641);const t=(0,e.Lk)("h1",{id:"isconcatspreadable",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#isconcatspreadable"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"isConcatSpreadable")])])],-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#well-known_symbols",target:"_blank",rel:"noopener noreferrer"},o={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable",target:"_blank",rel:"noopener noreferrer"},c=(0,e.Lk)("code",null,"Symbol.isConcatSpreadable",-1),l=(0,e.Fv)('
import { isConcatSpreadable } from '@aedart/support/arrays';\n\nisConcatSpreadable(null); // false\nisConcatSpreadable([ 1, 2, 3 ]); // false\nisConcatSpreadable({}); // false\n\n// -------------------------------------------------------------------------\n\nconst arr = [ 1, 2, 3 ];\narr[Symbol.isConcatSpreadable] = true;\nisConcatSpreadable(arr); // true\n\n// -------------------------------------------------------------------------\n\nconst obj = {\n    [Symbol.isConcatSpreadable]: true,\n\n    // NOTE: length should be present, if Symbol.isConcatSpreadable\n    // set to `true` However, isConcatSpreadable() does not check\n    // if `length` is set!\n    length: 3,\n    0: 'a',\n    1: 'b',\n    2: 'c'\n};\nisConcatSpreadable(obj); // true\n\n// ------------------------------------------------------------------------- \n\nclass A {}\nclass B {\n    [Symbol.isConcatSpreadable] = false;\n}\nisConcatSpreadable(new A()); // false\nisConcatSpreadable(new B()); // true\n
',1),i={};var u=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Determines if object contains the "),(0,e.Lk)("a",p,[(0,e.eW)("well-known"),(0,e.bF)(a)]),(0,e.eW)(" symbol "),(0,e.Lk)("a",o,[c,(0,e.bF)(a)]),(0,e.eW)(".")]),l])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/arrays/isConcatSpreadable.html","title":"Is Concat Spreadable","lang":"en-GB","frontmatter":{"title":"Is Concat Spreadable","description":"Determine if object is concat spreadable.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/isConcatSpreadable.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isConstructor.html.296bf48e.js b/assets/js/isConstructor.html.296bf48e.js new file mode 100644 index 00000000..549b9a2b --- /dev/null +++ b/assets/js/isConstructor.html.296bf48e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8874],{4263:function(n,s,a){a.r(s),a.d(s,{comp:function(){return d},data:function(){return m}});var t=a(641);const o=(0,t.Lk)("h1",{id:"isconstructor",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#isconstructor"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"isConstructor")])])],-1),e={href:"https://github.com/caitp/TC39-Proposals/blob/trunk/tc39-reflect-isconstructor-iscallable.md",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Lk)("code",null,"Function.isCallable() / Function.isConstructor()",-1),p=(0,t.Lk)("code",null,"isConstructor()",-1),u=(0,t.Fv)('
import { isConstructor } from "@aedart/support/reflections";\n\nisConstructor(null); // false\nisConstructor({}); // false\nisConstructor([]); // false\nisConstructor(() => {}); // false\n\nisConstructor(function() {}); // true\nisConstructor(class {}); // true\n\n// Built-in objects\nisConstructor(Array); // true\nisConstructor(String); // true\nisConstructor(Number); // true\nisConstructor(Date); // true\nisConstructor(Map); // true\nisConstructor(Set); // true\n// ...etc\n

Acknowledgement

',2),i={href:"https://github.com/zloirock/core-js#function-iscallable-isconstructor-",target:"_blank",rel:"noopener noreferrer"},l=(0,t.Lk)("em",null,"License MIT",-1),r=(0,t.Lk)("code",null,"isClassConstructor()",-1),k={};var d=(0,a(6262).A)(k,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon"),k=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[o,(0,t.Lk)("p",null,[(0,t.eW)("Based on the "),(0,t.Lk)("a",e,[(0,t.eW)("TC39 "),c,(0,t.bF)(a)]),(0,t.eW)(" proposal, the "),p,(0,t.eW)(" can determine if value is a constructor.")]),u,(0,t.Lk)("p",null,[(0,t.eW)("The source code of the above shown methods is heavily inspired by Denis Pushkarev's Core-js implementation of the "),(0,t.Lk)("a",i,[(0,t.eW)("Function.isCallable / Function.isConstructor"),(0,t.bF)(a)]),(0,t.eW)(" proposal ("),l,(0,t.eW)(").")]),(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(k,{to:"/archive/current/packages/support/reflections/isClassConstructor.html"},{default:(0,t.k6)((()=>[r])),_:1}),(0,t.eW)(".")])])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/reflections/isConstructor.html","title":"Is Constructor","lang":"en-GB","frontmatter":{"title":"Is Constructor","description":"Determine if value is a constructor.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710169684000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/packages/support/reflections/isConstructor.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isKey.html.5d05550b.js b/assets/js/isKey.html.5d05550b.js new file mode 100644 index 00000000..63add13e --- /dev/null +++ b/assets/js/isKey.html.5d05550b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6529],{9845:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return u}});var t=a(641);const e={id:"iskey",tabindex:"-1"},p={class:"header-anchor",href:"#iskey"},o=(0,t.Lk)("code",null,"isKey",-1),c=(0,t.Fv)('
import { isKey } from '@aedart/support/misc';\n\nisKey('foo'); // true\nisKey(12); // true\nisKey(Symbol('my-symbol')); // true\nisKey([ 'a', 'b.c', Symbol('my-other-symbol')]); // true\n\nisKey(true); // false\nisKey([]); // false\nisKey(null); // false\nisKey(undefined); // false\nisKey(() => true); // false\n
',1),i={};var l=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,t.g2)("Badge"),i=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),(0,t.Lk)("p",null,[(0,t.eW)("Determine if given is a valid "),(0,t.bF)(i,{to:"/archive/current/packages/support/misc/isPropertyKey.html"},{default:(0,t.k6)((()=>[(0,t.eW)("key")])),_:1}),(0,t.eW)(" or "),(0,t.bF)(i,{to:"/archive/current/packages/support/objects/has.html"},{default:(0,t.k6)((()=>[(0,t.eW)("property path identifier")])),_:1}),(0,t.eW)(".")]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/misc/isKey.html","title":"Is Key","lang":"en-GB","frontmatter":{"title":"Is Key","description":"Determine if is a key or path identifier","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/isKey.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isKeySafe.html.b4d79743.js b/assets/js/isKeySafe.html.b4d79743.js new file mode 100644 index 00000000..03934e81 --- /dev/null +++ b/assets/js/isKeySafe.html.b4d79743.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9088],{6536:function(n,s,a){a.r(s),a.d(s,{comp:function(){return r},data:function(){return u}});var e=a(641);const t={id:"iskeysafe",tabindex:"-1"},p={class:"header-anchor",href:"#iskeysafe"},i=(0,e.Lk)("code",null,"isKeySafe",-1),o=(0,e.Lk)("code",null,"isKeyUnsafe()",-1),c=(0,e.Fv)('
import { isKeySafe } from '@aedart/support/reflections';\n\nisKeySafe('name'); // true\nisKeySafe('length'); // true\nisKeySafe('constructor'); // true\nisKeySafe('__proto__'); // false\n
',1),l={};var r=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,e.g2)("Badge"),l=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h2",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[i,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Opposite of "),(0,e.bF)(l,{to:"/archive/current/packages/support/reflections/isKeyUnsafe.html"},{default:(0,e.k6)((()=>[o])),_:1}),(0,e.eW)(".")]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/reflections/isKeySafe.html","title":"Is Key Safe","lang":"en-GB","frontmatter":{"title":"Is Key Safe","description":"Determine if a property key is safe.","sidebarDepth":0},"headers":[{"level":2,"title":"isKeySafe","slug":"iskeysafe","link":"#iskeysafe","children":[]}],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isKeySafe.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isKeyUnsafe.html.48d1e86a.js b/assets/js/isKeyUnsafe.html.48d1e86a.js new file mode 100644 index 00000000..0da50d85 --- /dev/null +++ b/assets/js/isKeyUnsafe.html.48d1e86a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4795],{715:function(s,n,a){a.r(n),a.d(n,{comp:function(){return l},data:function(){return r}});var e=a(641);const t={id:"iskeyunsafe",tabindex:"-1"},p={class:"header-anchor",href:"#iskeyunsafe"},i=(0,e.Lk)("code",null,"isKeyUnsafe",-1),o=(0,e.Fv)('

Determines if a property key is considered "unsafe".

import { isKeyUnsafe } from '@aedart/support/reflections';\n\nisKeyUnsafe('name'); // false\nisKeyUnsafe('length'); // false\nisKeyUnsafe('constructor'); // false\nisKeyUnsafe('__proto__'); // true\n

Note

Behind the scene, the isKeyUnsafe() function matches the given key against values from the predefined DANGEROUS_PROPERTIES list, which is defined in the @aedart/contracts/support/objects submodule;

import { DANGEROUS_PROPERTIES } from "@aedart/contracts/support/objects";\n
',3),c={};var l=(0,a(6262).A)(c,[["render",function(s,n){const a=(0,e.g2)("Badge");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[i,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),o])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/isKeyUnsafe.html","title":"Is Key Unsafe","lang":"en-GB","frontmatter":{"title":"Is Key Unsafe","description":"Determine if a property key is unsafe.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/packages/support/reflections/isKeyUnsafe.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isMethod.html.c2a2d65f.js b/assets/js/isMethod.html.c2a2d65f.js new file mode 100644 index 00000000..595c3be0 --- /dev/null +++ b/assets/js/isMethod.html.c2a2d65f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8533],{9043:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return r}});var t=a(641);const e={id:"ismethod",tabindex:"-1"},p={class:"header-anchor",href:"#ismethod"},o=(0,t.Lk)("code",null,"isMethod",-1),c=(0,t.Fv)('

Determine if property (name) is a method in given target object.

It accepts the following arguments:

  • target: object - The target.
  • property: PropertyKey - Name of property.
import { isMethod } from '@aedart/support/reflections';\n\nclass A {\n    age = 23;\n    \n    #title = 'AAA';\n    get title() {\n        return this.#title;\n    }\n\n    #job = 'AAA';\n    set job(v) {\n        this.#job = v; \n    }\n\n    foo: () => { /* ...not shown... */ }\n}\n\nconst a = new A();\n\nisMethod(a, 'age'); // false\nisMethod(a, 'title'); // false\nisMethod(a, 'job'); // false\nisMethod(a, 'foo'); // true\n
',4),i=(0,t.Lk)("code",null,"hasMethod()",-1),l={};var u=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,t.g2)("Badge"),l=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.11",vertical:"middle"})])])]),c,(0,t.Lk)("p",null,[(0,t.eW)("See also "),(0,t.bF)(l,{to:"/archive/current/packages/support/reflections/hasMethod.html"},{default:(0,t.k6)((()=>[i])),_:1}),(0,t.eW)(".")])])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/reflections/isMethod.html","title":"Is Method","lang":"en-GB","frontmatter":{"title":"Is Method","description":"Determine if property is a method in target","sidebarDepth":0},"headers":[],"git":{"updatedTime":1710155509000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isMethod.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isPopulatable.html.44884087.js b/assets/js/isPopulatable.html.44884087.js new file mode 100644 index 00000000..06956c1d --- /dev/null +++ b/assets/js/isPopulatable.html.44884087.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6321],{6565:function(n,s,a){a.r(s),a.d(s,{comp:function(){return i},data:function(){return u}});var t=a(641);const e={id:"ispopulatable",tabindex:"-1"},p={class:"header-anchor",href:"#ispopulatable"},o=(0,t.Lk)("code",null,"isPopulatable",-1),c=(0,t.Fv)('

Determines if given object is "populatable". Here, "populatable" means that an object implements the Populatable interface, and offers a populate() method.

See @aedart/constracts/support/objects/Populatable for details.

import { isPopulatable } from "@aedart/support/objects";\n\nclass A {};\n\nclass B {\n    populate(data) {\n        // ...not shown here...\n        \n        return this;\n    }\n}\n\nisPopulatable(null); // false\nisPopulatable([]); // false\nisPopulatable({}); // false\nisPopulatable(new A()); // false\nisPopulatable(new B()); // true\n
',3),l={};var i=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,t.g2)("Badge");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/objects/isPopulatable.html","title":"Is Populatable","lang":"en-GB","frontmatter":{"title":"Is Populatable","description":"Determine if object is populatable.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/isPopulatable.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isPrimitive.html.c0301777.js b/assets/js/isPrimitive.html.c0301777.js new file mode 100644 index 00000000..4d6c6290 --- /dev/null +++ b/assets/js/isPrimitive.html.c0301777.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9383],{5615:function(n,s,a){a.r(s),a.d(s,{comp:function(){return c},data:function(){return u}});var t=a(641);const e=(0,t.Lk)("h1",{id:"isprimitive",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#isprimitive"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"isPrimitive")])])],-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#primitive_values",target:"_blank",rel:"noopener noreferrer"},i=(0,t.Fv)('
import { isPrimitive } from '@aedart/support/misc';\n\nisPrimitive(null); // true\nisPrimitive(undefined); // true\nisPrimitive(true); // true\nisPrimitive(1); // true\nisPrimitive(1n); // true\nisPrimitive('foo'); // true\nisPrimitive(Symbol('my-symbol')); // true\n\nisPrimitive([1, 2, 3]); // false\nisPrimitive({ name: 'Rian' }); // false\nisPrimitive(function() {}); // false\n
',1),o={};var c=(0,a(6262).A)(o,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[e,(0,t.Lk)("p",null,[(0,t.eW)("Determine if a value is a "),(0,t.Lk)("a",p,[(0,t.eW)("primitive value"),(0,t.bF)(a)]),(0,t.eW)(".")]),i])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/misc/isPrimitive.html","title":"Is Primitive","lang":"en-GB","frontmatter":{"title":"Is Primitive","description":"Determine if value is a primitive.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/isPrimitive.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isPropertyKey.html.87fe6434.js b/assets/js/isPropertyKey.html.87fe6434.js new file mode 100644 index 00000000..6574c26c --- /dev/null +++ b/assets/js/isPropertyKey.html.87fe6434.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5394],{9937:function(n,s,a){a.r(s),a.d(s,{comp:function(){return l},data:function(){return u}});var t=a(641);const e={id:"ispropertykey",tabindex:"-1"},p={class:"header-anchor",href:"#ispropertykey"},o=(0,t.Lk)("code",null,"isPropertyKey",-1),c=(0,t.Fv)('

Determine if a key a valid property key name (string, number, or symbol).

import { isPropertyKey } from '@aedart/support/misc';\n\nisPropertyKey('foo'); // true\nisPropertyKey(12); // true\nisPropertyKey(Symbol('my-symbol')); // true\n\nisPropertyKey(true); // false\nisPropertyKey(['a', 'b', 'c']); // false\nisPropertyKey(null); // false\nisPropertyKey(undefined); // false\nisPropertyKey(() => true); // false\n
',2),i={};var l=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,t.g2)("Badge");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),c])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/misc/isPropertyKey.html","title":"Is Property Key","lang":"en-GB","frontmatter":{"title":"Is Property Key","description":"Determine if key is a valid property key name.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/isPropertyKey.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isSafeArrayLike.html.d566834f.js b/assets/js/isSafeArrayLike.html.d566834f.js new file mode 100644 index 00000000..2475bf66 --- /dev/null +++ b/assets/js/isSafeArrayLike.html.d566834f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8071],{7240:function(n,a,s){s.r(a),s.d(a,{comp:function(){return u},data:function(){return k}});var e=s(641);const t=(0,e.Lk)("h1",{id:"issafearraylike",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#issafearraylike"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"isSafeArrayLike")])])],-1),p=(0,e.Lk)("a",{href:"#isarraylike"},"array-like",-1),o={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/String",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"String",-1),i={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",target:"_blank",rel:"noopener noreferrer"},c=(0,e.Fv)('
import { isSafeArrayLike } from '@aedart/support/arrays';\n\nisSafeArrayLike([]); // true\nisSafeArrayLike({ length: 0 }); // true\n\nisSafeArrayLike('abc'); // false\nisSafeArrayLike(new String('abc')); // false\nisSafeArrayLike(new Int8Array()); // false\n// ...etc\n
',1),l={};var u=(0,s(6262).A)(l,[["render",function(n,a){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)('Determines if value is "safe" '),p,(0,e.eW)(' object. In this context "safe" means that value is not a string, not an instance of '),(0,e.Lk)("a",o,[r,(0,e.bF)(s)]),(0,e.eW)(" object, and not a "),(0,e.Lk)("a",i,[(0,e.eW)("Typed Array"),(0,e.bF)(s)]),(0,e.eW)(" object.")]),c])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/arrays/isSafeArrayLike.html","title":"Is Safe Array Like","lang":"en-GB","frontmatter":{"title":"Is Safe Array Like","description":"Determine if value is \\"safe\\" array-like.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/isSafeArrayLike.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isSubclass.html.8603c7e5.js b/assets/js/isSubclass.html.8603c7e5.js new file mode 100644 index 00000000..5aeec13e --- /dev/null +++ b/assets/js/isSubclass.html.8603c7e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3082],{2408:function(s,n,a){a.r(n),a.d(n,{comp:function(){return i},data:function(){return u}});var t=a(641);const e={id:"issubclass",tabindex:"-1"},c={class:"header-anchor",href:"#issubclass"},p=(0,t.Lk)("code",null,"isSubclass",-1),o=(0,t.Fv)('

Determine if target class is a subclass (child class) of given superclass (parent class).

It accepts the following arguments:

  • target: object - The target.
  • superclass: ConstructorOrAbstractConstructor - The superclass.
import { isSubclass } from '@aedart/support/reflections';\n\nclass A {}\n\nclass B extends A {}\n\nisSubclass({}, A); // false\nisSubclass(A, A); // false\nisSubclass(A, B); // false\n\nisSubclass(B, A); // true\n
',4),l={};var i=(0,a(6262).A)(l,[["render",function(s,n){const a=(0,t.g2)("Badge");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",c,[(0,t.Lk)("span",null,[p,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),o])}]]);const u=JSON.parse('{"path":"/archive/current/packages/support/reflections/isSubclass.html","title":"Is Subclass","lang":"en-GB","frontmatter":{"title":"Is Subclass","description":"Determine if target is a subclass of another class.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isSubclass.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isSubclassOrLooksLike.html.46bf230a.js b/assets/js/isSubclassOrLooksLike.html.46bf230a.js new file mode 100644 index 00000000..08be66ad --- /dev/null +++ b/assets/js/isSubclassOrLooksLike.html.46bf230a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4648],{5092:function(s,n,a){a.r(n),a.d(n,{comp:function(){return L},data:function(){return f}});var t=a(641);const e={id:"issubclassorlookslike",tabindex:"-1"},p={class:"header-anchor",href:"#issubclassorlookslike"},o=(0,t.Lk)("code",null,"isSubclassOrLooksLike",-1),l=(0,t.Lk)("p",null,"Determine if target class is a subclass of given superclass, or if it looks like given blueprint.",-1),c=(0,t.Lk)("p",null,"It accepts the following arguments:",-1),i=(0,t.Lk)("li",null,[(0,t.Lk)("code",null,"target: object"),(0,t.eW)(" - The target.")],-1),u=(0,t.Lk)("li",null,[(0,t.Lk)("code",null,"superclass: ConstructorOrAbstractConstructor"),(0,t.eW)(" - The superclass.")],-1),r=(0,t.Lk)("code",null,"blueprint: ClassBlueprint",-1),k=(0,t.Lk)("code",null,"classLooksLike",-1),d=(0,t.Fv)('
import { isSubclassOrLooksLike } from '@aedart/support/reflections';\n\nclass A {\n    foo() {}\n}\nclass B extends A {}\n\nclass C {\n    foo() {}\n}\n\nisSubclassOrLooksLike(B, A, { members: [] }); // true\nisSubclassOrLooksLike(C, A, { members: [] }); // false\nisSubclassOrLooksLike(C, A, { members: [ 'foo' ] }); // true\n
',1),m=(0,t.Lk)("code",null,"isSubclass()",-1),b=(0,t.Lk)("code",null,"classLooksLike()",-1),v={};var L=(0,a(6262).A)(v,[["render",function(s,n){const a=(0,t.g2)("Badge"),v=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("h1",e,[(0,t.Lk)("a",p,[(0,t.Lk)("span",null,[o,(0,t.eW)(),(0,t.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),l,c,(0,t.Lk)("ul",null,[i,u,(0,t.Lk)("li",null,[r,(0,t.eW)(" - Class Blueprint ("),(0,t.Lk)("em",null,[(0,t.eW)("See "),(0,t.bF)(v,{to:"/archive/current/packages/support/reflections/classLooksLike.html#class-blueprint"},{default:(0,t.k6)((()=>[k])),_:1})]),(0,t.eW)(").")])]),d,(0,t.Lk)("p",null,[(0,t.Lk)("em",null,[(0,t.eW)("See "),(0,t.bF)(v,{to:"/archive/current/packages/support/reflections/isSubclass.html"},{default:(0,t.k6)((()=>[m])),_:1}),(0,t.eW)(" and "),(0,t.bF)(v,{to:"/archive/current/packages/support/reflections/classLooksLike.html"},{default:(0,t.k6)((()=>[b])),_:1}),(0,t.eW)(" for additional details.")])])])}]]);const f=JSON.parse('{"path":"/archive/current/packages/support/reflections/isSubclassOrLooksLike.html","title":"Is Subclass Or Looks Like","lang":"en-GB","frontmatter":{"title":"Is Subclass Or Looks Like","description":"Determine if target is a subclass of another class, or looks like blueprint","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isSubclassOrLooksLike.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isTypedArray.html.309030b7.js b/assets/js/isTypedArray.html.309030b7.js new file mode 100644 index 00000000..b2c094cd --- /dev/null +++ b/assets/js/isTypedArray.html.309030b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6805],{7187:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return i}});var t=a(641);const p=(0,t.Lk)("h1",{id:"istypedarray",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#istypedarray"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"isTypedArray")])])],-1),e={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray",target:"_blank",rel:"noopener noreferrer"},c=(0,t.Lk)("code",null,"TypedArray",-1),o=(0,t.Fv)('
import { isTypedArray } from '@aedart/support/arrays';\n\nisTypedArray(null); // false\nisTypedArray({}); // false\nisTypedArray([]); // false\nisTypedArray(new Map()); // false\n\nisTypedArray(new Int8Array()); // true\nisTypedArray(new Uint8Array()); // true\nisTypedArray(new Uint8ClampedArray()); // true\nisTypedArray(new Int16Array()); // true\nisTypedArray(new Uint16Array()); // true\nisTypedArray(new Int32Array()); // true\nisTypedArray(new Uint32Array()); // true\nisTypedArray(new Float32Array()); // true\nisTypedArray(new Float64Array()); // true\nisTypedArray(new BigInt64Array()); // true\nisTypedArray(new BigUint64Array()); // true\n
',1),l={};var u=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[p,(0,t.Lk)("p",null,[(0,t.eW)("Determines if target is an instance of a "),(0,t.Lk)("a",e,[c,(0,t.bF)(a)]),(0,t.eW)(".")]),o])}]]);const i=JSON.parse('{"path":"/archive/current/packages/support/arrays/isTypedArray.html","title":"Is Typed Array","lang":"en-GB","frontmatter":{"title":"Is Typed Array","description":"Determine if object is a typed array.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/arrays/isTypedArray.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isWeakKind.html.4f39498c.js b/assets/js/isWeakKind.html.4f39498c.js new file mode 100644 index 00000000..b924e6f7 --- /dev/null +++ b/assets/js/isWeakKind.html.4f39498c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9058],{6820:function(n,a,s){s.r(a),s.d(a,{comp:function(){return v},data:function(){return f}});var e=s(641);const t={id:"isweakkind",tabindex:"-1"},p={class:"header-anchor",href:"#isweakkind"},o=(0,e.Lk)("code",null,"isWeakKind",-1),c={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Lk)("code",null,"WeakRef",-1),l={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Lk)("code",null,"WeakMap",-1),k={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"WeakSet",-1),d=(0,e.Fv)('
import { isWeakKind } from '@aedart/support/reflections';\n\nconst a = {};\n\nisWeakKind(null); // false\nisWeakKind(a); // false\nisWeakKind(new Map()); // false\nisWeakKind(new Set()); // false\n\nisWeakKind(new WeakRef(a)); // true\nisWeakKind(new WeakMap()); // true\nisWeakKind(new WeakSet()); // true\n
',1),m={};var v=(0,s(6262).A)(m,[["render",function(n,a){const s=(0,e.g2)("Badge"),m=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(s,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)('Determine if object of a "weak" kind, e.g. '),(0,e.Lk)("a",c,[i,(0,e.bF)(m)]),(0,e.eW)(", "),(0,e.Lk)("a",l,[u,(0,e.bF)(m)]),(0,e.eW)(", or "),(0,e.Lk)("a",k,[r,(0,e.bF)(m)]),(0,e.eW)(".")]),d])}]]);const f=JSON.parse('{"path":"/archive/current/packages/support/reflections/isWeakKind.html","title":"Is WeakKind","lang":"en-GB","frontmatter":{"title":"Is WeakKind","description":"Determine if object is of a \\"weak\\" kind.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709548506000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/reflections/isWeakKind.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/isset.html.1a8165f2.js b/assets/js/isset.html.1a8165f2.js new file mode 100644 index 00000000..ed3068ff --- /dev/null +++ b/assets/js/isset.html.1a8165f2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9502],{8632:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return i}});var t=a(641);const e=(0,t.Lk)("h1",{id:"isset",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#isset"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"isset")])])],-1),p=(0,t.Lk)("p",null,[(0,t.eW)("Determine if value is different from "),(0,t.Lk)("code",null,"undefined"),(0,t.eW)(" and "),(0,t.Lk)("code",null,"null"),(0,t.eW)(".")],-1),o=(0,t.Lk)("code",null,"empty()",-1),c=(0,t.Fv)('
import { isset } from '@aedart/support/misc';\n\nisset('foo'); // true\nisset(''); // true\nisset(true); // true\nisset(false); // true\nisset(1234); // true\nisset(1.234); // true\nisset([]); // true\nisset({}); // true\nisset(() => true); // true\n\nisset(undefined); // false\nisset(null); // false\n

Multiple values

You can also determine if multiple values differ from undefined and null.

Note: All given values must differ from undefined and null, before method returns true.

isset('foo', { name: 'Jane' }, [ 1, 2, 3 ]); // true\n\nisset('foo', null, [ 1, 2, 3 ]); // false\nisset('foo', { name: 'Jane' }, undefined); // false\n
',5),l={};var u=(0,a(6262).A)(l,[["render",function(n,s){const a=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[e,p,(0,t.Lk)("p",null,[(0,t.Lk)("em",null,[(0,t.eW)("See also "),(0,t.bF)(a,{to:"/archive/current/packages/support/misc/empty.html"},{default:(0,t.k6)((()=>[o])),_:1}),(0,t.eW)(".")])]),c])}]]);const i=JSON.parse('{"path":"/archive/current/packages/support/misc/isset.html","title":"Isset","lang":"en-GB","frontmatter":{"title":"Isset","description":"Determine if value isset.","sidebarDepth":0},"headers":[{"level":2,"title":"Multiple values","slug":"multiple-values","link":"#multiple-values","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/isset.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},906:function(n,s,a){a.r(s),a.d(s,{comp:function(){return r},data:function(){return k}});var t=a(641);const e=(0,t.Lk)("h1",{id:"isset",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#isset"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"isset")])])],-1),p=(0,t.Lk)("code",null,"has()",-1),o=(0,t.Lk)("code",null,"undefined",-1),c=(0,t.Lk)("code",null,"null",-1),l=(0,t.Lk)("code",null,"isset()",-1),u=(0,t.Fv)('
import { isset } from "@aedart/support/objects";\n\nconst target = {\n    a: 1234,\n    b: {\n        name: undefined,\n        c: {\n            age: null\n        }\n    },\n};\n\nconsole.log(isset(target, 'a')); // true\nconsole.log(isset(target, 'b')); // true\nconsole.log(isset(target, 'b.name')); // false\nconsole.log(isset(target, 'b.c')); // true\nconsole.log(isset(target, 'b.c.age')); // false\n

You can also check if multiple paths are set.

console.log(isset(target, 'a', 'b')); // true\nconsole.log(isset(target, 'b.c', 'b.name')); // false\nconsole.log(isset(target, 'a', 'b.name', 'b.c.age')); // false\n
',3),i={};var r=(0,a(6262).A)(i,[["render",function(n,s){const a=(0,t.g2)("RouteLink");return(0,t.uX)(),(0,t.CE)("div",null,[e,(0,t.Lk)("p",null,[(0,t.eW)("Determine if paths are properties of given object and have values. This method differs from "),(0,t.bF)(a,{to:"/archive/current/packages/support/objects/has.html"},{default:(0,t.k6)((()=>[p])),_:1}),(0,t.eW)(", in that it only returns true if properties' values are not "),o,(0,t.eW)(" and not "),c,(0,t.eW)(".")]),(0,t.Lk)("p",null,[(0,t.Lk)("em",null,[(0,t.eW)("See also "),(0,t.bF)(a,{to:"/archive/current/packages/support/misc/isset.html"},{default:(0,t.k6)((()=>[(0,t.eW)("misc. "),l])),_:1}),(0,t.eW)(".")])]),u])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/objects/isset.html","title":"Isset","lang":"en-GB","frontmatter":{"title":"Isset","description":"Determine if object object paths are set and have values.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/isset.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/jsdoc.html.29e03e5d.js b/assets/js/jsdoc.html.29e03e5d.js new file mode 100644 index 00000000..43120683 --- /dev/null +++ b/assets/js/jsdoc.html.29e03e5d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6745],{7975:function(n,s,a){a.r(s),a.d(s,{comp:function(){return M},data:function(){return T}});var e=a(641);const t=(0,e.Lk)("h1",{id:"jsdoc",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#jsdoc"},[(0,e.Lk)("span",null,"JSDoc")])],-1),o={href:"https://jsdoc.app/",target:"_blank",rel:"noopener noreferrer"},p={class:"table-of-contents"},l={class:"custom-container tip"},c=(0,e.Lk)("p",{class:"custom-container-title"},"Help wanted!",-1),i=(0,e.Lk)("h2",{id:"mixin-and-mixes",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#mixin-and-mixes"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"@mixin"),(0,e.eW)(" and "),(0,e.Lk)("code",null,"@mixes")])])],-1),r={href:"https://jsdoc.app/tags-mixes",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Lk)("code",null,"@mixin",-1),d=(0,e.Lk)("code",null,"@mixes",-1),k=(0,e.Lk)("strong",null,"Downside",-1),m=(0,e.Lk)("code",null,"@mixin",-1),v=(0,e.Lk)("code",null,"@mixes",-1),b={href:"https://jsdoc.app/tags-function",target:"_blank",rel:"noopener noreferrer"},y=(0,e.Lk)("code",null,"@function",-1),h={href:"https://jsdoc.app/tags-member",target:"_blank",rel:"noopener noreferrer"},g=(0,e.Lk)("code",null,"@member",-1),w=(0,e.Fv)('
import { use, AbstractConcern } from "@aedart/support/concerns";\n\n/**\n * @mixin\n * @extends AbstractConcern\n */\nclass Shield extends AbstractConcern {\n\n    /**\n     * Returns the armor level\n     *\n     * @returns {number}\n     */\n    get armor() {\n        return 8;\n    }\n\n    /**\n     * Throw shield towards a target\n     *\n     * @param {object} target\n     *\n     * @returns {number} Damage given to target\n     */\n    throw(target) {\n        // target ignored here...\n        return 3;\n    }\n}\n\n/**\n * @mixes Shield\n */\n@use([Shield, {\n    'throw': 'fight'\n}])\nclass Monster {\n\n    /**\n     * Alias for {@link Shield#throw}\n     *\n     * @function fight\n     * @param {object} target The target to throw at...\n     * @return {number} Damage taken by target\n     * @instance\n     * @memberof Monster\n     */\n\n    /**\n     * Do stuff...\n     */\n    do() {\n        this.fight({});\n    }\n}\n

@property

',2),f={href:"https://jsdoc.app/tags-property",target:"_blank",rel:"noopener noreferrer"},L=(0,e.Lk)("code",null,"@property",-1),x=(0,e.Fv)('

Downside: Properties and methods described via @property are listed as "static" on the target class. Also, it is not possible to reuse existing JSDoc from your concern.

import { use, AbstractConcern } from "@aedart/support/concerns";\n\nclass Armor extends AbstractConcern {\n\n    /**\n     * Returns the armor level\n     *\n     * @returns {number}\n     */\n    get level() {\n        return 8;\n    }\n}\n\n/**\n * @property {number} armor Returns the armor level\n */\n@use([Armor, {\n    'level': 'armor'\n}])\nclass Hero {}\n

@borrows

',3),j={href:"https://jsdoc.app/tags-borrows",target:"_blank",rel:"noopener noreferrer"},W=(0,e.Lk)("code",null,"@borrows",-1),D=(0,e.Lk)("strong",null,"Downside",-1),S={href:"https://jsdoc.app/tags-member",target:"_blank",rel:"noopener noreferrer"},A=(0,e.Lk)("code",null,"@member",-1),_=(0,e.Fv)('
import { use, AbstractConcern } from "@aedart/support/concerns";\n\n/**\n * @extends AbstractConcern\n */\nclass Spell extends AbstractConcern {\n    \n    /**\n     * Cast the spell\n     *\n     * @name cast\n     * \n     * @returns {number} Damage done\n     */\n    cast() {\n        return 7;\n    }\n}\n\n/**\n * @borrows Spell#cast as damage\n */\n@use([Spell, {\n    'cast': 'damage'\n}])\nclass Mage {\n    \n    /**\n     * @function damage\n     * @return {number}\n     * @instance\n     * @memberof Npc\n     */\n}\n

@member

',2),F={href:"https://jsdoc.app/tags-member",target:"_blank",rel:"noopener noreferrer"},C=(0,e.Lk)("code",null,"@member",-1),q={href:"https://jsdoc.app/tags-borrows",target:"_blank",rel:"noopener noreferrer"},J=(0,e.Lk)("code",null,"@borrows",-1),R=(0,e.Fv)('

Downside: This approach can be very cumbersome. Also, reuse of JSDoc is not possible.

import { use, AbstractConcern } from "@aedart/support/concerns";\n\nclass Sword extends AbstractConcern {\n\n    /**\n     * Returns amount of damage\n     *\n     * @returns {number}\n     */\n    get slash() {\n        return 3;\n    }\n\n    /**\n     * Returns the sword type\n     *\n     * @name type\n     * @return {string}\n     */\n    get type() {\n        return 'unique';\n    }\n}\n\n\n@use([Sword, {\n    'slash': 'damage'\n}])\nclass Enemy {\n\n    /**\n     * @public\n     * @member {number} damage  Alias for {@link Sword#slash}\n     * @memberof Enemy\n     */\n\n    /**\n     * @public\n     * @member {string} type Alias for {@link Sword#type}\n     * @memberof Enemy\n     */\n}\n
',2),E={};var M=(0,a(6262).A)(E,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),E=(0,e.g2)("router-link"),M=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("Most modern IDEs support "),(0,e.Lk)("a",o,[(0,e.eW)("JSDoc"),(0,e.bF)(a)]),(0,e.eW)(". They can improve your coding experience via code suggestions, highlights and other features. In this chapter, you will find a few ways that you can document your concerns and target class, via JSDoc.")]),(0,e.Lk)("nav",p,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(E,{to:"#mixin-and-mixes"},{default:(0,e.k6)((()=>[(0,e.eW)("@mixin and @mixes")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(E,{to:"#property"},{default:(0,e.k6)((()=>[(0,e.eW)("@property")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(E,{to:"#borrows"},{default:(0,e.k6)((()=>[(0,e.eW)("@borrows")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(E,{to:"#member"},{default:(0,e.k6)((()=>[(0,e.eW)("@member")])),_:1})])])]),(0,e.Lk)("div",l,[c,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("If you are an expert in JSDoc, then you are most welcome to help improve this chapter. Please see the "),(0,e.bF)(M,{to:"/archive/current/contribution-guide.html"},{default:(0,e.k6)((()=>[(0,e.eW)("contribution guide")])),_:1}),(0,e.eW)(" for details on how you can contribute.")])])]),i,(0,e.Lk)("p",null,[(0,e.eW)("Possibly the easiest way to document your concern and target class that uses the concern, is via the "),(0,e.Lk)("a",r,[u,(0,e.eW)(" and "),d,(0,e.bF)(a)]),(0,e.eW)(" tags.")]),(0,e.Lk)("p",null,[k,(0,e.eW)(": "),(0,e.Lk)("em",null,[(0,e.eW)('Documenting "aliases" (known as virtual fields in the context of JSDoc) is not possible via '),m,(0,e.eW)(" and "),v,(0,e.eW)(". You can describe an alias via "),(0,e.Lk)("a",b,[y,(0,e.bF)(a)]),(0,e.eW)(" or "),(0,e.Lk)("a",h,[g,(0,e.bF)(a)]),(0,e.eW)(" tag.")])]),w,(0,e.Lk)("p",null,[(0,e.eW)("Another possibility is to describe properties and methods available in a target, via the "),(0,e.Lk)("a",f,[L,(0,e.bF)(a)]),(0,e.eW)(' tag. Doing so allows you to immediately describe the "alias" name.')]),x,(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.Lk)("a",j,[W,(0,e.bF)(a)]),(0,e.eW)(" tag does also offer a possible way to describe aliases.")]),(0,e.Lk)("p",null,[D,(0,e.eW)(": "),(0,e.Lk)("em",null,[(0,e.eW)("You are still required to use "),(0,e.Lk)("a",S,[A,(0,e.bF)(a)]),(0,e.eW)(" tag to describe the actual aliases inside your target class.")])]),_,(0,e.Lk)("p",null,[(0,e.eW)("Lastly, you can use "),(0,e.Lk)("a",F,[C,(0,e.bF)(a)]),(0,e.eW)(" to describe all aliases directly, without relying on the "),(0,e.Lk)("a",q,[J,(0,e.bF)(a)]),(0,e.eW)(" tag.")]),R])}]]);const T=JSON.parse('{"path":"/archive/current/packages/support/concerns/jsdoc.html","title":"JSDoc","lang":"en-GB","frontmatter":{"title":"JSDoc","description":"A wat to document what concerns a targer class uses.","sidebarDepth":0},"headers":[{"level":2,"title":"@mixin and @mixes","slug":"mixin-and-mixes","link":"#mixin-and-mixes","children":[]},{"level":2,"title":"@property","slug":"property","link":"#property","children":[]},{"level":2,"title":"@borrows","slug":"borrows","link":"#borrows","children":[]},{"level":2,"title":"@member","slug":"member","link":"#member","children":[]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/jsdoc.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/last-updated.html.d07a4dec.js b/assets/js/last-updated.html.d07a4dec.js new file mode 100644 index 00000000..513f8fdb --- /dev/null +++ b/assets/js/last-updated.html.d07a4dec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8518],{4306:function(n,e,a){a.r(e),a.d(e,{comp:function(){return f},data:function(){return h}});var s=a(641);const t=(0,s.Lk)("h1",{id:"last-updated",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#last-updated"},[(0,s.Lk)("span",null,"Last Updated")])],-1),o=(0,s.Lk)("code",null,"lastUpdatedPlugin()",-1),i={href:"https://v2.vuepress.vuejs.org/reference/default-theme/config.html#lastupdated",target:"_blank",rel:"noopener noreferrer"},l={href:"https://moment.github.io/luxon/#/",target:"_blank",rel:"noopener noreferrer"},p=(0,s.Lk)("h2",{id:"how-to-use",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#how-to-use"},[(0,s.Lk)("span",null,"How to use")])],-1),r={href:"https://v2.vuepress.vuejs.org/guide/configuration.html#config-file",target:"_blank",rel:"noopener noreferrer"},u=(0,s.Lk)("code",null,"lastUpdatedPlugin()",-1),d=(0,s.Fv)('
import {defineUserConfig} from 'vuepress';\nimport {lastUpdatedPlugin} from "@aedart/vuepress-utils/plugins";\n\nexport default defineUserConfig({\n    \n    // ...other settings not shown...\n    \n    plugins: [\n        \n        lastUpdatedPlugin()\n    ]\n});\n

Format

',2),c=(0,s.Lk)("code",null,"format",-1),m={href:"https://moment.github.io/luxon/#/formatting?id=table-of-tokens",target:"_blank",rel:"noopener noreferrer"},k=(0,s.Fv)('
lastUpdatedPlugin({ format: 'dd-MM-yyyy HH:mm:ss' })\n

Note

The plugin uses yyyy-MM-dd HH:mm:ss ZZZZ as default format, when none is given.

Example output: 2023-03-19 16:09:20 GMT+1

',2),v={};var f=(0,a(6262).A)(v,[["render",function(n,e){const a=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,(0,s.Lk)("p",null,[o,(0,s.eW)(" allows you to specify a custom datetime format for the "),(0,s.Lk)("a",i,[(0,s.eW)('"last updated" date'),(0,s.bF)(a)]),(0,s.eW)(", for the default theme. It uses "),(0,s.Lk)("a",l,[(0,s.eW)("Luxon"),(0,s.bF)(a)]),(0,s.eW)(" to perform the formatting.")]),p,(0,s.Lk)("p",null,[(0,s.eW)("In your "),(0,s.Lk)("a",r,[(0,s.eW)("Config File"),(0,s.bF)(a)]),(0,s.eW)(", add the "),u,(0,s.eW)(":")]),d,(0,s.Lk)("p",null,[(0,s.eW)("Use the "),c,(0,s.eW)(" argument to specify your desired datetime format. See "),(0,s.Lk)("a",m,[(0,s.eW)("Luxon documentation"),(0,s.bF)(a)]),(0,s.eW)(" for available format tokens.")]),k])}]]);const h=JSON.parse('{"path":"/archive/current/packages/vuepress-utils/plugins/last-updated.html","title":"Last Updated","lang":"en-GB","frontmatter":{"title":"Last Updated","description":"Last Updated Date Vuepress plugins","sidebarDepth":0},"headers":[{"level":2,"title":"How to use","slug":"how-to-use","link":"#how-to-use","children":[]},{"level":2,"title":"Format","slug":"format","link":"#format","children":[]}],"git":{"updatedTime":1679756362000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/vuepress-utils/plugins/last-updated.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/merge.html.4504c2dd.js b/assets/js/merge.html.4504c2dd.js new file mode 100644 index 00000000..db90c9d3 --- /dev/null +++ b/assets/js/merge.html.4504c2dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8802],{7260:function(n,s,a){a.r(s),a.d(s,{comp:function(){return W},data:function(){return x}});var e=a(641);const t=(0,e.Lk)("h1",{id:"merge",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#merge"},[(0,e.Lk)("span",null,[(0,e.Lk)("code",null,"merge")])])],-1),p={class:"table-of-contents"},o={href:"https://developer.mozilla.org/en-US/docs/Web/API/structuredClone",target:"_blank",rel:"noopener noreferrer"},c=(0,e.Lk)("code",null,"structuredClone",-1),l=(0,e.Fv)('
import { merge } from '@aedart/support/arrays';\n\nconst a = [ 1, 2, 3 ];\nconst b = [ 4, 5, 6 ];\nconst c = [ 7, 8, 9 ];\n\nmerge(a, b, c); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n

Deep Copy Objects

',2),i=(0,e.Lk)("em",null,'or "plain"',-1),r={href:"https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy",target:"_blank",rel:"noopener noreferrer"},u={href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm",target:"_blank",rel:"noopener noreferrer"},d=(0,e.Fv)('
const a = { foo: 'foo' };\nconst b = { bar: 'bar' };\nconst c = { ping: 'pong' };\n\nconst result = merge([ a ], [ b, c ]);\n\nconsole.log(result[0] === a); // false\nconsole.log(result[1] === b); // false\nconsole.log(result[2] === c); // false\n

When unable to merge values

In situations when values cannot be copied via structuredClone, an ArrayMergeError is thrown.

const a = [ 1, 2, 3 ];\nconst b = [ function() {} ]; // A function cannot be deep copied...\n\nmerge(a, b); // ArrayMergeError\n

See merge options for details on how to deal with functions.

',5),k={id:"merge-options",tabindex:"-1"},v={class:"header-anchor",href:"#merge-options"},m=(0,e.Fv)('

merge() supports a number of options. To specify thom, use the using() method.

merge()\n    .using({ /** option: value */ })\n    .of(arrayA, arrayB, arrayC);\n

Note

When invoking merge() without any arguments, an underlying array Merger instance is returned.

transferFunctions

',4),b=(0,e.Lk)("em",null,"not copied",-1),g=(0,e.Lk)("code",null,"ArrayMergeError",-1),h={href:"https://developer.mozilla.org/en-US/docs/Web/API/structuredClone",target:"_blank",rel:"noopener noreferrer"},y=(0,e.Lk)("code",null,"structuredClone",-1),f=(0,e.Lk)("code",null,"transferFunctions",-1),w=(0,e.Lk)("code",null,"true",-1),j=(0,e.Fv)('
const foo = () => true;\nconst bar = () => false;\n\nmerge()\n    .using({ transferFunctions: true })\n    .of([ foo ], [ bar ]) // [ foo, bar ]\n

callback

If you require more advanced duplication logic of the array values, then you can specify a callback that can process and return the value in question.

const a = [ 1, 2 ];\nconst b = [ 3, 4 ];\n\nconst result = merge()\n    .using({\n        callback: (element, index, array, options) => {\n            return element * 2;\n        }\n    })\n    .of(a, b); // [ 2, 4, 6, 8 ]\n

Arguments

  • element: any - The current element being processed in the array.
  • index: number - The index of the current element being processed in the array.
  • array: any[] - The concatenated array this callback was called upon.
  • options: Readonly<ArrayMergeOptions> - The merge options to be applied.
',6),L={};var W=(0,a(6262).A)(L,[["render",function(n,s){const a=(0,e.g2)("router-link"),L=(0,e.g2)("Badge"),W=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",p,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#deep-copy-objects"},{default:(0,e.k6)((()=>[(0,e.eW)("Deep Copy Objects")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#when-unable-to-merge-values"},{default:(0,e.k6)((()=>[(0,e.eW)("When unable to merge values")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#merge-options"},{default:(0,e.k6)((()=>[(0,e.eW)("Merge Options "),(0,e.bF)(L,{type:"tip",text:"Available since v0.11",vertical:"middle"})])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#transferfunctions"},{default:(0,e.k6)((()=>[(0,e.eW)("transferFunctions")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#callback"},{default:(0,e.k6)((()=>[(0,e.eW)("callback")])),_:1})])])])])]),(0,e.Lk)("p",null,[(0,e.eW)("Merges arrays into a new array. This function attempts to deep copy values, using "),(0,e.Lk)("a",o,[c,(0,e.bF)(W)]),(0,e.eW)(".")]),l,(0,e.Lk)("p",null,[(0,e.eW)("Simple ("),i,(0,e.eW)(") objects are "),(0,e.Lk)("a",r,[(0,e.eW)("deep copied"),(0,e.bF)(W)]),(0,e.eW)(". This means that new objects are returned in the resulting array.")]),(0,e.Lk)("p",null,[(0,e.eW)("See "),(0,e.Lk)("a",u,[(0,e.eW)("Mozilla's documentation"),(0,e.bF)(W)]),(0,e.eW)(" for additional information about what data types are supported.")]),d,(0,e.Lk)("h2",k,[(0,e.Lk)("a",v,[(0,e.Lk)("span",null,[(0,e.eW)("Merge Options "),(0,e.bF)(L,{type:"tip",text:"Available since v0.11",vertical:"middle"})])])]),m,(0,e.Lk)("p",null,[(0,e.eW)("By default, functions are not transferred ("),b,(0,e.eW)("). When encountered an "),g,(0,e.eW)(" is thrown, because the underlying "),(0,e.Lk)("a",h,[y,(0,e.bF)(W)]),(0,e.eW)(" is not able to duplicate functions. To change this behaviour, you can set the "),f,(0,e.eW)(" setting to "),w,(0,e.eW)('. Function are then "transferred" into the resulting array.')]),j])}]]);const x=JSON.parse('{"path":"/archive/current/packages/support/arrays/merge.html","title":"Merge","lang":"en-GB","frontmatter":{"title":"Merge","description":"Merge multiple arrays into a new array.","sidebarDepth":0},"headers":[{"level":2,"title":"Deep Copy Objects","slug":"deep-copy-objects","link":"#deep-copy-objects","children":[]},{"level":2,"title":"When unable to merge values","slug":"when-unable-to-merge-values","link":"#when-unable-to-merge-values","children":[]},{"level":2,"title":"Merge Options","slug":"merge-options","link":"#merge-options","children":[{"level":3,"title":"transferFunctions","slug":"transferfunctions","link":"#transferfunctions","children":[]},{"level":3,"title":"callback","slug":"callback","link":"#callback","children":[]}]}],"git":{"updatedTime":1712043873000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/packages/support/arrays/merge.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},5888:function(n,s,a){a.r(s),a.d(s,{comp:function(){return _},data:function(){return S}});var e=a(641);const t={id:"merge",tabindex:"-1"},p={class:"header-anchor",href:"#merge"},o=(0,e.Lk)("code",null,"merge",-1),c={href:"https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy",target:"_blank",rel:"noopener noreferrer"},l={href:"https://developer.mozilla.org/en-US/docs/Web/API/structuredClone",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Lk)("code",null,"structuredClone",-1),r={class:"table-of-contents"},u=(0,e.Fv)('

Example

import { merge } from "@aedart/support/objects";\n\nconst person = {\n    'name': 'Alice',\n};\n\nconst address = {\n    'address': {\n        'street': 'Somewhere Street 43'\n    },\n};\n\nconst result = merge(person, address);\n\nconsole.log(result);\n

The above shown example results in a new object that looks like this:

{\n    "name": "Alice",\n    "address": {\n        "street": "Somewhere Street 43"\n    }\n}\n

Shallow Copied Types

',5),d={href:"https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy",target:"_blank",rel:"noopener noreferrer"},k={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function",target:"_blank",rel:"noopener noreferrer"},v={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol",target:"_blank",rel:"noopener noreferrer"},m=(0,e.Fv)('
const a = {\n    'foo': null,\n    'bar': Symbol('my_symbol')\n};\n\nconst b = {\n    'foo': function() {},\n};\n\nconst result = merge(a, b);\n\nconsole.log(result.foo === b.foo); // true\nconsole.log(result.bar === a.bar); // true\n

Unsafe Keys

Property keys that are considered "unsafe", are never copied.

const a = {\n    'foo': 'bar'\n};\nconst b = {\n    __proto__: { 'is_admin': true }\n}\n\nconst result = merge(a, b);\n\nconsole.log(result); // { 'foo': 'bar' }\nconsole.log(Reflect.has(result, '__proto__')); // false\n
',4),b=(0,e.Lk)("code",null,"isUnsafeKey()",-1),g=(0,e.Fv)('

Merge Options

merge() supports a number of options. To specify thom, use the using() method.

merge()\n    .using({ /** option: value */ })\n    .of(objA, objB, objC);\n

Note

When invoking merge() without any arguments, an underlying objects Merger instance is returned.

depth

The depth option specifies the maximum merge depth.

  • Default maximum depth: 512

A MergeError is thrown, if the maximum depth is exceeded.

const a = {\n    'person': {\n        'name': 'Una'\n    }\n};\n\nconst b = {\n    'person': {         // Level 0\n        'age': 24,      // Level 1\n        'address': {\n            'street': 'Somewhere Str. 654' // Level 2\n        }\n    }\n};\n\nconst result = merge()\n    .using({\n        depth: 1\n    })\n    .of(a, b); // MergeError - Maximum merge depth (1) has been exceeded\n

skip

skip defines property keys that must not be merged.

It accepts an array of property keys or a callback.

List of property keys

const a = {\n    'person': {\n        'name': 'Ulrik'\n    }\n};\n\nconst b = {\n    'person': {\n        'age': 36,\n        'address': {\n            'street': 'Nowhere Str. 12'\n        }\n    }\n};\n\nconst result = merge()\n    .using({\n        skip: [ 'age' ]\n    })\n    .of(a, b);\n

The above example results in the following new object:

{\n    "person": {\n        "name": "Ulrik",\n        "address": {\n            "street": "Nowhere Str. 12"\n        }\n    }\n}\n

Note

When specifying a list of property keys, then the depth level in which the property key is found does not matter.

Skip Callback

You can use a callback, if you need to handle more advanced skip logic. The callback accepts the the following arguments:

  • key: PropertyKey - The current property that is being processed.
  • source: object - The source object that contains the key.
  • result: object - The resulting object (relative to the current depth that is being processed).

The callback MUST return a boolean value; true if given key must be skipped, false otherwise.

const a = {\n    'person': {\n        'name': 'Jane'\n    }\n};\n\nconst b = {\n    'person': {\n        'name': 'James',\n        'address': {\n            'street': 'Sunview Palace 88'\n        }\n    }\n};\n\nconst b = {\n    'person': {\n        'name': 'White',\n    }\n};\n\nconst result = merge()\n    .using({\n        skip: (key, source, result) => {\n            return key === 'name'\n                && source[key] !== null\n                && !Reflect.has(result, key); \n        }\n    })\n    .of(a, b);\n

The above example results in the following new object:

{\n    "person": {\n        "name": "Jane",\n        "address": {\n            "street": "Sunview Palace 88"\n        }\n    }\n}\n

overwriteWithUndefined

Determines if a property value should be overwritten with undefined.

Note: By default, all values are overwritten, even when they are undefined!

const a = { 'foo': true };\nconst b = { 'foo': undefined };\n\nmerge(a, b); // { 'foo': undefined }\n\nmerge()\n    .using({ overwriteWithUndefined: false })\n    .of(a, b) // { 'foo': true }\n

useCloneable

',29),h=(0,e.Lk)("code",null,"clone()",-1),y=(0,e.Lk)("code",null,"Cloneable",-1),f=(0,e.Fv)('

Note: By default, if an object is cloneable, then its return value from clone() is used.

const a = { 'foo': { 'name': 'John Doe' } };\nconst b = { 'foo': {\n     'name': 'Jane Doe',\n     clone() {\n         return {\n             'name': 'Rick Doe',\n             'age': 26\n         }\n     }\n} };\n\nmerge(a, b); // { 'foo': { 'name': 'Rick Doe', 'age': 26 } }\n\nmerge()\n    .using({ useCloneable: false })\n    .of(a, b); // { 'foo': { 'name': 'Jane Doe', clone() {...} } }\n

mergeArrays

',3),w=(0,e.Fv)('

Note: By default, existing array values are NOT merged.

const a = { 'foo': [ 1, 2, 3 ] };\nconst b = { 'foo': [ 4, 5, 6 ] };\n\nmerge(a, b); // { 'foo': [ 4, 5, 6 ] }\n\nmerge()\n    .using({ mergeArrays: true })\n    .of(a, b); // { 'foo': [ 1, 2, 3, 4, 5, 6 ] }\n
',2),j={id:"arraymergeoptions",tabindex:"-1"},L={class:"header-anchor",href:"#arraymergeoptions"},W=(0,e.Lk)("code",null,"arrayMergeOptions",-1),x=(0,e.Fv)('

callback

In situations when you need more advanced merge logic, you may specify a custom callback.

The callback is responsible for returning the value to be merged, from a given source object.

const a = {\n    'a': 1\n};\n\nconst b = {\n    'b': 2\n};\n\nconst result = merge()\n    .using({\n        callback: (target, next, options) => {\n            const { key, value } = target;\n            if (key === 'b') {\n                return value + 1;\n            }\n\n            return value;\n        }\n    })\n    .of(a, b); // { 'a': 1, 'b': 3 }\n

If you do not have other merge options to specify, then you can simply provide a merge callback directly as argument for the using() method.

const result = merge()\n    .using((target, next, options) => {\n        const { key, value } = target;\n        if (key === 'b') {\n            return value + 1;\n        }\n\n        return value;\n    })\n    .of(a, b);\n

Arguments

The merge callback is given the following arguments:

  • target: MergeSourceInfo - The source target information (see below).
  • next: NextCallback - Callback to invoke for merging nested objects (next depth level).
  • options: Readonly<MergeOptions> - The merge options to be applied.

target: MergeSourceInfo

The source target information object contains the following properties:

  • result: object - The resulting object (relative to object depth)
  • key: PropertyKey - The target property key in source object to.
  • value: any - Value of the property in source object.
  • source: object - The source object that holds the property key and value.
  • sourceIndex: number - Source object's index (relative to object depth).
  • depth: number - The current recursion depth.

next: NextCallback

The callback to perform the merging of nested objects. It accepts the following arguments:

  • sources: object[] - The nested objects to be merged.
  • options: Readonly<MergeOptions> - The merge options to be applied.
  • nextDepth: number - The next recursion depth number.

Onward

For additional information about the merge callback, please review the source code of the defaultMergeCallback(), inside @aedart/support/objects.

',17),F={};var _=(0,a(6262).A)(F,[["render",function(n,s){const a=(0,e.g2)("Badge"),F=(0,e.g2)("ExternalLinkIcon"),_=(0,e.g2)("router-link"),S=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Merges objects recursively into a new object. The properties and values of the source objects are copied, using "),(0,e.Lk)("a",c,[(0,e.eW)("deep copy techniques"),(0,e.bF)(F)]),(0,e.eW)(", when possible. Behind the scene, most value types are deep copied via "),(0,e.Lk)("a",l,[i,(0,e.bF)(F)]),(0,e.eW)(".")]),(0,e.Lk)("nav",r,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#shallow-copied-types"},{default:(0,e.k6)((()=>[(0,e.eW)("Shallow Copied Types")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#unsafe-keys"},{default:(0,e.k6)((()=>[(0,e.eW)("Unsafe Keys")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#merge-options"},{default:(0,e.k6)((()=>[(0,e.eW)("Merge Options")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#depth"},{default:(0,e.k6)((()=>[(0,e.eW)("depth")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#skip"},{default:(0,e.k6)((()=>[(0,e.eW)("skip")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#overwritewithundefined"},{default:(0,e.k6)((()=>[(0,e.eW)("overwriteWithUndefined")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#usecloneable"},{default:(0,e.k6)((()=>[(0,e.eW)("useCloneable")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#mergearrays"},{default:(0,e.k6)((()=>[(0,e.eW)("mergeArrays")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#arraymergeoptions"},{default:(0,e.k6)((()=>[(0,e.eW)("arrayMergeOptions "),(0,e.bF)(a,{type:"tip",text:"Available since v0.11",vertical:"middle"})])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(_,{to:"#callback"},{default:(0,e.k6)((()=>[(0,e.eW)("callback")])),_:1})])])])])]),u,(0,e.Lk)("p",null,[(0,e.eW)("Be default, the following value types are only "),(0,e.Lk)("a",d,[(0,e.eW)("shallow copied"),(0,e.bF)(F)]),(0,e.eW)(":")]),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.Lk)("a",k,[(0,e.eW)("function"),(0,e.bF)(F)])]),(0,e.Lk)("li",null,[(0,e.Lk)("a",v,[(0,e.eW)("Symbol"),(0,e.bF)(F)])])]),m,(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See "),(0,e.bF)(S,{to:"/archive/current/packages/support/reflections/isKeyUnsafe.html"},{default:(0,e.k6)((()=>[b])),_:1}),(0,e.eW)(" for additional details.")])]),g,(0,e.Lk)("p",null,[(0,e.eW)("Determines if an object's return value from a "),h,(0,e.eW)(" method ("),(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.bF)(S,{to:"/archive/current/packages/support/objects/isCloneable.html"},{default:(0,e.k6)((()=>[y])),_:1})]),(0,e.eW)(") should be used for merging, rather than the source object itself.")]),f,(0,e.Lk)("p",null,[(0,e.eW)("When enabled, arrays, "),(0,e.bF)(S,{to:"/archive/current/packages/support/arrays/isArrayLike.html"},{default:(0,e.k6)((()=>[(0,e.eW)("array-like")])),_:1}),(0,e.eW)(", and "),(0,e.bF)(S,{to:"/archive/current/packages/support/arrays/isConcatSpreadable.html"},{default:(0,e.k6)((()=>[(0,e.eW)("concat spreadable")])),_:1}),(0,e.eW)(" objects are merged.")]),w,(0,e.Lk)("p",null,[(0,e.eW)("Behind the scene, the "),(0,e.bF)(S,{to:"/archive/current/packages/support/arrays/merge.html"},{default:(0,e.k6)((()=>[(0,e.eW)("array merge")])),_:1}),(0,e.eW)(" utility is used for merging arrays.")]),(0,e.Lk)("h3",j,[(0,e.Lk)("a",L,[(0,e.Lk)("span",null,[W,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.11",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.Lk)("em",null,[(0,e.eW)("See "),(0,e.bF)(S,{to:"/archive/current/packages/support/arrays/merge.html#merge-options"},{default:(0,e.k6)((()=>[(0,e.eW)("Array Merge Options")])),_:1}),(0,e.eW)(".")])]),x])}]]);const S=JSON.parse('{"path":"/archive/current/packages/support/objects/merge.html","title":"Merge","lang":"en-GB","frontmatter":{"title":"Merge","description":"Merge multiple objects into a new object.","sidebarDepth":0},"headers":[{"level":2,"title":"Shallow Copied Types","slug":"shallow-copied-types","link":"#shallow-copied-types","children":[]},{"level":2,"title":"Unsafe Keys","slug":"unsafe-keys","link":"#unsafe-keys","children":[]},{"level":2,"title":"Merge Options","slug":"merge-options","link":"#merge-options","children":[{"level":3,"title":"depth","slug":"depth","link":"#depth","children":[]},{"level":3,"title":"skip","slug":"skip","link":"#skip","children":[]},{"level":3,"title":"overwriteWithUndefined","slug":"overwritewithundefined","link":"#overwritewithundefined","children":[]},{"level":3,"title":"useCloneable","slug":"usecloneable","link":"#usecloneable","children":[]},{"level":3,"title":"mergeArrays","slug":"mergearrays","link":"#mergearrays","children":[]},{"level":3,"title":"arrayMergeOptions","slug":"arraymergeoptions","link":"#arraymergeoptions","children":[]},{"level":3,"title":"callback","slug":"callback","link":"#callback","children":[]}]}],"git":{"updatedTime":1712045233000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":5}]},"filePathRelative":"archive/current/packages/support/objects/merge.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/mergeKeys.html.2d62ee48.js b/assets/js/mergeKeys.html.2d62ee48.js new file mode 100644 index 00000000..86896213 --- /dev/null +++ b/assets/js/mergeKeys.html.2d62ee48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[338],{903:function(n,s,a){a.r(s),a.d(s,{comp:function(){return u},data:function(){return k}});var e=a(641);const t={id:"mergekeys",tabindex:"-1"},p={class:"header-anchor",href:"#mergekeys"},o=(0,e.Lk)("code",null,"mergeKeys",-1),c=(0,e.Lk)("code",null,"mergeKeys()",-1),i=(0,e.Lk)("code",null,"isKey()",-1),l=(0,e.Fv)('
import { mergeKeys } from "@aedart/support/misc";\n\nconst key = mergeKeys(Symbol('my-symbol'), [ 'b', 'c.d' ], 23);\n\nconsole.log(key); // [ Symbol('my-symbol'), 'b', 'c.d', 23 ];\n
',1),r={};var u=(0,a(6262).A)(r,[["render",function(n,s){const a=(0,e.g2)("Badge"),r=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("The "),c,(0,e.eW)(" method is able to merge two or more keys into a single key ("),(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.bF)(r,{to:"/archive/current/packages/support/misc/isKey.html"},{default:(0,e.k6)((()=>[i])),_:1})]),(0,e.eW)(").")]),l])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/misc/mergeKeys.html","title":"Merge Keys","lang":"en-GB","frontmatter":{"title":"Merge Keys","description":"Merge keys into a single key.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/mergeKeys.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/newMixin.html.1e594094.js b/assets/js/newMixin.html.1e594094.js new file mode 100644 index 00000000..ff0b768f --- /dev/null +++ b/assets/js/newMixin.html.1e594094.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9495],{6251:function(n,s,a){a.r(s),a.d(s,{comp:function(){return b},data:function(){return h}});var e=a(641);const t=(0,e.Lk)("h1",{id:"define-a-new-mixin",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#define-a-new-mixin"},[(0,e.Lk)("span",null,"Define a new Mixin")])],-1),o=(0,e.Lk)("code",null,"Mixin",-1),p={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Lk)("code",null,"instanceof",-1),c=(0,e.Lk)("code",null,"instanceof",-1),r=(0,e.Fv)('
import { Mixin } from "@aedart/support/mixins";\n\nexport const RectangleMixin = Mixin((superclass) => class extends superclass {\n    length = 0\n    width = 0;\n    \n    area() {\n        return this.length * this.width;\n    }\n});\n

Constructor

',2),l={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/constructor",target:"_blank",rel:"noopener noreferrer"},u=(0,e.Lk)("code",null,"constructor",-1),d={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super",target:"_blank",rel:"noopener noreferrer"},k=(0,e.Lk)("code",null,"super()",-1),m=(0,e.Fv)('
import { Mixin } from "@aedart/support/mixins";\n\nexport const RectangleMixin = Mixin((superclass) => class extends superclass {\n    \n    constructor(...args) {\n        super(...args); // Invoke parent constructor and pass on arugments!\n        \n        // Perform your initialisaiton logic...\n    }\n    \n    // ...remaining not shown...\n});\n
',1),v={};var b=(0,a(6262).A)(v,[["render",function(n,s){const a=(0,e.g2)("ExternalLinkIcon"),v=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("You can use the "),o,(0,e.eW)(" decorator to define a new mixin. Amongst other things, the decorator will enable support for "),(0,e.Lk)("a",p,[i,(0,e.bF)(a)]),(0,e.eW)(" checks. See "),(0,e.bF)(v,{to:"/archive/current/packages/support/mixins/instanceof.html"},{default:(0,e.k6)((()=>[c,(0,e.eW)(" Operator")])),_:1}),(0,e.eW)(" for additional information.")]),r,(0,e.Lk)("p",null,[(0,e.eW)("If you need to perform initialisation logic in your mixins, then you can do so by implementing a class "),(0,e.Lk)("a",l,[u,(0,e.bF)(a)]),(0,e.eW)(". When doing so, it is important to invoke the parent constructor via "),(0,e.Lk)("a",d,[k,(0,e.bF)(a)]),(0,e.eW)(" and pass on eventual arguments.")]),m])}]]);const h=JSON.parse('{"path":"/archive/current/packages/support/mixins/newMixin.html","title":"New Mixin","lang":"en-GB","frontmatter":{"title":"New Mixin","description":"How to defined a new Mixin class.","sidebarDepth":0},"headers":[{"level":2,"title":"Constructor","slug":"constructor","link":"#constructor","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/mixins/newMixin.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/not_available.html.f239d346.js b/assets/js/not_available.html.f239d346.js new file mode 100644 index 00000000..a72db108 --- /dev/null +++ b/assets/js/not_available.html.f239d346.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1711],{8193:function(e,a,t){t.r(a),t.d(a,{comp:function(){return l},data:function(){return r}});var n=t(641);const i=[(0,n.Lk)("h1",{id:"not-available",tabindex:"-1"},[(0,n.Lk)("a",{class:"header-anchor",href:"#not-available"},[(0,n.Lk)("span",null,"Not Available")])],-1),(0,n.Lk)("p",null,[(0,n.Lk)("em",null,"The next version of Ion has yet to be designed and implemented. Come back at a later time to review the documentation...")],-1)],o={};var l=(0,t(6262).A)(o,[["render",function(e,a){return(0,n.uX)(),(0,n.CE)("div",null,i)}]]);const r=JSON.parse('{"path":"/archive/not_available.html","title":"Not Available","lang":"en-GB","frontmatter":{"title":"Not Available","description":"Next Ion Version","sidebarDepth":0},"headers":[],"git":{"updatedTime":1679232263000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/not_available.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/onward.html.8fb7cd66.js b/assets/js/onward.html.8fb7cd66.js new file mode 100644 index 00000000..4498efc3 --- /dev/null +++ b/assets/js/onward.html.8fb7cd66.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[8411],{2231:function(e,n,a){a.r(n),a.d(n,{comp:function(){return u},data:function(){return m}});var r=a(641);const t=(0,r.Lk)("h1",{id:"onward",tabindex:"-1"},[(0,r.Lk)("a",{class:"header-anchor",href:"#onward"},[(0,r.Lk)("span",null,"Onward")])],-1),i={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/extends#mix-ins",target:"_blank",rel:"noopener noreferrer"},o=(0,r.Lk)("em",null,'"Mix-ins"',-1),s={href:"https://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/",target:"_blank",rel:"noopener noreferrer"},l=(0,r.Lk)("em",null,'"Real" Mixins with JavaScript Classes',-1),c={href:"https://justinfagnani.com/2016/01/07/enhancing-mixins-with-decorator-functions/",target:"_blank",rel:"noopener noreferrer"},d=(0,r.Lk)("em",null,"Enhancing Mixins with Decorator Functions",-1),p={};var u=(0,a(6262).A)(p,[["render",function(e,n){const a=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[t,(0,r.Lk)("p",null,[(0,r.eW)("For more information and examples, please read Mozilla's documentation about "),(0,r.Lk)("a",i,[o,(0,r.bF)(a)]),(0,r.eW)(", and Justin Fagnani's blog posts:")]),(0,r.Lk)("ul",null,[(0,r.Lk)("li",null,[(0,r.Lk)("a",s,[l,(0,r.bF)(a)])]),(0,r.Lk)("li",null,[(0,r.Lk)("a",c,[d,(0,r.bF)(a)])])])])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/mixins/onward.html","title":"Onward","lang":"en-GB","frontmatter":{"title":"Onward","description":"Where to read more about mixins.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/mixins/onward.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/origin.html.b71a5112.js b/assets/js/origin.html.b71a5112.js new file mode 100644 index 00000000..96dd0162 --- /dev/null +++ b/assets/js/origin.html.b71a5112.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3066],{6885:function(e,n,r){r.r(n),r.d(n,{comp:function(){return d},data:function(){return g}});var a=r(641);const o=(0,a.Lk)("h1",{id:"origin",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#origin"},[(0,a.Lk)("span",null,"Origin")])],-1),t={href:"https://aedart.github.io/athenaeum/",target:"_blank",rel:"noopener noreferrer"},i={href:"https://lerna.js.org/",target:"_blank",rel:"noopener noreferrer"},s={href:"https://www.typescriptlang.org/",target:"_blank",rel:"noopener noreferrer"},l={href:"https://en.wikipedia.org/wiki/Monorepo",target:"_blank",rel:"noopener noreferrer"},c=(0,a.Lk)("h2",{id:"meaning-of-ion",tabindex:"-1"},[(0,a.Lk)("a",{class:"header-anchor",href:"#meaning-of-ion"},[(0,a.Lk)("span",null,'Meaning of "Ion"')])],-1),m=(0,a.Lk)("em",null,"positive or negative",-1),p={href:"https://www.dictionary.com/browse/ion",target:"_blank",rel:"noopener noreferrer"},h={};var d=(0,r(6262).A)(h,[["render",function(e,n){const r=(0,a.g2)("ExternalLinkIcon");return(0,a.uX)(),(0,a.CE)("div",null,[o,(0,a.Lk)("p",null,[(0,a.eW)("For many years, I was too discouraged and overburden to publish my JavaScript as packages. Having a full-time job and maintaining "),(0,a.Lk)("a",t,[(0,a.eW)("Athenaeum"),(0,a.bF)(r)]),(0,a.eW)(" took most of my time. Like so many other developers, I was copying JavaScript from one project into another. I always knew that was very bad practice. But, it was too cumbersome trying to maintain so much code, spread throughout various repositories.")]),(0,a.Lk)("p",null,[(0,a.eW)("Nevertheless, in recent years, "),(0,a.Lk)("a",i,[(0,a.eW)("Lerna"),(0,a.bF)(r)]),(0,a.eW)(", "),(0,a.Lk)("a",s,[(0,a.eW)("TypeScript"),(0,a.bF)(r)]),(0,a.eW)(", and many other tools & frameworks made it somewhat easier to manage "),(0,a.Lk)("a",l,[(0,a.eW)("mono-repos"),(0,a.bF)(r)]),(0,a.eW)(". I cannot claim to have gained more time, but decided to give JavaScript packages another shoot.")]),c,(0,a.Lk)("blockquote",null,[(0,a.Lk)("p",null,[(0,a.eW)('"[...] An atom or a group of atoms that has an electric charge [...] - '),m,(0,a.eW)('" ('),(0,a.Lk)("a",p,[(0,a.eW)('"Scientific definition" from dictionary.com'),(0,a.bF)(r)]),(0,a.eW)(")")])])])}]]);const g=JSON.parse('{"path":"/archive/current/origin.html","title":"Origin","lang":"en-GB","frontmatter":{"description":"The origin of Ion","sidebarDepth":0},"headers":[{"level":2,"title":"Meaning of \\"Ion\\"","slug":"meaning-of-ion","link":"#meaning-of-ion","children":[]}],"git":{"updatedTime":1679938081000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":3}]},"filePathRelative":"archive/current/origin.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/outsideChanges.html.156b6bbb.js b/assets/js/outsideChanges.html.156b6bbb.js new file mode 100644 index 00000000..88233c25 --- /dev/null +++ b/assets/js/outsideChanges.html.156b6bbb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5180],{1276:function(n,a,s){s.r(a),s.d(a,{comp:function(){return p},data:function(){return c}});var e=s(641);const t=[(0,e.Fv)('

Changes outside the decorator

Whenever you read metadata, a copy is returned by the getMeta() method. This means that you can change the data, in your given context, but the original metadata remains the same.

import { meta, getMeta } from '@aedart/support/meta';\n\n@meta('description', { name: 'Search Service', alias: 'Location Sercher' })\nclass Service {}\n\n// Obtain "copy" and change it...\nlet desc = getMeta(Service, 'description');\ndesc.name = 'Country Searcher';\n\n// Original remains unchanged\ngetMeta(Service, 'description').name; // Search Service\n

Caution

Only the meta decorator is intended to alter existing metadata - even if the value is an object. Please be mindful of this behaviour, whenever you change retrieved metadata using the getMeta() and getAllMeta() methods.

',4)],o={};var p=(0,s(6262).A)(o,[["render",function(n,a){return(0,e.uX)(),(0,e.CE)("div",null,t)}]]);const c=JSON.parse('{"path":"/archive/current/packages/support/meta/outsideChanges.html","title":"Outside Changes","lang":"en-GB","frontmatter":{"title":"Outside Changes","description":"About changes to metadata outside decorator scope.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/outsideChanges.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/populate.html.36046530.js b/assets/js/populate.html.36046530.js new file mode 100644 index 00000000..6cf41015 --- /dev/null +++ b/assets/js/populate.html.36046530.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[7902],{5766:function(n,s,a){a.r(s),a.d(s,{comp:function(){return b},data:function(){return y}});var e=a(641);const t={id:"populate",tabindex:"-1"},p={class:"header-anchor",href:"#populate"},o=(0,e.Lk)("code",null,"populate",-1),c=(0,e.Lk)("code",null,"populate()",-1),l={href:"https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy",target:"_blank",rel:"noopener noreferrer"},i={class:"table-of-contents"},u=(0,e.Fv)('

Arguments

populate() accepts the following arguments:

  • target: object

  • source: object

  • keys: PropertyKey | PropertyKey[] | SourceKeysCallback = '*' - The keys to select and copy from source object. If wildcard (*) given, then all properties from the source are selected. If a callback is given, then that callback must return key or keys to select from source.

  • safe: boolean = true - When true, properties must exist in target (must be defined in target), before they are shallow copied.

Caution

The target object is mutated by this function.

',4),r={class:"custom-container tip"},k=(0,e.Lk)("p",{class:"custom-container-title"},"Note",-1),d=(0,e.Lk)("code",null,"keys",-1),m=(0,e.Fv)('
import { populate } from "@aedart/support/objects";\n\nclass Person {\n    name = null;\n    age = null;\n\n    constructor(data) {\n        populate(this, data);\n    }\n}\n\nconst instance = new Person({ name: 'Janine', age: 36 });\ninstance.name // Janine\ninstance.age // 36\n

Limit keys to populate

By default, all keys (*) from the source object are attempted populated into the target. You can limit what properties can be populated, by specifying what keys are allowed to be populated.

class Person {\n    name = null;\n    age = null;\n    phone = null;\n\n    constructor(data) {\n        populate(this, data, [ 'name', 'age' ]);\n    }\n}\n\nconst instance = new Person({ name: 'Janine', age: 36, phone: '555 555 555' });\ninstance.name // Janine\ninstance.age // 36\ninstance.phone // null\n

Source Keys Callback

If you need a more advanced way to determine what keys to populate, then you can specify a callback as the keys argument.

populate(target, source, (source, target) => {\n    if (Reflect.has(source, 'phone') && Reflect.has(target, 'phone')) {\n        return [ 'name', 'age', 'phone' ];\n    }\n\n    return [ 'name', 'age' ];\n});\n

When keys do not exist

When the safe argument is set to true (default behavior), and a property key does not exist in the target object, then a TypeError is thrown.

class Person {\n    name = null;\n    age = null;\n\n    constructor(data) {\n        populate(this, data, [ 'name', 'age', 'phone' ]);\n    }\n}\n\nconst instance = new Person({\n    name: 'Janine',\n    age: 36,\n    phone: '555 555 555'\n}); // TypeError - phone does not exist in target \n

However, if a requested key does not exist in the source object, then a TypeError is thrown regardless of the safe argument value.

class Person {\n    name = null;\n    age = null;\n\n    constructor(data) {\n        populate(this, data, [ 'name', 'age', 'phone' ], false);\n    }\n}\n\nconst instance = new Person({\n    name: 'Janine',\n    age: 36\n}); // TypeError - phone does not exist in source \n
',12),v={};var b=(0,a(6262).A)(v,[["render",function(n,s){const a=(0,e.g2)("Badge"),v=(0,e.g2)("ExternalLinkIcon"),b=(0,e.g2)("router-link"),y=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[o,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.9",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("The "),c,(0,e.eW)(" allows you to populate a target object's properties with those from a source object. The values are "),(0,e.Lk)("a",l,[(0,e.eW)("shallow copied"),(0,e.bF)(v)]),(0,e.eW)(".")]),(0,e.Lk)("nav",i,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#arguments"},{default:(0,e.k6)((()=>[(0,e.eW)("Arguments")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#limit-keys-to-populate"},{default:(0,e.k6)((()=>[(0,e.eW)("Limit keys to populate")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#source-keys-callback"},{default:(0,e.k6)((()=>[(0,e.eW)("Source Keys Callback")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#when-keys-do-not-exist"},{default:(0,e.k6)((()=>[(0,e.eW)("When keys do not exist")])),_:1})])])]),u,(0,e.Lk)("div",r,[k,(0,e.Lk)("p",null,[(0,e.bF)(y,{to:"/archive/current/packages/support/reflections/isKeyUnsafe.html"},{default:(0,e.k6)((()=>[(0,e.eW)('"Unsafe" properties')])),_:1}),(0,e.eW)(" are disregarded, regardless of what "),d,(0,e.eW)(" are given.")])]),m])}]]);const y=JSON.parse('{"path":"/archive/current/packages/support/objects/populate.html","title":"Populate","lang":"en-GB","frontmatter":{"title":"Populate","description":"Populate target object.","sidebarDepth":0},"headers":[{"level":2,"title":"Arguments","slug":"arguments","link":"#arguments","children":[]},{"level":2,"title":"Limit keys to populate","slug":"limit-keys-to-populate","link":"#limit-keys-to-populate","children":[]},{"level":2,"title":"Source Keys Callback","slug":"source-keys-callback","link":"#source-keys-callback","children":[]},{"level":2,"title":"When keys do not exist","slug":"when-keys-do-not-exist","link":"#when-keys-do-not-exist","children":[]}],"git":{"updatedTime":1709649075000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":2}]},"filePathRelative":"archive/current/packages/support/objects/populate.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/prerequisites.html.ecd52261.js b/assets/js/prerequisites.html.ecd52261.js new file mode 100644 index 00000000..3e13739e --- /dev/null +++ b/assets/js/prerequisites.html.ecd52261.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[4261],{759:function(e,r,t){t.r(r),t.d(r,{comp:function(){return c},data:function(){return l}});var s=t(641);const a=(0,s.Lk)("h1",{id:"prerequisites",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#prerequisites"},[(0,s.Lk)("span",null,"Prerequisites")])],-1),o={href:"https://github.com/tc39/proposal-decorators",target:"_blank",rel:"noopener noreferrer"},n={href:"https://babeljs.io/docs/babel-plugin-proposal-decorators",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#decorators",target:"_blank",rel:"noopener noreferrer"},p={};var c=(0,t(6262).A)(p,[["render",function(e,r){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[a,(0,s.Lk)("p",null,[(0,s.eW)("At the time of this writing, "),(0,s.Lk)("a",o,[(0,s.eW)("decorators"),(0,s.bF)(t)]),(0,s.eW)(" are still in a proposal phase. To use the service container, you must either use "),(0,s.Lk)("a",n,[(0,s.eW)("@babel/plugin-proposal-decorators"),(0,s.bF)(t)]),(0,s.eW)(", or use "),(0,s.Lk)("a",i,[(0,s.eW)("TypeScript 5 decorators"),(0,s.bF)(t)]),(0,s.eW)(".")])])}]]);const l=JSON.parse('{"path":"/archive/current/packages/container/prerequisites.html","title":"Prerequisites","lang":"en-GB","frontmatter":{"title":"Prerequisites","description":"Prerequisites for using service container.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1712318306000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/container/prerequisites.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},840:function(e,r,t){t.r(r),t.d(r,{comp:function(){return c},data:function(){return l}});var s=t(641);const a=(0,s.Lk)("h1",{id:"prerequisites",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#prerequisites"},[(0,s.Lk)("span",null,"Prerequisites")])],-1),o={href:"https://github.com/tc39/proposal-decorators",target:"_blank",rel:"noopener noreferrer"},n={href:"https://babeljs.io/docs/babel-plugin-proposal-decorators",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#decorators",target:"_blank",rel:"noopener noreferrer"},p={};var c=(0,t(6262).A)(p,[["render",function(e,r){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[a,(0,s.Lk)("p",null,[(0,s.eW)("At the time of this writing, "),(0,s.Lk)("a",o,[(0,s.eW)("decorators"),(0,s.bF)(t)]),(0,s.eW)(" are still in a proposal phase. To use concerns, you must either use "),(0,s.Lk)("a",n,[(0,s.eW)("@babel/plugin-proposal-decorators"),(0,s.bF)(t)]),(0,s.eW)(", or use "),(0,s.Lk)("a",i,[(0,s.eW)("TypeScript 5 decorators"),(0,s.bF)(t)]),(0,s.eW)(".")])])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/concerns/prerequisites.html","title":"Prerequisites","lang":"en-GB","frontmatter":{"title":"Prerequisites","description":"Prerequisites for using concerns.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/prerequisites.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')},5265:function(e,r,t){t.r(r),t.d(r,{comp:function(){return c},data:function(){return l}});var s=t(641);const a=(0,s.Lk)("h1",{id:"prerequisites",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#prerequisites"},[(0,s.Lk)("span",null,"Prerequisites")])],-1),o={href:"https://github.com/tc39/proposal-decorators",target:"_blank",rel:"noopener noreferrer"},n={href:"https://babeljs.io/docs/babel-plugin-proposal-decorators",target:"_blank",rel:"noopener noreferrer"},i={href:"https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#decorators",target:"_blank",rel:"noopener noreferrer"},p={};var c=(0,t(6262).A)(p,[["render",function(e,r){const t=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[a,(0,s.Lk)("p",null,[(0,s.eW)("At the time of this writing, "),(0,s.Lk)("a",o,[(0,s.eW)("decorators"),(0,s.bF)(t)]),(0,s.eW)(" are still in a proposal phase. To use the meta decorator, you must either use "),(0,s.Lk)("a",n,[(0,s.eW)("@babel/plugin-proposal-decorators"),(0,s.bF)(t)]),(0,s.eW)(", or use "),(0,s.Lk)("a",i,[(0,s.eW)("TypeScript 5 decorators"),(0,s.bF)(t)]),(0,s.eW)(".")])])}]]);const l=JSON.parse('{"path":"/archive/current/packages/support/meta/prerequisites.html","title":"Prerequisites","lang":"en-GB","frontmatter":{"title":"Prerequisites","description":"Prerequisites for using meta decorators.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/prerequisites.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/resolving.html.df94b85d.js b/assets/js/resolving.html.df94b85d.js new file mode 100644 index 00000000..46213988 --- /dev/null +++ b/assets/js/resolving.html.df94b85d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[1449],{1655:function(n,a,s){s.r(a),s.d(a,{comp:function(){return x},data:function(){return _}});var e=s(641);const t=(0,e.Lk)("h1",{id:"resolving",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#resolving"},[(0,e.Lk)("span",null,"Resolving")])],-1),o={class:"table-of-contents"},c=(0,e.Lk)("h2",{id:"the-make-method",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#the-make-method"},[(0,e.Lk)("span",null,[(0,e.eW)("The "),(0,e.Lk)("code",null,"make()"),(0,e.eW)(" method")])])],-1),p=(0,e.Lk)("p",null,[(0,e.eW)("To resolve component instances or values from the Service Container, use the "),(0,e.Lk)("code",null,"make()"),(0,e.eW)(" method. It accepts the following arguments:")],-1),l=(0,e.Lk)("code",null,"identifier: Identifier",-1),i=(0,e.Lk)("code",null,"args: any[] = []",-1),u=(0,e.Lk)("em",null,"optional",-1),r=(0,e.Fv)('
const recorder = container.make('recorder');\n

When specifying a class constructor as the identifier argument, the make() method will automatically attempt to create a new instance of the given class, even if no binding was registered for it.

class AudioPlayer\n{\n    // ...not shown...\n}\n\nconst audio = container.make(AudioPlayer); // new AudioPlayer instance\n

Dependencies

',4),d=(0,e.Lk)("a",{href:"../support/meta"},"metadata",-1),k=(0,e.Lk)("code",null,"make()",-1),v=(0,e.Fv)('
import { dependencies } from "@aedart/support/container";\n\n@dependencies('storage')\nclass TextRecorder\n{\n    storage = undeinfed;\n\n    constructor(storage) {\n        this.storage = storage;\n    }\n}\n\n// Register binding in the Service Container\ncontainer.singleton('storage', () => {\n   return new CookieStorage(); \n});\n\n\n// ...Later in your application\nconst recorder = container.make(TextRecorder);\nconsole.log(recorder.storage); // CookieStorage\n

The args Argument

You can also manually specify what arguments a class constructor or "factory" callback should receive, via the args argument.

const recorder = container.make(TextRecorder, [ new CloudStorage() ]);\nconsole.log(recorder.storage); // CloudStorage\n
',4),m={class:"custom-container warning"},h=(0,e.Lk)("p",{class:"custom-container-title"},"WARNING",-1),b=(0,e.Lk)("code",null,"args",-1),g=(0,e.Lk)("code",null,"make()",-1),f=(0,e.Lk)("strong",null,"overwritten",-1),y=(0,e.Lk)("code",null,"args",-1),w=(0,e.Lk)("code",null,"dependencies",-1),j=(0,e.Fv)('

The call() method

The Service Container can also be used to invoke class methods or callbacks. This allows you to resolve a method's dependencies and inject them. The call() method accepts the following arguments:

  • method: Callback | CallbackWrapper | ClassMethodReference - The target callback or class method to invoke.
  • args: any[] = [] - (optional) Eventual arguments to be passed on to class method or callback.
class UsersRepository\n{\n    @dependencies('users_api_service')\n    fetchUser(usersService)\n    {\n        // ...not shown...\n    }\n}\n\n// Later in your application\nconst promise = container.call([UsersRepository, 'fetchUser']);\n

Class Method Reference

A "class method reference" is an array that holds two values:

  • A class constructor or object instance.
  • The name of the method to be invoked in the target class.
const reference = [AudioPlayer, 'play'];\n

When given as the method argument, for call(), the target class constructor is automatically resolved (instantiated with eventual dependencies injected). The method is thereafter invoked and output is returned. If the class method has any dependencies defined, then those will be resolved and injected into the method as arguments.

class AudioPlayer\n{\n    @dependencies('audio_processor', 'my_song')\n    play(processor, song) {\n        // ...play logic not shown...\n        return this;\n    }\n}\n\nconst player = container.call([AudioPlayer, 'play']);\n

WARNING

If you specify the args argument for call(), then eventual defined dependencies are overwritten with the values provided in the args array. Thus, the dependencies of the class method are ignored.

const player = container.call(\n    [AudioPlayer, 'play'],\n    \n    // Arguments passed on to "play" method.\n    [\n        new AudioProcessor(),\n        new FavouriteSong()\n    ]\n);\n

Callback Wrapper

',12),W=(0,e.Lk)("code",null,"call()",-1),L=(0,e.Fv)('

WARNING

Providing the args argument for call() will overwrite eventual arguments set in the callback wrapper!

import { CallbackWrapper } from "@aedart/support";\n\nconst wrapped = CallbackWrapper.make((firstname, lastname) => {\n    return `Hi ${firstname} ${lastname}`;\n}, 'Brian', 'Jackson');\n\nconst result = container.call(wrapped, [ 'James', 'Brown' ]);\nconsole.log(result); // Hi James Brown\n

To define dependencies for a callback wrapper, you must use the wrapper's set() method and specify an array of target binding identifiers for the DEPENDENCIES symbol as key.

import { DEPENDENCIES } from "@aedart/contracts/container";\n\nconst wrapped = CallbackWrapper.make((apiClient) => {\n    // ...fetch user logic not shown...\n    \n    return promise;\n}).set(DEPENDENCIES, [ 'api_client' ]);\n\nconst promise = container.call(wrapped); // Api Client injected into callback...\n

Callback

The call() can also be used for invoking a regular callback. Any args argument given to call() are passed on to the callback, and eventual output value is returned.

const result = container.call((x) => {\n    return x * 2;\n}, 4);\n\nconsole.log(result); // 8\n

Limitation

At the moment, it is not possible to associate dependencies with a native callback directly. Please use a callback wrapper instead, if you need to inject dependencies into a callback.

Hooks

If you need to react to components or values that are being resolved from the Service Container, then you can use the before() and after() hook methods.

before()

The before() method registers a callback to be invoked before a binding is resolved.

container.before('user', (identifier, args, container) => {\n    // ...not shown...\n});\n

after()

The after() method registers a callback to be invoked after a binding has been resolved

container.after('user', (identifier, resolved, container) => {\n    // ...not shown...\n});\n
',15),C={};var x=(0,s(6262).A)(C,[["render",function(n,a){const s=(0,e.g2)("router-link"),C=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#the-make-method"},{default:(0,e.k6)((()=>[(0,e.eW)("The make() method")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#dependencies"},{default:(0,e.k6)((()=>[(0,e.eW)("Dependencies")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#the-args-argument"},{default:(0,e.k6)((()=>[(0,e.eW)("The args Argument")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#the-call-method"},{default:(0,e.k6)((()=>[(0,e.eW)("The call() method")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#class-method-reference"},{default:(0,e.k6)((()=>[(0,e.eW)("Class Method Reference")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#callback-wrapper"},{default:(0,e.k6)((()=>[(0,e.eW)("Callback Wrapper")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#callback"},{default:(0,e.k6)((()=>[(0,e.eW)("Callback")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#hooks"},{default:(0,e.k6)((()=>[(0,e.eW)("Hooks")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#before"},{default:(0,e.k6)((()=>[(0,e.eW)("before()")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#after"},{default:(0,e.k6)((()=>[(0,e.eW)("after()")])),_:1})])])])])]),c,p,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[l,(0,e.eW)(" - Target "),(0,e.bF)(C,{to:"/archive/current/packages/container/bindings.html#identifiers"},{default:(0,e.k6)((()=>[(0,e.eW)("binding identifier")])),_:1}),(0,e.eW)(".")]),(0,e.Lk)("li",null,[i,(0,e.eW)(" - ("),u,(0,e.eW)(") Eventual arguments to be passed on to "),(0,e.bF)(C,{to:"/archive/current/packages/container/bindings.html#constructors"},{default:(0,e.k6)((()=>[(0,e.eW)("class constructor")])),_:1}),(0,e.eW)(" or "),(0,e.bF)(C,{to:"/archive/current/packages/container/bindings.html#factory-callbacks"},{default:(0,e.k6)((()=>[(0,e.eW)('"factory" callback')])),_:1}),(0,e.eW)(".")])]),r,(0,e.Lk)("p",null,[(0,e.eW)("If the target that must be resolved is a class that has "),(0,e.bF)(C,{to:"/archive/current/packages/container/dependencies.html"},{default:(0,e.k6)((()=>[(0,e.eW)("dependencies defined")])),_:1}),(0,e.eW)(" as "),d,(0,e.eW)(", then the "),k,(0,e.eW)(" method will automatically resolve them, and inject them into the target class.")]),v,(0,e.Lk)("div",m,[h,(0,e.Lk)("p",null,[(0,e.eW)("When specifying the "),b,(0,e.eW)(" argument for "),g,(0,e.eW)(", any defined dependencies are "),f,(0,e.eW)(" by the values in the "),y,(0,e.eW)(" array, if a class constructor is requested resolved! In other words, the binding identifiers defined via the "),(0,e.bF)(C,{to:"/archive/current/packages/container/dependencies.html"},{default:(0,e.k6)((()=>[w,(0,e.eW)(" decorator")])),_:1}),(0,e.eW)(" are ignored.")])]),j,(0,e.Lk)("p",null,[(0,e.eW)("When specifying a "),(0,e.bF)(C,{to:"/archive/current/packages/support/CallbackWrapper.html"},{default:(0,e.k6)((()=>[(0,e.eW)("callback wrapper")])),_:1}),(0,e.eW)(" as target for "),W,(0,e.eW)(", then the callback will be invoked and eventual output is returned. If the wrapper has arguments specified, then they will automatically be applied, the underlying callback is invoked.")]),L])}]]);const _=JSON.parse('{"path":"/archive/current/packages/container/resolving.html","title":"Resolving","lang":"en-GB","frontmatter":{"description":"Resolving Dependencies","sidebarDepth":0},"headers":[{"level":2,"title":"The make() method","slug":"the-make-method","link":"#the-make-method","children":[{"level":3,"title":"Dependencies","slug":"dependencies","link":"#dependencies","children":[]},{"level":3,"title":"The args Argument","slug":"the-args-argument","link":"#the-args-argument","children":[]}]},{"level":2,"title":"The call() method","slug":"the-call-method","link":"#the-call-method","children":[{"level":3,"title":"Class Method Reference","slug":"class-method-reference","link":"#class-method-reference","children":[]},{"level":3,"title":"Callback Wrapper","slug":"callback-wrapper","link":"#callback-wrapper","children":[]},{"level":3,"title":"Callback","slug":"callback","link":"#callback","children":[]}]},{"level":2,"title":"Hooks","slug":"hooks","link":"#hooks","children":[{"level":3,"title":"before()","slug":"before","link":"#before","children":[]},{"level":3,"title":"after()","slug":"after","link":"#after","children":[]}]}],"git":{"updatedTime":1712582376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/packages/container/resolving.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/runtime~app.c653e560.js b/assets/js/runtime~app.c653e560.js new file mode 100644 index 00000000..bdf663f4 --- /dev/null +++ b/assets/js/runtime~app.c653e560.js @@ -0,0 +1 @@ +!function(){"use strict";var e,t,r,l={},n={};function a(e){var t=n[e];if(void 0!==t)return t.exports;var r=n[e]={exports:{}};return l[e](r,r.exports,a),r.exports}a.m=l,e=[],a.O=function(t,r,l,n){if(!r){var o=1/0;for(d=0;d=n)&&Object.keys(a.O).every((function(e){return a.O[e](r[s])}))?r.splice(s--,1):(i=!1,n0&&e[d-1][2]>n;d--)e[d]=e[d-1];e[d]=[r,l,n]},a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,r){return a.f[r](e,t),t}),[]))},a.u=function(e){return"assets/js/"+{86:"booting.html",338:"mergeKeys.html",376:"CallbackWrapper.html",469:"install.html",572:"getClassPropertyDescriptor.html",676:"targetMeta.html",754:"get.html",984:"classOwnKeys.html",1449:"resolving.html",1705:"getNameOrDesc.html",1711:"not_available.html",1816:"customErrors.html",1901:"hasAllMethods.html",1936:"isCallable.html",2021:"tc39.html",2023:"classLooksLike.html",2822:"hooks.html",2846:"code-of-conduct.html",3066:"origin.html",3082:"isSubclass.html",3100:"archive.html",3246:"has.html",3248:"supported.html",3287:"hasPrototypeProperty.html",3295:"empty.html",3503:"getAllParentsOfClass.html",3518:"set.html",3717:"setAndGet.html",3783:"configureStackTrace.html",3884:"isClassConstructor.html",4261:"prerequisites.html",4470:"index.html",4610:"includesAll.html",4648:"isSubclassOrLooksLike.html",4795:"isKeyUnsafe.html",4975:"contribution-guide.html",4993:"forget.html",5067:"getParentOfClass.html",5180:"outsideChanges.html",5394:"isPropertyKey.html",5646:"instanceof.html",5807:"configureCustomError.html",5815:"upgrade-guide.html",5943:"includesAny.html",6030:"bindings.html",6054:"uniqueId.html",6247:"isCloneable.html",6262:"apply.html",6305:"container-instance.html",6321:"isPopulatable.html",6333:"usage.html",6366:"isClassMethodReference.html",6368:"version-disclaimer.html",6406:"inheritance.html",6529:"isKey.html",6666:"contextual-bindings.html",6745:"jsdoc.html",6805:"isTypedArray.html",7044:"isArrayLike.html",7428:"conflictResolution.html",7490:"404.html",7627:"isConcatSpreadable.html",7902:"populate.html",7920:"edgeCases.html",7922:"forgetAll.html",8071:"isSafeArrayLike.html",8411:"onward.html",8423:"hasAll.html",8469:"dependencies.html",8483:"hasMethod.html",8518:"last-updated.html",8533:"isMethod.html",8802:"merge.html",8852:"hasUniqueId.html",8874:"isConstructor.html",8925:"assertHasPrototypeProperty.html",9058:"isWeakKind.html",9061:"descTag.html",9088:"isKeySafe.html",9127:"getErrorMessage.html",9150:"hasAny.html",9383:"isPrimitive.html",9414:"security.html",9443:"getClassPropertyDescriptors.html",9495:"newMixin.html",9502:"isset.html",9583:"getConstructorName.html",9628:"concernClass.html",9912:"toWeakRef.html",9994:"aliases.html"}[e]+"."+{86:"eb728ae1",338:"2d62ee48",376:"159d6ab7",469:"649220ed",572:"8da3ab1f",676:"543973ed",754:"cb27b757",984:"ad046074",1449:"df94b85d",1705:"687020eb",1711:"f239d346",1816:"49a0442d",1901:"42db66cc",1936:"84eaa115",2021:"ad6563e8",2023:"efaf58a0",2822:"ba015dd6",2846:"bac34c39",3066:"b71a5112",3082:"8603c7e5",3100:"b243c4ec",3246:"4debffef",3248:"adf3fce5",3287:"89ee5d31",3295:"9e33f6c2",3503:"fe69b65f",3518:"87fec706",3717:"eb5cdd15",3783:"a35c72c3",3884:"1dbf8d8c",4261:"ecd52261",4470:"3cddfd92",4610:"dedc848a",4648:"46bf230a",4795:"48d1e86a",4975:"eb251cb2",4993:"522dfd63",5067:"bb3ce886",5180:"156b6bbb",5394:"87fe6434",5646:"46ee3113",5807:"ef9b6e9e",5815:"7cad2293",5943:"2465015b",6030:"c03df7ed",6054:"058f42b9",6247:"a8253de5",6262:"1fa5dcc0",6305:"0c106a57",6321:"44884087",6333:"0cc995d4",6366:"97742a21",6368:"f9b07ad7",6406:"ff09d1d0",6529:"5d05550b",6666:"fa8c9ec2",6745:"29e03e5d",6805:"309030b7",7044:"4487815f",7428:"653ec4d9",7490:"1424746e",7627:"36d6883b",7902:"36046530",7920:"b8f147f4",7922:"58d8e9c1",8071:"d566834f",8411:"8fb7cd66",8423:"ccff6c37",8469:"15552877",8483:"04c1131e",8518:"d07a4dec",8533:"c2a2d65f",8802:"4504c2dd",8852:"f01d682a",8874:"296bf48e",8925:"c96dd651",9058:"4f39498c",9061:"704e225b",9088:"b4d79743",9127:"b3a46b8e",9150:"6704b902",9383:"c0301777",9414:"2d888571",9443:"27c05d0b",9495:"1e594094",9502:"1a8165f2",9583:"8b21384d",9628:"28be5543",9912:"c223105a",9994:"d906e91a"}[e]+".js"},a.miniCssF=function(e){},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t={},r="@aedart/ion-monorepo:",a.l=function(e,l,n,o){if(t[e])t[e].push(l);else{var i,s;if(void 0!==n)for(var c=document.getElementsByTagName("script"),d=0;dHow to report a vulnerability

If you have discovered a vulnerability, please send an encrypted email to Alin Eugen Deac (aedart@gmail.com). Use the public PGP key listed below for encryption. Your email will be prioritised and addressed as quickly as possible.

In addition, please make sure that the contents of your email contains appropriate information about the vulnerability. E.g.:

  • Where the vulnerability is located
  • Why it is a vulnerability
  • Affected version(s)
  • (How it can be resolved, if you have a possible solution)
',4),d={class:"custom-container tip"},u=(0,l.Lk)("p",{class:"custom-container-title"},"How to encrypt emails using PGP",-1),o=(0,l.Lk)("p",null,"If you do not know how to use PGP encryption, then the following can help you",-1),c={href:"https://youtu.be/Ro3MSBS9w-A",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/mailvelope/mailvelope",target:"_blank",rel:"noopener noreferrer"},p={href:"https://sela.io/pgp-en/",target:"_blank",rel:"noopener noreferrer"},m=(0,l.Fv)('

Public PGP Key

-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: Mailvelope v4.4.1\nComment: https://www.mailvelope.com\n\n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\ngA==\n=E13G\n-----END PGP PUBLIC KEY BLOCK-----\n

Supported Versions

',3),b={};var h=(0,n(6262).A)(b,[["render",function(e,i){const n=(0,l.g2)("router-link"),b=(0,l.g2)("ExternalLinkIcon"),h=(0,l.g2)("RouteLink");return(0,l.uX)(),(0,l.CE)("div",null,[s,r,(0,l.Lk)("nav",a,[(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.bF)(n,{to:"#how-to-report-a-vulnerability"},{default:(0,l.k6)((()=>[(0,l.eW)("How to report a vulnerability")])),_:1}),(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.bF)(n,{to:"#public-pgp-key"},{default:(0,l.k6)((()=>[(0,l.eW)("Public PGP Key")])),_:1})])])]),(0,l.Lk)("li",null,[(0,l.bF)(n,{to:"#supported-versions"},{default:(0,l.k6)((()=>[(0,l.eW)("Supported Versions")])),_:1})])])]),t,(0,l.Lk)("div",d,[u,o,(0,l.Lk)("ul",null,[(0,l.Lk)("li",null,[(0,l.Lk)("a",c,[(0,l.eW)("How to Use PGP Encryption With Gmail and Other Web Email With Mailvelope"),(0,l.bF)(b)])]),(0,l.Lk)("li",null,[(0,l.Lk)("a",v,[(0,l.eW)("Mailvelope - Browser Extension"),(0,l.bF)(b)])]),(0,l.Lk)("li",null,[(0,l.Lk)("a",p,[(0,l.eW)("Sela - Online PGP Encrypt & Decrypt"),(0,l.bF)(b)])])])]),m,(0,l.Lk)("p",null,[(0,l.eW)("Please read the "),(0,l.bF)(h,{to:"/archive/current/#support-policy"},{default:(0,l.k6)((()=>[(0,l.eW)("Support Policy")])),_:1}),(0,l.eW)(" for additional information about what versions are supported.")])])}]]);const g=JSON.parse('{"path":"/archive/current/security.html","title":"Security Policy","lang":"en-GB","frontmatter":{"description":"Security Policy of Athenaeum","sidebarDepth":0},"headers":[{"level":2,"title":"How to report a vulnerability","slug":"how-to-report-a-vulnerability","link":"#how-to-report-a-vulnerability","children":[{"level":3,"title":"Public PGP Key","slug":"public-pgp-key","link":"#public-pgp-key","children":[]}]},{"level":2,"title":"Supported Versions","slug":"supported-versions","link":"#supported-versions","children":[]}],"git":{"updatedTime":1679232326000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/security.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/set.html.87fec706.js b/assets/js/set.html.87fec706.js new file mode 100644 index 00000000..d61dee80 --- /dev/null +++ b/assets/js/set.html.87fec706.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3518],{9819:function(n,a,s){s.r(a),s.d(a,{comp:function(){return l},data:function(){return r}});var t=s(641);const e=(0,t.Lk)("h1",{id:"set",tabindex:"-1"},[(0,t.Lk)("a",{class:"header-anchor",href:"#set"},[(0,t.Lk)("span",null,[(0,t.Lk)("code",null,"set")])])],-1),o={href:"https://lodash.com/docs/4.17.15#set",target:"_blank",rel:"noopener noreferrer"},p=(0,t.Lk)("code",null,"set",-1),c=(0,t.Fv)('
import { set } from "@aedart/support/objects";\n\nconst target = {};\n\nset(target, 'a.foo', 'bar');\n\nconsole.log(target); // { a: { foo: 'bar } }\n
',1),i={};var l=(0,s(6262).A)(i,[["render",function(n,a){const s=(0,t.g2)("ExternalLinkIcon");return(0,t.uX)(),(0,t.CE)("div",null,[e,(0,t.Lk)("p",null,[(0,t.eW)("Set a value in object at given path. "),(0,t.Lk)("em",null,[(0,t.eW)("Method is an alias for "),(0,t.Lk)("a",o,[(0,t.eW)("Lodash "),p,(0,t.bF)(s)]),(0,t.eW)(".")])]),c])}]]);const r=JSON.parse('{"path":"/archive/current/packages/support/objects/set.html","title":"Set","lang":"en-GB","frontmatter":{"title":"Set","description":"Set value in object path.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/set.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/setAndGet.html.eb5cdd15.js b/assets/js/setAndGet.html.eb5cdd15.js new file mode 100644 index 00000000..0b205e56 --- /dev/null +++ b/assets/js/setAndGet.html.eb5cdd15.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3717],{3321:function(a,n,s){s.r(n),s.d(n,{comp:function(){return w},data:function(){return L}});var e=s(641);const t=(0,e.Lk)("h1",{id:"set-and-get-metadata",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#set-and-get-metadata"},[(0,e.Lk)("span",null,"Set and Get Metadata")])],-1),o={class:"table-of-contents"},l=(0,e.Lk)("h2",{id:"set-metadata",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#set-metadata"},[(0,e.Lk)("span",null,"Set Metadata")])],-1),p=(0,e.Lk)("p",null,[(0,e.eW)("To define metadata on a class or its elements, use "),(0,e.Lk)("code",null,"meta()"),(0,e.eW)(". It accepts the following arguments:")],-1),c=(0,e.Lk)("code",null,"key",-1),i=(0,e.Lk)("code",null,"set",-1),r=(0,e.Lk)("code",null,"value",-1),u={href:"https://developer.mozilla.org/en-US/docs/Glossary/Primitive",target:"_blank",rel:"noopener noreferrer"},d={href:"https://developer.mozilla.org/en-US/docs/Glossary/Object",target:"_blank",rel:"noopener noreferrer"},k={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function",target:"_blank",rel:"noopener noreferrer"},m=(0,e.Fv)('

To obtain metadata, use the getMeta() method. You can also use getAllMeta(), if you wish to obtain all available metadata for a target class.

import { meta } from '@aedart/support/meta';\n\n@meta('service_alias', 'locationSearcher')\nclass Service\n{\n    @meta('name', 'Name of service') name;\n    \n    @meta('fetch.desc', 'Fetches resource via a gateway')\n    @meta('fetch.dependencies', [ 'my-gateway' ])\n    async fetch(gateway)\n    {\n        // ...implementation not shown...\n    }\n}\n

Get Metadata

Use getMeta() or getAllMeta() to retrieve metadata.

import { getMeta, getAllMeta } from '@aedart/support/meta';\n\nconst service = new Service();\n\nconst desc = getMeta(Service, 'fetch.desc');\nconst dependencies = getMeta(Service, 'fetch.dependencies');\n\n// Or, obtain all metadata\nconst allMeta = getAllMeta(Service);\n
',5),v={class:"custom-container tip"},b=(0,e.Fv)('

Metadata Availability

Depending on the kind of element that is decorated, metadata might only become available for reading, after a new class instance has been instantiated. This is true for the following elements:

  • method
  • getter
  • setter
  • field
  • accessor

Static Elements

',4),g={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static",target:"_blank",rel:"noopener noreferrer"},h=(0,e.Lk)("code",null,"static",-1),f=(0,e.Fv)('

Default Value

The getMeta() method also offers a defaultValue argument, which is returned, in case that a metadata value does not exist for a given identifier.

const description = getMeta(Service, 'fetch.desc', 'N/A');\n

Callback

If you need to create more advanced metadata, you can specify a callback as the first argument for the meta() decorator method. When using a callback you gain access to the target that is being decorated, as well as the decorator context. The callback MUST return an object that contains a key and a value property.

import { meta } from '@aedart/support/meta';\n\nclass Service {\n\n    @meta((target, context) => {\n        return {\n            key: context.name,\n            value: '...'\n        }\n    })\n    delegateTo(gateway) {\n        // ...not shown...\n    }\n}\n

Although the above example is a bit cumbersome to read, it shows a simple way to defined metadata for a method, which utilises the decorator context. If you wish, you can use this approach to create your own specialised meta decorators. Doing so can also improve the readability of your class. Consider the following example:

import { meta } from '@aedart/support/meta';\n\nfunction delegateMeta() {\n    return meta((target, context) => {\n        return {\n            key: context.name,\n            value: '...'\n        }\n    });\n}\n\nclass Service {\n\n    @delegateMeta()\n    delegateTo(gateway) {\n        // ...not shown...\n    }\n}\n
',8),y={};var w=(0,s(6262).A)(y,[["render",function(a,n){const s=(0,e.g2)("router-link"),y=(0,e.g2)("RouteLink"),w=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",o,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#set-metadata"},{default:(0,e.k6)((()=>[(0,e.eW)("Set Metadata")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#get-metadata"},{default:(0,e.k6)((()=>[(0,e.eW)("Get Metadata")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#default-value"},{default:(0,e.k6)((()=>[(0,e.eW)("Default Value")])),_:1})])])]),(0,e.Lk)("li",null,[(0,e.bF)(s,{to:"#callback"},{default:(0,e.k6)((()=>[(0,e.eW)("Callback")])),_:1})])])]),l,p,(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[c,(0,e.eW)(": "),(0,e.Lk)("em",null,[(0,e.eW)("name of metadata identifier. Can also be a path ("),(0,e.Lk)("em",null,[(0,e.eW)("see "),(0,e.bF)(y,{to:"/archive/current/packages/support/objects/set.html"},{default:(0,e.k6)((()=>[i])),_:1})]),(0,e.eW)(").")])]),(0,e.Lk)("li",null,[r,(0,e.eW)(": "),(0,e.Lk)("em",null,[(0,e.eW)("arbitrary data. Can be a "),(0,e.Lk)("a",u,[(0,e.eW)("primitive value"),(0,e.bF)(w)]),(0,e.eW)(", an "),(0,e.Lk)("a",d,[(0,e.eW)("object"),(0,e.bF)(w)]),(0,e.eW)(", or a "),(0,e.Lk)("a",k,[(0,e.eW)("function"),(0,e.bF)(w)]),(0,e.eW)(".")])])]),m,(0,e.Lk)("div",v,[b,(0,e.Lk)("p",null,[(0,e.eW)("If an element is declared as "),(0,e.Lk)("a",g,[h,(0,e.bF)(w)]),(0,e.eW)(", then it's metadata becomes available as soon as the class has been defined.")])]),f])}]]);const L=JSON.parse('{"path":"/archive/current/packages/support/meta/setAndGet.html","title":"Set & Get","lang":"en-GB","frontmatter":{"title":"Set & Get","description":"Defining and retrieving metadata.","sidebarDepth":0},"headers":[{"level":2,"title":"Set Metadata","slug":"set-metadata","link":"#set-metadata","children":[]},{"level":2,"title":"Get Metadata","slug":"get-metadata","link":"#get-metadata","children":[{"level":3,"title":"Default Value","slug":"default-value","link":"#default-value","children":[]}]},{"level":2,"title":"Callback","slug":"callback","link":"#callback","children":[]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/setAndGet.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/supported.html.adf3fce5.js b/assets/js/supported.html.adf3fce5.js new file mode 100644 index 00000000..89e41b58 --- /dev/null +++ b/assets/js/supported.html.adf3fce5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[3248],{2302:function(e,t,o){o.r(t),o.d(t,{comp:function(){return l},data:function(){return c}});var r=o(641);const a=(0,r.Fv)('

Supported Elements

The meta decorator supports the following elements¹:

  • class
  • method
  • getter
  • setter
  • field
  • accessor
',3),n={href:"https://github.com/tc39/proposal-decorators#2-calling-decorators",target:"_blank",rel:"noopener noreferrer"},s=(0,r.Lk)("code",null,"context.kind",-1),d={};var l=(0,o(6262).A)(d,[["render",function(e,t){const o=(0,r.g2)("ExternalLinkIcon");return(0,r.uX)(),(0,r.CE)("div",null,[a,(0,r.Lk)("p",null,[(0,r.eW)("¹: "),(0,r.Lk)("em",null,[(0,r.eW)("An element is determined by the decorator's "),(0,r.Lk)("a",n,[s,(0,r.bF)(o)]),(0,r.eW)(" property.")])])])}]]);const c=JSON.parse('{"path":"/archive/current/packages/support/meta/supported.html","title":"Supported Elements","lang":"en-GB","frontmatter":{"title":"Supported Elements","description":"Supported elements by meta decorators.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/supported.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/targetMeta.html.543973ed.js b/assets/js/targetMeta.html.543973ed.js new file mode 100644 index 00000000..34db6553 --- /dev/null +++ b/assets/js/targetMeta.html.543973ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[676],{3037:function(n,s,a){a.r(s),a.d(s,{comp:function(){return b},data:function(){return g}});var e=a(641);const t={id:"target-meta",tabindex:"-1"},p={class:"header-anchor",href:"#target-meta"},c=(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.Lk)("code",null,"targetMeta()"),(0,e.eW)(" decorator offers the ability to associate metadata directly with a class instance or class method reference. This can be useful in situations when you do not know the class that owns the metadata.")],-1),i=(0,e.Lk)("code",null,"targetMeta()",-1),o=(0,e.Lk)("code",null,"meta()",-1),l={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Lk)("code",null,"WeakMap",-1),u={class:"table-of-contents"},d=(0,e.Lk)("h2",{id:"supported-elements",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#supported-elements"},[(0,e.Lk)("span",null,"Supported Elements")])],-1),k=(0,e.Lk)("code",null,"meta()",-1),m=(0,e.Lk)("code",null,"targetMeta()",-1),v=(0,e.Fv)('
  • class
  • method

Class Instance

The following shows how to define target meta for a class and retrieve it.

import { targetMeta, getTargetMeta } from '@aedart/support/meta';\n\n@targetMeta('description', { type: 'Search Service', alias: 'Location Sercher' })\nclass LocationSearcherService {}\n\nconst instance = new LocationSearcherService();\n\n// ...later in your application...\ngetTargetMeta(instance, 'description')?.type; // Search Service\n

Method Reference

The following shows how to define target meta for a class method and retrieve it.

import { targetMeta, getTargetMeta } from '@aedart/support/meta';\n\nclass LocationSearcherService {\n\n    @targetMeta('dependencies', [ 'httpClient' ])    \n    search(apiClient) {}\n}\n\nconst instance = new LocationSearcherService();\n\n// ...later in your application...\ngetTargetMeta(instance.search, 'dependencies'); // [ 'httpClient' ]\n

Inheritance

Target meta is automatically inherited by subclasses and can also be overwritten, similar to that of the meta() decorator.

Example: classes

import {targetMeta, getTargetMeta} from '@aedart/support/meta';\n\n@meta('service_alias', 'locationSearcher')\nclass Service {}\n\nclass CitySearcher extends Service {}\n\nconst instance = new CitySearcher();\n\n// ...later in your application...\ngetTargetMeta(instance, 'service_alias'); // locationSearcher\n

Example: methods

import {targetMeta, getTargetMeta} from '@aedart/support/meta';\n\nclass Service {\n\n    @targetMeta('dependencies', [ 'countrySearchApiClient' ])\n    search(apiClient) {\n        // ...not shown...\n    }\n}\n\nclass CountrySearcher extends Service {\n    // ... not method overwrite here...\n}\n\nclass CitySearcher extends Service {\n\n    @targetMeta('dependencies', [ 'citySearchApiClient' ])\n    search(apiClient) {\n        // ...not shown...\n    }\n}\n\nconst instanceA = new Service();\nconst instanceB = new CountrySearcher();\nconst instanceC = new CitySearcher();\n\n// ...later in your application...\ngetTargetMeta(instanceA.search, 'dependencies'); // [ 'countrySearchApiClient' ]\ngetTargetMeta(instanceB.search, 'dependencies'); // [ 'countrySearchApiClient' ]\ngetTargetMeta(instanceC.search, 'dependencies'); // [ 'citySearchApiClient' ]\n

Static Methods

Inheritance for static methods works a bit differently. By default, any subclass will automatically inherit target metadata, even for static methods. However, if you overwrite the given static method, the metadata is lost.

Limitation

When a static method is overwritten, the parent's "target" metadata cannot be obtained due to a general limitation of the meta() decorator. The decorator has no late this binding available to the overwritten static method. This makes it impossible to associate the overwritten static method with metadata from the parent.

Example: inheritance for static methods

import {targetMeta, getTargetMeta} from '@aedart/support/meta';\n\nclass Service {\n\n    @targetMeta('dependencies', [ 'xmlClient' ])\n    static search(client) {\n        // ...not shown...\n    }\n}\n\nclass CountrySearcher extends Service {\n    // ... not method overwrite here...\n}\n\nclass CitySearcher extends Service {\n    \n    // Overwite of static method - target meta is lost\n    static search(client) {}\n}\n\n// ...later in your application...\ngetTargetMeta(CountrySearcher.search, 'dependencies'); // [ 'xmlClient' ]\ngetTargetMeta(CitySearcher.search, 'dependencies'); // undefined\n

To overcome the above shown issue, you can use the inheritTargetMeta() decorator. It forces the static method to "copy" metadata from its parent, if available.

Example: force inheritance for static methods

import {\n    targetMeta,\n    getTargetMeta,\n    inheritTargetMeta\n} from '@aedart/support/meta';\n\nclass Service {\n\n    @targetMeta('dependencies', [ 'xmlClient' ])\n    static search(client) {\n        // ...not shown...\n    }\n}\n\nclass CountrySearcher extends Service {\n    // ... not method overwrite here...\n}\n\nclass CitySearcher extends Service {\n    \n    @inheritTargetMeta()\n    static search(client) {}\n}\n\n// ...later in your application...\ngetTargetMeta(CountrySearcher.search, 'dependencies'); // [ 'xmlClient' ]\ngetTargetMeta(CitySearcher.search, 'dependencies'); // [ 'xmlClient' ]\n
',21),h={};var b=(0,a(6262).A)(h,[["render",function(n,s){const a=(0,e.g2)("Badge"),h=(0,e.g2)("ExternalLinkIcon"),b=(0,e.g2)("router-link"),g=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",p,[(0,e.Lk)("span",null,[(0,e.eW)("Target Meta "),(0,e.bF)(a,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),c,(0,e.Lk)("p",null,[(0,e.eW)("Behind the scene, "),i,(0,e.eW)(" uses the "),o,(0,e.eW)(" decorator and stores a reference to the target that is decorated inside a "),(0,e.Lk)("a",l,[r,(0,e.bF)(h)]),(0,e.eW)(".")]),(0,e.Lk)("nav",u,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#supported-elements"},{default:(0,e.k6)((()=>[(0,e.eW)("Supported Elements")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#class-instance"},{default:(0,e.k6)((()=>[(0,e.eW)("Class Instance")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#method-reference"},{default:(0,e.k6)((()=>[(0,e.eW)("Method Reference")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#inheritance"},{default:(0,e.k6)((()=>[(0,e.eW)("Inheritance")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(b,{to:"#static-methods"},{default:(0,e.k6)((()=>[(0,e.eW)("Static Methods")])),_:1})])])])])]),d,(0,e.Lk)("p",null,[(0,e.eW)("Unlike the "),(0,e.bF)(g,{to:"/archive/current/packages/support/meta/supported.html"},{default:(0,e.k6)((()=>[k,(0,e.eW)(" decorator")])),_:1}),(0,e.eW)(", "),m,(0,e.eW)(" only supports the following elements:")]),v])}]]);const g=JSON.parse('{"path":"/archive/current/packages/support/meta/targetMeta.html","title":"Target Meta","lang":"en-GB","frontmatter":{"title":"Target Meta","description":"Associate metadata with a class instance or class method reference.","sidebarDepth":0},"headers":[{"level":2,"title":"Supported Elements","slug":"supported-elements","link":"#supported-elements","children":[]},{"level":2,"title":"Class Instance","slug":"class-instance","link":"#class-instance","children":[]},{"level":2,"title":"Method Reference","slug":"method-reference","link":"#method-reference","children":[]},{"level":2,"title":"Inheritance","slug":"inheritance","link":"#inheritance","children":[{"level":3,"title":"Static Methods","slug":"static-methods","link":"#static-methods","children":[]}]}],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/targetMeta.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/tc39.html.ad6563e8.js b/assets/js/tc39.html.ad6563e8.js new file mode 100644 index 00000000..08376609 --- /dev/null +++ b/assets/js/tc39.html.ad6563e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[2021],{8338:function(a,n,s){s.r(n),s.d(n,{comp:function(){return h},data:function(){return g}});var e=s(641);const t=(0,e.Lk)("h1",{id:"tc39-decorator-metadata",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#tc39-decorator-metadata"},[(0,e.Lk)("span",null,"TC39 Decorator Metadata")])],-1),o={href:"https://github.com/tc39/proposal-decorator-metadata",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Lk)("em",null,'"mimics"',-1),c=(0,e.Lk)("code",null,"context.metadata",-1),l=(0,e.Lk)("code",null,"Symbol.metadata",-1),r=(0,e.Fv)('

Example:

import { meta, getMeta } from '@aedart/support/meta';\n\n@meta('service_alias', 'locationSearcher')\nclass Service {}\n\ngetMeta(Service, 'service_alias'); // locationSearcher\n

Roughly "desugars" to the following:

function meta(key, value) {\n    return (target, context) => {\n        context.metadata[key] = value;\n    }\n}\n\n@meta('service_alias', 'locationSearcher')\nclass Service {}\n\nService[Symbol.metadata].service_alias; // locationSearcher\n

(Above shown example is very simplified. Actual implementation is a bit more complex...)

',5),i=(0,e.Lk)("code",null,"meta",-1),u={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap",target:"_blank",rel:"noopener noreferrer"},d=(0,e.Lk)("code",null,"WeakMap",-1),k={href:"https://github.com/tc39/proposal-decorator-metadata",target:"_blank",rel:"noopener noreferrer"},m=(0,e.Lk)("code",null,"context.metadata",-1),v=(0,e.Lk)("em",null,"or when browsers support it",-1),b={};var h=(0,s(6262).A)(b,[["render",function(a,n){const s=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("In relation to the "),(0,e.Lk)("a",o,[(0,e.eW)("Decorator Metadata proposal"),(0,e.bF)(s)]),(0,e.eW)(", this decorator "),p,(0,e.eW)(" a similar behaviour as the one defined by the proposal. Defining and retrieving metadata relies on a decorator's "),c,(0,e.eW)(" object, and the "),l,(0,e.eW)(" property of a class.")]),r,(0,e.Lk)("p",null,[(0,e.eW)("At present, the internal mechanisms of the "),i,(0,e.eW)(" decorator must rely on a "),(0,e.Lk)("a",u,[d,(0,e.bF)(s)]),(0,e.eW)(" to associate metadata with the intended class. When the "),(0,e.Lk)("a",k,[(0,e.eW)("Decorator Metadata proposal"),(0,e.bF)(s)]),(0,e.eW)(" becomes more mature and transpilers offer the "),m,(0,e.eW)(" object ("),v,(0,e.eW)("), then this decorator will be updated respectfully to use the available metadata object.")])])}]]);const g=JSON.parse('{"path":"/archive/current/packages/support/meta/tc39.html","title":"TC39 Proposal","lang":"en-GB","frontmatter":{"title":"TC39 Proposal","description":"In relation to TC39 Decorator Metadata proposal","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/meta/tc39.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/toWeakRef.html.c223105a.js b/assets/js/toWeakRef.html.c223105a.js new file mode 100644 index 00000000..6817d670 --- /dev/null +++ b/assets/js/toWeakRef.html.c223105a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[9912],{9904:function(n,a,s){s.r(a),s.d(a,{comp:function(){return u},data:function(){return k}});var e=s(641);const t={id:"toweakref",tabindex:"-1"},o={class:"header-anchor",href:"#toweakref"},p=(0,e.Lk)("code",null,"toWeakRef",-1),c={href:"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Lk)("code",null,"WeakRef",-1),l=(0,e.Fv)('
import { toWeakRef } from "@aedart/support/misc";\n\nconst person = { name: 'Sine' };\n\nconst a = toWeakRef(person); // new WeakRef of "person"\nconst b = toWeakRef(a); // same WeakRef instance as "a"\n\ntoWeakRef(null); // undefined\ntoWeakRef(undefined); // undefined\n
',1),r={};var u=(0,s(6262).A)(r,[["render",function(n,a){const s=(0,e.g2)("Badge"),r=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",o,[(0,e.Lk)("span",null,[p,(0,e.eW)(),(0,e.bF)(s,{type:"tip",text:"Available since v0.7",vertical:"middle"})])])]),(0,e.Lk)("p",null,[(0,e.eW)("Wraps a target object into a "),(0,e.Lk)("a",c,[i,(0,e.bF)(r)]),(0,e.eW)(", if not already instance of a weak reference.")]),l])}]]);const k=JSON.parse('{"path":"/archive/current/packages/support/misc/toWeakRef.html","title":"To Weak Ref.","lang":"en-GB","frontmatter":{"title":"To Weak Ref.","description":"Wrap object into a Weak Reference.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/misc/toWeakRef.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/uniqueId.html.058f42b9.js b/assets/js/uniqueId.html.058f42b9.js new file mode 100644 index 00000000..13464f72 --- /dev/null +++ b/assets/js/uniqueId.html.058f42b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6054],{7717:function(n,s,a){a.r(s),a.d(s,{comp:function(){return k},data:function(){return m}});var e=a(641);const t={id:"uniqueid",tabindex:"-1"},o={class:"header-anchor",href:"#uniqueid"},p=(0,e.Lk)("code",null,"uniqueId",-1),i=(0,e.Fv)('

The uniqueId() is able to return a "unique¹" reference identifier for any given object.

import { uniqueId, hasUniqueId } from "@aedart/support/objects";\n\nconst target = {\n    name: 'Ursula'\n};\n\nconsole.log(uniqueId(target)); // 27\n\n// ...later in your application\nconsole.log(hasUniqueId(target)); // true\nconsole.log(uniqueId(target)); // 27\n
',2),c={href:"https://github.com/ngehlert",target:"_blank",rel:"noopener noreferrer"},u={href:"https://developapa.com/object-ids/",target:"_blank",rel:"noopener noreferrer"},l=(0,e.Lk)("em",null,"Get object reference IDs in JavaScript/TypeScript",-1),r=(0,e.Lk)("p",null,[(0,e.eW)("¹: "),(0,e.Lk)("em",null,"In this context, the returned number is unique in the current session. The number will NOT be unique across multiple sessions, nor guarantee that an object will receive the exact same identifier as in a previous session!")],-1),d={};var k=(0,a(6262).A)(d,[["render",function(n,s){const a=(0,e.g2)("Badge"),d=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[(0,e.Lk)("h1",t,[(0,e.Lk)("a",o,[(0,e.Lk)("span",null,[p,(0,e.eW)(),(0,e.bF)(a,{type:"tip",text:"Available since v0.6",vertical:"middle"})])])]),i,(0,e.Lk)("p",null,[(0,e.eW)("The source code is heavily inspired by "),(0,e.Lk)("a",c,[(0,e.eW)("Nicolas Gehlert's"),(0,e.bF)(d)]),(0,e.eW)(" blog post: "),(0,e.Lk)("a",u,[(0,e.eW)('"'),l,(0,e.eW)('" (September 28, 2022)'),(0,e.bF)(d)])]),r])}]]);const m=JSON.parse('{"path":"/archive/current/packages/support/objects/uniqueId.html","title":"Unique ID","lang":"en-GB","frontmatter":{"title":"Unique ID","description":"Set value in object path.","sidebarDepth":0},"headers":[],"git":{"updatedTime":1709288721000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/objects/uniqueId.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/upgrade-guide.html.7cad2293.js b/assets/js/upgrade-guide.html.7cad2293.js new file mode 100644 index 00000000..f6752b29 --- /dev/null +++ b/assets/js/upgrade-guide.html.7cad2293.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[5815],{8472:function(n,a,e){e.r(a),e.d(a,{comp:function(){return v},data:function(){return m}});var s=e(641);const t=(0,s.Lk)("h1",{id:"upgrade-guide",tabindex:"-1"},[(0,s.Lk)("a",{class:"header-anchor",href:"#upgrade-guide"},[(0,s.Lk)("span",null,"Upgrade Guide")])],-1),o={class:"table-of-contents"},p=(0,s.Fv)('

From v0.7.x- to v0.10.x

Meta (types)

The following deprecated types have been removed (deprecated in version v0.7.0):

  • ClassContext
  • MethodContext
  • GetterContext
  • SetterContext
  • FieldContext
  • AccessorContext
  • MetadataContext
  • MemberContext

More information available in the source code and CHANGELOG.md

Meta (targetMeta() and inheritTargetMeta())

The util functions targetMeta() and inheritTargetMeta() now throw a MetaError instead of previous TypeError. If you rely on TypeError as the type of exception being thrown in a try-catch statement, when decorating class members, then you should change it to MetaError.

From v0.6.x to v0.7.x

Node.js 20.11.0 Required

',9),l={href:"https://nodejs.org",target:"_blank",rel:"noopener noreferrer"},r=(0,s.Lk)("code",null,"v20.11.0",-1),i=(0,s.Fv)('

Meta

Various metadata related type definitions have now been deprecated in favour of TypeScript's own definitions. Mostly, this should not affect the implementation. However, if your decorator(s) depend on the following types (see below), then you are strongly encouraged to use corresponding TypeScript defined types instead.

Deprecated types and interfaces are defined in @aedart/contracts/support/meta:

  • ClassContext
  • MethodContext
  • GetterContext
  • SetterContext
  • FieldContext
  • AccessorContext
  • MetadataContext
  • MemberContext

More information available in the source code and CHANGELOG.md

Vuepress Utils

The @aedart/vuepress-utils has been upgraded to use vuepress v2.0.0-rc.2, meaning that you no longer should require to manually define your vuepress dependency, in your application's packages.json file.

❌ Previously

{\n    "devDependencies": {\n        "@aedart/vuepress-utils": "^0.6.1",\n        "vuepress": "2.0.0-beta.61",\n        "@vuepress/core": "2.0.0-beta.61",\n        "@vuepress/utils": "2.0.0-beta.61",\n        "@vuepress/client": "2.0.0-beta.61"\n    }   \n}\n

✔️ Now

{\n    "devDependencies": {\n        "@aedart/vuepress-utils": "^0.7.0"\n    }   \n}\n
',11),c={href:"https://github.com/vuepress/core/blob/main/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"},d=(0,s.Fv)('

Webpack Bundle

In addition to the above, the @aedart/vuepress-utils automatically comes with @vuepress/bundler-webpack as its peed dependency.

From v0.3.x to v0.4.x

Rest Parameters for forgetAll(), hasAll() and hasAny()

forgetAll(), hasAll() and hasAny() (in @aedart/support/object submodule) now accept rest parameters instead of an array of paths. If you are using these methods, then you need to upgrade or risk unexpected results.

❌ Previously

import {\n    forgetAll,\n    hasAll,\n    hasAny\n} from "@aedart/support/objects";\n\nhasAny(target, [ 'a', 'b.c.age' ]);\nhasAll(target, [ 'a', 'b.c.age' ]);\nforgetAll(target, [ 'a', 'b.c.age' ]);\n

✔️ Now

hasAny(target, ...[ 'a', 'b.c.age' ]);\nhasAll(target, ...[ 'a', 'b.c.age' ]);\nforgetAll(target, ...[ 'a', 'b.c.age' ]);\n\n// ...Or\nhasAny(target, 'a', 'b.c.age');\nhasAll(target, 'a', 'b.c.age');\nforgetAll(target, 'a', 'b.c.age');\n

Onward

',10),u={href:"https://github.com/aedart/ion/blob/main/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"},k={};var v=(0,e(6262).A)(k,[["render",function(n,a){const e=(0,s.g2)("router-link"),k=(0,s.g2)("ExternalLinkIcon");return(0,s.uX)(),(0,s.CE)("div",null,[t,(0,s.Lk)("nav",o,[(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#from-v0-7-x-to-v0-10-x"},{default:(0,s.k6)((()=>[(0,s.eW)("From v0.7.x- to v0.10.x")])),_:1}),(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#meta-types"},{default:(0,s.k6)((()=>[(0,s.eW)("Meta (types)")])),_:1})]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#meta-targetmeta-and-inherittargetmeta"},{default:(0,s.k6)((()=>[(0,s.eW)("Meta (targetMeta() and inheritTargetMeta())")])),_:1})])])]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#from-v0-6-x-to-v0-7-x"},{default:(0,s.k6)((()=>[(0,s.eW)("From v0.6.x to v0.7.x")])),_:1}),(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#node-js-20-11-0-required"},{default:(0,s.k6)((()=>[(0,s.eW)("Node.js 20.11.0 Required")])),_:1})]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#meta"},{default:(0,s.k6)((()=>[(0,s.eW)("Meta")])),_:1})]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#vuepress-utils"},{default:(0,s.k6)((()=>[(0,s.eW)("Vuepress Utils")])),_:1})])])]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#from-v0-3-x-to-v0-4-x"},{default:(0,s.k6)((()=>[(0,s.eW)("From v0.3.x to v0.4.x")])),_:1}),(0,s.Lk)("ul",null,[(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#rest-parameters-for-forgetall-hasall-and-hasany"},{default:(0,s.k6)((()=>[(0,s.eW)("Rest Parameters for forgetAll(), hasAll() and hasAny()")])),_:1})])])]),(0,s.Lk)("li",null,[(0,s.bF)(e,{to:"#onward"},{default:(0,s.k6)((()=>[(0,s.eW)("Onward")])),_:1})])])]),p,(0,s.Lk)("p",null,[(0,s.eW)("Ion now requires "),(0,s.Lk)("a",l,[(0,s.eW)("Node.js"),(0,s.bF)(k)]),(0,s.eW)(),r,(0,s.eW)(" or greater.")]),i,(0,s.Lk)("p",null,[(0,s.eW)("Please read "),(0,s.Lk)("a",c,[(0,s.eW)("vuepress' changelog"),(0,s.bF)(k)]),(0,s.eW)(" for additional details.")]),d,(0,s.Lk)("p",null,[(0,s.eW)("More details can be found in the "),(0,s.Lk)("a",u,[(0,s.eW)("changelog"),(0,s.bF)(k)]),(0,s.eW)(".")])])}]]);const m=JSON.parse('{"path":"/archive/current/upgrade-guide.html","title":"Upgrade Guide","lang":"en-GB","frontmatter":{"description":"Ion Upgrade Guide","sidebarDepth":1},"headers":[{"level":2,"title":"From v0.7.x- to v0.10.x","slug":"from-v0-7-x-to-v0-10-x","link":"#from-v0-7-x-to-v0-10-x","children":[{"level":3,"title":"Meta (types)","slug":"meta-types","link":"#meta-types","children":[]},{"level":3,"title":"Meta (targetMeta() and inheritTargetMeta())","slug":"meta-targetmeta-and-inherittargetmeta","link":"#meta-targetmeta-and-inherittargetmeta","children":[]}]},{"level":2,"title":"From v0.6.x to v0.7.x","slug":"from-v0-6-x-to-v0-7-x","link":"#from-v0-6-x-to-v0-7-x","children":[{"level":3,"title":"Node.js 20.11.0 Required","slug":"node-js-20-11-0-required","link":"#node-js-20-11-0-required","children":[]},{"level":3,"title":"Meta","slug":"meta","link":"#meta","children":[]},{"level":3,"title":"Vuepress Utils","slug":"vuepress-utils","link":"#vuepress-utils","children":[]}]},{"level":2,"title":"From v0.3.x to v0.4.x","slug":"from-v0-3-x-to-v0-4-x","link":"#from-v0-3-x-to-v0-4-x","children":[{"level":3,"title":"Rest Parameters for forgetAll(), hasAll() and hasAny()","slug":"rest-parameters-for-forgetall-hasall-and-hasany","link":"#rest-parameters-for-forgetall-hasall-and-hasany","children":[]}]},{"level":2,"title":"Onward","slug":"onward","link":"#onward","children":[]}],"git":{"updatedTime":1709813341000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":3},{"name":"alin","email":"alin@rspsystems.com","commits":3}]},"filePathRelative":"archive/current/upgrade-guide.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/usage.html.0cc995d4.js b/assets/js/usage.html.0cc995d4.js new file mode 100644 index 00000000..3ef21253 --- /dev/null +++ b/assets/js/usage.html.0cc995d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6333],{3623:function(n,s,a){a.r(s),a.d(s,{comp:function(){return f},data:function(){return C}});var e=a(641);const t=(0,e.Lk)("h1",{id:"how-to-use-concerns",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#how-to-use-concerns"},[(0,e.Lk)("span",null,"How to use Concerns")])],-1),c={class:"table-of-contents"},o=(0,e.Lk)("h2",{id:"using-concerns",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#using-concerns"},[(0,e.Lk)("span",null,"Using Concerns")])],-1),i={href:"https://github.com/tc39/proposal-decorators",target:"_blank",rel:"noopener noreferrer"},p=(0,e.Lk)("code",null,"use()",-1),l=(0,e.Fv)('
import { use } from "@aedart/support/concerns";\n\n@use(\n    ApiConnection,\n    Serialization,\n    Collections\n)\nclass Flight {}\n
',1),u=(0,e.Lk)("code",null,"CONCERNS",-1),r=(0,e.Lk)("a",{href:"#manual-interaction"},"Manual interaction",-1),d=(0,e.Fv)('

Inheritance

All concerns that are used by a parent class are automatically available (inherited), by child classes.

@use(\n    ApiConnection,\n    Serialization,\n    Collections\n)\nclass ApiService {}\n\nclass Flight extends ApiService {} // Uses ApiConnection, Serialization, ...etc\n
',3),k={class:"custom-container warning"},v=(0,e.Fv)('

WARNING

A concern class may ONLY occur once in a target class' prototype chain. An InjectionError is thrown, if this is violated!

@use(\n    ApiConnection,\n    Serialization,\n    Collections\n)\nclass ApiService {}\n\n@use(Serialization) // InjectionError\nclass Flight extends ApiService {}\n
',3),m=(0,e.Lk)("h2",{id:"manual-interaction",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#manual-interaction"},[(0,e.Lk)("span",null,"Manual interaction")])],-1),b=(0,e.Lk)("code",null,"CONCERNS",-1),g=(0,e.Lk)("code",null,"get()",-1),h=(0,e.Fv)('
import {\n    use,\n    CONCERNS,\n    AbstractConcern\n} from "@aedart/support/concerns";\n\nclass Encryption extends AbstractConcern {\n    encrypt(value) { /* ...not shown... */ }\n}\n\n@use(Encryption)\nclass CookieStore {\n    constructor() {\n        const container = this[CONCERNS];\n        const value = container.get(Encryption).encrypt('Lorum lipsum');\n        \n        // ...remaining not shown...\n    }\n}\n

You can achieve the same result by using the getContainer() utility method.

import { use, getContainer } from "@aedart/support/concerns";\n\n// ...Encryption concern not shown...\n\n@use(Encryption)\nclass CookieStore {\n    constructor() {\n        const value = getContainer(this)\n            .get(Encryption)\n            .encrypt('Lorum lipsum');\n        \n        // ...remaining not shown...\n    }\n}\n
CONCERNS symbol, getContainer(), and getConcernsContainer()

There are 3 ways to obtain the concerns container instance:

A) CONCERNS symbol

Inside your target class, if you know that concerns are used (if target is a "concern owner"), then you can use the CONCERNS symbol to gain access to the container.

import { CONCERNS } from "@aedart/support/concerns";\n\n// Inside your target class...\nconst container = this[CONCERNS];\n

B) getContainer()

getContainer() is essentially a just a wrapper for: return this[CONCERNS].

import { getContainer } from "@aedart/support/concerns";\n\n// Inside your target class...\nconst container = getContainer(this);\n

C) getConcernsContainer()

The getConcernsContainer() achieves the same result as the previous shown methods. However, it does perform a check of the provided target instance, which ensures that it is a "concern owner". If the target does not pass this test, then a TypeError is thrown. This might can be useful in situations when you might now know if the target is a concern owner, e.g. when situated in a child class or outside a target class.

import { getConcernsContainer } from "@aedart/support/concerns";\n\n// Inside your target class...\nconst container = getConcernsContainer(this);\n

Determine if target uses concerns

To determine if a target uses one or more concerns, use the usesConcerns() method. It accepts the following arguments:

  • instance: object|Owner - The target class instance.
  • ...concerns: ConcernConstructor[] - Concern classes to test for.
import {\n    use,\n    AbstractConcern,\n    usesConcerns\n} from "@aedart/support/concerns";\n\nclass A extends AbstractConcern {}\nclass B extends AbstractConcern {}\nclass C extends AbstractConcern {}\n\n@use(\n    A,\n    B\n)\nclass Game {}\n\nconst instance = new Game();\n\nusesConcerns(instance, A); // true\nusesConcerns(instance, B); // true\nusesConcerns(instance, A, B); // true\n\nusesConcerns(instance, C); // false\nusesConcerns(instance, A, C); // false\nusesConcerns(instance, B, C); // false\nusesConcerns(instance, A, B, C); // false\n
',8),y={};var f=(0,a(6262).A)(y,[["render",function(n,s){const a=(0,e.g2)("router-link"),y=(0,e.g2)("ExternalLinkIcon"),f=(0,e.g2)("RouteLink");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("nav",c,[(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#using-concerns"},{default:(0,e.k6)((()=>[(0,e.eW)("Using Concerns")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#inheritance"},{default:(0,e.k6)((()=>[(0,e.eW)("Inheritance")])),_:1})]),(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#manual-interaction"},{default:(0,e.k6)((()=>[(0,e.eW)("Manual interaction")])),_:1}),(0,e.Lk)("ul",null,[(0,e.Lk)("li",null,[(0,e.bF)(a,{to:"#determine-if-target-uses-concerns"},{default:(0,e.k6)((()=>[(0,e.eW)("Determine if target uses concerns")])),_:1})])])])])]),o,(0,e.Lk)("p",null,[(0,e.eW)("The "),(0,e.Lk)("a",i,[(0,e.eW)("class decorator"),(0,e.bF)(y)]),(0,e.eW)(),p,(0,e.eW)(" is used to inject one or more concern classes into a target class.")]),l,(0,e.Lk)("p",null,[(0,e.eW)("When concern classes are injected, the target class is transformed and all concerns are made available inside a private "),u,(0,e.eW)(" property. See "),r,(0,e.eW)(" and "),(0,e.bF)(f,{to:"/archive/current/packages/support/concerns/aliases.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Aliases")])),_:1}),(0,e.eW)(" for additional details.")]),d,(0,e.Lk)("div",k,[v,(0,e.Lk)("p",null,[(0,e.eW)("See also "),(0,e.bF)(f,{to:"/archive/current/packages/support/concerns/conflictResolution.html"},{default:(0,e.k6)((()=>[(0,e.eW)("Conflict Resolution")])),_:1}),(0,e.eW)(" for additional details.")])]),m,(0,e.Lk)("p",null,[(0,e.eW)('When concerns are injected into a target, they are defined inside a "Concerns Container", which is available in the target instance via the '),b,(0,e.eW)(" symbol. Should you require to perform more advanced interaction with a concern class instance, then you can obtain a concern instance via the container's "),g,(0,e.eW)(" method. It will automatically ensure to "),(0,e.bF)(f,{to:"/archive/current/packages/support/concerns/booting.html"},{default:(0,e.k6)((()=>[(0,e.eW)("boot")])),_:1}),(0,e.eW)(" a concern, if not already booted.")]),h])}]]);const C=JSON.parse('{"path":"/archive/current/packages/support/concerns/usage.html","title":"Using Concerns","lang":"en-GB","frontmatter":{"title":"Using Concerns","description":"How to use concerns.","sidebarDepth":0},"headers":[{"level":2,"title":"Using Concerns","slug":"using-concerns","link":"#using-concerns","children":[]},{"level":2,"title":"Inheritance","slug":"inheritance","link":"#inheritance","children":[]},{"level":2,"title":"Manual interaction","slug":"manual-interaction","link":"#manual-interaction","children":[{"level":3,"title":"Determine if target uses concerns","slug":"determine-if-target-uses-concerns","link":"#determine-if-target-uses-concerns","children":[]}]}],"git":{"updatedTime":1709641376000,"contributors":[{"name":"alin","email":"alin@rspsystems.com","commits":1}]},"filePathRelative":"archive/current/packages/support/concerns/usage.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/assets/js/version-disclaimer.html.f9b07ad7.js b/assets/js/version-disclaimer.html.f9b07ad7.js new file mode 100644 index 00000000..6567418b --- /dev/null +++ b/assets/js/version-disclaimer.html.f9b07ad7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_aedart_ion_monorepo=self.webpackChunk_aedart_ion_monorepo||[]).push([[6368],{6679:function(n,a,s){s.r(a),s.d(a,{comp:function(){return h},data:function(){return f}});var e=s(641);const t=(0,e.Fv)('

Version Disclaimer

The <VersionDisclaimer /> component is a simply "notice" container, which can be used in your layout. Most often, you would use this to display a custom message when outdated / unsupported documentation is being viewed.

<VersionDisclaimer type="warning" label="Note">\n    You are viewing documentation for an unsupported version...\n</VersionDisclaimer>\n

Properties

type (optional)

The type property accepts the following values:

  • info (default)
  • warning
  • danger

label (optional)

An optional label that is used as a prefix for the custom disclaim message.

Extend Default Layout

',10),o=(0,e.Lk)("code",null,"Archive",-1),p={href:"https://v2.vuepress.vuejs.org/advanced/theme.html#create-a-theme",target:"_blank",rel:"noopener noreferrer"},i=(0,e.Lk)("em",null,"e.g. extend the default theme",-1),l=(0,e.Lk)("code",null,".vuepress/layouts/Layout.vue",-1),c=(0,e.Fv)('
<script setup lang="ts">\nimport ParentLayout from '@vuepress/theme-default/layouts/Layout.vue';\nimport VersionDisclaimer from "@aedart/vuepress-utils/components/VersionDisclaimer.vue";\nimport {usePageData} from "@vuepress/client";\nimport {isViewingNextRef, isViewingOtherRef} from "@aedart/vuepress-utils";\nimport archive from "../my_archive";\n\nconst page = usePageData();\nconst showForNext = isViewingNextRef(page, archive);\nconst showForOther = isViewingOtherRef(page, archive);\n</script>\n\n<template>\n  <ParentLayout>\n    <template #page-top>\n        \n      <VersionDisclaimer v-if="showForNext">\n        You are viewing documentation for next version...\n      </VersionDisclaimer>\n        \n      <VersionDisclaimer v-if="showForOther" type="danger" label="Oh oh">\n        You are viewing old stuff...\n      </VersionDisclaimer>\n\n    </template>\n  </ParentLayout>\n</template>\n
',1),u=(0,e.Lk)("code",null,"isViewingNextRef()",-1),r=(0,e.Lk)("code",null,"isViewingOtherRef()",-1),d=(0,e.Lk)("h2",{id:"client-config",tabindex:"-1"},[(0,e.Lk)("a",{class:"header-anchor",href:"#client-config"},[(0,e.Lk)("span",null,"Client Config")])],-1),k={href:"https://v2.vuepress.vuejs.org/guide/configuration.html#client-config-file",target:"_blank",rel:"noopener noreferrer"},v=(0,e.Lk)("code",null,"Layout",-1),m=(0,e.Fv)('
import { defineClientConfig } from '@vuepress/client';\nimport Layout from "./layouts/Layout.vue";\n\nexport default defineClientConfig({\n    layouts: {\n        Layout\n    }\n});\n
',1),g={};var h=(0,s(6262).A)(g,[["render",function(n,a){const s=(0,e.g2)("RouteLink"),g=(0,e.g2)("ExternalLinkIcon");return(0,e.uX)(),(0,e.CE)("div",null,[t,(0,e.Lk)("p",null,[(0,e.eW)("The following example assumes that you are using an "),(0,e.bF)(s,{to:"/archive/current/packages/vuepress-utils/navigation/archive.html"},{default:(0,e.k6)((()=>[o,(0,e.eW)(" component")])),_:1}),(0,e.eW)(' to structure documentation. When doing so, you can display a custom message whenever "outdated" or "upcoming" documentation is being viewed.')]),(0,e.Lk)("p",null,[(0,e.eW)("To achieve this, you will need to create a "),(0,e.Lk)("a",p,[(0,e.eW)("custom layout"),(0,e.bF)(g)]),(0,e.eW)(" ("),i,(0,e.eW)("). Create a new layout, e.g. in "),l,(0,e.eW)(".")]),c,(0,e.Lk)("p",null,[(0,e.eW)("The "),u,(0,e.eW)(" method returns a computed property that indicates if visitor is viewing the "),(0,e.bF)(s,{to:"/archive/current/packages/vuepress-utils/navigation/archive.html#current--next"},{default:(0,e.k6)((()=>[(0,e.eW)('"next" collection of pages')])),_:1}),(0,e.eW)(". The "),r,(0,e.eW)(' methods returns a computed property that determines if pages are viewed that do not belong to "next" nor "current" collections.')]),d,(0,e.Lk)("p",null,[(0,e.eW)("In your "),(0,e.Lk)("a",k,[(0,e.eW)("Client Config File"),(0,e.bF)(g)]),(0,e.eW)(", use the custom "),v,(0,e.eW)(".")]),m])}]]);const f=JSON.parse('{"path":"/archive/current/packages/vuepress-utils/components/version-disclaimer.html","title":"Version Disclaimer","lang":"en-GB","frontmatter":{"title":"Version Disclaimer","description":"A simple notice container","sidebarDepth":0},"headers":[{"level":2,"title":"Properties","slug":"properties","link":"#properties","children":[{"level":3,"title":"type (optional)","slug":"type-optional","link":"#type-optional","children":[]},{"level":3,"title":"label (optional)","slug":"label-optional","link":"#label-optional","children":[]}]},{"level":2,"title":"Extend Default Layout","slug":"extend-default-layout","link":"#extend-default-layout","children":[]},{"level":2,"title":"Client Config","slug":"client-config","link":"#client-config","children":[]}],"git":{"updatedTime":1679769520000,"contributors":[{"name":"Alin Eugen Deac","email":"aedart@gmail.com","commits":1}]},"filePathRelative":"archive/current/packages/vuepress-utils/components/version-disclaimer.md","lastUpdatedDateFormat":"yyyy-MM-dd HH:mm:ss ZZZZ","lastUpdatedDateOptions":{}}')}}]); \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8bbf645e5313fc38e42eaae5b005ee83faa66886 GIT binary patch literal 15406 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 Of!;_fN|j3(efobhL}?)a literal 0 HcmV?d00001 diff --git a/images/icon/apple-touch-icon.png b/images/icon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc18c75a0097efc182ba42ab85b59f7ff705878 GIT binary patch literal 9201 zcmdT~Wm6nXv&C5)LU4ix4Z)oNi@QSz?he5n0*eNR;4HGZySux)ySux+Jip@B{V+2% z)zj5A-8Eg)=X8joyaXCDAu<#c6q=NzsPe~J^WOj;|L{W-F!YNrI75(d4xELG*Hh;(nA z`8-s09!5vPO|)&}ZO+E%QVwuNvZ5McQlDl9&eQcg@$kUe$^NTMwSLC#uIS5kxa{}P zzHm1xtdvG}dM(hotMPhEWPT9OMVR)P2gIR4FY9g&YxK`*bDKC+@*pGMRQb%@q5fP< zjI~IGH8|6*3p@gGz(itIsK<(7Jcaj^a!{JRMVD*of^?nNquUS`qkv2#2nL*A#`8&M z0C7an%XN^jmW(mu@e}vUn#R(6Ed|K&8Oh4{1y}(nL#laJdw9tK;{e$BWHIg8=yZ1z z!I;e1zKeehaM~_deD)sg&kW}XRytY<;uJs? z01Yl_j%a$eGTU<6V^&;chdKT5WV&%lQ+wSc8Rb%&YnFOB78Fd~>v#DB^1rtea+DKT zm=#1dK-Yl#g8K>t=pNStY)u&v31J|LlY|G@gDD4I6GbTaziqHbng^REq!!hQ7Vbl# zV7`zm8(wo5_#D2C5^0 z+r^Iy|)I?BI1a0MfiS&F~Kv>o@S!;co0NJb{ux* zYH?%K7zV1Bg2jQKKv&4@PCFNG^Gc9&-2$n&`jQ9UVR@k_`8G%You5uz5l{us!-E2Z z#9jjMt^#OX*1TQ3^&aFLkvyG~)lcLRKmoWR>WMbFKT*C;zL-s`Rsr*J|N9$-6FgfBac36?o!3zk|2J3_u=L~-Em zPbR-1`<7yXCxZx}4BQaKL?%CD_6GWy^X5nw9rLPA$$GRnkPvzte(A4McFJ@=PnBhj zuCv43bllT=+7x*53kOU(iqmW)jfxvB@z+n^1rEiBydJAW6;{P4CjxxyVZQuT-hmKZ zHPxp7i<2?Iq$AfXI?IHTaDu`QGK-t# zJ{`*wLMu3b1SwP1d*M{Mz@bLR;i#RC{}t_~o17nui8X!(tYDI;xI(Q67V z?$tEw&v!y-D!3m?JfeROGV5c?Wk?Hq7Y@Zkc6@e&5F)@P>}ktz$b-#zKkKA#dv8y$>&Ttxn0 zqRl6FgELq<+d_+{$j5;j>&E=!5f=dp(kA|{76|NWTm?2umW%WQWkmA%_Jn{^5O46Q z^rXmdnr=NRwBJu)F51gIy`1OcNJ3BofELMVcC0;bV#84`CcyFq+x0+d~CuW#&7YI{g2CV^t3jAVNRd0zCyF>Ba{u{9pvxoQyBf#y*% zbPcDQ$ED%hV{GekSv#Kf(gp4vph|;qe9~wn7Ol+D%j0k)#s`-mmO^X4pg16+D_^3p z|CpjjysVS%JE#;R)N?gpd6tHO}Y$r|#BI5}j4 zI+feFVz5Nxt|M)|IU$^J_k|Ne3<4f8cNWAJsEEguB7Hgk{x`O%a)-}&icFBZ)f;>! zYnrbshrijckcT1My4Q~m+GFzVFuwH~`VN+Bq{>i*!@h@!7!^ft3xsJ!OoYo`fYks9 zS-%8I8#SB}{{?iSSvxbU*?2P(Or9w}MwRaGlA4*W8B326%l%xvm%QnfQUmRYXv^Is zA%1y;|Hqb|H6w8!T0Z81MpJ>rcwUs|Bc@hRM~02d!2I~8Bkle4mG!Y5hsI5deICYU z<|gaFz?EKX{<7~AX=K(-IL(q_l(A@&iauDRM{4_=1&WDQIlguT`5}8Oq<|6}Sjb zs^l?;pSn^V*Z+;f*9vrZy8z0PSo2pP6yW<8A?S%Vo*{J?%0wk$w}9rMs}Jtp82u6T z5J>crZ0&C<5@j4~yfs=p*hSOuJ;i4jmevo*(v4@wo~Fp3&V{?dowvyB=IwiS1FI9QfY9rN@-=A%)HHf%Jg}lG2Xn$(4rk1tcCRSwyf;0;*bdT!Z+7Riu-@86vG_gcG_HOk4G|Gxl3*?2 zC3oL`2s3C-+gdaYKawkaIzSu z@Gy1aYQD`MfS&(X?r59qynD>>d;f&NmyYp%TYEvJoia~bpC&XSHgVLcOAC-6b`f1$ znK;tk`)A?V*(U4R1FbA=*e~_kyoz7G)sbPs)a<}gVnxi<86&rK_h?UL`a%AVo7QD~oM@`l-EuwI%wKQJt|s!yIFL;A^!i4tRr&Y3CAGM~Z)?MQzaWcr zSUd;fCi$Y4bHAkD&Pk6veNi|^0z>L}6}?M1DDAq+;9Xswiq+{N!mI|#NVFs6D#Vi; zl0MQ4Ws6nU8X6IQ2Jqxpz`P>Ny_WA^7%4V@1523)7DS0R2zk|K2Ht# zDtx%+rh6EjZzY!e7ot9W@RCVI`h03S3T!DSs8Zfn___Px{^;5%or8!9gq}0Me0JS} z4eNe`vsd-~O=_v&&kLSjJ0WBP-okw82ZhWvB(eqCmpBhfj9nSBSi=V5&F-9LN7ZJu zk8MpcnY(_(C{AwgR`CiVF6@7K145hf%J=09KyKgu&Zf-+8E$YNay24k=q}g3M54Zl zkD7K})5^#W9!tvmd^V_#l6Ev8%4Gb^bK}x*S${3tpo!k2oeDyv`s2UYxUm* znHIE^bah3$XCt*lil_aK z!uf|SjmQzpHr-~$n+-7ktw5jddu)SKlZ_f*DgfMkPhC#z^wO6&)=OjTJV^D36^O@w zkoRvK$CK>#5#{e_o0vuTT-p~TC!D|d-4lzdgg#3u(d~T6!Yh4w?M}1#Gu=EZL|e8m$t5Nk z@gAx#X*Ta1G*QmPsPVQFJ0mP{R|}gvk`T&=7I+9>A^Y1%AI*DOm0mkNKWcUA)nSeY zma$ITWgy$2W(fDHa%oXeQIuy59W;>QXV$`nHIfB|hbstaZu)S(92nhlje6B=A?gjD z%gpJW`z`9Jh*ktY+#}5u1@72P5Z^^$(y{=F`zqvPVaHR>F^JCf>OE6Rj+#l9u6NLB zz;-G_N7L+C$3Em7r!ERErc@2v##cLr+HkYI!-gs}jIdCb^h;n|Mix5Th(d-JoU%Qz zi+FYks1iMiFMlL2j`OWG$0Eug*My90reweG8kb~^+li{5?4lTa(xT@`kRA-%L(({v z@_E#g-ja#oQpuhjLUki8#?l$ccWg|Fms0M=mgv|!ElJg>xbs3LkL@W=(7B?UNf&HH z-`!nEJ~ARzda~@Lrf_mzbjJB9zuL1Hm1b&buqjVe88HMt0=vx4m~|&-bs*D~?6q`m@=1oj z=QzC83#3Y$?{h3d*R-xDBd2t8j>eQKhTDbQVoe3N1mvc!zAh%Z5F4P)2>%puyEk!` zxZ&+ERpcczM%=vjX{#eJ0`i!ml1@2IRZZ_ngnbcU+U73jrskiT7%Y;xuoUa1;R2B% zjES(P6Mxd;x(B_KDq$x&?Er^T&_z67L4M1F!97bX*X*@hFlh6?cc9{U&)8IT zL+5V7$yLa|sq}++ZWaowd)uU~DwJ6)-ANoJ{(&6xhjHAqE4ZJs>d+CR+5 z>6y^`CwZ-l9=ZVI)D2K5wWu`3e%s}$*qd3;I;)}q*%RD#Irb-mk{dc?9HAdy4Z6^1 zop@ZcT2zpwZhh8AEm4gp(0r7hdV=9a{t_{> z30BU|*MB;+31ir$fQMQ`PtQ}o+LWe#YYh_q5{AsK*W<^RR`SE*2qlM1u1(1@^#DoX zpB@V(Wwo*RG}1xb37j4*`Gh`-!*q#pYk_#Q&cmg`YQT^^o@!*5J;ou=HkN`iZytHW zu*OGiR{uMpX019kXX$~M^~}UdSQtK>_{R0Cv_F?ZRR}Bs*PTlJXZf6*VQe~>RxYTtSvez^`v+SPD#h0v}9oe`V#B$y)q zLyW{!`he8I4fHEII|`xO;}AJPlEJ?cb)(n4s=K=J2o^aFaFq2E$3K5TGPzJNGKF71 z>y|{k@ZANNQ2l!1X)W60c6OQSX|7lFxI-zcz|L1}Z`HZQ%3}`D&gp|3Orq4 z_!qxApoR(rs}&XUCO#l0`qt8AE2^ZOv&Z zgg~6lXuizx0vyuc1DT{NFY!8)H`A#GqhvHbC$h~_$Esp3ZL?x^oY$H7Bt<-TDOf^F z7FyfHHZv-)b*`oVmG`eJ3AAt+-(U%?&cqHUj|9*{<#wlkV2KkDCWhkS~b z_55}vdM|4*aj^mra1{Dl|2m9w<4`$ggl zPBIE`7Q#l?vdmK?12j-D#^aMLw&aOf^!8L8h!2A^B9DmZ&P4<%a^!a{12FV5_r6+n zpG-w{4V>W~>LO$LRC1N&ooLtcNqxQ~>a{+~)y35V5ZQM$ux$z_b)w=dJ>Jw_9yA8! zlAZJPZ6ZZz{lV{CrpGBuF&oeX>B`W!;H40U7E?lRuR=Ys+*hm-f@; zx}D@76NA2F9?7R2LaZa3Hki$QTR&FUANCXuOXbiGZ2?dy_;7&WPGdz;&>I1IAu3cJ zWy`s5m6SPdK-CiD6WJ}9UzNky%^BO+?@*p6T<&+~n4SnC56Vv)S3j{#NwhDJx@JqK zS{ibiZ}CwK5JH+KLzfaG&~7o#HctZXy4a_GsC*LQs?wmZ!mFNZwsw1}p`Nly99?lE z>O8V=AP8b*S7HxIzR_Cl7dpZ|@PU)RzmB({oNEg{j8d{3@|JGax7-3))(_MXSC0v} z$911U?#1#{jm_Cs&zn{m3LMc=?N*C+`7;}3MFRZwDURrltrJJR_&YbL=e$S0^~xN&5!kA$?t4hsO--Sp%So2iCK#B9fmpj*V`gl^;)xPBJ@w; zg`?ta4jXML@@JAWL9JQj1y+G=c8x()6Pfel-$$7yAj3FFnV~GiEth@vl$*$Js>ra( zP?=uXRD#|x9$@VlN~SGbWSjK)-rkTTNZ))dlR$A=Pj0{O8tqY{+rpOZD;i>0m}>bC z$6$j$B})#kDwBh(i*F+V@fL`eM4;1+t>7jN2EIbY7a3j9T{c1p!0!@j=7~n%Alj+g z;rpdwB0UZ8ifu7Bqtgj6UmtFU+|^4=_GiJTwWIqmrS(tbH4obeLhb~`-xkycR7CT1 z`J6VPR{C9i6yJHimgjS_kw7{y*sw81|9MkqOck9GxBCffxlI=L6ntlIk@aXX2USHu z5vqapBLzM`uz-dl`3pJYpq<{c(EY3~7>~oINP+O1j#j_lB0Iv|q9GNpC`Esn*`|!z z3JP5o&3fCPG)(`!`+xTVKO0x;y*7(_!nLJK2=o2$B0_ZjoexSRJ#rGs#=MpbA;_pR zB~0%b(N6ys;wa*IB>0N=SzeX4u8=rMYf&aSQ4=34M9nTM5JekGD{A&JNF{7+`=udU-KI`7JE&C>7U#M&t z3(;w0$2~Dj3UFG=8fsWEfsx5y?xYH3U3Tt@N} zG>IIpl4|6>Wp42=qXifJMY79NkIGV<*Tzqe*l8qCd*2n-KBge*n0B@Pj%qz9(L~H%8|s-Pqmm-~v^Dq-uo9 z!>STBf*E>i!xITV);1RbVpOj~4C}V$Z6@Y(^4r1fiu`pwI}~^Lrl*Tr*2PO#@9z@c7@|$?iuCD zqt8D3rZb-IN|qjFIt32GjyZaMvv6(?Fw4XJdDXb)6V{r}{FItY;#H(^uSL$n3;%upmII9E@r6|}4pk;0& zNg(q5z+~zFL8SXuAYB?ep8#@=2w6ZK@%XCF7&tl4JnG|WJx0b`BZWzpsPyZ0cSy6Iw&7+=}V z5ny3byy+Yvb_$Pp|LWiWhc-8rY>1=#RU06K;g{(UmM?wE;P9X$-59_cd)1kgj5q`v z=`9|hQ<(6s?6zWLM^R9DeNjj=MCz%!D;Ztli{8;=v8bzwd)pS1{7m$bhAd~{8Tx^XLQF@m6oiw+UtCDv$q^Rz@n}~Ke zzG$6mF1i_1FZqak`_1F1%ScAha=!F%scr*x^?b9(+6OcgYBz)u$IYvHx0A;N z9yHt@(|SjtdJuz*m9%bf^jovf3ymnKm^vNGq{$PWnj#(Ze-l_e(cj9F`$SAvH0kmi zFGGg|gVl-Tpi3INf-5R*UF87U8yasQBm!}{z+amupU4Ey$*tY$2jw>>-ty&rZZHMQ zp@-K}e&ea;gS)7J%iHYm&~^wr!{-uL*~1A#aUlmrTBpZi%}7F`x5TtFj}{E1#ZjRahSAefzFuaX`MG?oNA@06YE+(=QQruN^M-P4dbCz{N3- zs}3=>YL!sBL&r@TsgI>a3WcR1xCpcx%J@2b!ma;;dZQuO+j|%`$e1F}LcJ}+#e2H7 z#p5p$`Rlg8!Up94 z*KLt5xfv*bzeU!f$5KnO;HM3Ib({C!_XrXPa7|mB4mVD^@PQ?I^5HJ0A)sir1NWIW zUOXBMZjI#DAp06J$VCZ$az@?ub=7oXy+I-M`t~Vtx5{jxE9T8mPBE&BFsVmJk-!?o z(r~a(54nzJKVeLGH4RLx#hfau9)OHGEA7hHT&P(Lw`_tSn_=J3Mz>uu;}_ez=Z%ow z0=2+gTt|eyiq6qK>}6n~3+vcp?;gf(8Nf{gid)M)z=z8f0nDKPCW@8Ji~bUu&e7Le zEI4kgtrxhcVIte?MPa76&IhX-ags$hRTRY+pZ#coeoEwqpj~#BEYjFxx21Epn#dW{ z>@D;N&nG*g+(W=feMFy7Y#;Mw%veF*9Wt1@!-*?uVDQ%FNx8Y1lC?-&8f>QJ24g9% z(#v$-Mz-aEPT{&PuEo0)bKy}HiE5j1At#xHmL{uO)rX9+b>7-MAbi)^Fpk%oMZ+mk zV_&%G`uhr!R~!4i#sfjH3u@tw2QOM`is#OEb-qfj0Ed}hv%%X8YkHU_taiwg@E6Uo zQMCpfPKER;QBrjmjEd@0aYzN9Af-u`V+{!=7lJFl7N&OHM4J|1C1LcFM^#`^ z>qm;ZDxHi0hDBn2hV8Q6N*t_F6|n9Dk~>B^l3@$|c$it24$Dm)Z2(RkQC^dl@F>xCs7DHT%JyKus>t4TwA(xVrbcQv$jIABv5>@boE-$Yz+#PTi3 z7xy4ksGNoo5k?a-3@Re2HUyZ1%J6SIwj9VH|6dP5fy#7Lx=V<=k6AciY(ji(s)51`>>niau{`-A)b0_}fNSmNN@ zxXhj3YAar@N2wqC`nS?!W<$j~dewV7Swm4tX7hbc7*^YfUQbs$bH>RGRXG#3?7%Fgp%g3S_({=lV=gu!SLwr7cz$ zx~3h(7&?S%zE0DC8f-Z0W)kQ5AlENE&Y#NNN`YL3B(<~*l8GLg1C41LS&54zSQX!2 zY*iC~lj>QfN;clY@w(i1=q?s@u+`b1+e9r-TfOm+`}!r-v2f^{21$&k)#bSFAE!>d zkg7)!*2LQ&r1#L3wgwB*JesR}ni%9oDc3n`j$h~7g{;)t@Pqc+OPXvY^}6dMVx?-A zHmAzgZpQU1wU_3Tr2ic6Fq-+i=p3W%fP#;4k}AlB}nP4#lf?yNqC|Bk$HbEQ1~M6bwAc{6{Mfl$4mfXqm9S-~Rvr C`qcaY literal 0 HcmV?d00001 diff --git a/images/icon/favicon-16x16.png b/images/icon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc03ca1e35b130c1b0d2bbf4489ae617ba1fc89 GIT binary patch literal 547 zcmV+;0^I$HP)x?YFGvMlUcJ-ha=-6<=R4m~mBQc*sPh_Pgg6Qs zXnj$Y3xf?IutH#0ziJvnke1?WKdS_06k2|0rVc?QL2A56?am~+@-7rfKoIR2A+cu~ z_u3HnE8z+3;Y%3nyQ!739dOjfNOsY#evr0)1W(4sUfSiisQ3o7SAk}ykSbrje3&==rLN}^Zi(@iK7v+{Fbn2)>{r)Vi z&o5Ya#KC)f6(t~R>nQ%4d72-elN`?DJ)NWd^)>cT4!1Ziel4TE-^*)z_Y}3;r!Y77 zOZ7?I>jz0>rognMjrTztR_`I)xe;R9j}z-ZCierF(w16z;^_FmL;#9x$zW&BQhzXu zq)hJTM7HEix6v}*$w=!fxVk8NW7C leUo)I*09b(($KQbKLPcP(584rCh-6O002ovPDHLkV1h1d1VsP< literal 0 HcmV?d00001 diff --git a/images/icon/favicon-32x32.png b/images/icon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca10cc3fa79b22a6e9a67fa491e960ff2de1b8c GIT binary patch literal 1290 zcmV+l1@-!gP)DM zlUPh*5*1b?P^QfwrskM*Q6x>{(kQT3_S?(%^?v7rtsP=Uf9&$d_t$&QzUREp`@ENL z4=XQ+@LZy;lmTnOkO(kRBPp^B8U3=%cE*<+*~;vdw#_nQTO#Rl+`A>Ilnqtd`YGs} zCISF)(ZhzSGUSPHuKJ`zOe_GZxa$D^j{#;*gzV~%N@^T;3 z5Mcm>gjp~zucfYJaJQ5q(EV+60gOhkcy)fV3erGV6ag>+mM5Da7$-pvh;V$c2#|u& z1E5K~2j-mjxWhpIX}CWtj<|EhL8u1w>CYfGt$;ffPu0WQz9Sp}F(f412ElSOF%v-W z%311^zA+$~WeN-#>)`#d8q&~t^$c~DL|r9aIWyLNv<*!;HP9yB#SPpoWmJG|A!BXo zLKx<4P@Rv6OoQBiwi(0Ug@4D45AA?1#fHG;GmyP@=%%KJ&iMa40#EbHG=cw3t;> z2y4LsFhRqO9d$XOIiS1!Q5Y6%;+-MO68v4Q@LxC#A#NHF^uhP*=YY@2&k2+7fI0Vl zZW{s`41j60p|$JF=MlWr5n6KqnyEIJvsKC^&j6esW^&9@xSi_&WE|(8`0mc_RYEifLIjv`MqM zz3-1h7(VbS*E!%30IsHWG~kYh12AU29g4_%vJPTL1vfB1z7HB}GS^*Slpxr968f~K z5u092Y4pR@xCWLLyW#$36KBSW8pX=75Lqxw$y>QP;NcM}+&Rhi3;y3wT;O}3cp}afma-p3z z4~EQFc>aTq9=JYU&TW`E3DzeXxgMm#bTzC7(_3MDxPq8|kpNU@%GRQTbWl(uZF-g{ zI-w#jXn~+NbKTv#8G&=Hgj@#`6`JE~^@Dy0`KMn26 zG~UI|28iwNaDco9V(wiH{p>uYci>cVNBuo2Li`Nqspz!Hb15Ab$kcBBiyaUt0%@>2 z448T49$ri0>Ah6Ql?qJ$yZ-(Sh`DtM0+)_L{Hc}$8gqVo@^PK$jF-fk7D>?esKU-)Qdc4c&2mk;807*qoM6N<$f}*c! ACIA2c literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 00000000..8cc7ae11 --- /dev/null +++ b/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Ion + + + + + +

Ion

Ion

Ion Official Documentation

View Documentation Packages

Work in progress. Ion is at a very early stage. Feel free to browse the available documentation...

+ + + diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 00000000..94bd8959 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Ion Official Documentation", + "short_name": "Ion Docs", + "icons": [ + { + "src": "/ion/images/icon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/ion/images/icon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +}