@figulus/validator-core 0.5.0-alpha-dev-01 → 0.5.0-alpha-dev-03
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/changed-file.d.ts +30 -0
- package/dist/changed-file.d.ts.map +1 -0
- package/dist/changed-file.js +131 -0
- package/dist/changed-file.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/check-push-limit.d.ts +5 -0
- package/dist/lib/check-push-limit.d.ts.map +1 -0
- package/dist/lib/check-push-limit.js +61 -0
- package/dist/lib/check-push-limit.js.map +1 -0
- package/dist/lib/git-head.d.ts +5 -0
- package/dist/lib/git-head.d.ts.map +1 -0
- package/dist/lib/git-head.js +20 -0
- package/dist/lib/git-head.js.map +1 -0
- package/dist/lib/namespace.d.ts +5 -0
- package/dist/lib/namespace.d.ts.map +1 -0
- package/dist/lib/namespace.js +10 -0
- package/dist/lib/namespace.js.map +1 -0
- package/dist/lib/parse.d.ts +7 -0
- package/dist/lib/parse.d.ts.map +1 -0
- package/dist/lib/parse.js +29 -0
- package/dist/lib/parse.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.d.ts.map +1 -0
- package/dist/lib/permissions.js +9 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/validate-blob-references.d.ts +5 -0
- package/dist/lib/validate-blob-references.d.ts.map +1 -0
- package/dist/lib/validate-blob-references.js +21 -0
- package/dist/lib/validate-blob-references.js.map +1 -0
- package/dist/lib/validate-file/blob.d.ts +4 -0
- package/dist/lib/validate-file/blob.d.ts.map +1 -0
- package/dist/lib/validate-file/blob.js +57 -0
- package/dist/lib/validate-file/blob.js.map +1 -0
- package/dist/lib/validate-file/entity.d.ts +4 -0
- package/dist/lib/validate-file/entity.d.ts.map +1 -0
- package/dist/lib/validate-file/entity.js +74 -0
- package/dist/lib/validate-file/entity.js.map +1 -0
- package/dist/lib/validate-file/namespace-metadata.d.ts +4 -0
- package/dist/lib/validate-file/namespace-metadata.d.ts.map +1 -0
- package/dist/lib/validate-file/namespace-metadata.js +128 -0
- package/dist/lib/validate-file/namespace-metadata.js.map +1 -0
- package/dist/lib/validate-file/namespace-overrides.d.ts +4 -0
- package/dist/lib/validate-file/namespace-overrides.d.ts.map +1 -0
- package/dist/lib/validate-file/namespace-overrides.js +47 -0
- package/dist/lib/validate-file/namespace-overrides.js.map +1 -0
- package/dist/lib/validate-ownership-transfer.d.ts +3 -0
- package/dist/lib/validate-ownership-transfer.d.ts.map +1 -0
- package/dist/lib/validate-ownership-transfer.js +13 -0
- package/dist/lib/validate-ownership-transfer.js.map +1 -0
- package/dist/lib/validate-push-limit-constraints.d.ts +19 -0
- package/dist/lib/validate-push-limit-constraints.d.ts.map +1 -0
- package/dist/lib/validate-push-limit-constraints.js +14 -0
- package/dist/lib/validate-push-limit-constraints.js.map +1 -0
- package/dist/pr.d.ts +13 -0
- package/dist/pr.d.ts.map +1 -0
- package/dist/pr.js +80 -0
- package/dist/pr.js.map +1 -0
- package/dist/registry-validator.d.ts +39 -0
- package/dist/registry-validator.d.ts.map +1 -0
- package/dist/registry-validator.js +19 -0
- package/dist/registry-validator.js.map +1 -0
- package/dist/settings.d.ts +39 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +56 -0
- package/dist/settings.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation-result.d.ts +39 -0
- package/dist/validation-result.d.ts.map +1 -0
- package/dist/validation-result.js +44 -0
- package/dist/validation-result.js.map +1 -0
- package/package.json +2 -2
- package/src/changed-file.ts +3 -3
- package/src/lib/check-push-limit.ts +7 -7
- package/src/lib/git-head.ts +5 -5
- package/src/lib/validate-file/entity.ts +6 -6
- package/src/lib/validate-file/namespace-metadata.ts +2 -2
- package/src/pr.ts +2 -2
- package/src/registry-validator.ts +7 -7
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const ERROR_CODES = {
|
|
2
|
+
// File type errors
|
|
3
|
+
FILE_TYPE_UNKNOWN: "FILE_TYPE_UNKNOWN",
|
|
4
|
+
// Blob errors
|
|
5
|
+
BLOB_INVALID_FILENAME: "BLOB_INVALID_FILENAME",
|
|
6
|
+
BLOB_MISSING_EXTENSION: "BLOB_MISSING_EXTENSION",
|
|
7
|
+
BLOB_INVALID_EXTENSION: "BLOB_INVALID_EXTENSION",
|
|
8
|
+
BLOB_HASH_MISMATCH: "BLOB_HASH_MISMATCH",
|
|
9
|
+
BLOB_VERIFICATION_FAILED: "BLOB_VERIFICATION_FAILED",
|
|
10
|
+
BLOB_REFERENCE_NOT_FOUND: "BLOB_REFERENCE_NOT_FOUND",
|
|
11
|
+
// Entity errors
|
|
12
|
+
ENTITY_PARSE_ERROR: "ENTITY_PARSE_ERROR",
|
|
13
|
+
ENTITY_SCHEMA_INVALID: "ENTITY_SCHEMA_INVALID",
|
|
14
|
+
// Namespace errors
|
|
15
|
+
NAMESPACE_RESERVED: "NAMESPACE_RESERVED",
|
|
16
|
+
NAMESPACE_NOT_FOUND: "NAMESPACE_NOT_FOUND",
|
|
17
|
+
NAMESPACE_NOT_EDITOR: "NAMESPACE_NOT_EDITOR",
|
|
18
|
+
NAMESPACE_PARSE_ERROR: "NAMESPACE_PARSE_ERROR",
|
|
19
|
+
NAMESPACE_SCHEMA_INVALID: "NAMESPACE_SCHEMA_INVALID",
|
|
20
|
+
NAMESPACE_OWNERSHIP_TRANSFER_DENIED: "NAMESPACE_OWNERSHIP_TRANSFER_DENIED",
|
|
21
|
+
// Permissions
|
|
22
|
+
PERMISSION_DENIED_MAINTAINER_ONLY: "PERMISSION_DENIED_MAINTAINER_ONLY",
|
|
23
|
+
// Push limit
|
|
24
|
+
PUSH_LIMIT_EXCEEDED: "PUSH_LIMIT_EXCEEDED",
|
|
25
|
+
};
|
|
26
|
+
export function createError(message, code) {
|
|
27
|
+
return { message, code };
|
|
28
|
+
}
|
|
29
|
+
export function createWarning(message, code) {
|
|
30
|
+
return { message, code };
|
|
31
|
+
}
|
|
32
|
+
export function success(warnings = []) {
|
|
33
|
+
return warnings.length > 0 ? { success: true, warnings } : { success: true };
|
|
34
|
+
}
|
|
35
|
+
export function failure(errors) {
|
|
36
|
+
return { success: false, errors };
|
|
37
|
+
}
|
|
38
|
+
export function failureFromStrings(messages, code) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
errors: messages.map((msg) => createError(msg, code)),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=validation-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-result.js","sourceRoot":"","sources":["../src/validation-result.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,mBAAmB;IACnB,iBAAiB,EAAE,mBAAmB;IAEtC,cAAc;IACd,qBAAqB,EAAE,uBAAuB;IAC9C,sBAAsB,EAAE,wBAAwB;IAChD,sBAAsB,EAAE,wBAAwB;IAChD,kBAAkB,EAAE,oBAAoB;IACxC,wBAAwB,EAAE,0BAA0B;IACpD,wBAAwB,EAAE,0BAA0B;IAEpD,gBAAgB;IAChB,kBAAkB,EAAE,oBAAoB;IACxC,qBAAqB,EAAE,uBAAuB;IAE9C,mBAAmB;IACnB,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,qBAAqB,EAAE,uBAAuB;IAC9C,wBAAwB,EAAE,0BAA0B;IACpD,mCAAmC,EAAE,qCAAqC;IAE1E,cAAc;IACd,iCAAiC,EAAE,mCAAmC;IAEtE,aAAa;IACb,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAqBX,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,IAAe;IAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,IAAe;IAEf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,WAA8B,EAAE;IACtD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAyB;IAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAkB,EAClB,IAAe;IAEf,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KACtD,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@figulus/validator-core",
|
|
3
|
-
"version": "0.5.0-alpha-dev-
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.0-alpha-dev-03",
|
|
4
|
+
"description": "Core logic for the Figulus Validator",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"exports": {
|
package/src/changed-file.ts
CHANGED
|
@@ -148,7 +148,7 @@ export class ChangedFile {
|
|
|
148
148
|
return parseJSON(content);
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
public validate(): FileValidationResult {
|
|
151
|
+
public async validate(): Promise<FileValidationResult> {
|
|
152
152
|
const fileType = this.getFileType();
|
|
153
153
|
|
|
154
154
|
if (!fileType) {
|
|
@@ -172,13 +172,13 @@ export class ChangedFile {
|
|
|
172
172
|
case "spec":
|
|
173
173
|
case "stack":
|
|
174
174
|
case "parser":
|
|
175
|
-
result = validateEntity(this, fileType);
|
|
175
|
+
result = await validateEntity(this, fileType);
|
|
176
176
|
break;
|
|
177
177
|
case "blob":
|
|
178
178
|
result = validateBlob(this);
|
|
179
179
|
break;
|
|
180
180
|
case "namespace":
|
|
181
|
-
result = validateNamespaceMetadata(this);
|
|
181
|
+
result = await validateNamespaceMetadata(this);
|
|
182
182
|
break;
|
|
183
183
|
case "verified":
|
|
184
184
|
case "limits":
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
} from "../validation-result.js";
|
|
12
12
|
import { Settings } from "../settings.js";
|
|
13
13
|
|
|
14
|
-
export function checkPushLimit(
|
|
14
|
+
export async function checkPushLimit(
|
|
15
15
|
prAuthor: string,
|
|
16
16
|
namespace: string,
|
|
17
17
|
helpers: Helpers,
|
|
18
18
|
settings: Settings,
|
|
19
|
-
): ValidationError | null {
|
|
20
|
-
const namespaceMetadata = getNamespaceMetadataFromHead(namespace, helpers);
|
|
19
|
+
): Promise<ValidationError | null> {
|
|
20
|
+
const namespaceMetadata = await getNamespaceMetadataFromHead(namespace, helpers);
|
|
21
21
|
if (!namespaceMetadata) return null;
|
|
22
22
|
|
|
23
23
|
const editorEntry = getNamespaceEditorEntry(prAuthor, namespaceMetadata);
|
|
@@ -28,7 +28,7 @@ export function checkPushLimit(
|
|
|
28
28
|
value: settings.pushLimits.default.pushes,
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
const overrides = getPushLimitOverridesFromHead(helpers);
|
|
31
|
+
const overrides = await getPushLimitOverridesFromHead(helpers);
|
|
32
32
|
const override = overrides
|
|
33
33
|
? overrides.find((o) => o.namespace === namespace)
|
|
34
34
|
: undefined;
|
|
@@ -61,15 +61,15 @@ export function checkPushLimit(
|
|
|
61
61
|
`blobs/${namespace}/`,
|
|
62
62
|
];
|
|
63
63
|
|
|
64
|
-
const prs = helpers.git
|
|
65
|
-
.getAllPRs()
|
|
64
|
+
const prs = (await helpers.git
|
|
65
|
+
.getAllPRs())
|
|
66
66
|
.filter(
|
|
67
67
|
(pr) => pr.user.id === prAuthor && new Date(pr.createdAt) >= startDate,
|
|
68
68
|
);
|
|
69
69
|
|
|
70
70
|
let count = 0;
|
|
71
71
|
for (const pr of prs) {
|
|
72
|
-
const files = helpers.git.getPRFiles(pr.url);
|
|
72
|
+
const files = await helpers.git.getPRFiles(pr.url);
|
|
73
73
|
|
|
74
74
|
const touchesNamespace = files.some((f: any) =>
|
|
75
75
|
filePrefixes.some((prefix) => f.filename.startsWith(prefix)),
|
package/src/lib/git-head.ts
CHANGED
|
@@ -8,13 +8,13 @@ import {
|
|
|
8
8
|
} from "@figulus/schema/registry";
|
|
9
9
|
import { parseJSON } from "./parse.js";
|
|
10
10
|
|
|
11
|
-
function getFileFromHeadAndParse(
|
|
11
|
+
async function getFileFromHeadAndParse(
|
|
12
12
|
filePath: string,
|
|
13
13
|
schema: SchemaObject,
|
|
14
14
|
helpers: Helpers,
|
|
15
15
|
) {
|
|
16
16
|
try {
|
|
17
|
-
const headContent = helpers.git.showHead(filePath);
|
|
17
|
+
const headContent = await helpers.git.showHead(filePath);
|
|
18
18
|
const data = parseJSON(headContent);
|
|
19
19
|
const result = schema.safeParse(data);
|
|
20
20
|
return result.success ? data : null;
|
|
@@ -23,9 +23,9 @@ function getFileFromHeadAndParse(
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export function getPushLimitOverridesFromHead(
|
|
26
|
+
export async function getPushLimitOverridesFromHead(
|
|
27
27
|
helpers: Helpers,
|
|
28
|
-
): PushLimitOverrides | null {
|
|
28
|
+
): Promise<PushLimitOverrides | null> {
|
|
29
29
|
return getFileFromHeadAndParse(
|
|
30
30
|
"namespaces/push-limit-overrides.json",
|
|
31
31
|
pushLimitOverridesSchema,
|
|
@@ -36,7 +36,7 @@ export function getPushLimitOverridesFromHead(
|
|
|
36
36
|
export function getNamespaceMetadataFromHead(
|
|
37
37
|
namespace: string,
|
|
38
38
|
helpers: Helpers,
|
|
39
|
-
): NamespaceMetadata | null {
|
|
39
|
+
): Promise<NamespaceMetadata | null> {
|
|
40
40
|
return getFileFromHeadAndParse(
|
|
41
41
|
`namespaces/${namespace}.json`,
|
|
42
42
|
namespaceMetadataSchema,
|
|
@@ -15,17 +15,17 @@ import {
|
|
|
15
15
|
success,
|
|
16
16
|
} from "../../validation-result.js";
|
|
17
17
|
|
|
18
|
-
export function validateEntity(
|
|
18
|
+
export async function validateEntity(
|
|
19
19
|
file: ChangedFile,
|
|
20
20
|
type: FileTypeEntity,
|
|
21
|
-
): ValidationResult {
|
|
21
|
+
): Promise<ValidationResult> {
|
|
22
22
|
const { registry, prInfo } = file.pr;
|
|
23
23
|
const { settings, helpers } = registry;
|
|
24
24
|
const { fs } = helpers;
|
|
25
25
|
|
|
26
26
|
const namespace = file.getNamespace(type);
|
|
27
27
|
|
|
28
|
-
const isAllowedToChangeEntityFile = () => {
|
|
28
|
+
const isAllowedToChangeEntityFile = async () => {
|
|
29
29
|
if (registry.isNamespaceRestricted(namespace)) {
|
|
30
30
|
if (!registry.isMaintainer(prInfo.author)) {
|
|
31
31
|
return {
|
|
@@ -39,7 +39,7 @@ export function validateEntity(
|
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
} else {
|
|
42
|
-
const namespaceMetadata = getNamespaceMetadataFromHead(
|
|
42
|
+
const namespaceMetadata = await getNamespaceMetadataFromHead(
|
|
43
43
|
namespace,
|
|
44
44
|
registry.helpers,
|
|
45
45
|
);
|
|
@@ -67,7 +67,7 @@ export function validateEntity(
|
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
const pushLimitError = checkPushLimit(
|
|
70
|
+
const pushLimitError = await checkPushLimit(
|
|
71
71
|
prInfo.author,
|
|
72
72
|
namespace,
|
|
73
73
|
helpers,
|
|
@@ -84,7 +84,7 @@ export function validateEntity(
|
|
|
84
84
|
return success();
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
const permissionResult = isAllowedToChangeEntityFile();
|
|
87
|
+
const permissionResult = await isAllowedToChangeEntityFile();
|
|
88
88
|
if (!permissionResult.success) return permissionResult;
|
|
89
89
|
|
|
90
90
|
try {
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
getPushLimitConstraintsForEditor,
|
|
15
15
|
} from "../validate-push-limit-constraints.js";
|
|
16
16
|
|
|
17
|
-
export function validateNamespaceMetadata(file: ChangedFile): ValidationResult {
|
|
17
|
+
export async function validateNamespaceMetadata(file: ChangedFile): Promise<ValidationResult> {
|
|
18
18
|
const { registry, prInfo } = file.pr;
|
|
19
19
|
const { git } = registry.helpers;
|
|
20
20
|
|
|
@@ -60,7 +60,7 @@ export function validateNamespaceMetadata(file: ChangedFile): ValidationResult {
|
|
|
60
60
|
if (namespace) {
|
|
61
61
|
try {
|
|
62
62
|
try {
|
|
63
|
-
const headContent = git.showHead(file.path);
|
|
63
|
+
const headContent = await git.showHead(file.path);
|
|
64
64
|
const headData = parseJSON(headContent);
|
|
65
65
|
|
|
66
66
|
const headEditors = headData.editors || [];
|
package/src/pr.ts
CHANGED
|
@@ -25,7 +25,7 @@ export class PR {
|
|
|
25
25
|
return this.registry.helpers;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
public validate(): ValidationSummary {
|
|
28
|
+
public async validate(): Promise<ValidationSummary> {
|
|
29
29
|
const { prInfo, registry } = this;
|
|
30
30
|
const { helpers } = registry;
|
|
31
31
|
|
|
@@ -45,7 +45,7 @@ export class PR {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
for (const file of prInfo.changedFiles) {
|
|
48
|
-
const result = new ChangedFile(file, this).validate();
|
|
48
|
+
const result = await new ChangedFile(file, this).validate();
|
|
49
49
|
results.push(result);
|
|
50
50
|
|
|
51
51
|
if (!result.result.success) {
|
|
@@ -17,15 +17,15 @@ export interface Helpers {
|
|
|
17
17
|
readFileAsUtf8: (path: string) => string;
|
|
18
18
|
};
|
|
19
19
|
git: {
|
|
20
|
-
showHead: (filePath: string) => string
|
|
21
|
-
getAllPRs: () => {
|
|
20
|
+
showHead: (filePath: string, branch?: string) => Promise<string>;
|
|
21
|
+
getAllPRs: () => Promise<{
|
|
22
22
|
url: string;
|
|
23
23
|
createdAt: string;
|
|
24
24
|
user: { id: string };
|
|
25
|
-
}[]
|
|
26
|
-
getPRFiles: (
|
|
25
|
+
}[]>;
|
|
26
|
+
getPRFiles: (prUrl: string) => Promise<{
|
|
27
27
|
filename: string;
|
|
28
|
-
}[]
|
|
28
|
+
}[]>;
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -35,8 +35,8 @@ export class RegistryValidator {
|
|
|
35
35
|
public settings: Settings,
|
|
36
36
|
) {}
|
|
37
37
|
|
|
38
|
-
public validatePr(prInfo: PullRequestInfo) {
|
|
39
|
-
return new PR(prInfo, this);
|
|
38
|
+
public async validatePr(prInfo: PullRequestInfo) {
|
|
39
|
+
return await new PR(prInfo, this).validate();
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
public isMaintainer(user: string): boolean {
|