@maroonedog/luq 0.1.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +879 -0
- package/dist/constants.d.ts +27 -0
- package/dist/core/async.experimental/async-context.d.ts +60 -0
- package/dist/core/builder/array-batch-optimizer.d.ts +66 -0
- package/dist/core/builder/context/field-context.d.ts +31 -0
- package/dist/core/builder/context/field-type-detector.d.ts +19 -0
- package/dist/core/builder/core/builder.d.ts +10 -0
- package/dist/core/builder/core/field-builder.d.ts +13 -0
- package/dist/core/builder/core/index.d.ts +17 -0
- package/dist/core/builder/index.d.ts +24 -0
- package/dist/core/builder/nested-array-processor.d.ts +52 -0
- package/dist/core/builder/plugins/composable-conditional-plugin.d.ts +32 -0
- package/dist/core/builder/plugins/composable-directly-plugin.d.ts +32 -0
- package/dist/core/builder/plugins/composable-plugin.d.ts +242 -0
- package/dist/core/builder/plugins/plugin-creator.d.ts +38 -0
- package/dist/core/builder/plugins/plugin-interfaces.d.ts +343 -0
- package/dist/core/builder/plugins/plugin-types.d.ts +441 -0
- package/dist/core/builder/raw-validator.d.ts +22 -0
- package/dist/core/builder/types/field-options.d.ts +46 -0
- package/dist/core/builder/types/types.d.ts +318 -0
- package/dist/core/builder/ultra-fast-validator.d.ts +30 -0
- package/dist/core/builder/validator-factory.d.ts +29 -0
- package/dist/core/global-config.d.ts +27 -0
- package/dist/core/index.d.ts +36 -0
- package/dist/core/optimization/array-batch-validator.d.ts +68 -0
- package/dist/core/optimization/core/field-utils.d.ts +103 -0
- package/dist/core/optimization/core/strategy-factory.d.ts +84 -0
- package/dist/core/optimization/core/validation-engine.d.ts +107 -0
- package/dist/core/optimization/execution-strategy-selector.d.ts +23 -0
- package/dist/core/optimization/unified-validator.d.ts +45 -0
- package/dist/core/plugin/__tests__/test-utils.d.ts +1 -0
- package/dist/core/plugin/arrayContains.d.ts +37 -0
- package/dist/core/plugin/arrayIncludes.d.ts +42 -0
- package/dist/core/plugin/arrayMaxLength.d.ts +43 -0
- package/dist/core/plugin/arrayMinLength.d.ts +43 -0
- package/dist/core/plugin/arrayUnique.d.ts +41 -0
- package/dist/core/plugin/booleanFalsy.d.ts +41 -0
- package/dist/core/plugin/booleanTruthy.d.ts +38 -0
- package/dist/core/plugin/compareField.d.ts +58 -0
- package/dist/core/plugin/conditionalSchema.d.ts +24 -0
- package/dist/core/plugin/custom.d.ts +60 -0
- package/dist/core/plugin/fromContext.d.ts +150 -0
- package/dist/core/plugin/index.d.ts +71 -0
- package/dist/core/plugin/jsonSchema/dsl-converter.d.ts +22 -0
- package/dist/core/plugin/jsonSchema/error-generation.d.ts +14 -0
- package/dist/core/plugin/jsonSchema/format-validators.d.ts +20 -0
- package/dist/core/plugin/jsonSchema/index.d.ts +11 -0
- package/dist/core/plugin/jsonSchema/plugin.d.ts +35 -0
- package/dist/core/plugin/jsonSchema/ref-resolver.d.ts +14 -0
- package/dist/core/plugin/jsonSchema/types.d.ts +69 -0
- package/dist/core/plugin/jsonSchema/validation-core.d.ts +29 -0
- package/dist/core/plugin/jsonSchemaFullFeature.d.ts +31 -0
- package/dist/core/plugin/literal.d.ts +40 -0
- package/dist/core/plugin/message-factories.d.ts +9 -0
- package/dist/core/plugin/nullable.d.ts +34 -0
- package/dist/core/plugin/numberFinite.d.ts +41 -0
- package/dist/core/plugin/numberInteger.d.ts +41 -0
- package/dist/core/plugin/numberMax.d.ts +49 -0
- package/dist/core/plugin/numberMin.d.ts +49 -0
- package/dist/core/plugin/numberMultipleOf.d.ts +42 -0
- package/dist/core/plugin/numberNegative.d.ts +41 -0
- package/dist/core/plugin/numberPositive.d.ts +41 -0
- package/dist/core/plugin/numberRange.d.ts +48 -0
- package/dist/core/plugin/object.d.ts +43 -0
- package/dist/core/plugin/objectAdditionalProperties.d.ts +51 -0
- package/dist/core/plugin/objectDependentRequired.d.ts +42 -0
- package/dist/core/plugin/objectDependentSchemas.d.ts +40 -0
- package/dist/core/plugin/objectMaxProperties.d.ts +42 -0
- package/dist/core/plugin/objectMinProperties.d.ts +42 -0
- package/dist/core/plugin/objectPatternProperties.d.ts +46 -0
- package/dist/core/plugin/objectPropertyNames.d.ts +36 -0
- package/dist/core/plugin/objectRecursively.d.ts +81 -0
- package/dist/core/plugin/oneOf.d.ts +44 -0
- package/dist/core/plugin/optional.d.ts +35 -0
- package/dist/core/plugin/optionalIf.d.ts +42 -0
- package/dist/core/plugin/orFail.d.ts +132 -0
- package/dist/core/plugin/readOnlyWriteOnly.d.ts +48 -0
- package/dist/core/plugin/required.d.ts +45 -0
- package/dist/core/plugin/requiredIf.d.ts +66 -0
- package/dist/core/plugin/shared-constants.d.ts +45 -0
- package/dist/core/plugin/shared.d.ts +3 -0
- package/dist/core/plugin/skip.d.ts +57 -0
- package/dist/core/plugin/stitch-typed.d.ts +15 -0
- package/dist/core/plugin/stitch.d.ts +1 -0
- package/dist/core/plugin/stitchSimple.d.ts +4 -0
- package/dist/core/plugin/stringAlphanumeric.d.ts +42 -0
- package/dist/core/plugin/stringBase64.d.ts +119 -0
- package/dist/core/plugin/stringContentEncoding.d.ts +43 -0
- package/dist/core/plugin/stringContentMediaType.d.ts +47 -0
- package/dist/core/plugin/stringDate.d.ts +48 -0
- package/dist/core/plugin/stringDatetime.d.ts +108 -0
- package/dist/core/plugin/stringDuration.d.ts +41 -0
- package/dist/core/plugin/stringEmail.d.ts +81 -0
- package/dist/core/plugin/stringEndsWith.d.ts +42 -0
- package/dist/core/plugin/stringExactLength.d.ts +46 -0
- package/dist/core/plugin/stringHostname.d.ts +104 -0
- package/dist/core/plugin/stringIpv4.d.ts +85 -0
- package/dist/core/plugin/stringIpv6.d.ts +104 -0
- package/dist/core/plugin/stringIri.d.ts +117 -0
- package/dist/core/plugin/stringIriReference.d.ts +43 -0
- package/dist/core/plugin/stringJsonPointer.d.ts +107 -0
- package/dist/core/plugin/stringMax.d.ts +43 -0
- package/dist/core/plugin/stringMin.d.ts +43 -0
- package/dist/core/plugin/stringPattern.d.ts +40 -0
- package/dist/core/plugin/stringRelativeJsonPointer.d.ts +42 -0
- package/dist/core/plugin/stringStartsWith.d.ts +42 -0
- package/dist/core/plugin/stringTime.d.ts +39 -0
- package/dist/core/plugin/stringUriTemplate.d.ts +43 -0
- package/dist/core/plugin/stringUrl.d.ts +97 -0
- package/dist/core/plugin/testUtils.d.ts +15 -0
- package/dist/core/plugin/transform-type-restrictions.d.ts +61 -0
- package/dist/core/plugin/transform.d.ts +35 -0
- package/dist/core/plugin/tupleBuilder.d.ts +66 -0
- package/dist/core/plugin/types.d.ts +143 -0
- package/dist/core/plugin/unionGuard.d.ts +50 -0
- package/dist/core/plugin/utils/field-accessor-optimized.d.ts +50 -0
- package/dist/core/plugin/utils/field-accessor.d.ts +107 -0
- package/dist/core/plugin/uuid.d.ts +95 -0
- package/dist/core/plugin/validateIf.d.ts +57 -0
- package/dist/core/registry/plugin-registry.d.ts +116 -0
- package/dist/core/registry.d.ts +6 -0
- package/dist/core/transform/index.d.ts +1 -0
- package/dist/core/transform/string/defaultValue.d.ts +6 -0
- package/dist/core/transform/string/index.d.ts +3 -0
- package/dist/core/transform/string/replace.d.ts +14 -0
- package/dist/core/transform/string/sanitize.d.ts +6 -0
- package/dist/core/utils/type-guards.d.ts +68 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +7 -0
- package/dist/plugins/arrayContains.d.ts +37 -0
- package/dist/plugins/arrayContains.js +1 -0
- package/dist/plugins/arrayContains.mjs +1 -0
- package/dist/plugins/arrayIncludes.d.ts +42 -0
- package/dist/plugins/arrayIncludes.js +1 -0
- package/dist/plugins/arrayIncludes.mjs +1 -0
- package/dist/plugins/arrayMaxLength.d.ts +43 -0
- package/dist/plugins/arrayMaxLength.js +1 -0
- package/dist/plugins/arrayMaxLength.mjs +1 -0
- package/dist/plugins/arrayMinLength.d.ts +43 -0
- package/dist/plugins/arrayMinLength.js +1 -0
- package/dist/plugins/arrayMinLength.mjs +1 -0
- package/dist/plugins/arrayUnique.d.ts +41 -0
- package/dist/plugins/arrayUnique.js +1 -0
- package/dist/plugins/arrayUnique.mjs +1 -0
- package/dist/plugins/booleanFalsy.d.ts +41 -0
- package/dist/plugins/booleanFalsy.js +1 -0
- package/dist/plugins/booleanFalsy.mjs +1 -0
- package/dist/plugins/booleanTruthy.d.ts +38 -0
- package/dist/plugins/booleanTruthy.js +1 -0
- package/dist/plugins/booleanTruthy.mjs +1 -0
- package/dist/plugins/compareField.d.ts +58 -0
- package/dist/plugins/compareField.js +1 -0
- package/dist/plugins/compareField.mjs +1 -0
- package/dist/plugins/custom.d.ts +60 -0
- package/dist/plugins/custom.js +1 -0
- package/dist/plugins/custom.mjs +1 -0
- package/dist/plugins/jsonSchema.d.ts +11 -0
- package/dist/plugins/jsonSchema.js +1 -0
- package/dist/plugins/jsonSchema.mjs +1 -0
- package/dist/plugins/jsonSchemaFullFeature.d.ts +31 -0
- package/dist/plugins/jsonSchemaFullFeature.js +1 -0
- package/dist/plugins/jsonSchemaFullFeature.mjs +1 -0
- package/dist/plugins/literal.d.ts +40 -0
- package/dist/plugins/literal.js +1 -0
- package/dist/plugins/literal.mjs +1 -0
- package/dist/plugins/nullable.d.ts +34 -0
- package/dist/plugins/nullable.js +1 -0
- package/dist/plugins/nullable.mjs +1 -0
- package/dist/plugins/numberInteger.d.ts +41 -0
- package/dist/plugins/numberInteger.js +1 -0
- package/dist/plugins/numberInteger.mjs +1 -0
- package/dist/plugins/numberMax.d.ts +49 -0
- package/dist/plugins/numberMax.js +1 -0
- package/dist/plugins/numberMax.mjs +1 -0
- package/dist/plugins/numberMin.d.ts +49 -0
- package/dist/plugins/numberMin.js +1 -0
- package/dist/plugins/numberMin.mjs +1 -0
- package/dist/plugins/numberMultipleOf.d.ts +42 -0
- package/dist/plugins/numberMultipleOf.js +1 -0
- package/dist/plugins/numberMultipleOf.mjs +1 -0
- package/dist/plugins/numberNegative.d.ts +41 -0
- package/dist/plugins/numberNegative.js +1 -0
- package/dist/plugins/numberNegative.mjs +1 -0
- package/dist/plugins/numberPositive.d.ts +41 -0
- package/dist/plugins/numberPositive.js +1 -0
- package/dist/plugins/numberPositive.mjs +1 -0
- package/dist/plugins/object.d.ts +43 -0
- package/dist/plugins/object.js +1 -0
- package/dist/plugins/object.mjs +1 -0
- package/dist/plugins/objectAdditionalProperties.d.ts +51 -0
- package/dist/plugins/objectAdditionalProperties.js +1 -0
- package/dist/plugins/objectAdditionalProperties.mjs +1 -0
- package/dist/plugins/objectDependentRequired.d.ts +42 -0
- package/dist/plugins/objectDependentRequired.js +1 -0
- package/dist/plugins/objectDependentRequired.mjs +1 -0
- package/dist/plugins/objectDependentSchemas.d.ts +40 -0
- package/dist/plugins/objectDependentSchemas.js +1 -0
- package/dist/plugins/objectDependentSchemas.mjs +1 -0
- package/dist/plugins/objectMaxProperties.d.ts +42 -0
- package/dist/plugins/objectMaxProperties.js +1 -0
- package/dist/plugins/objectMaxProperties.mjs +1 -0
- package/dist/plugins/objectMinProperties.d.ts +42 -0
- package/dist/plugins/objectMinProperties.js +1 -0
- package/dist/plugins/objectMinProperties.mjs +1 -0
- package/dist/plugins/objectPatternProperties.d.ts +46 -0
- package/dist/plugins/objectPatternProperties.js +1 -0
- package/dist/plugins/objectPatternProperties.mjs +1 -0
- package/dist/plugins/objectPropertyNames.d.ts +36 -0
- package/dist/plugins/objectPropertyNames.js +1 -0
- package/dist/plugins/objectPropertyNames.mjs +1 -0
- package/dist/plugins/oneOf.d.ts +44 -0
- package/dist/plugins/oneOf.js +1 -0
- package/dist/plugins/oneOf.mjs +1 -0
- package/dist/plugins/optional.d.ts +35 -0
- package/dist/plugins/optional.js +1 -0
- package/dist/plugins/optional.mjs +1 -0
- package/dist/plugins/readOnlyWriteOnly.d.ts +48 -0
- package/dist/plugins/readOnlyWriteOnly.js +1 -0
- package/dist/plugins/readOnlyWriteOnly.mjs +1 -0
- package/dist/plugins/required.d.ts +45 -0
- package/dist/plugins/required.js +1 -0
- package/dist/plugins/required.mjs +1 -0
- package/dist/plugins/requiredIf.d.ts +66 -0
- package/dist/plugins/requiredIf.js +1 -0
- package/dist/plugins/requiredIf.mjs +1 -0
- package/dist/plugins/skip.d.ts +57 -0
- package/dist/plugins/skip.js +1 -0
- package/dist/plugins/skip.mjs +1 -0
- package/dist/plugins/stringBase64.d.ts +119 -0
- package/dist/plugins/stringBase64.js +1 -0
- package/dist/plugins/stringBase64.mjs +1 -0
- package/dist/plugins/stringContentEncoding.d.ts +43 -0
- package/dist/plugins/stringContentEncoding.js +1 -0
- package/dist/plugins/stringContentEncoding.mjs +1 -0
- package/dist/plugins/stringContentMediaType.d.ts +47 -0
- package/dist/plugins/stringContentMediaType.js +1 -0
- package/dist/plugins/stringContentMediaType.mjs +1 -0
- package/dist/plugins/stringDate.d.ts +48 -0
- package/dist/plugins/stringDate.js +1 -0
- package/dist/plugins/stringDate.mjs +1 -0
- package/dist/plugins/stringDatetime.d.ts +108 -0
- package/dist/plugins/stringDatetime.js +1 -0
- package/dist/plugins/stringDatetime.mjs +1 -0
- package/dist/plugins/stringDuration.d.ts +41 -0
- package/dist/plugins/stringDuration.js +1 -0
- package/dist/plugins/stringDuration.mjs +1 -0
- package/dist/plugins/stringEmail.d.ts +81 -0
- package/dist/plugins/stringEmail.js +1 -0
- package/dist/plugins/stringEmail.mjs +1 -0
- package/dist/plugins/stringHostname.d.ts +104 -0
- package/dist/plugins/stringHostname.js +1 -0
- package/dist/plugins/stringHostname.mjs +1 -0
- package/dist/plugins/stringIpv4.d.ts +85 -0
- package/dist/plugins/stringIpv4.js +1 -0
- package/dist/plugins/stringIpv4.mjs +1 -0
- package/dist/plugins/stringIpv6.d.ts +104 -0
- package/dist/plugins/stringIpv6.js +1 -0
- package/dist/plugins/stringIpv6.mjs +1 -0
- package/dist/plugins/stringIri.d.ts +117 -0
- package/dist/plugins/stringIri.js +1 -0
- package/dist/plugins/stringIri.mjs +1 -0
- package/dist/plugins/stringIriReference.d.ts +43 -0
- package/dist/plugins/stringIriReference.js +1 -0
- package/dist/plugins/stringIriReference.mjs +1 -0
- package/dist/plugins/stringJsonPointer.d.ts +107 -0
- package/dist/plugins/stringJsonPointer.js +1 -0
- package/dist/plugins/stringJsonPointer.mjs +1 -0
- package/dist/plugins/stringMax.d.ts +43 -0
- package/dist/plugins/stringMax.js +1 -0
- package/dist/plugins/stringMax.mjs +1 -0
- package/dist/plugins/stringMin.d.ts +43 -0
- package/dist/plugins/stringMin.js +1 -0
- package/dist/plugins/stringMin.mjs +1 -0
- package/dist/plugins/stringPattern.d.ts +40 -0
- package/dist/plugins/stringPattern.js +1 -0
- package/dist/plugins/stringPattern.mjs +1 -0
- package/dist/plugins/stringRelativeJsonPointer.d.ts +42 -0
- package/dist/plugins/stringRelativeJsonPointer.js +1 -0
- package/dist/plugins/stringRelativeJsonPointer.mjs +1 -0
- package/dist/plugins/stringTime.d.ts +39 -0
- package/dist/plugins/stringTime.js +1 -0
- package/dist/plugins/stringTime.mjs +1 -0
- package/dist/plugins/stringUriTemplate.d.ts +43 -0
- package/dist/plugins/stringUriTemplate.js +1 -0
- package/dist/plugins/stringUriTemplate.mjs +1 -0
- package/dist/plugins/stringUrl.d.ts +97 -0
- package/dist/plugins/stringUrl.js +1 -0
- package/dist/plugins/stringUrl.mjs +1 -0
- package/dist/plugins/transform.d.ts +35 -0
- package/dist/plugins/transform.js +1 -0
- package/dist/plugins/transform.mjs +1 -0
- package/dist/plugins/tupleBuilder.d.ts +66 -0
- package/dist/plugins/tupleBuilder.js +1 -0
- package/dist/plugins/tupleBuilder.mjs +1 -0
- package/dist/plugins/uuid.d.ts +95 -0
- package/dist/plugins/uuid.js +1 -0
- package/dist/plugins/uuid.mjs +1 -0
- package/dist/plugins/validateIf.d.ts +57 -0
- package/dist/plugins/validateIf.js +1 -0
- package/dist/plugins/validateIf.mjs +1 -0
- package/dist/types/array-type-analysis.d.ts +115 -0
- package/dist/types/index.d.ts +74 -0
- package/dist/types/indexed-result.d.ts +44 -0
- package/dist/types/result.d.ts +159 -0
- package/dist/types/stitch-types.d.ts +118 -0
- package/dist/types/util.d.ts +19 -0
- package/dist/types/valitator.d.ts +10 -0
- package/package.json +353 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=(a,o,s,i)=>{let t=(n=>(...r)=>{let m=n(...r);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:i}:m})(s);switch(a){case"conditional":return(n,...r)=>t(n,...r);case"fieldReference":return(n,...r)=>t(n,...r);case"multiFieldReference":return t;case"transform":return n=>t(n);case"arrayElement":return(n,...r)=>t(n,...r);case"context":return n=>t(n);default:return t}};function l(a){let{name:o,methodName:s,allowedTypes:i,category:e,impl:t}=a;return{name:o,methodName:s,allowedTypes:i,category:e,create:()=>p(e,s,t,o)}}var T="objectMinProperties",u=["object"],y=l({name:"objectMinProperties",methodName:"minProperties",allowedTypes:u,category:"standard",impl:(a,o)=>{let s=o?.code||T,i=o?.messageFactory||(e=>`Must have at least ${e.min} properties, but has ${e.actual}`);if(typeof a!="number"||isNaN(a)||a<0)throw new Error(`Invalid minValue: ${a}. Must be a non-negative number.`);return{check:e=>typeof e!="object"||e===null?!0:Object.keys(e).length>=a,code:s,getErrorMessage:(e,t)=>{let n=typeof e=="object"&&e!==null?Object.keys(e).length:0;return i({path:t,value:e,code:s,min:a,actual:n})},params:[a,o]}}});export{y as objectMinPropertiesPlugin};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @luq-plugin
|
|
3
|
+
* @name objectPatternProperties
|
|
4
|
+
* @category object
|
|
5
|
+
* @description Validates object properties that match specific patterns with corresponding schemas
|
|
6
|
+
* @allowedTypes ["object"]
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Pattern-based property validation
|
|
10
|
+
* const validator = Builder()
|
|
11
|
+
* .use(objectPatternPropertiesPlugin)
|
|
12
|
+
* .for<{ [key: string]: any }>()
|
|
13
|
+
* .v("config", (b) => b.object.patternProperties({
|
|
14
|
+
* "^str_": (value) => typeof value === "string",
|
|
15
|
+
* "^num_": (value) => typeof value === "number"
|
|
16
|
+
* }))
|
|
17
|
+
* .build();
|
|
18
|
+
*
|
|
19
|
+
* // With custom validators and messages
|
|
20
|
+
* builder.v("data", b => b.object.patternProperties({
|
|
21
|
+
* "^email_": {
|
|
22
|
+
* validator: (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),
|
|
23
|
+
* message: "Email properties must be valid email addresses"
|
|
24
|
+
* },
|
|
25
|
+
* "^id_": {
|
|
26
|
+
* validator: (value) => typeof value === "string" && value.length > 0,
|
|
27
|
+
* message: "ID properties must be non-empty strings"
|
|
28
|
+
* }
|
|
29
|
+
* }))
|
|
30
|
+
* ```
|
|
31
|
+
* @params
|
|
32
|
+
* - patterns: Record<string, (value: any) => boolean | PatternValidator> - Pattern to validator mapping
|
|
33
|
+
* @returns Validation function that checks properties matching patterns
|
|
34
|
+
* @since 0.1.0-alpha
|
|
35
|
+
*/
|
|
36
|
+
export interface PatternValidator {
|
|
37
|
+
validator: (value: any) => boolean;
|
|
38
|
+
message?: string;
|
|
39
|
+
}
|
|
40
|
+
export type PatternPropertiesSchema = Record<string, ((value: any) => boolean) | PatternValidator>;
|
|
41
|
+
export declare const objectPatternPropertiesPlugin: import("../index").TypedPlugin<"objectPatternProperties", "patternProperties", (patterns: PatternPropertiesSchema) => {
|
|
42
|
+
check: (value: any) => boolean;
|
|
43
|
+
code: string;
|
|
44
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
45
|
+
params: PatternPropertiesSchema[];
|
|
46
|
+
}, readonly ["object"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var u=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var o in e)u(r,o,{get:e[o],enumerable:!0})},N=(r,e,o,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of y(e))!c.call(r,i)&&i!==o&&u(r,i,{get:()=>e[i],enumerable:!(l=g(e,i))||l.enumerable});return r};var P=r=>N(u({},"__esModule",{value:!0}),r);var I={};f(I,{objectPatternPropertiesPlugin:()=>x});module.exports=P(I);var h=(r,e,o,l)=>{let n=(t=>(...a)=>{let m=t(...a);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:l}:m})(o);switch(r){case"conditional":return(t,...a)=>n(t,...a);case"fieldReference":return(t,...a)=>n(t,...a);case"multiFieldReference":return n;case"transform":return t=>n(t);case"arrayElement":return(t,...a)=>n(t,...a);case"context":return t=>n(t);default:return n}};function d(r){let{name:e,methodName:o,allowedTypes:l,category:i,impl:n}=r;return{name:e,methodName:o,allowedTypes:l,category:i,create:()=>h(i,o,n,e)}}var x=d({name:"objectPatternProperties",methodName:"patternProperties",allowedTypes:["object"],category:"standard",impl:r=>({check:e=>{if(!e||typeof e!="object"||Array.isArray(e))return!1;let o=Object.keys(e),l=Object.entries(r);for(let i of o){let n=e[i];for(let[t,a]of l)if(new RegExp(t).test(i)){let s=!1;if(typeof a=="function"?s=a(n):typeof a=="object"&&a!==null&&"validator"in a&&(s=a.validator(n)),!s)return!1;break}}return!0},code:"PATTERN_PROPERTIES",getErrorMessage:(e,o)=>{let l=Object.keys(e||{}),i=Object.entries(r),n=[];for(let t of l){let a=e[t];for(let[m,s]of i)if(new RegExp(m).test(t)){let p=!1,T;typeof s=="function"?p=s(a):typeof s=="object"&&s!==null&&"validator"in s&&(p=s.validator(a),T=s.message),p||(T?n.push(`${t}: ${T}`):n.push(`${t} (matching pattern ${m}) has invalid value`));break}}return n.length>0?`${o} has pattern property violations: ${n.join(", ")}`:`${o} has invalid pattern properties`},params:[r]})});0&&(module.exports={objectPatternPropertiesPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var d=(l,a,o,m)=>{let t=(e=>(...n)=>{let i=e(...n);return i&&typeof i=="object"&&"check"in i?{...i,pluginName:m}:i})(o);switch(l){case"conditional":return(e,...n)=>t(e,...n);case"fieldReference":return(e,...n)=>t(e,...n);case"multiFieldReference":return t;case"transform":return e=>t(e);case"arrayElement":return(e,...n)=>t(e,...n);case"context":return e=>t(e);default:return t}};function u(l){let{name:a,methodName:o,allowedTypes:m,category:s,impl:t}=l;return{name:a,methodName:o,allowedTypes:m,category:s,create:()=>d(s,o,t,a)}}var f=u({name:"objectPatternProperties",methodName:"patternProperties",allowedTypes:["object"],category:"standard",impl:l=>({check:a=>{if(!a||typeof a!="object"||Array.isArray(a))return!1;let o=Object.keys(a),m=Object.entries(l);for(let s of o){let t=a[s];for(let[e,n]of m)if(new RegExp(e).test(s)){let r=!1;if(typeof n=="function"?r=n(t):typeof n=="object"&&n!==null&&"validator"in n&&(r=n.validator(t)),!r)return!1;break}}return!0},code:"PATTERN_PROPERTIES",getErrorMessage:(a,o)=>{let m=Object.keys(a||{}),s=Object.entries(l),t=[];for(let e of m){let n=a[e];for(let[i,r]of s)if(new RegExp(i).test(e)){let p=!1,T;typeof r=="function"?p=r(n):typeof r=="object"&&r!==null&&"validator"in r&&(p=r.validator(n),T=r.message),p||(T?t.push(`${e}: ${T}`):t.push(`${e} (matching pattern ${i}) has invalid value`));break}}return t.length>0?`${o} has pattern property violations: ${t.join(", ")}`:`${o} has invalid pattern properties`},params:[l]})});export{f as objectPatternPropertiesPlugin};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @luq-plugin
|
|
3
|
+
* @name objectPropertyNames
|
|
4
|
+
* @category object
|
|
5
|
+
* @description Validates that all property names in an object match a specified pattern or schema
|
|
6
|
+
* @allowedTypes ["object"]
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Property names must match pattern
|
|
10
|
+
* const validator = Builder()
|
|
11
|
+
* .use(objectPropertyNamesPlugin)
|
|
12
|
+
* .for<{ [key: string]: any }>()
|
|
13
|
+
* .v("config", (b) => b.object.propertyNames(/^[a-zA-Z_][a-zA-Z0-9_]*$/))
|
|
14
|
+
* .build();
|
|
15
|
+
*
|
|
16
|
+
* // Property names with custom validator
|
|
17
|
+
* builder.v("data", b => b.object.propertyNames({
|
|
18
|
+
* validator: (name) => name.length >= 3 && !name.startsWith('_'),
|
|
19
|
+
* message: "Property names must be at least 3 characters and not start with underscore"
|
|
20
|
+
* }))
|
|
21
|
+
* ```
|
|
22
|
+
* @params
|
|
23
|
+
* - schema: RegExp | string | { validator: (name: string) => boolean, message?: string } - Pattern or validation schema for property names
|
|
24
|
+
* @returns Validation function that checks all property names
|
|
25
|
+
* @since 0.1.0-alpha
|
|
26
|
+
*/
|
|
27
|
+
export interface PropertyNamesSchema {
|
|
28
|
+
validator: (name: string) => boolean;
|
|
29
|
+
message?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const objectPropertyNamesPlugin: import("../index").TypedPlugin<"objectPropertyNames", "propertyNames", (schema: RegExp | string | PropertyNamesSchema) => {
|
|
32
|
+
check: (value: any) => boolean;
|
|
33
|
+
code: string;
|
|
34
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
35
|
+
params: (string | RegExp | PropertyNamesSchema)[];
|
|
36
|
+
}, readonly ["object"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var p=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var t in n)p(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of T(n))!g.call(e,o)&&o!==t&&p(e,o,{get:()=>n[o],enumerable:!(a=u(n,o))||a.enumerable});return e};var f=e=>y(p({},"__esModule",{value:!0}),e);var x={};d(x,{objectPropertyNamesPlugin:()=>c});module.exports=f(x);var N=(e,n,t,a)=>{let r=(i=>(...s)=>{let l=i(...s);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:a}:l})(t);switch(e){case"conditional":return(i,...s)=>r(i,...s);case"fieldReference":return(i,...s)=>r(i,...s);case"multiFieldReference":return r;case"transform":return i=>r(i);case"arrayElement":return(i,...s)=>r(i,...s);case"context":return i=>r(i);default:return r}};function m(e){let{name:n,methodName:t,allowedTypes:a,category:o,impl:r}=e;return{name:n,methodName:t,allowedTypes:a,category:o,create:()=>N(o,t,r,n)}}var c=m({name:"objectPropertyNames",methodName:"propertyNames",allowedTypes:["object"],category:"standard",impl:e=>({check:n=>{if(!n||typeof n!="object"||Array.isArray(n))return!1;let t=Object.keys(n);for(let a of t)if(e instanceof RegExp){if(!e.test(a))return!1}else if(typeof e=="string"){if(!new RegExp(e).test(a))return!1}else if(typeof e=="object"&&e!==null&&"validator"in e){if(!e.validator(a))return!1}else return!1;return!0},code:"PROPERTY_NAMES",getErrorMessage:(n,t)=>{let a=Object.keys(n||{}).filter(r=>e instanceof RegExp?!e.test(r):typeof e=="string"?!new RegExp(e).test(r):typeof e=="object"&&e!==null&&"validator"in e?!e.validator(r):!0);if(typeof e=="object"&&e!==null&&"message"in e&&e.message)return e.message;let o=e instanceof RegExp?e.toString():typeof e=="string"?`/${e}/`:"the specified pattern";return`${t} has invalid property names: ${a.join(", ")}. Property names must match ${o}`},params:[e]})});0&&(module.exports={objectPropertyNamesPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=(e,r,o,a)=>{let n=(t=>(...i)=>{let l=t(...i);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:a}:l})(o);switch(e){case"conditional":return(t,...i)=>n(t,...i);case"fieldReference":return(t,...i)=>n(t,...i);case"multiFieldReference":return n;case"transform":return t=>n(t);case"arrayElement":return(t,...i)=>n(t,...i);case"context":return t=>n(t);default:return n}};function p(e){let{name:r,methodName:o,allowedTypes:a,category:s,impl:n}=e;return{name:r,methodName:o,allowedTypes:a,category:s,create:()=>m(s,o,n,r)}}var g=p({name:"objectPropertyNames",methodName:"propertyNames",allowedTypes:["object"],category:"standard",impl:e=>({check:r=>{if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=Object.keys(r);for(let a of o)if(e instanceof RegExp){if(!e.test(a))return!1}else if(typeof e=="string"){if(!new RegExp(e).test(a))return!1}else if(typeof e=="object"&&e!==null&&"validator"in e){if(!e.validator(a))return!1}else return!1;return!0},code:"PROPERTY_NAMES",getErrorMessage:(r,o)=>{let a=Object.keys(r||{}).filter(n=>e instanceof RegExp?!e.test(n):typeof e=="string"?!new RegExp(e).test(n):typeof e=="object"&&e!==null&&"validator"in e?!e.validator(n):!0);if(typeof e=="object"&&e!==null&&"message"in e&&e.message)return e.message;let s=e instanceof RegExp?e.toString():typeof e=="string"?`/${e}/`:"the specified pattern";return`${o} has invalid property names: ${a.join(", ")}. Property names must match ${s}`},params:[e]})});export{g as objectPropertyNamesPlugin};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ValidationOptions } from "../core/plugin/types";
|
|
2
|
+
/**
|
|
3
|
+
* @luq-plugin
|
|
4
|
+
* @name oneOf
|
|
5
|
+
* @category standard
|
|
6
|
+
* @description Validates that a value is one of the specified allowed values (enum-like validation)
|
|
7
|
+
* @allowedTypes ["string", "number", "boolean"]
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // String enum validation
|
|
11
|
+
* const validator = Builder()
|
|
12
|
+
* .use(oneOfPlugin)
|
|
13
|
+
* .for<FormData>()
|
|
14
|
+
* .v("status", (b) => b.string.oneOf(["active", "inactive", "pending"]))
|
|
15
|
+
* .v("role", (b) => b.string.oneOf(["admin", "user", "guest"]))
|
|
16
|
+
* .build();
|
|
17
|
+
*
|
|
18
|
+
* // Number enum validation
|
|
19
|
+
* builder.v("priority", b => b.number.oneOf([0, 1, 2, 3]))
|
|
20
|
+
*
|
|
21
|
+
* // With TypeScript const for type safety
|
|
22
|
+
* const ROLES = ["admin", "user", "guest"] as const;
|
|
23
|
+
* builder.v("userRole", b => b.string.oneOf(ROLES))
|
|
24
|
+
* ```
|
|
25
|
+
* @params
|
|
26
|
+
* - allowed: Array<string | number | boolean> - Array of allowed values
|
|
27
|
+
* - options?: { messageFactory?: (context: MessageContext) => string } - Optional configuration
|
|
28
|
+
* @returns Validation function that returns true if value is in the allowed list
|
|
29
|
+
* @customError
|
|
30
|
+
* ```typescript
|
|
31
|
+
* .oneOf(["A", "B", "C"], {
|
|
32
|
+
* messageFactory: ({ path, value, params }) =>
|
|
33
|
+
* `${path} must be one of: ${params.allowed.join(", ")} (received: ${value})`
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
* @since 0.1.0-alpha
|
|
37
|
+
*/
|
|
38
|
+
export declare const oneOfPlugin: import("../index").TypedPlugin<"oneOf", "oneOf", (allowedValues: readonly any[], options?: ValidationOptions) => {
|
|
39
|
+
check: (value: any) => boolean;
|
|
40
|
+
code: string;
|
|
41
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
42
|
+
params: (any[] | ValidationOptions<{}>)[];
|
|
43
|
+
allowedValues: readonly any[];
|
|
44
|
+
}, readonly ["string", "number", "boolean"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var y=(e,n)=>{for(var a in n)l(e,a,{get:n[a],enumerable:!0})},c=(e,n,a,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of d(n))!g.call(e,o)&&o!==a&&l(e,o,{get:()=>n[o],enumerable:!(i=u(n,o))||i.enumerable});return e};var f=e=>c(l({},"__esModule",{value:!0}),e);var w={};y(w,{oneOfPlugin:()=>P});module.exports=f(w);var N=(e,n,a,i)=>{let s=(r=>(...t)=>{let m=r(...t);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:i}:m})(a);switch(e){case"conditional":return(r,...t)=>s(r,...t);case"fieldReference":return(r,...t)=>s(r,...t);case"multiFieldReference":return s;case"transform":return r=>s(r);case"arrayElement":return(r,...t)=>s(r,...t);case"context":return r=>s(r);default:return s}};function p(e){let{name:n,methodName:a,allowedTypes:i,category:o,impl:s}=e;return{name:n,methodName:a,allowedTypes:i,category:o,create:()=>N(o,a,s,n)}}var h="oneOf",x=e=>Array.isArray(e)?`Value must be one of: ${e.map(a=>JSON.stringify(a)).join(", ")}`:"Value must be one of the allowed values",I=["string","number","boolean"],P=p({name:"oneOf",methodName:"oneOf",allowedTypes:I,category:"standard",impl:(e,n)=>{if(!Array.isArray(e)||e.length===0)throw new Error("oneOf requires a non-empty array of allowed values");let a=n?.code||h,i=n?.messageFactory||(t=>x(t.options)),o=Object.freeze([...e]),s=e.length>7,r=s?new Set(e):null;return{check:t=>t==null?!0:s?r.has(t):e.includes(t),code:a,getErrorMessage:(t,m)=>{let T={path:m,value:t,code:a,options:[...o]};return i(T)},params:[e,n],allowedValues:o}}});0&&(module.exports={oneOfPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var T=(n,o,r,m)=>{let a=(t=>(...e)=>{let s=t(...e);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:m}:s})(r);switch(n){case"conditional":return(t,...e)=>a(t,...e);case"fieldReference":return(t,...e)=>a(t,...e);case"multiFieldReference":return a;case"transform":return t=>a(t);case"arrayElement":return(t,...e)=>a(t,...e);case"context":return t=>a(t);default:return a}};function l(n){let{name:o,methodName:r,allowedTypes:m,category:i,impl:a}=n;return{name:o,methodName:r,allowedTypes:m,category:i,create:()=>T(i,r,a,o)}}var u="oneOf",d=n=>Array.isArray(n)?`Value must be one of: ${n.map(r=>JSON.stringify(r)).join(", ")}`:"Value must be one of the allowed values",g=["string","number","boolean"],f=l({name:"oneOf",methodName:"oneOf",allowedTypes:g,category:"standard",impl:(n,o)=>{if(!Array.isArray(n)||n.length===0)throw new Error("oneOf requires a non-empty array of allowed values");let r=o?.code||u,m=o?.messageFactory||(e=>d(e.options)),i=Object.freeze([...n]),a=n.length>7,t=a?new Set(n):null;return{check:e=>e==null?!0:a?t.has(e):n.includes(e),code:r,getErrorMessage:(e,s)=>{let p={path:s,value:e,code:r,options:[...i]};return m(p)},params:[n,o],allowedValues:i}}});export{f as oneOfPlugin};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @luq-plugin
|
|
3
|
+
* @name optional
|
|
4
|
+
* @category standard
|
|
5
|
+
* @description Allows a field to be undefined (but not null or empty string)
|
|
6
|
+
* @allowedTypes ["string", "number", "boolean", "array", "object", "date", "union"]
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Basic usage - field can be undefined
|
|
10
|
+
* const validator = Builder()
|
|
11
|
+
* .use(optionalPlugin)
|
|
12
|
+
* .for<UserProfile>()
|
|
13
|
+
* .v("nickname", (b) => b.string.optional().min(3))
|
|
14
|
+
* .v("age", (b) => b.number.optional().min(0))
|
|
15
|
+
* .build();
|
|
16
|
+
*
|
|
17
|
+
* // Arrays and objects can be optional
|
|
18
|
+
* builder.v("hobbies", b => b.array.optional().minLength(1))
|
|
19
|
+
* builder.v("settings", b => b.object.optional())
|
|
20
|
+
* ```
|
|
21
|
+
* @params
|
|
22
|
+
* No parameters - this is a modifier plugin
|
|
23
|
+
* @returns Validation function that returns true and skips further validation if value is undefined
|
|
24
|
+
* @customError
|
|
25
|
+
* This plugin does not generate errors - it allows undefined values
|
|
26
|
+
* @since 0.1.0-alpha
|
|
27
|
+
*/
|
|
28
|
+
export declare const optionalPlugin: import("../index").TypedPlugin<"optional", "optional", () => {
|
|
29
|
+
check: (value: any) => boolean;
|
|
30
|
+
code: string;
|
|
31
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
32
|
+
params: any[];
|
|
33
|
+
isOptional: boolean;
|
|
34
|
+
skipForUndefined: boolean;
|
|
35
|
+
}, readonly ["string", "number", "boolean", "array", "object", "date", "union"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(e,n)=>{for(var a in n)s(e,a,{get:n[a],enumerable:!0})},y=(e,n,a,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of T(n))!d.call(e,r)&&r!==a&&s(e,r,{get:()=>n[r],enumerable:!(l=p(n,r))||l.enumerable});return e};var c=e=>y(s({},"__esModule",{value:!0}),e);var I={};g(I,{optionalPlugin:()=>h});module.exports=c(I);var f=(e,n,a,l)=>{let o=(t=>(...i)=>{let m=t(...i);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:l}:m})(a);switch(e){case"conditional":return(t,...i)=>o(t,...i);case"fieldReference":return(t,...i)=>o(t,...i);case"multiFieldReference":return o;case"transform":return t=>o(t);case"arrayElement":return(t,...i)=>o(t,...i);case"context":return t=>o(t);default:return o}};function u(e){let{name:n,methodName:a,allowedTypes:l,category:r,impl:o}=e;return{name:n,methodName:a,allowedTypes:l,category:r,create:()=>f(r,a,o,n)}}var C=Object.freeze({valid:!0,__skipFurtherValidation:!0}),N=["string","number","boolean","array","object","date","union"],h=u({name:"optional",methodName:"optional",allowedTypes:N,category:"standard",impl:()=>({check:e=>e!==null,code:"optional",getErrorMessage:(e,n)=>e===null?`${n} cannot be null (use undefined for optional fields)`:"Optional validation error (should not happen)",params:[],isOptional:!0,skipForUndefined:!0})});0&&(module.exports={optionalPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=(t,r,i,l)=>{let n=(e=>(...a)=>{let o=e(...a);return o&&typeof o=="object"&&"check"in o?{...o,pluginName:l}:o})(i);switch(t){case"conditional":return(e,...a)=>n(e,...a);case"fieldReference":return(e,...a)=>n(e,...a);case"multiFieldReference":return n;case"transform":return e=>n(e);case"arrayElement":return(e,...a)=>n(e,...a);case"context":return e=>n(e);default:return n}};function s(t){let{name:r,methodName:i,allowedTypes:l,category:m,impl:n}=t;return{name:r,methodName:i,allowedTypes:l,category:m,create:()=>u(m,i,n,r)}}var g=Object.freeze({valid:!0,__skipFurtherValidation:!0}),p=["string","number","boolean","array","object","date","union"],y=s({name:"optional",methodName:"optional",allowedTypes:p,category:"standard",impl:()=>({check:t=>t!==null,code:"optional",getErrorMessage:(t,r)=>t===null?`${r} cannot be null (use undefined for optional fields)`:"Optional validation error (should not happen)",params:[],isOptional:!0,skipForUndefined:!0})});export{y as optionalPlugin};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @luq-plugin
|
|
3
|
+
* @name readOnlyWriteOnly
|
|
4
|
+
* @category context
|
|
5
|
+
* @description Validates fields based on read-only or write-only context
|
|
6
|
+
* @allowedTypes ["string", "number", "boolean", "date", "array", "object"]
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Read-only field (should not be modified after creation)
|
|
10
|
+
* const validator = Builder()
|
|
11
|
+
* .use(readOnlyWriteOnlyPlugin)
|
|
12
|
+
* .for<{ id: string; name: string; }>()
|
|
13
|
+
* .v("id", (b) => b.string.readOnly())
|
|
14
|
+
* .v("name", (b) => b.string.required())
|
|
15
|
+
* .build();
|
|
16
|
+
*
|
|
17
|
+
* // Write-only field (e.g., password that shouldn't be read back)
|
|
18
|
+
* builder.v("password", b => b.string.writeOnly())
|
|
19
|
+
*
|
|
20
|
+
* // With operation context
|
|
21
|
+
* const result = validator.validate(data, {
|
|
22
|
+
* context: { operation: "read" } // or "write"
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
* @params
|
|
26
|
+
* - mode?: "readOnly" | "writeOnly" - The access mode for the field
|
|
27
|
+
* - options?: { errorMessage?: string } - Optional configuration
|
|
28
|
+
* @returns Validation function that checks field access based on context
|
|
29
|
+
* @since 0.1.0-alpha
|
|
30
|
+
*/
|
|
31
|
+
export interface ReadOnlyWriteOnlyOptions {
|
|
32
|
+
/** Custom error message */
|
|
33
|
+
errorMessage?: string;
|
|
34
|
+
/** Whether to skip validation entirely for inaccessible fields */
|
|
35
|
+
skipValidation?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare const readOnlyWriteOnlyPlugin: import("../index").TypedPlugin<"readOnlyWriteOnly", "readOnly", (options?: ReadOnlyWriteOnlyOptions) => {
|
|
38
|
+
check: (value: any, allValues: any, context?: any) => boolean;
|
|
39
|
+
code: string;
|
|
40
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
41
|
+
params: (string | ReadOnlyWriteOnlyOptions)[];
|
|
42
|
+
}, readonly ["string", "number", "boolean", "date", "array", "object"], "validator", "context">;
|
|
43
|
+
export declare const writeOnlyPlugin: import("../index").TypedPlugin<"writeOnly", "writeOnly", (options?: ReadOnlyWriteOnlyOptions) => {
|
|
44
|
+
check: (value: any, allValues: any, context?: any) => boolean;
|
|
45
|
+
code: string;
|
|
46
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
47
|
+
params: (string | ReadOnlyWriteOnlyOptions)[];
|
|
48
|
+
}, readonly ["string", "number", "boolean", "date", "array", "object"], "validator", "context">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var y=(n,e)=>{for(var t in e)m(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!d.call(n,r)&&r!==t&&m(n,r,{get:()=>e[r],enumerable:!(a=u(e,r))||a.enumerable});return n};var c=n=>g(m({},"__esModule",{value:!0}),n);var h={};y(h,{readOnlyWriteOnlyPlugin:()=>N,writeOnlyPlugin:()=>x});module.exports=c(h);var f=(n,e,t,a)=>{let i=(o=>(...l)=>{let s=o(...l);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:a}:s})(t);switch(n){case"conditional":return(o,...l)=>i(o,...l);case"fieldReference":return(o,...l)=>i(o,...l);case"multiFieldReference":return i;case"transform":return o=>i(o);case"arrayElement":return(o,...l)=>i(o,...l);case"context":return o=>i(o);default:return i}};function p(n){let{name:e,methodName:t,allowedTypes:a,category:r,impl:i}=n;return{name:e,methodName:t,allowedTypes:a,category:r,create:()=>f(r,t,i,e)}}var N=p({name:"readOnlyWriteOnly",methodName:"readOnly",allowedTypes:["string","number","boolean","date","array","object"],category:"context",impl:(n={})=>({check:(e,t,a)=>!((a?.operation||"write")==="write"&&e!==void 0&&a?.isUpdate),code:"READ_ONLY",getErrorMessage:(e,t)=>n.errorMessage||`${t} is read-only and cannot be modified`,params:["readOnly",n]})}),x=p({name:"writeOnly",methodName:"writeOnly",allowedTypes:["string","number","boolean","date","array","object"],category:"context",impl:(n={})=>({check:(e,t,a)=>!((a?.operation||"write")==="read"&&e!==void 0),code:"WRITE_ONLY",getErrorMessage:(e,t)=>n.errorMessage||`${t} is write-only and cannot be read`,params:["writeOnly",n]})});0&&(module.exports={readOnlyWriteOnlyPlugin,writeOnlyPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=(t,a,n,o)=>{let r=(e=>(...i)=>{let s=e(...i);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:o}:s})(n);switch(t){case"conditional":return(e,...i)=>r(e,...i);case"fieldReference":return(e,...i)=>r(e,...i);case"multiFieldReference":return r;case"transform":return e=>r(e);case"arrayElement":return(e,...i)=>r(e,...i);case"context":return e=>r(e);default:return r}};function m(t){let{name:a,methodName:n,allowedTypes:o,category:l,impl:r}=t;return{name:a,methodName:n,allowedTypes:o,category:l,create:()=>p(l,n,r,a)}}var d=m({name:"readOnlyWriteOnly",methodName:"readOnly",allowedTypes:["string","number","boolean","date","array","object"],category:"context",impl:(t={})=>({check:(a,n,o)=>!((o?.operation||"write")==="write"&&a!==void 0&&o?.isUpdate),code:"READ_ONLY",getErrorMessage:(a,n)=>t.errorMessage||`${n} is read-only and cannot be modified`,params:["readOnly",t]})}),y=m({name:"writeOnly",methodName:"writeOnly",allowedTypes:["string","number","boolean","date","array","object"],category:"context",impl:(t={})=>({check:(a,n,o)=>!((o?.operation||"write")==="read"&&a!==void 0),code:"WRITE_ONLY",getErrorMessage:(a,n)=>t.errorMessage||`${n} is write-only and cannot be read`,params:["writeOnly",t]})});export{d as readOnlyWriteOnlyPlugin,y as writeOnlyPlugin};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ValidationOptions } from "../core/plugin/types";
|
|
2
|
+
/**
|
|
3
|
+
* @luq-plugin
|
|
4
|
+
* @name required
|
|
5
|
+
* @category standard
|
|
6
|
+
* @description Validates that a field is required (not null, undefined, or empty string)
|
|
7
|
+
* @allowedTypes ["string", "number", "boolean", "date", "array", "object", "tuple", "union"]
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Basic usage
|
|
11
|
+
* const validator = Builder()
|
|
12
|
+
* .use(requiredPlugin)
|
|
13
|
+
* .for<UserProfile>()
|
|
14
|
+
* .v("name", (b) => b.string.required())
|
|
15
|
+
* .v("age", (b) => b.number.required())
|
|
16
|
+
* .v("terms", (b) => b.boolean.required())
|
|
17
|
+
* .build();
|
|
18
|
+
*
|
|
19
|
+
* // Custom error message
|
|
20
|
+
* builder.v("email", b => b.string.required({
|
|
21
|
+
* messageFactory: ({ path }) => `${path} is required`
|
|
22
|
+
* }))
|
|
23
|
+
* ```
|
|
24
|
+
* @params
|
|
25
|
+
* - messageFactory?: (context: MessageContext) => string - Custom error message factory
|
|
26
|
+
* @returns Validation function that returns true if value exists (not null/undefined/empty string)
|
|
27
|
+
* @customError
|
|
28
|
+
* ```typescript
|
|
29
|
+
* .required({
|
|
30
|
+
* messageFactory: ({ path, value }) =>
|
|
31
|
+
* `${path} field is required (current value: ${value})`
|
|
32
|
+
* })
|
|
33
|
+
* ```
|
|
34
|
+
* @since 0.1.0-alpha
|
|
35
|
+
*/
|
|
36
|
+
export declare const requiredPlugin: import("../index").TypedPlugin<"required", "required", (options?: ValidationOptions & {
|
|
37
|
+
allowNull?: boolean;
|
|
38
|
+
}) => {
|
|
39
|
+
check: (value: any) => boolean;
|
|
40
|
+
code: string;
|
|
41
|
+
getErrorMessage: (value: any, path: string) => string;
|
|
42
|
+
params: (ValidationOptions<{}> & {
|
|
43
|
+
allowNull?: boolean;
|
|
44
|
+
})[];
|
|
45
|
+
}, readonly ["array", "boolean", "number", "object", "string", "date", "union", "tuple"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var g=(e,t)=>{for(var r in t)l(e,r,{get:t[r],enumerable:!0})},y=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of d(t))!p.call(e,o)&&o!==r&&l(e,o,{get:()=>t[o],enumerable:!(i=T(t,o))||i.enumerable});return e};var c=e=>y(l({},"__esModule",{value:!0}),e);var P={};g(P,{requiredPlugin:()=>h});module.exports=c(P);var f=(e,t,r,i)=>{let n=(a=>(...m)=>{let s=a(...m);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:i}:s})(r);switch(e){case"conditional":return(a,...m)=>n(a,...m);case"fieldReference":return(a,...m)=>n(a,...m);case"multiFieldReference":return n;case"transform":return a=>n(a);case"arrayElement":return(a,...m)=>n(a,...m);case"context":return a=>n(a);default:return n}};function u(e){let{name:t,methodName:r,allowedTypes:i,category:o,impl:n}=e;return{name:t,methodName:r,allowedTypes:i,category:o,create:()=>f(o,r,n,t)}}var N="required",x=e=>`${e} is required`,I=["array","boolean","number","object","string","date","union","tuple"],h=u({name:"required",methodName:"required",allowedTypes:I,category:"standard",impl:e=>{let t=e?.code||N,r=e?.messageFactory||(n=>x(n.field)),i=e?.fieldName,o=e?.allowNull||!1;return{check:n=>o?!(n===void 0||n===""):!(n==null||n===""),code:t,getErrorMessage:(n,a)=>r({field:i||a,path:a,value:n,code:t}),params:e?[e]:[]}}});0&&(module.exports={requiredPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=(t,r,o,i)=>{let e=(n=>(...a)=>{let s=n(...a);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:i}:s})(o);switch(t){case"conditional":return(n,...a)=>e(n,...a);case"fieldReference":return(n,...a)=>e(n,...a);case"multiFieldReference":return e;case"transform":return n=>e(n);case"arrayElement":return(n,...a)=>e(n,...a);case"context":return n=>e(n);default:return e}};function l(t){let{name:r,methodName:o,allowedTypes:i,category:m,impl:e}=t;return{name:r,methodName:o,allowedTypes:i,category:m,create:()=>u(m,o,e,r)}}var T="required",d=t=>`${t} is required`,p=["array","boolean","number","object","string","date","union","tuple"],c=l({name:"required",methodName:"required",allowedTypes:p,category:"standard",impl:t=>{let r=t?.code||T,o=t?.messageFactory||(e=>d(e.field)),i=t?.fieldName,m=t?.allowNull||!1;return{check:e=>m?!(e===void 0||e===""):!(e==null||e===""),code:r,getErrorMessage:(e,n)=>o({field:i||n,path:n,value:e,code:r}),params:t?[t]:[]}}});export{c as requiredPlugin};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ValidationOptions, MessageContext } from "../core/plugin/types";
|
|
2
|
+
export interface RequiredIfContext extends MessageContext {
|
|
3
|
+
condition?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @luq-plugin
|
|
7
|
+
* @name requiredIf
|
|
8
|
+
* @category conditional
|
|
9
|
+
* @description Makes a field required based on a dynamic condition evaluated at validation time, with support for array context validation
|
|
10
|
+
* @allowedTypes ["string", "number", "boolean", "array", "object", "date", "union"]
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Basic conditional required
|
|
14
|
+
* const validator = Builder()
|
|
15
|
+
* .use(requiredIfPlugin)
|
|
16
|
+
* .for<ContactForm>()
|
|
17
|
+
* .v("email", (b) => b.string.requiredIf(values => values.contactMethod === 'email'))
|
|
18
|
+
* .v("phone", (b) => b.string.requiredIf(values => values.contactMethod === 'phone'))
|
|
19
|
+
* .build();
|
|
20
|
+
*
|
|
21
|
+
* // Multiple conditions
|
|
22
|
+
* builder.v("ssn", b =>
|
|
23
|
+
* b.string.requiredIf(values =>
|
|
24
|
+
* values.country === 'US' && values.employmentType === 'full-time'
|
|
25
|
+
* )
|
|
26
|
+
* )
|
|
27
|
+
*
|
|
28
|
+
* // Array context validation - conditional required within array items
|
|
29
|
+
* builder.v("items[].billingAddress", b =>
|
|
30
|
+
* b.string.requiredIf((allValues, arrayContext) => {
|
|
31
|
+
* // arrayContext.index: current index in array
|
|
32
|
+
* // arrayContext.item: current object at index
|
|
33
|
+
* // arrayContext.array: full array
|
|
34
|
+
* return arrayContext?.item?.type === 'premium';
|
|
35
|
+
* })
|
|
36
|
+
* )
|
|
37
|
+
*
|
|
38
|
+
* // Mixed validation - access both form values and array context
|
|
39
|
+
* builder.v("orders[].shippingAddress", b =>
|
|
40
|
+
* b.string.requiredIf((allValues, arrayContext) => {
|
|
41
|
+
* const isInternational = allValues.country !== 'US';
|
|
42
|
+
* const requiresShipping = arrayContext?.item?.requiresShipping;
|
|
43
|
+
* return isInternational && requiresShipping;
|
|
44
|
+
* })
|
|
45
|
+
* )
|
|
46
|
+
* ```
|
|
47
|
+
* @params
|
|
48
|
+
* - condition: (allValues: TObject, arrayContext?: ArrayContext) => boolean - Condition function that receives all form values and optional array context
|
|
49
|
+
* - options?: { messageFactory?: (context: MessageContext) => string } - Optional configuration
|
|
50
|
+
* @returns Validation function that checks if field is required based on condition
|
|
51
|
+
* @customError
|
|
52
|
+
* ```typescript
|
|
53
|
+
* .requiredIf(
|
|
54
|
+
* (values, arrayContext) => values.hasAccount && arrayContext?.item?.isActive,
|
|
55
|
+
* { messageFactory: ({ path }) => `${path} is required when account exists and item is active` }
|
|
56
|
+
* )
|
|
57
|
+
* ```
|
|
58
|
+
* @since 0.1.0-alpha
|
|
59
|
+
*/
|
|
60
|
+
export declare const requiredIfPlugin: import("../index").TypedPlugin<"requiredIf", "requiredIf", <TObject>(condition: (allValues: TObject, arrayContext?: import("./types").ArrayContext) => boolean, options?: ValidationOptions<RequiredIfContext>) => {
|
|
61
|
+
check: (value: any, allValues?: TObject, arrayContext?: import("./types").ArrayContext) => boolean;
|
|
62
|
+
code: string;
|
|
63
|
+
getErrorMessage: (value: any, path: string, allValues?: TObject, arrayContext?: import("./types").ArrayContext) => string;
|
|
64
|
+
params: (((allValues: TObject, arrayContext?: import("./types").ArrayContext) => boolean) | ValidationOptions<RequiredIfContext>)[];
|
|
65
|
+
evaluateCondition: (allValues?: TObject, arrayContext?: import("./types").ArrayContext) => boolean;
|
|
66
|
+
}, readonly ["string", "number", "boolean", "array", "object", "date", "union"], "validator", "conditional">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(n,t)=>{for(var o in t)l(n,o,{get:t[o],enumerable:!0})},y=(n,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!d.call(n,e)&&e!==o&&l(n,e,{get:()=>t[e],enumerable:!(s=T(t,e))||s.enumerable});return n};var c=n=>y(l({},"__esModule",{value:!0}),n);var C={};g(C,{requiredIfPlugin:()=>P});module.exports=c(C);var f=(n,t,o,s)=>{let r=(a=>(...i)=>{let m=a(...i);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:s}:m})(o);switch(n){case"conditional":return(a,...i)=>r(a,...i);case"fieldReference":return(a,...i)=>r(a,...i);case"multiFieldReference":return r;case"transform":return a=>r(a);case"arrayElement":return(a,...i)=>r(a,...i);case"context":return a=>r(a);default:return r}};function u(n){let{name:t,methodName:o,allowedTypes:s,category:e,impl:r}=n;return{name:t,methodName:o,allowedTypes:s,category:e,create:()=>f(e,o,r,t)}}var x="requiredIf",N="Field is required when condition is met";function I(n){return N}var h=["string","number","boolean","array","object","date","union"],P=u({name:"requiredIf",methodName:"requiredIf",allowedTypes:h,category:"conditional",impl:(n,t)=>{let o=t?.code||x,s=t?.messageFactory||I;return{check:(e,r,a)=>r&&n(r,a)?!(e==null||e===""):!0,code:o,getErrorMessage:(e,r,a,i)=>{let m=a?n(a,i):!1;return s({path:r,value:e,code:o,condition:m})},params:[n,t],evaluateCondition:(e,r)=>e?n(e,r):!1}}});0&&(module.exports={requiredIfPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=(a,o,i,m)=>{let e=(n=>(...r)=>{let s=n(...r);return s&&typeof s=="object"&&"check"in s?{...s,pluginName:m}:s})(i);switch(a){case"conditional":return(n,...r)=>e(n,...r);case"fieldReference":return(n,...r)=>e(n,...r);case"multiFieldReference":return e;case"transform":return n=>e(n);case"arrayElement":return(n,...r)=>e(n,...r);case"context":return n=>e(n);default:return e}};function l(a){let{name:o,methodName:i,allowedTypes:m,category:t,impl:e}=a;return{name:o,methodName:i,allowedTypes:m,category:t,create:()=>u(t,i,e,o)}}var T="requiredIf",p="Field is required when condition is met";function d(a){return p}var g=["string","number","boolean","array","object","date","union"],x=l({name:"requiredIf",methodName:"requiredIf",allowedTypes:g,category:"conditional",impl:(a,o)=>{let i=o?.code||T,m=o?.messageFactory||d;return{check:(t,e,n)=>e&&a(e,n)?!(t==null||t===""):!0,code:i,getErrorMessage:(t,e,n,r)=>{let s=n?a(n,r):!1;return m({path:e,value:t,code:i,condition:s})},params:[a,o],evaluateCondition:(t,e)=>t?a(t,e):!1}}});export{x as requiredIfPlugin};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ValidationOptions } from "../core/plugin/types";
|
|
2
|
+
/**
|
|
3
|
+
* @luq-plugin
|
|
4
|
+
* @name skip
|
|
5
|
+
* @category conditional
|
|
6
|
+
* @description Completely skips validation for a field based on a dynamic condition
|
|
7
|
+
* @allowedTypes ["string", "number", "boolean", "array", "object", "date", "union"]
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Skip validation when not needed
|
|
11
|
+
* const validator = Builder()
|
|
12
|
+
* .use(skipPlugin)
|
|
13
|
+
* .for<FormData>()
|
|
14
|
+
* .v("advancedOptions", b =>
|
|
15
|
+
* b.object
|
|
16
|
+
* .skip(values => !values.showAdvanced)
|
|
17
|
+
* .required()
|
|
18
|
+
* )
|
|
19
|
+
* .build();
|
|
20
|
+
*
|
|
21
|
+
* // Skip debug fields in production
|
|
22
|
+
* builder.v("debugInfo", b =>
|
|
23
|
+
* b.string
|
|
24
|
+
* .skip(values => values.environment === 'production')
|
|
25
|
+
* .min(10)
|
|
26
|
+
* )
|
|
27
|
+
*
|
|
28
|
+
* // Skip entire sections conditionally
|
|
29
|
+
* builder.v("enterpriseSettings", b =>
|
|
30
|
+
* b.object
|
|
31
|
+
* .skip(values => values.plan !== 'enterprise')
|
|
32
|
+
* .recursively()
|
|
33
|
+
* )
|
|
34
|
+
* ```
|
|
35
|
+
* @params
|
|
36
|
+
* - condition: (allValues: TObject) => boolean - Function that returns true if field should be skipped
|
|
37
|
+
* - options?: ValidationOptions - Optional configuration
|
|
38
|
+
* @returns Validation function that skips field entirely when condition is true
|
|
39
|
+
* @customError
|
|
40
|
+
* ```typescript
|
|
41
|
+
* This plugin does not generate errors - it removes fields from validation
|
|
42
|
+
* ```
|
|
43
|
+
* @since 0.1.0-alpha
|
|
44
|
+
*/
|
|
45
|
+
export declare const skipPlugin: import("../index").TypedPlugin<"skip", "skip", <TObject>(condition: (allValues: TObject) => boolean, options?: ValidationOptions) => {
|
|
46
|
+
check: (value: any, allValues?: TObject) => boolean;
|
|
47
|
+
shouldSkipAllValidation: (value: any, allValues?: TObject) => boolean;
|
|
48
|
+
code: string;
|
|
49
|
+
getErrorMessage: () => string;
|
|
50
|
+
params: (ValidationOptions<{}> | ((allValues: TObject) => boolean))[];
|
|
51
|
+
metadata: {
|
|
52
|
+
type: string;
|
|
53
|
+
category: string;
|
|
54
|
+
skipCondition: (allValues: TObject) => boolean;
|
|
55
|
+
async: boolean;
|
|
56
|
+
};
|
|
57
|
+
}, readonly ["string", "number", "boolean", "array", "object", "date", "union"], "validator", "conditional">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(e,n)=>{for(var t in n)s(e,t,{get:n[t],enumerable:!0})},y=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of u(n))!d.call(e,o)&&o!==t&&s(e,o,{get:()=>n[o],enumerable:!(r=T(n,o))||r.enumerable});return e};var c=e=>y(s({},"__esModule",{value:!0}),e);var x={};g(x,{skipPlugin:()=>h});module.exports=c(x);var f=(e,n,t,r)=>{let i=(a=>(...l)=>{let m=a(...l);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:r}:m})(t);switch(e){case"conditional":return(a,...l)=>i(a,...l);case"fieldReference":return(a,...l)=>i(a,...l);case"multiFieldReference":return i;case"transform":return a=>i(a);case"arrayElement":return(a,...l)=>i(a,...l);case"context":return a=>i(a);default:return i}};function p(e){let{name:n,methodName:t,allowedTypes:r,category:o,impl:i}=e;return{name:n,methodName:t,allowedTypes:r,category:o,create:()=>f(o,t,i,n)}}var N=["string","number","boolean","array","object","date","union"],h=p({name:"skip",methodName:"skip",allowedTypes:N,category:"conditional",impl:(e,n)=>({check:(t,r)=>!0,shouldSkipAllValidation:(t,r)=>r?e(r):!1,code:"skip",getErrorMessage:()=>"Skip condition not met",params:[e,n],metadata:{type:"conditional",category:"skip",skipCondition:e,async:!1}})});0&&(module.exports={skipPlugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=(t,i,o,a)=>{let n=(e=>(...r)=>{let l=e(...r);return l&&typeof l=="object"&&"check"in l?{...l,pluginName:a}:l})(o);switch(t){case"conditional":return(e,...r)=>n(e,...r);case"fieldReference":return(e,...r)=>n(e,...r);case"multiFieldReference":return n;case"transform":return e=>n(e);case"arrayElement":return(e,...r)=>n(e,...r);case"context":return e=>n(e);default:return n}};function s(t){let{name:i,methodName:o,allowedTypes:a,category:m,impl:n}=t;return{name:i,methodName:o,allowedTypes:a,category:m,create:()=>p(m,o,n,i)}}var T=["string","number","boolean","array","object","date","union"],g=s({name:"skip",methodName:"skip",allowedTypes:T,category:"conditional",impl:(t,i)=>({check:(o,a)=>!0,shouldSkipAllValidation:(o,a)=>a?t(a):!1,code:"skip",getErrorMessage:()=>"Skip condition not met",params:[t,i],metadata:{type:"conditional",category:"skip",skipCondition:t,async:!1}})});export{g as skipPlugin};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @luq-plugin
|
|
3
|
+
* @name stringBase64
|
|
4
|
+
* @category string
|
|
5
|
+
* @description Validates base64 encoded string
|
|
6
|
+
* @allowedTypes ["string"]
|
|
7
|
+
* @see https://tools.ietf.org/html/rfc4648 - RFC 4648: The Base16, Base32, and Base64 Data Encodings
|
|
8
|
+
* @see https://developer.mozilla.org/en-US/docs/Glossary/Base64 - MDN Base64 Encoding Reference
|
|
9
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/btoa - MDN btoa() Function
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Basic usage - validates base64 encoded string (RFC 4648 compliant)
|
|
13
|
+
* const validator = Builder()
|
|
14
|
+
* .use(stringBase64Plugin)
|
|
15
|
+
* .for<{ encodedData: string }>()
|
|
16
|
+
* .v("encodedData", (b) => b.string.base64())
|
|
17
|
+
* .build();
|
|
18
|
+
*
|
|
19
|
+
* // URL-safe base64 validation
|
|
20
|
+
* const urlSafeValidator = Builder()
|
|
21
|
+
* .use(stringBase64Plugin)
|
|
22
|
+
* .for<{ token: string }>()
|
|
23
|
+
* .v("token", (b) => b.string.base64({ urlSafe: true }))
|
|
24
|
+
* .build();
|
|
25
|
+
*
|
|
26
|
+
* // ✅ VALID base64 strings (RFC 4648)
|
|
27
|
+
* // Standard base64 encoding
|
|
28
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ=" }); // "Hello World"
|
|
29
|
+
* validator.parse({ encodedData: "YW55IGNhcm5hbCBwbGVhc3VyZS4=" }); // "any carnal pleasure."
|
|
30
|
+
* validator.parse({ encodedData: "" }); // Empty string
|
|
31
|
+
* validator.parse({ encodedData: "YQ==" }); // Single char "a"
|
|
32
|
+
* validator.parse({ encodedData: "YWI=" }); // Two chars "ab"
|
|
33
|
+
* validator.parse({ encodedData: "YWJj" }); // Three chars "abc"
|
|
34
|
+
* validator.parse({ encodedData: "YWJjZA==" }); // Four chars "abcd"
|
|
35
|
+
* validator.parse({ encodedData: "VGhpcyBpcyBhIHRlc3Q=" }); // "This is a test"
|
|
36
|
+
*
|
|
37
|
+
* // With numbers and special base64 characters
|
|
38
|
+
* validator.parse({ encodedData: "MTIzNDU2Nzg5MA==" }); // "1234567890"
|
|
39
|
+
* validator.parse({ encodedData: "QUJDREVGRw==" }); // "ABCDEFG"
|
|
40
|
+
* validator.parse({ encodedData: "YWJjZGVmZ2hpams=" }); // "abcdefghijk"
|
|
41
|
+
* validator.parse({ encodedData: "Pz8/Pz8/Pz8=" }); // Contains + and / chars
|
|
42
|
+
* validator.parse({ encodedData: "+/+/+/+/+/+=" }); // All special chars
|
|
43
|
+
*
|
|
44
|
+
* // Different padding scenarios
|
|
45
|
+
* validator.parse({ encodedData: "YWI=" }); // One padding char
|
|
46
|
+
* validator.parse({ encodedData: "YQ==" }); // Two padding chars
|
|
47
|
+
* validator.parse({ encodedData: "YWJj" }); // No padding needed
|
|
48
|
+
* validator.parse({ encodedData: "YWJjZA==" }); // Two padding chars
|
|
49
|
+
*
|
|
50
|
+
* // URL-safe base64 (RFC 4648 Section 5)
|
|
51
|
+
* urlSafeValidator.parse({ token: "SGVsbG8gV29ybGQ" }); // URL-safe without padding
|
|
52
|
+
* urlSafeValidator.parse({ token: "SGVsbG8gV29ybGQ=" }); // URL-safe with padding
|
|
53
|
+
* urlSafeValidator.parse({ token: "YW55IGNhcm5hbC1wbGVhc3VyZS4" }); // Uses - instead of /
|
|
54
|
+
* urlSafeValidator.parse({ token: "YWJjZGVmZ2hpams_" }); // Uses _ instead of +
|
|
55
|
+
* urlSafeValidator.parse({ token: "-_-_-_-_-_-_" }); // All URL-safe special chars
|
|
56
|
+
*
|
|
57
|
+
* // Real-world examples
|
|
58
|
+
* validator.parse({ encodedData: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" }); // JWT header
|
|
59
|
+
* validator.parse({ encodedData: "VG8gYmUgb3Igbm90IHRvIGJlLCB0aGF0IGlzIHRoZSBxdWVzdGlvbg==" }); // Long text
|
|
60
|
+
* validator.parse({ encodedData: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" }); // Base64 image
|
|
61
|
+
*
|
|
62
|
+
* // ❌ INVALID base64 strings
|
|
63
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ" }); // Wrong length (not multiple of 4)
|
|
64
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ===" }); // Too many padding chars (3)
|
|
65
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ====" }); // Too many padding chars (4)
|
|
66
|
+
* validator.parse({ encodedData: "SGV@bG8gV29ybGQ=" }); // Invalid character (@)
|
|
67
|
+
* validator.parse({ encodedData: "SGV sbG8gV29ybGQ=" }); // Space not allowed
|
|
68
|
+
* validator.parse({ encodedData: "SGV\tbG8gV29ybGQ=" }); // Tab not allowed
|
|
69
|
+
* validator.parse({ encodedData: "SGV\nbG8gV29ybGQ=" }); // Newline not allowed
|
|
70
|
+
* validator.parse({ encodedData: "SGVsbG8\rgV29ybGQ=" }); // Carriage return not allowed
|
|
71
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ=" }); // Non-standard characters
|
|
72
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ!=" }); // Exclamation mark not allowed
|
|
73
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ?=" }); // Question mark not allowed
|
|
74
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ&=" }); // Ampersand not allowed
|
|
75
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ*=" }); // Asterisk not allowed
|
|
76
|
+
*
|
|
77
|
+
* // Padding in wrong position
|
|
78
|
+
* validator.parse({ encodedData: "SGVsbG=gV29ybGQ=" }); // Padding in middle
|
|
79
|
+
* validator.parse({ encodedData: "=GVsbG8gV29ybGQ=" }); // Padding at start
|
|
80
|
+
* validator.parse({ encodedData: "SGVsbG8=V29ybGQ=" }); // Padding before end
|
|
81
|
+
*
|
|
82
|
+
* // URL-safe base64 invalid examples
|
|
83
|
+
* urlSafeValidator.parse({ token: "SGVsbG8gV29ybGQ+" }); // + not allowed in URL-safe
|
|
84
|
+
* urlSafeValidator.parse({ token: "SGVsbG8gV29ybGQ/" }); // / not allowed in URL-safe
|
|
85
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ-" }); // - not allowed in standard
|
|
86
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ_" }); // _ not allowed in standard
|
|
87
|
+
*
|
|
88
|
+
* // Edge cases
|
|
89
|
+
* validator.parse({ encodedData: " SGVsbG8gV29ybGQ=" }); // Leading space
|
|
90
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ= " }); // Trailing space
|
|
91
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ=\n" }); // Trailing newline
|
|
92
|
+
* validator.parse({ encodedData: "SGVsbG8gV29ybGQ=\r\n" }); // CRLF at end
|
|
93
|
+
* ```
|
|
94
|
+
* @params
|
|
95
|
+
* - options?: { messageFactory?: (context: MessageContext) => string; urlSafe?: boolean } - Optional configuration
|
|
96
|
+
* @returns Validation function that checks base64 encoding
|
|
97
|
+
* @customError
|
|
98
|
+
* ```typescript
|
|
99
|
+
* .base64({
|
|
100
|
+
* messageFactory: ({ path, value }) =>
|
|
101
|
+
* `${path} must be valid base64 encoded string (received: ${value.substring(0, 20)}...)`
|
|
102
|
+
* })
|
|
103
|
+
* ```
|
|
104
|
+
* @since 0.1.0-alpha
|
|
105
|
+
*/
|
|
106
|
+
import type { MessageContext } from "../core/plugin/types";
|
|
107
|
+
export declare const stringBase64Plugin: import("../index").TypedPlugin<"stringBase64", "base64", (options?: {
|
|
108
|
+
messageFactory?: (context: MessageContext) => string;
|
|
109
|
+
urlSafe?: boolean;
|
|
110
|
+
}) => {
|
|
111
|
+
check: (value: string) => boolean;
|
|
112
|
+
code: string;
|
|
113
|
+
getErrorMessage: (value: string, path: string) => string;
|
|
114
|
+
messageFactory: (context: MessageContext) => string;
|
|
115
|
+
params: {
|
|
116
|
+
messageFactory?: (context: MessageContext) => string;
|
|
117
|
+
urlSafe?: boolean;
|
|
118
|
+
}[];
|
|
119
|
+
}, readonly ["string"], "validator", "standard">;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var d=(e,t)=>{for(var o in t)l(e,o,{get:t[o],enumerable:!0})},y=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of g(t))!p.call(e,a)&&a!==o&&l(e,a,{get:()=>t[a],enumerable:!(n=u(t,a))||n.enumerable});return e};var c=e=>y(l({},"__esModule",{value:!0}),e);var I={};d(I,{stringBase64Plugin:()=>h});module.exports=c(I);var f=(e,t,o,n)=>{let r=(s=>(...m)=>{let i=s(...m);return i&&typeof i=="object"&&"check"in i?{...i,pluginName:n}:i})(o);switch(e){case"conditional":return(s,...m)=>r(s,...m);case"fieldReference":return(s,...m)=>r(s,...m);case"multiFieldReference":return r;case"transform":return s=>r(s);case"arrayElement":return(s,...m)=>r(s,...m);case"context":return s=>r(s);default:return r}};function T(e){let{name:t,methodName:o,allowedTypes:n,category:a,impl:r}=e;return{name:t,methodName:o,allowedTypes:n,category:a,create:()=>f(a,o,r,t)}}var N=/^[A-Za-z0-9+/]*={0,2}$/,x=/^[A-Za-z0-9\-_]*={0,2}$/,h=T({name:"stringBase64",methodName:"base64",allowedTypes:["string"],category:"standard",impl:e=>({check:n=>typeof n!="string"?!1:n===""?!0:n.length%4!==0?!1:(e?.urlSafe?x:N).test(n),code:"FORMAT_BASE64",getErrorMessage:(n,a)=>{let r={path:a,value:n,code:"FORMAT_BASE64"};return e?.messageFactory?.(r)||`${a} must be a valid base64 encoded string`},messageFactory:n=>e?.messageFactory?.(n)||`${n.path} must be a valid base64 encoded string`,params:[e]})});0&&(module.exports={stringBase64Plugin});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var T=(a,i,o,e)=>{let n=(t=>(...s)=>{let m=t(...s);return m&&typeof m=="object"&&"check"in m?{...m,pluginName:e}:m})(o);switch(a){case"conditional":return(t,...s)=>n(t,...s);case"fieldReference":return(t,...s)=>n(t,...s);case"multiFieldReference":return n;case"transform":return t=>n(t);case"arrayElement":return(t,...s)=>n(t,...s);case"context":return t=>n(t);default:return n}};function l(a){let{name:i,methodName:o,allowedTypes:e,category:r,impl:n}=a;return{name:i,methodName:o,allowedTypes:e,category:r,create:()=>T(r,o,n,i)}}var u=/^[A-Za-z0-9+/]*={0,2}$/,g=/^[A-Za-z0-9\-_]*={0,2}$/,y=l({name:"stringBase64",methodName:"base64",allowedTypes:["string"],category:"standard",impl:a=>({check:e=>typeof e!="string"?!1:e===""?!0:e.length%4!==0?!1:(a?.urlSafe?g:u).test(e),code:"FORMAT_BASE64",getErrorMessage:(e,r)=>{let n={path:r,value:e,code:"FORMAT_BASE64"};return a?.messageFactory?.(n)||`${r} must be a valid base64 encoded string`},messageFactory:e=>a?.messageFactory?.(e)||`${e.path} must be a valid base64 encoded string`,params:[a]})});export{y as stringBase64Plugin};
|