@oktis-works/validation 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/basic.d.ts +12 -0
- package/dist/basic.d.ts.map +1 -0
- package/dist/basic.js +94 -0
- package/dist/basic.js.map +1 -0
- package/dist/choice.d.ts +11 -0
- package/dist/choice.d.ts.map +1 -0
- package/dist/choice.js +84 -0
- package/dist/choice.js.map +1 -0
- package/dist/client-validate.d.ts +17 -0
- package/dist/client-validate.d.ts.map +1 -0
- package/dist/client-validate.js +354 -0
- package/dist/client-validate.js.map +1 -0
- package/dist/clone.d.ts +16 -0
- package/dist/clone.d.ts.map +1 -0
- package/dist/clone.js +63 -0
- package/dist/clone.js.map +1 -0
- package/dist/compatibility.d.ts +23 -0
- package/dist/compatibility.d.ts.map +1 -0
- package/dist/compatibility.js +46 -0
- package/dist/compatibility.js.map +1 -0
- package/dist/compatibility.test.d.ts +2 -0
- package/dist/compatibility.test.d.ts.map +1 -0
- package/dist/compatibility.test.js +50 -0
- package/dist/compatibility.test.js.map +1 -0
- package/dist/conditional.d.ts +30 -0
- package/dist/conditional.d.ts.map +1 -0
- package/dist/conditional.js +114 -0
- package/dist/conditional.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/media.d.ts +13 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +102 -0
- package/dist/media.js.map +1 -0
- package/dist/relational.d.ts +6 -0
- package/dist/relational.d.ts.map +1 -0
- package/dist/relational.js +113 -0
- package/dist/relational.js.map +1 -0
- package/dist/structural.d.ts +26 -0
- package/dist/structural.d.ts.map +1 -0
- package/dist/structural.js +50 -0
- package/dist/structural.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAoD9E"}
|
package/dist/clone.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// @oktis-works/core - Clone Field Semantics (ACF parity)
|
|
2
|
+
/**
|
|
3
|
+
* Expande campos do tipo `clone` nas definições alvo.
|
|
4
|
+
*
|
|
5
|
+
* - `display: 'seamless'` (default): os campos referenciados entram
|
|
6
|
+
* diretamente na lista, com os mesmos nomes (valores "inline").
|
|
7
|
+
* - `display: 'group'`: os campos viram subcampos de um pseudo-group com o
|
|
8
|
+
* nome do clone, e os nomes internos recebem o prefixo `{clone}_`
|
|
9
|
+
* (valores aninhados em data[clone.name]).
|
|
10
|
+
*
|
|
11
|
+
* Referências inexistentes são ignoradas; clones de clones não são
|
|
12
|
+
* resolvidos recursivamente (profundidade 1, como o modo básico do ACF).
|
|
13
|
+
*/
|
|
14
|
+
export function expandCloneFields(fields) {
|
|
15
|
+
const byName = new Map();
|
|
16
|
+
for (const field of fields)
|
|
17
|
+
byName.set(field.name, field);
|
|
18
|
+
const result = [];
|
|
19
|
+
const emittedNames = new Set();
|
|
20
|
+
const emit = (field) => {
|
|
21
|
+
if (emittedNames.has(field.name))
|
|
22
|
+
return;
|
|
23
|
+
emittedNames.add(field.name);
|
|
24
|
+
result.push(field);
|
|
25
|
+
};
|
|
26
|
+
for (const field of fields) {
|
|
27
|
+
if (field.type !== 'clone') {
|
|
28
|
+
emit(field);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const config = field.config ?? {};
|
|
32
|
+
const display = config['display'] ?? 'seamless';
|
|
33
|
+
const targets = config['clone'] ?? [];
|
|
34
|
+
const resolved = [];
|
|
35
|
+
for (const targetName of targets) {
|
|
36
|
+
const target = byName.get(targetName);
|
|
37
|
+
if (!target || target.type === 'clone')
|
|
38
|
+
continue;
|
|
39
|
+
resolved.push(target);
|
|
40
|
+
}
|
|
41
|
+
if (resolved.length === 0)
|
|
42
|
+
continue;
|
|
43
|
+
if (display === 'group') {
|
|
44
|
+
emit({
|
|
45
|
+
...field,
|
|
46
|
+
type: 'group',
|
|
47
|
+
name: field.name,
|
|
48
|
+
label: field.label,
|
|
49
|
+
required: false,
|
|
50
|
+
conditionalLogic: undefined,
|
|
51
|
+
subFields: resolved.map((target) => ({
|
|
52
|
+
...target,
|
|
53
|
+
name: `${field.name}_${target.name}`,
|
|
54
|
+
})),
|
|
55
|
+
});
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
for (const target of resolved)
|
|
59
|
+
emit(target);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=clone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAMzD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAA6B,MAAW;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,MAAM,IAAI,GAAG,CAAC,KAAQ,EAAQ,EAAE;QAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO;QACzC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,MAAM,OAAO,GAAI,MAAM,CAAC,SAAS,CAA8B,IAAI,UAAU,CAAC;QAC9E,MAAM,OAAO,GAAI,MAAM,CAAC,OAAO,CAA0B,IAAI,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAQ,EAAE,CAAC;QAEzB,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;gBAAE,SAAS;YACjD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,GAAG,KAAK;gBACR,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,KAAK;gBACf,gBAAgB,EAAE,SAAS;gBAC3B,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACnC,GAAG,MAAM;oBACT,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;iBACrC,CAAC,CAAC;aACC,CAAC,CAAC;YACR,SAAS;QACX,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface CompatibilityManifest {
|
|
2
|
+
name?: unknown;
|
|
3
|
+
version?: unknown;
|
|
4
|
+
type?: unknown;
|
|
5
|
+
compatibility?: {
|
|
6
|
+
blacklotus?: unknown;
|
|
7
|
+
} | unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface CompatibilityIssue {
|
|
10
|
+
code: 'MANIFEST_INCOMPLETE' | 'INVALID_RANGE' | 'INCOMPATIBLE_VERSION';
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
/** Versão do CMS contra a qual a compatibilidade é avaliada. */
|
|
14
|
+
export declare const CMS_VERSION = "0.1.0";
|
|
15
|
+
/**
|
|
16
|
+
* Valida o manifesto de uma extensão (plugin|theme) contra a versão do CMS.
|
|
17
|
+
* BUSI-022: manifest deve conter name, version, type e compatibility.blacklotus;
|
|
18
|
+
* range incompatível bloqueia instalação/carregamento.
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkExtensionCompatibility(kind: 'plugin' | 'theme', manifest: CompatibilityManifest, cmsVersion?: string): CompatibilityIssue[];
|
|
21
|
+
/** Lança na primeira incompatibilidade — para uso direto em install/load. */
|
|
22
|
+
export declare function assertCompatible(kind: 'plugin' | 'theme', manifest: CompatibilityManifest, cmsVersion?: string): void;
|
|
23
|
+
//# sourceMappingURL=compatibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;CACpD;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,qBAAqB,GAAG,eAAe,GAAG,sBAAsB,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gEAAgE;AAChE,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,QAAQ,GAAG,OAAO,EACxB,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,GAAE,MAAoB,GAC/B,kBAAkB,EAAE,CAkCtB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,GAAG,OAAO,EACxB,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,GAAE,MAAoB,GAC/B,IAAI,CAKN"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// @oktis-works/validation - Extension Compatibility (BUSI-022 / RULE-semver-compatibility)
|
|
2
|
+
import { satisfies, validRange } from 'semver';
|
|
3
|
+
/** Versão do CMS contra a qual a compatibilidade é avaliada. */
|
|
4
|
+
export const CMS_VERSION = '0.1.0';
|
|
5
|
+
/**
|
|
6
|
+
* Valida o manifesto de uma extensão (plugin|theme) contra a versão do CMS.
|
|
7
|
+
* BUSI-022: manifest deve conter name, version, type e compatibility.blacklotus;
|
|
8
|
+
* range incompatível bloqueia instalação/carregamento.
|
|
9
|
+
*/
|
|
10
|
+
export function checkExtensionCompatibility(kind, manifest, cmsVersion = CMS_VERSION) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
if (typeof manifest.name !== 'string' || manifest.name.length === 0) {
|
|
13
|
+
issues.push({ code: 'MANIFEST_INCOMPLETE', message: `manifest.${kind === 'plugin' ? 'json' : 'theme.json'} sem "name"` });
|
|
14
|
+
}
|
|
15
|
+
if (typeof manifest.version !== 'string' || !/^\d+\.\d+\.\d+/.test(manifest.version)) {
|
|
16
|
+
issues.push({ code: 'MANIFEST_INCOMPLETE', message: `manifest sem "version" semver válida` });
|
|
17
|
+
}
|
|
18
|
+
if (typeof manifest.type !== 'string' || (manifest.type !== 'plugin' && manifest.type !== 'theme')) {
|
|
19
|
+
issues.push({ code: 'MANIFEST_INCOMPLETE', message: `manifest sem "type" válido (plugin|theme)` });
|
|
20
|
+
}
|
|
21
|
+
const compat = (manifest.compatibility ?? {});
|
|
22
|
+
const range = compat.blacklotus;
|
|
23
|
+
if (typeof range !== 'string' || range.length === 0) {
|
|
24
|
+
issues.push({ code: 'MANIFEST_INCOMPLETE', message: `manifest sem "compatibility.blacklotus" (range semver do CMS)` });
|
|
25
|
+
return issues;
|
|
26
|
+
}
|
|
27
|
+
if (!validRange(range)) {
|
|
28
|
+
issues.push({ code: 'INVALID_RANGE', message: `"compatibility.blacklotus" não é um range semver válido: "${range}"` });
|
|
29
|
+
return issues;
|
|
30
|
+
}
|
|
31
|
+
if (!satisfies(cmsVersion, range)) {
|
|
32
|
+
issues.push({
|
|
33
|
+
code: 'INCOMPATIBLE_VERSION',
|
|
34
|
+
message: `${kind} requer BlackLotus ${range}, mas a versão atual é ${cmsVersion}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return issues;
|
|
38
|
+
}
|
|
39
|
+
/** Lança na primeira incompatibilidade — para uso direto em install/load. */
|
|
40
|
+
export function assertCompatible(kind, manifest, cmsVersion = CMS_VERSION) {
|
|
41
|
+
const issues = checkExtensionCompatibility(kind, manifest, cmsVersion);
|
|
42
|
+
if (issues.length > 0) {
|
|
43
|
+
throw new Error(`Extensão incompatível (${kind}): ${issues.map((i) => i.message).join('; ')}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAc/C,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAwB,EACxB,QAA+B,EAC/B,aAAqB,WAAW;IAEhC,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC5H,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QACnG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAA6B,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,+DAA+D,EAAE,CAAC,CAAC;QACvH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,6DAA6D,KAAK,GAAG,EAAE,CAAC,CAAC;QACvH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,GAAG,IAAI,sBAAsB,KAAK,0BAA0B,UAAU,EAAE;SAClF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,QAA+B,EAC/B,aAAqB,WAAW;IAEhC,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.test.d.ts","sourceRoot":"","sources":["../src/compatibility.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// @oktis-works/validation - Extension Compatibility Tests (BUSI-022, RULE-semver-compatibility, REQU-023)
|
|
2
|
+
import { describe, it, expect } from 'vitest';
|
|
3
|
+
import { checkExtensionCompatibility, assertCompatible, CMS_VERSION } from './compatibility.js';
|
|
4
|
+
const valid = {
|
|
5
|
+
name: 'meu-plugin',
|
|
6
|
+
version: '1.2.3',
|
|
7
|
+
type: 'plugin',
|
|
8
|
+
compatibility: { blacklotus: '>=0.1.0 <1.0.0' },
|
|
9
|
+
};
|
|
10
|
+
describe('checkExtensionCompatibility (BUSI-022)', () => {
|
|
11
|
+
it('aceita manifest completo e compatível', () => {
|
|
12
|
+
expect(checkExtensionCompatibility('plugin', valid)).toEqual([]);
|
|
13
|
+
});
|
|
14
|
+
it('exige name, version, type e compatibility.blacklotus', () => {
|
|
15
|
+
const issues = checkExtensionCompatibility('theme', {});
|
|
16
|
+
expect(issues.map((i) => i.code).filter((c) => c === 'MANIFEST_INCOMPLETE').length).toBe(4);
|
|
17
|
+
});
|
|
18
|
+
it('bloqueia range semver inválido', () => {
|
|
19
|
+
const issues = checkExtensionCompatibility('plugin', {
|
|
20
|
+
...valid,
|
|
21
|
+
compatibility: { blacklotus: 'latest || *-oops' },
|
|
22
|
+
});
|
|
23
|
+
expect(issues[0].code).toBe('INVALID_RANGE');
|
|
24
|
+
});
|
|
25
|
+
it('bloqueia versão do CMS fora do range declarado', () => {
|
|
26
|
+
const issues = checkExtensionCompatibility('plugin', {
|
|
27
|
+
...valid,
|
|
28
|
+
compatibility: { blacklotus: '^9.9.0' },
|
|
29
|
+
});
|
|
30
|
+
expect(issues[0].code).toBe('INCOMPATIBLE_VERSION');
|
|
31
|
+
expect(issues[0].message).toContain(CMS_VERSION);
|
|
32
|
+
});
|
|
33
|
+
it('respeita ranges parciais (^, ~, >=)', () => {
|
|
34
|
+
for (const range of ['^0.1.0', '~0.1.0', '>=0.1.0']) {
|
|
35
|
+
const issues = checkExtensionCompatibility('plugin', {
|
|
36
|
+
...valid,
|
|
37
|
+
compatibility: { blacklotus: range },
|
|
38
|
+
});
|
|
39
|
+
expect(issues).toEqual([]);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
it('assertCompatible lança com mensagem agregada', () => {
|
|
43
|
+
expect(() => assertCompatible('plugin', {
|
|
44
|
+
...valid,
|
|
45
|
+
compatibility: { blacklotus: '^99.0.0' },
|
|
46
|
+
})).toThrow(/incompatível \(plugin\): .*0\.1\.0/);
|
|
47
|
+
expect(() => assertCompatible('theme', valid)).not.toThrow();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=compatibility.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.test.js","sourceRoot":"","sources":["../src/compatibility.test.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAE1G,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEhG,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,QAAiB;IACvB,aAAa,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;CAChD,CAAC;AAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,2BAA2B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,2BAA2B,CAAC,QAAQ,EAAE;YACnD,GAAG,KAAK;YACR,aAAa,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,2BAA2B,CAAC,QAAQ,EAAE;YACnD,GAAG,KAAK;YACR,aAAa,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,2BAA2B,CAAC,QAAQ,EAAE;gBACnD,GAAG,KAAK;gBACR,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;aACrC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,EAAE,CACV,gBAAgB,CAAC,QAAQ,EAAE;YACzB,GAAG,KAAK;YACR,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SACzC,CAAC,CACH,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;QAEhD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type ConditionOperator = 'eq' | 'neq' | 'gt' | 'lt' | 'pattern_matches' | 'contains' | 'has_any_value' | 'has_no_value';
|
|
2
|
+
export interface ConditionalRule {
|
|
3
|
+
field: string;
|
|
4
|
+
operator: ConditionOperator;
|
|
5
|
+
value?: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface ConditionalGroup {
|
|
8
|
+
match: 'ALL' | 'ANY';
|
|
9
|
+
rules: ConditionalRule[];
|
|
10
|
+
}
|
|
11
|
+
export interface ConditionalLogic {
|
|
12
|
+
match: 'ALL' | 'ANY';
|
|
13
|
+
groups: ConditionalGroup[];
|
|
14
|
+
}
|
|
15
|
+
export declare function evaluateRule(rule: ConditionalRule, values: Record<string, unknown>): boolean;
|
|
16
|
+
export declare function evaluateGroup(group: ConditionalGroup, values: Record<string, unknown>): boolean;
|
|
17
|
+
export declare function evaluateConditionalLogic(logic: ConditionalLogic | null | undefined, values: Record<string, unknown>): boolean;
|
|
18
|
+
export declare function isVisibleField<T extends {
|
|
19
|
+
name: string;
|
|
20
|
+
conditionalLogic?: ConditionalLogic | null;
|
|
21
|
+
}>(field: T, siblingValues: Record<string, unknown>): boolean;
|
|
22
|
+
export interface FieldRefLike {
|
|
23
|
+
name: string;
|
|
24
|
+
conditionalLogic?: ConditionalLogic | null;
|
|
25
|
+
}
|
|
26
|
+
export declare function findConditionalIssues(fields: Array<FieldRefLike>): Array<{
|
|
27
|
+
field: string;
|
|
28
|
+
issue: string;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=conditional.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional.d.ts","sourceRoot":"","sources":["../src/conditional.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GACzB,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,iBAAiB,GACjB,UAAU,GACV,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AA2BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAqC5F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAK/F;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAMT;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,EACnG,KAAK,EAAE,CAAC,EACR,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAGT;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC1G"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// @oktis-works/core - Conditional Logic Engine (ACF parity)
|
|
2
|
+
function isEmpty(value) {
|
|
3
|
+
if (value === null || value === undefined)
|
|
4
|
+
return true;
|
|
5
|
+
if (typeof value === 'string')
|
|
6
|
+
return value.trim() === '';
|
|
7
|
+
if (Array.isArray(value))
|
|
8
|
+
return value.length === 0;
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
function toNumber(value) {
|
|
12
|
+
const parsed = Number(value);
|
|
13
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
14
|
+
}
|
|
15
|
+
function looseEquals(a, b) {
|
|
16
|
+
if (a === b)
|
|
17
|
+
return true;
|
|
18
|
+
if (typeof a === 'boolean' || typeof b === 'boolean') {
|
|
19
|
+
const truthyA = a === true || a === 'true' || a === 1 || a === '1';
|
|
20
|
+
const truthyB = b === true || b === 'true' || b === 1 || b === '1';
|
|
21
|
+
return truthyA === truthyB;
|
|
22
|
+
}
|
|
23
|
+
const numA = toNumber(a);
|
|
24
|
+
const numB = toNumber(b);
|
|
25
|
+
if (numA !== null && numB !== null)
|
|
26
|
+
return numA === numB;
|
|
27
|
+
return String(a) === String(b);
|
|
28
|
+
}
|
|
29
|
+
export function evaluateRule(rule, values) {
|
|
30
|
+
const fieldValue = values[rule.field];
|
|
31
|
+
switch (rule.operator) {
|
|
32
|
+
case 'eq':
|
|
33
|
+
return looseEquals(fieldValue, rule.value);
|
|
34
|
+
case 'neq':
|
|
35
|
+
return !looseEquals(fieldValue, rule.value);
|
|
36
|
+
case 'gt': {
|
|
37
|
+
const a = toNumber(fieldValue);
|
|
38
|
+
const b = toNumber(rule.value);
|
|
39
|
+
return a !== null && b !== null && a > b;
|
|
40
|
+
}
|
|
41
|
+
case 'lt': {
|
|
42
|
+
const a = toNumber(fieldValue);
|
|
43
|
+
const b = toNumber(rule.value);
|
|
44
|
+
return a !== null && b !== null && a < b;
|
|
45
|
+
}
|
|
46
|
+
case 'pattern_matches':
|
|
47
|
+
try {
|
|
48
|
+
return new RegExp(String(rule.value)).test(String(fieldValue ?? ''));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
case 'contains': {
|
|
54
|
+
if (Array.isArray(fieldValue)) {
|
|
55
|
+
return fieldValue.some((item) => looseEquals(item, rule.value));
|
|
56
|
+
}
|
|
57
|
+
return String(fieldValue ?? '').includes(String(rule.value));
|
|
58
|
+
}
|
|
59
|
+
case 'has_any_value':
|
|
60
|
+
return !isEmpty(fieldValue);
|
|
61
|
+
case 'has_no_value':
|
|
62
|
+
return isEmpty(fieldValue);
|
|
63
|
+
default:
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function evaluateGroup(group, values) {
|
|
68
|
+
if (!group.rules || group.rules.length === 0)
|
|
69
|
+
return true;
|
|
70
|
+
const results = group.rules.map((rule) => evaluateRule(rule, values));
|
|
71
|
+
return group.match === 'ANY' ? results.some(Boolean) : results.every(Boolean);
|
|
72
|
+
}
|
|
73
|
+
export function evaluateConditionalLogic(logic, values) {
|
|
74
|
+
if (!logic || !logic.groups || logic.groups.length === 0)
|
|
75
|
+
return true;
|
|
76
|
+
const results = logic.groups.map((group) => evaluateGroup(group, values));
|
|
77
|
+
// ACF parity: grupos são combinados com OR; dentro do grupo vale group.match (default ALL).
|
|
78
|
+
return (logic.match ?? 'ANY') === 'ANY' ? results.some(Boolean) : results.every(Boolean);
|
|
79
|
+
}
|
|
80
|
+
export function isVisibleField(field, siblingValues) {
|
|
81
|
+
if (!field.conditionalLogic)
|
|
82
|
+
return true;
|
|
83
|
+
return evaluateConditionalLogic(field.conditionalLogic, siblingValues);
|
|
84
|
+
}
|
|
85
|
+
export function findConditionalIssues(fields) {
|
|
86
|
+
const issues = [];
|
|
87
|
+
const declaredIndex = new Map();
|
|
88
|
+
fields.forEach((field, index) => {
|
|
89
|
+
declaredIndex.set(field.name, index);
|
|
90
|
+
if (!field.conditionalLogic?.groups)
|
|
91
|
+
return;
|
|
92
|
+
for (const group of field.conditionalLogic.groups) {
|
|
93
|
+
for (const rule of group.rules ?? []) {
|
|
94
|
+
const targetIndex = declaredIndex.get(rule.field);
|
|
95
|
+
if (targetIndex === undefined) {
|
|
96
|
+
issues.push({
|
|
97
|
+
field: field.name,
|
|
98
|
+
issue: `Campo condicionante "${rule.field}" não existe no mesmo grupo`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (targetIndex >= index) {
|
|
102
|
+
issues.push({
|
|
103
|
+
field: field.name,
|
|
104
|
+
issue: targetIndex === index
|
|
105
|
+
? 'Auto-referência não permitida'
|
|
106
|
+
: `Só é possível referenciar campos declarados antes de "${field.name}"`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return issues;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=conditional.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional.js","sourceRoot":"","sources":["../src/conditional.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './basic.js';
|
|
2
|
+
export * from './choice.js';
|
|
3
|
+
export * from './media.js';
|
|
4
|
+
export * from './relational.js';
|
|
5
|
+
export * from './structural.js';
|
|
6
|
+
export { checkExtensionCompatibility, assertCompatible, CMS_VERSION, } from './compatibility.js';
|
|
7
|
+
export type { CompatibilityIssue, CompatibilityManifest } from './compatibility.js';
|
|
8
|
+
export { validateFieldClient } from './client-validate.js';
|
|
9
|
+
export { evaluateConditionalLogic, findConditionalIssues, isVisibleField } from './conditional.js';
|
|
10
|
+
export type { ConditionalLogic, ConditionalRule, ConditionalGroup, ConditionOperator, } from './conditional.js';
|
|
11
|
+
export { expandCloneFields } from './clone.js';
|
|
12
|
+
export type { CloneDisplay } from './clone.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnG,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @oktis-works/validation - Pure field validation (ACF parity), sem dependência de banco.
|
|
2
|
+
// Pacote UI-safe: pode ser importado por frontend (admin/themes) e backend (core/api).
|
|
3
|
+
export * from './basic.js';
|
|
4
|
+
export * from './choice.js';
|
|
5
|
+
export * from './media.js';
|
|
6
|
+
export * from './relational.js';
|
|
7
|
+
export * from './structural.js';
|
|
8
|
+
export { checkExtensionCompatibility, assertCompatible, CMS_VERSION, } from './compatibility.js';
|
|
9
|
+
export { validateFieldClient } from './client-validate.js';
|
|
10
|
+
export { evaluateConditionalLogic, findConditionalIssues, isVisibleField } from './conditional.js';
|
|
11
|
+
export { expandCloneFields } from './clone.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,uFAAuF;AAEvF,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FieldError } from './basic.js';
|
|
2
|
+
export interface MediaValue {
|
|
3
|
+
id?: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
mimeType?: string;
|
|
6
|
+
size?: number;
|
|
7
|
+
width?: number;
|
|
8
|
+
height?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function validateImage(value: unknown, config: Record<string, unknown>, field: string, errors: FieldError[]): void;
|
|
11
|
+
export declare function validateFile(value: unknown, config: Record<string, unknown>, field: string, errors: FieldError[]): void;
|
|
12
|
+
export declare function validateGallery(value: unknown, config: Record<string, unknown>, field: string, errors: FieldError[]): void;
|
|
13
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAGxH;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAGvH;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAAE,GACnB,IAAI,CAkCN"}
|
package/dist/media.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// @oktis-works/core - Media Field Validators (ACF parity)
|
|
2
|
+
import { isEmptyValue } from './basic.js';
|
|
3
|
+
function validateMediaItem(item, config, field, errors) {
|
|
4
|
+
if (typeof item !== 'object' || item === null || Array.isArray(item)) {
|
|
5
|
+
errors.push({
|
|
6
|
+
field,
|
|
7
|
+
code: 'INVALID_MEDIA',
|
|
8
|
+
message: `${field} deve referenciar uma mídia válida`,
|
|
9
|
+
});
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const media = item;
|
|
13
|
+
const mimeTypes = config['mimeTypes'] ?? [];
|
|
14
|
+
if (mimeTypes.length > 0 && media.mimeType) {
|
|
15
|
+
const normalized = mimeTypes.map((mime) => mime.toLowerCase());
|
|
16
|
+
if (!normalized.includes(media.mimeType.toLowerCase())) {
|
|
17
|
+
errors.push({
|
|
18
|
+
field,
|
|
19
|
+
code: 'INVALID_MIME',
|
|
20
|
+
message: `${field} não aceita arquivos do tipo ${media.mimeType}`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const maxSize = config['maxSize'];
|
|
25
|
+
const minSize = config['minSize'];
|
|
26
|
+
if (media.size !== undefined) {
|
|
27
|
+
if (maxSize !== undefined && media.size > maxSize) {
|
|
28
|
+
errors.push({
|
|
29
|
+
field,
|
|
30
|
+
code: 'FILE_TOO_LARGE',
|
|
31
|
+
message: `${field} excede o tamanho máximo de ${Math.round(maxSize / 1024)}KB`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (minSize !== undefined && media.size < minSize) {
|
|
35
|
+
errors.push({
|
|
36
|
+
field,
|
|
37
|
+
code: 'FILE_TOO_SMALL',
|
|
38
|
+
message: `${field} está abaixo do tamanho mínimo de ${Math.round(minSize / 1024)}KB`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (media.width !== undefined && media.height !== undefined) {
|
|
43
|
+
const minWidth = config['minWidth'];
|
|
44
|
+
const maxWidth = config['maxWidth'];
|
|
45
|
+
const minHeight = config['minHeight'];
|
|
46
|
+
const maxHeight = config['maxHeight'];
|
|
47
|
+
if (minWidth !== undefined && media.width < minWidth) {
|
|
48
|
+
errors.push({ field, code: 'MIN_WIDTH', message: `${field} requer largura mínima de ${minWidth}px` });
|
|
49
|
+
}
|
|
50
|
+
if (maxWidth !== undefined && media.width > maxWidth) {
|
|
51
|
+
errors.push({ field, code: 'MAX_WIDTH', message: `${field} permite largura máxima de ${maxWidth}px` });
|
|
52
|
+
}
|
|
53
|
+
if (minHeight !== undefined && media.height < minHeight) {
|
|
54
|
+
errors.push({ field, code: 'MIN_HEIGHT', message: `${field} requer altura mínima de ${minHeight}px` });
|
|
55
|
+
}
|
|
56
|
+
if (maxHeight !== undefined && media.height > maxHeight) {
|
|
57
|
+
errors.push({ field, code: 'MAX_HEIGHT', message: `${field} permite altura máxima de ${maxHeight}px` });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function validateImage(value, config, field, errors) {
|
|
62
|
+
if (isEmptyValue(value))
|
|
63
|
+
return;
|
|
64
|
+
validateMediaItem(value, config, field, errors);
|
|
65
|
+
}
|
|
66
|
+
export function validateFile(value, config, field, errors) {
|
|
67
|
+
if (isEmptyValue(value))
|
|
68
|
+
return;
|
|
69
|
+
validateMediaItem(value, config, field, errors);
|
|
70
|
+
}
|
|
71
|
+
export function validateGallery(value, config, field, errors) {
|
|
72
|
+
if (value === null || value === undefined)
|
|
73
|
+
return;
|
|
74
|
+
if (!Array.isArray(value)) {
|
|
75
|
+
errors.push({ field, code: 'NOT_ARRAY', message: `${field} deve ser uma lista de imagens` });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Array vazio ainda passa pelos limites configurados (minSelections/maxSelections).
|
|
79
|
+
const hasLimits = config['minSelections'] !== undefined || config['maxSelections'] !== undefined;
|
|
80
|
+
if (value.length === 0 && !hasLimits)
|
|
81
|
+
return;
|
|
82
|
+
const minSelections = config['minSelections'];
|
|
83
|
+
const maxSelections = config['maxSelections'];
|
|
84
|
+
if (minSelections !== undefined && value.length < minSelections) {
|
|
85
|
+
errors.push({
|
|
86
|
+
field,
|
|
87
|
+
code: 'MIN_SELECTIONS',
|
|
88
|
+
message: `${field} requer no mínimo ${minSelections} imagem(ns)`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (maxSelections !== undefined && value.length > maxSelections) {
|
|
92
|
+
errors.push({
|
|
93
|
+
field,
|
|
94
|
+
code: 'MAX_SELECTIONS',
|
|
95
|
+
message: `${field} permite no máximo ${maxSelections} imagem(ns)`,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
for (const item of value) {
|
|
99
|
+
validateMediaItem(item, config, field, errors);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FieldError } from './basic.js';
|
|
2
|
+
export declare function validateRelationshipIds(value: unknown, config: Record<string, unknown>, field: string, errors: FieldError[]): void;
|
|
3
|
+
export declare function validateLink(value: unknown, field: string, errors: FieldError[]): void;
|
|
4
|
+
export declare function validateGoogleMap(value: unknown, field: string, errors: FieldError[]): void;
|
|
5
|
+
export declare function validateColorPicker(value: unknown, config: Record<string, unknown>, field: string, errors: FieldError[]): void;
|
|
6
|
+
//# sourceMappingURL=relational.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relational.d.ts","sourceRoot":"","sources":["../src/relational.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAAE,GACnB,IAAI,CAkCN;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CA6BtF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAuB3F;AAID,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAAE,GACnB,IAAI,CA+BN"}
|