@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.
Files changed (84) hide show
  1. package/dist/changed-file.d.ts +30 -0
  2. package/dist/changed-file.d.ts.map +1 -0
  3. package/dist/changed-file.js +131 -0
  4. package/dist/changed-file.js.map +1 -0
  5. package/dist/index.d.ts +4 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +3 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/check-push-limit.d.ts +5 -0
  10. package/dist/lib/check-push-limit.d.ts.map +1 -0
  11. package/dist/lib/check-push-limit.js +61 -0
  12. package/dist/lib/check-push-limit.js.map +1 -0
  13. package/dist/lib/git-head.d.ts +5 -0
  14. package/dist/lib/git-head.d.ts.map +1 -0
  15. package/dist/lib/git-head.js +20 -0
  16. package/dist/lib/git-head.js.map +1 -0
  17. package/dist/lib/namespace.d.ts +5 -0
  18. package/dist/lib/namespace.d.ts.map +1 -0
  19. package/dist/lib/namespace.js +10 -0
  20. package/dist/lib/namespace.js.map +1 -0
  21. package/dist/lib/parse.d.ts +7 -0
  22. package/dist/lib/parse.d.ts.map +1 -0
  23. package/dist/lib/parse.js +29 -0
  24. package/dist/lib/parse.js.map +1 -0
  25. package/dist/lib/permissions.d.ts +4 -0
  26. package/dist/lib/permissions.d.ts.map +1 -0
  27. package/dist/lib/permissions.js +9 -0
  28. package/dist/lib/permissions.js.map +1 -0
  29. package/dist/lib/validate-blob-references.d.ts +5 -0
  30. package/dist/lib/validate-blob-references.d.ts.map +1 -0
  31. package/dist/lib/validate-blob-references.js +21 -0
  32. package/dist/lib/validate-blob-references.js.map +1 -0
  33. package/dist/lib/validate-file/blob.d.ts +4 -0
  34. package/dist/lib/validate-file/blob.d.ts.map +1 -0
  35. package/dist/lib/validate-file/blob.js +57 -0
  36. package/dist/lib/validate-file/blob.js.map +1 -0
  37. package/dist/lib/validate-file/entity.d.ts +4 -0
  38. package/dist/lib/validate-file/entity.d.ts.map +1 -0
  39. package/dist/lib/validate-file/entity.js +74 -0
  40. package/dist/lib/validate-file/entity.js.map +1 -0
  41. package/dist/lib/validate-file/namespace-metadata.d.ts +4 -0
  42. package/dist/lib/validate-file/namespace-metadata.d.ts.map +1 -0
  43. package/dist/lib/validate-file/namespace-metadata.js +128 -0
  44. package/dist/lib/validate-file/namespace-metadata.js.map +1 -0
  45. package/dist/lib/validate-file/namespace-overrides.d.ts +4 -0
  46. package/dist/lib/validate-file/namespace-overrides.d.ts.map +1 -0
  47. package/dist/lib/validate-file/namespace-overrides.js +47 -0
  48. package/dist/lib/validate-file/namespace-overrides.js.map +1 -0
  49. package/dist/lib/validate-ownership-transfer.d.ts +3 -0
  50. package/dist/lib/validate-ownership-transfer.d.ts.map +1 -0
  51. package/dist/lib/validate-ownership-transfer.js +13 -0
  52. package/dist/lib/validate-ownership-transfer.js.map +1 -0
  53. package/dist/lib/validate-push-limit-constraints.d.ts +19 -0
  54. package/dist/lib/validate-push-limit-constraints.d.ts.map +1 -0
  55. package/dist/lib/validate-push-limit-constraints.js +14 -0
  56. package/dist/lib/validate-push-limit-constraints.js.map +1 -0
  57. package/dist/pr.d.ts +13 -0
  58. package/dist/pr.d.ts.map +1 -0
  59. package/dist/pr.js +80 -0
  60. package/dist/pr.js.map +1 -0
  61. package/dist/registry-validator.d.ts +39 -0
  62. package/dist/registry-validator.d.ts.map +1 -0
  63. package/dist/registry-validator.js +19 -0
  64. package/dist/registry-validator.js.map +1 -0
  65. package/dist/settings.d.ts +39 -0
  66. package/dist/settings.d.ts.map +1 -0
  67. package/dist/settings.js +56 -0
  68. package/dist/settings.js.map +1 -0
  69. package/dist/types.d.ts +20 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/validation-result.d.ts +39 -0
  74. package/dist/validation-result.d.ts.map +1 -0
  75. package/dist/validation-result.js +44 -0
  76. package/dist/validation-result.js.map +1 -0
  77. package/package.json +2 -2
  78. package/src/changed-file.ts +3 -3
  79. package/src/lib/check-push-limit.ts +7 -7
  80. package/src/lib/git-head.ts +5 -5
  81. package/src/lib/validate-file/entity.ts +6 -6
  82. package/src/lib/validate-file/namespace-metadata.ts +2 -2
  83. package/src/pr.ts +2 -2
  84. 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-01",
4
- "description": "Zod schemas for the Figulus engine API",
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": {
@@ -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)),
@@ -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: (url: string) => {
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 {