@postxl/schema 0.0.2
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 +50 -0
- package/README.md +320 -0
- package/dist/enum/enum.brands.d.ts +11 -0
- package/dist/enum/enum.brands.js +19 -0
- package/dist/enum/enum.d.ts +49 -0
- package/dist/enum/enum.defaults.d.ts +41 -0
- package/dist/enum/enum.defaults.js +105 -0
- package/dist/enum/enum.js +6 -0
- package/dist/enum/enum.json-decoder.d.ts +61 -0
- package/dist/enum/enum.json-decoder.js +51 -0
- package/dist/enum/enum.transformer.d.ts +12 -0
- package/dist/enum/enum.transformer.js +76 -0
- package/dist/enum/enum.types.d.ts +14 -0
- package/dist/enum/enum.types.js +2 -0
- package/dist/enum/index.d.ts +6 -0
- package/dist/enum/index.js +22 -0
- package/dist/field/defaults.d.ts +12 -0
- package/dist/field/defaults.js +78 -0
- package/dist/field/discriminated-union.d.ts +125 -0
- package/dist/field/discriminated-union.js +207 -0
- package/dist/field/enum.d.ts +65 -0
- package/dist/field/enum.js +111 -0
- package/dist/field/field.d.ts +483 -0
- package/dist/field/field.js +68 -0
- package/dist/field/id.d.ts +152 -0
- package/dist/field/id.js +104 -0
- package/dist/field/index.d.ts +11 -0
- package/dist/field/index.js +27 -0
- package/dist/field/relation.d.ts +88 -0
- package/dist/field/relation.js +138 -0
- package/dist/field/scalar.d.ts +179 -0
- package/dist/field/scalar.js +197 -0
- package/dist/field/shared/brands.d.ts +38 -0
- package/dist/field/shared/brands.js +109 -0
- package/dist/field/shared/decoders.d.ts +17 -0
- package/dist/field/shared/decoders.js +88 -0
- package/dist/field/shared/seed.d.ts +32 -0
- package/dist/field/shared/seed.js +63 -0
- package/dist/field/shared/types.d.ts +73 -0
- package/dist/field/shared/types.js +2 -0
- package/dist/field/shared/utils.d.ts +26 -0
- package/dist/field/shared/utils.js +52 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +25 -0
- package/dist/model/index.d.ts +5 -0
- package/dist/model/index.js +21 -0
- package/dist/model/model.brands.d.ts +7 -0
- package/dist/model/model.brands.js +10 -0
- package/dist/model/model.defaults.d.ts +28 -0
- package/dist/model/model.defaults.js +304 -0
- package/dist/model/model.json-decoder.d.ts +94 -0
- package/dist/model/model.json-decoder.js +107 -0
- package/dist/model/model.transformer.d.ts +93 -0
- package/dist/model/model.transformer.js +183 -0
- package/dist/model/model.types.d.ts +37 -0
- package/dist/model/model.types.js +2 -0
- package/dist/project-schema/project-schema.brands.d.ts +10 -0
- package/dist/project-schema/project-schema.brands.js +17 -0
- package/dist/project-schema/project-schema.defaults.d.ts +16 -0
- package/dist/project-schema/project-schema.defaults.js +53 -0
- package/dist/project-schema/project-schema.json-decoder.d.ts +285 -0
- package/dist/project-schema/project-schema.json-decoder.js +145 -0
- package/dist/project-schema/project-schema.transformer.d.ts +284 -0
- package/dist/project-schema/project-schema.transformer.js +444 -0
- package/dist/project-schema/project-schema.types.d.ts +77 -0
- package/dist/project-schema/project-schema.types.js +2 -0
- package/dist/samples/la.schema.json +2055 -0
- package/dist/samples/mca.schema.json +830 -0
- package/dist/samples/ring.schema.json +879 -0
- package/dist/samples/sample-schemas.d.ts +1896 -0
- package/dist/samples/sample-schemas.js +20 -0
- package/dist/samples/simple.schema.json +250 -0
- package/dist/samples/subex.schema.json +1188 -0
- package/dist/samples/usp-msm.schema.json +2515 -0
- package/package.json +57 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zEnumJSON = exports.zEnumNameJSON = exports.zEnumMemberJSON = exports.zEnumMemberCompact = exports.zEnumMemberJSONDetailed = exports.zEnumMemberDescriptionJSON = exports.zEnumMemberNameJSON = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const utils_1 = require("@postxl/utils");
|
|
6
|
+
exports.zEnumMemberNameJSON = zod_1.z
|
|
7
|
+
//
|
|
8
|
+
.string()
|
|
9
|
+
.min(1, 'Value of the enum member must not be empty')
|
|
10
|
+
.describe('The value of the enum member.');
|
|
11
|
+
exports.zEnumMemberDescriptionJSON = zod_1.z
|
|
12
|
+
//
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('A helpful description of the enum member.');
|
|
16
|
+
exports.zEnumMemberJSONDetailed = zod_1.z.object({
|
|
17
|
+
value: exports.zEnumMemberNameJSON,
|
|
18
|
+
description: exports.zEnumMemberDescriptionJSON,
|
|
19
|
+
});
|
|
20
|
+
exports.zEnumMemberCompact = exports.zEnumMemberNameJSON;
|
|
21
|
+
exports.zEnumMemberJSON = zod_1.z.union([exports.zEnumMemberJSONDetailed, exports.zEnumMemberCompact], (0, utils_1.unionErrorMessage)((data) => `Enum member must either be object of type ${(0, utils_1.yellow)('{value: string; description: string}')} or just a plain ${(0, utils_1.yellow)('string')}! Instead, received ${(0, utils_1.red)(JSON.stringify(data))}.`));
|
|
22
|
+
exports.zEnumNameJSON = zod_1.z
|
|
23
|
+
//
|
|
24
|
+
.string()
|
|
25
|
+
.min(1, 'Name of the enum must not be empty')
|
|
26
|
+
.refine((v) => (0, utils_1.isCamelCase)(v) || (0, utils_1.isPascalCase)(v), (v) => ({
|
|
27
|
+
message: `Enum name must be camelCase (${(0, utils_1.toCamelCase)(v)} or PascalCase ${(0, utils_1.toPascalCase)(v)})! Received ${v}.`,
|
|
28
|
+
}))
|
|
29
|
+
.describe('Name of the enum.');
|
|
30
|
+
exports.zEnumJSON = zod_1.z.object({
|
|
31
|
+
name: exports.zEnumNameJSON,
|
|
32
|
+
description: zod_1.z
|
|
33
|
+
//
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.default('')
|
|
37
|
+
.describe('A helpful description of the enum.'),
|
|
38
|
+
schema: zod_1.z
|
|
39
|
+
.string()
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('The database schema that the enum belongs to. If not provided, the default schema is assumed.'),
|
|
42
|
+
databaseName: zod_1.z
|
|
43
|
+
//
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe('The name of the enum in the database.'),
|
|
47
|
+
members: zod_1.z
|
|
48
|
+
//
|
|
49
|
+
.array(exports.zEnumMemberJSON)
|
|
50
|
+
.min(1, 'Enum must have at least one member.'),
|
|
51
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { EnumJSON, EnumMemberJSON } from './enum.json-decoder';
|
|
3
|
+
import type { EnumMember } from './enum.types';
|
|
4
|
+
export declare function enumMemberTransformer(input: EnumMemberJSON): EnumMember;
|
|
5
|
+
export type EnumEnriched = ReturnType<typeof enumTransformer>;
|
|
6
|
+
export declare function enumTransformer(input: EnumJSON, ctx: z.RefinementCtx): {
|
|
7
|
+
name: string & z.BRAND<"PXL.EnumName">;
|
|
8
|
+
description: string;
|
|
9
|
+
members: Map<string & z.BRAND<"PXL.EnumValue">, EnumMember>;
|
|
10
|
+
databaseSchema: (string & z.BRAND<"PXL.DatabaseSchemaName">) | undefined;
|
|
11
|
+
databaseName: string & z.BRAND<"PXL.DatabaseEnumName">;
|
|
12
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.enumMemberTransformer = enumMemberTransformer;
|
|
37
|
+
exports.enumTransformer = enumTransformer;
|
|
38
|
+
const zod_1 = require("zod");
|
|
39
|
+
const utils_1 = require("@postxl/utils");
|
|
40
|
+
const project_schema_brands_1 = require("../project-schema/project-schema.brands");
|
|
41
|
+
const Branded = __importStar(require("./enum.brands"));
|
|
42
|
+
function enumMemberTransformer(input) {
|
|
43
|
+
if (typeof input === 'string') {
|
|
44
|
+
return {
|
|
45
|
+
value: Branded.toEnumValue(input),
|
|
46
|
+
description: input,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
value: Branded.toEnumValue(input.value),
|
|
51
|
+
description: input.description ?? input.value,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function enumTransformer(input, ctx) {
|
|
55
|
+
const members = new Map();
|
|
56
|
+
const memberValues = new Set();
|
|
57
|
+
for (const member of input.members) {
|
|
58
|
+
const enumMember = enumMemberTransformer(member);
|
|
59
|
+
if (memberValues.has(enumMember.value)) {
|
|
60
|
+
ctx.addIssue({
|
|
61
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
62
|
+
message: `Enum ${input.name} has multiple members with the same value ${enumMember.value}!`,
|
|
63
|
+
});
|
|
64
|
+
return zod_1.z.NEVER;
|
|
65
|
+
}
|
|
66
|
+
memberValues.add(enumMember.value);
|
|
67
|
+
members.set(enumMember.value, enumMember);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
name: Branded.toEnumName(input.name),
|
|
71
|
+
description: input.description,
|
|
72
|
+
members,
|
|
73
|
+
databaseSchema: input.schema ? (0, project_schema_brands_1.toDatabaseSchemaName)(input.schema) : undefined,
|
|
74
|
+
databaseName: Branded.toDatabaseEnumName(input.databaseName ?? (0, utils_1.toSnakeCase)(input.name)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatabaseSchemaName } from '../project-schema/project-schema.brands';
|
|
2
|
+
import { DatabaseEnumName, EnumName, EnumValue } from './enum.brands';
|
|
3
|
+
export type Enums = Map<EnumName, Enum>;
|
|
4
|
+
export type Enum = {
|
|
5
|
+
name: EnumName;
|
|
6
|
+
description: string;
|
|
7
|
+
databaseSchema: DatabaseSchemaName;
|
|
8
|
+
databaseName: DatabaseEnumName;
|
|
9
|
+
members: Map<EnumValue, EnumMember>;
|
|
10
|
+
};
|
|
11
|
+
export type EnumMember = {
|
|
12
|
+
value: EnumValue;
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./enum"), exports);
|
|
18
|
+
__exportStar(require("./enum.brands"), exports);
|
|
19
|
+
__exportStar(require("./enum.defaults"), exports);
|
|
20
|
+
__exportStar(require("./enum.json-decoder"), exports);
|
|
21
|
+
__exportStar(require("./enum.transformer"), exports);
|
|
22
|
+
__exportStar(require("./enum.types"), exports);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as Branded from './shared/brands';
|
|
2
|
+
import { FieldJSONInput } from './field';
|
|
3
|
+
export declare const standardFieldName_id: "id" & import("zod").BRAND<"PXL.FieldName"> & import("zod").BRAND<"PXL.FieldName.Id">;
|
|
4
|
+
export declare const standardFieldName_createdAt: string & import("zod").BRAND<"PXL.FieldName">;
|
|
5
|
+
export declare const standardFieldName_updatedAt: string & import("zod").BRAND<"PXL.FieldName">;
|
|
6
|
+
export declare const standardFieldName_name: string & import("zod").BRAND<"PXL.FieldName">;
|
|
7
|
+
export declare const standardFieldNames: (string & import("zod").BRAND<"PXL.FieldName">)[];
|
|
8
|
+
export declare const standardField_id: FieldJSONInput;
|
|
9
|
+
export declare const standardField_createdAt: FieldJSONInput;
|
|
10
|
+
export declare const standardField_updatedAt: FieldJSONInput;
|
|
11
|
+
export declare const standardField_name: FieldJSONInput;
|
|
12
|
+
export declare const standardFields: Record<Branded.FieldName, FieldJSONInput>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.standardFields = exports.standardField_name = exports.standardField_updatedAt = exports.standardField_createdAt = exports.standardField_id = exports.standardFieldNames = exports.standardFieldName_name = exports.standardFieldName_updatedAt = exports.standardFieldName_createdAt = exports.standardFieldName_id = void 0;
|
|
37
|
+
const Branded = __importStar(require("./shared/brands"));
|
|
38
|
+
exports.standardFieldName_id = Branded.toFieldIdName('id');
|
|
39
|
+
exports.standardFieldName_createdAt = Branded.toFieldName('createdAt');
|
|
40
|
+
exports.standardFieldName_updatedAt = Branded.toFieldName('updatedAt');
|
|
41
|
+
exports.standardFieldName_name = Branded.toFieldName('name');
|
|
42
|
+
exports.standardFieldNames = [
|
|
43
|
+
exports.standardFieldName_id,
|
|
44
|
+
exports.standardFieldName_createdAt,
|
|
45
|
+
exports.standardFieldName_updatedAt,
|
|
46
|
+
exports.standardFieldName_name,
|
|
47
|
+
];
|
|
48
|
+
exports.standardField_id = {
|
|
49
|
+
name: exports.standardFieldName_id,
|
|
50
|
+
excelName: 'Id',
|
|
51
|
+
type: 'String',
|
|
52
|
+
};
|
|
53
|
+
exports.standardField_createdAt = {
|
|
54
|
+
name: exports.standardFieldName_createdAt,
|
|
55
|
+
excelName: 'Created at',
|
|
56
|
+
type: 'DateTime',
|
|
57
|
+
isCreatedAt: true,
|
|
58
|
+
description: 'The date and time when the item was created.',
|
|
59
|
+
};
|
|
60
|
+
exports.standardField_updatedAt = {
|
|
61
|
+
name: exports.standardFieldName_updatedAt,
|
|
62
|
+
excelName: 'Updated at',
|
|
63
|
+
type: 'DateTime',
|
|
64
|
+
isUpdatedAt: true,
|
|
65
|
+
description: 'The date and time when the item was last updated. Initially, this is set to the current date and time when the item is created - but is automatically updated when the item is updated.',
|
|
66
|
+
};
|
|
67
|
+
exports.standardField_name = {
|
|
68
|
+
name: exports.standardFieldName_name,
|
|
69
|
+
type: 'String',
|
|
70
|
+
excelName: 'Name',
|
|
71
|
+
description: 'The name of the item.',
|
|
72
|
+
};
|
|
73
|
+
exports.standardFields = {
|
|
74
|
+
[exports.standardFieldName_id]: exports.standardField_id,
|
|
75
|
+
[exports.standardFieldName_createdAt]: exports.standardField_createdAt,
|
|
76
|
+
[exports.standardFieldName_updatedAt]: exports.standardField_updatedAt,
|
|
77
|
+
[exports.standardFieldName_name]: exports.standardField_name,
|
|
78
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as Branded from './shared/brands';
|
|
3
|
+
import { FieldCommon, FieldTransformer } from './shared/types';
|
|
4
|
+
import * as Fields from './field';
|
|
5
|
+
export type FieldKindDiscriminatedUnion = 'discriminatedUnion';
|
|
6
|
+
export declare const fieldKindDiscriminatedUnion: FieldKindDiscriminatedUnion;
|
|
7
|
+
export type DiscriminatedUnionMember = {
|
|
8
|
+
/**
|
|
9
|
+
* The discriminator value that is used to identify the member.
|
|
10
|
+
*/
|
|
11
|
+
type: Discriminator;
|
|
12
|
+
/**
|
|
13
|
+
* A human readable label for the member.
|
|
14
|
+
*/
|
|
15
|
+
label: DiscriminatorLabel;
|
|
16
|
+
/**
|
|
17
|
+
* The fields that are part of the member.
|
|
18
|
+
*/
|
|
19
|
+
fields: Fields.Fields<PartOfDiscriminatedUnionMember<Fields.FieldDatabaseNative>>;
|
|
20
|
+
};
|
|
21
|
+
type PartOfDiscriminatedUnion<T extends Fields.FieldDatabaseNative> = T & {
|
|
22
|
+
discriminatedUnionFieldName: Branded.FieldName;
|
|
23
|
+
};
|
|
24
|
+
export declare function isPartOfDiscriminatedUnion<T extends Fields.FieldDatabaseNative>(field: Fields.FieldDatabaseNative): field is PartOfDiscriminatedUnion<T>;
|
|
25
|
+
type PartOfDiscriminatedUnionMember<T extends Fields.FieldDatabaseNative> = PartOfDiscriminatedUnion<T> & {
|
|
26
|
+
discriminatedUnionMemberType: Discriminator;
|
|
27
|
+
};
|
|
28
|
+
export declare function isPartOfDiscriminatedUnionMember<T extends Fields.FieldDatabaseNative>(field: Fields.FieldDatabaseNative): field is PartOfDiscriminatedUnionMember<T>;
|
|
29
|
+
export type FieldDiscriminatedUnion = FieldCommon<FieldKindDiscriminatedUnion> & {
|
|
30
|
+
type: Branded.DiscriminatedUnionType;
|
|
31
|
+
/**
|
|
32
|
+
* The name of the field that is used to discriminate the union.
|
|
33
|
+
*
|
|
34
|
+
* This is a constant name `type`.
|
|
35
|
+
*/
|
|
36
|
+
discriminatorFieldName: Branded.FieldName;
|
|
37
|
+
/**
|
|
38
|
+
* The common fields that are shared by all members.
|
|
39
|
+
*/
|
|
40
|
+
commonFields: Fields.Fields<PartOfDiscriminatedUnion<Fields.FieldDatabaseNative>>;
|
|
41
|
+
/**
|
|
42
|
+
* The members of the discriminated union.
|
|
43
|
+
*/
|
|
44
|
+
members: Map<Discriminator, DiscriminatedUnionMember>;
|
|
45
|
+
};
|
|
46
|
+
export type FieldDiscriminatedUnionEnriched = ReturnType<typeof fieldDiscriminatedUnionJSONTransformer>;
|
|
47
|
+
declare const zDiscriminator: z.ZodBranded<z.ZodString, "PXL.Discriminator">;
|
|
48
|
+
export type Discriminator = z.infer<typeof zDiscriminator>;
|
|
49
|
+
declare const zDiscriminatorLabel: z.ZodBranded<z.ZodString, "PXL.DiscriminatorLabel">;
|
|
50
|
+
type DiscriminatorLabel = z.infer<typeof zDiscriminatorLabel>;
|
|
51
|
+
export declare const zField: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
52
|
+
/**
|
|
53
|
+
* JSON Schema for an Discriminated Union field
|
|
54
|
+
*/
|
|
55
|
+
export declare const zFieldDiscriminatedUnionJSON: z.ZodObject<{
|
|
56
|
+
name: z.ZodEffects<z.ZodString, string, string>;
|
|
57
|
+
type: z.ZodUnion<[z.ZodLiteral<"DiscriminatedUnion">, z.ZodLiteral<"DiscriminatedUnion?">]>;
|
|
58
|
+
label: z.ZodOptional<z.ZodString>;
|
|
59
|
+
description: z.ZodOptional<z.ZodString>;
|
|
60
|
+
databaseName: z.ZodOptional<z.ZodString>;
|
|
61
|
+
excelName: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
|
|
62
|
+
members: z.ZodArray<z.ZodObject<{
|
|
63
|
+
type: z.ZodEffects<z.ZodString, string, string>;
|
|
64
|
+
label: z.ZodOptional<z.ZodString>;
|
|
65
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodAny>, "many">>;
|
|
66
|
+
}, "strip", z.ZodTypeAny, {
|
|
67
|
+
type: string;
|
|
68
|
+
label?: string | undefined;
|
|
69
|
+
fields?: Record<string, any>[] | undefined;
|
|
70
|
+
}, {
|
|
71
|
+
type: string;
|
|
72
|
+
label?: string | undefined;
|
|
73
|
+
fields?: Record<string, any>[] | undefined;
|
|
74
|
+
}>, "many">;
|
|
75
|
+
commonFields: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodAny>, "many">>;
|
|
76
|
+
isReadonly: z.ZodOptional<z.ZodBoolean>;
|
|
77
|
+
}, "strip", z.ZodTypeAny, {
|
|
78
|
+
type: "DiscriminatedUnion" | "DiscriminatedUnion?";
|
|
79
|
+
name: string;
|
|
80
|
+
members: {
|
|
81
|
+
type: string;
|
|
82
|
+
label?: string | undefined;
|
|
83
|
+
fields?: Record<string, any>[] | undefined;
|
|
84
|
+
}[];
|
|
85
|
+
description?: string | undefined;
|
|
86
|
+
databaseName?: string | undefined;
|
|
87
|
+
excelName?: string | undefined;
|
|
88
|
+
label?: string | undefined;
|
|
89
|
+
isReadonly?: boolean | undefined;
|
|
90
|
+
commonFields?: Record<string, any>[] | undefined;
|
|
91
|
+
}, {
|
|
92
|
+
type: "DiscriminatedUnion" | "DiscriminatedUnion?";
|
|
93
|
+
name: string;
|
|
94
|
+
members: {
|
|
95
|
+
type: string;
|
|
96
|
+
label?: string | undefined;
|
|
97
|
+
fields?: Record<string, any>[] | undefined;
|
|
98
|
+
}[];
|
|
99
|
+
description?: string | undefined;
|
|
100
|
+
databaseName?: string | undefined;
|
|
101
|
+
excelName?: string | undefined;
|
|
102
|
+
label?: string | undefined;
|
|
103
|
+
isReadonly?: boolean | undefined;
|
|
104
|
+
commonFields?: Record<string, any>[] | undefined;
|
|
105
|
+
}>;
|
|
106
|
+
export type FieldDiscriminatedUnionJSON = z.infer<typeof zFieldDiscriminatedUnionJSON>;
|
|
107
|
+
export declare function fieldDiscriminatedUnionJSONTransformer(fieldInput: FieldDiscriminatedUnionJSON): {
|
|
108
|
+
kind: "discriminatedUnion";
|
|
109
|
+
name: string & z.BRAND<"PXL.FieldName">;
|
|
110
|
+
discriminatorFieldName: string & z.BRAND<"PXL.FieldName">;
|
|
111
|
+
label: string;
|
|
112
|
+
databaseName: string & z.BRAND<"PXL.DatabaseFieldName">;
|
|
113
|
+
excelName: string & z.BRAND<"PXL.ExcelColumnName">;
|
|
114
|
+
description: string | undefined;
|
|
115
|
+
members: {
|
|
116
|
+
type: string;
|
|
117
|
+
label?: string | undefined;
|
|
118
|
+
fields?: Record<string, any>[] | undefined;
|
|
119
|
+
}[];
|
|
120
|
+
commonFields: Record<string, any>[] | undefined;
|
|
121
|
+
isReadonly: boolean;
|
|
122
|
+
isRequired: boolean;
|
|
123
|
+
};
|
|
124
|
+
export declare const fieldDiscriminatedUnionTransformer: FieldTransformer<FieldKindDiscriminatedUnion, FieldDiscriminatedUnionEnriched, FieldDiscriminatedUnion>;
|
|
125
|
+
export {};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fieldDiscriminatedUnionTransformer = exports.zFieldDiscriminatedUnionJSON = exports.zField = exports.fieldKindDiscriminatedUnion = void 0;
|
|
37
|
+
exports.isPartOfDiscriminatedUnion = isPartOfDiscriminatedUnion;
|
|
38
|
+
exports.isPartOfDiscriminatedUnionMember = isPartOfDiscriminatedUnionMember;
|
|
39
|
+
exports.fieldDiscriminatedUnionJSONTransformer = fieldDiscriminatedUnionJSONTransformer;
|
|
40
|
+
const zod_1 = require("zod");
|
|
41
|
+
const utils_1 = require("@postxl/utils");
|
|
42
|
+
const enum_1 = require("../enum");
|
|
43
|
+
const model_1 = require("../model");
|
|
44
|
+
const Branded = __importStar(require("./shared/brands"));
|
|
45
|
+
const Decoders = __importStar(require("./shared/decoders"));
|
|
46
|
+
const utils_2 = require("./shared/utils");
|
|
47
|
+
const Fields = __importStar(require("./field"));
|
|
48
|
+
exports.fieldKindDiscriminatedUnion = 'discriminatedUnion';
|
|
49
|
+
function isPartOfDiscriminatedUnion(field) {
|
|
50
|
+
return 'discriminatedUnionFieldName' in field;
|
|
51
|
+
}
|
|
52
|
+
function isPartOfDiscriminatedUnionMember(field) {
|
|
53
|
+
return 'discriminatedUnionMemberType' in field;
|
|
54
|
+
}
|
|
55
|
+
const zDiscriminator = zod_1.z.string().brand('PXL.Discriminator');
|
|
56
|
+
const toDiscriminator = (input) => zDiscriminator.parse(input);
|
|
57
|
+
const zDiscriminatorLabel = zod_1.z.string().brand('PXL.DiscriminatorLabel');
|
|
58
|
+
const toDiscriminatorLabel = (input) => zDiscriminatorLabel.parse(input);
|
|
59
|
+
exports.zField = zod_1.z.record(zod_1.z.string(), zod_1.z.any());
|
|
60
|
+
/**
|
|
61
|
+
* JSON Schema for an Discriminated Union field
|
|
62
|
+
*/
|
|
63
|
+
exports.zFieldDiscriminatedUnionJSON = zod_1.z.object({
|
|
64
|
+
name: Decoders.zFieldPropertyName,
|
|
65
|
+
type: zod_1.z //
|
|
66
|
+
.literal('DiscriminatedUnion')
|
|
67
|
+
.or(zod_1.z.literal('DiscriminatedUnion?'))
|
|
68
|
+
.describe('The kind of the field. This should always be `discriminatedUnion`.'),
|
|
69
|
+
label: Decoders.zFieldPropertyLabel,
|
|
70
|
+
description: Decoders.zFieldPropertyDescription,
|
|
71
|
+
databaseName: Decoders.zFieldPropertyDatabaseName,
|
|
72
|
+
excelName: Decoders.zFieldPropertyExcelName,
|
|
73
|
+
members: zod_1.z.array(zod_1.z.object({
|
|
74
|
+
type: zod_1.z
|
|
75
|
+
.string()
|
|
76
|
+
.regex(/^[a-zA-Z0-9]*$/, 'Type name shall only contain letters and numbers.')
|
|
77
|
+
.refine((v) => v !== 'type', {
|
|
78
|
+
message: 'Element field name cannot be "type" as this is reserved for the discriminator.',
|
|
79
|
+
}),
|
|
80
|
+
label: zod_1.z.string().optional(),
|
|
81
|
+
fields: zod_1.z.array(exports.zField).optional(),
|
|
82
|
+
})),
|
|
83
|
+
commonFields: zod_1.z.array(exports.zField).optional(),
|
|
84
|
+
isReadonly: Decoders.zFieldPropertyIsReadonly,
|
|
85
|
+
});
|
|
86
|
+
function fieldDiscriminatedUnionJSONTransformer(fieldInput) {
|
|
87
|
+
const { isRequired } = (0, utils_2.isFieldRequired)(fieldInput.type);
|
|
88
|
+
return {
|
|
89
|
+
kind: exports.fieldKindDiscriminatedUnion,
|
|
90
|
+
name: Branded.toFieldName(fieldInput.name),
|
|
91
|
+
discriminatorFieldName: Branded.toFieldName('type'),
|
|
92
|
+
label: (0, utils_1.toHumanReadable)(fieldInput.label ?? fieldInput.name),
|
|
93
|
+
databaseName: Branded.toDatabaseFieldName(fieldInput.databaseName ?? (0, utils_1.toSnakeCase)(fieldInput.name)),
|
|
94
|
+
excelName: Branded.toExcelColumnName(fieldInput.excelName ?? fieldInput.label ?? fieldInput.name),
|
|
95
|
+
description: fieldInput.description,
|
|
96
|
+
members: fieldInput.members,
|
|
97
|
+
commonFields: fieldInput.commonFields,
|
|
98
|
+
isReadonly: fieldInput.isReadonly ?? false,
|
|
99
|
+
isRequired,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const fieldDiscriminatedUnionTransformer = ({ fieldInput, model, projectSchema }, ctx) => {
|
|
103
|
+
const modelNames = [...projectSchema.models.keys()].map((name) => (0, model_1.toModelName)(name));
|
|
104
|
+
const enumNames = [...projectSchema.enums.keys()].map((name) => (0, enum_1.toEnumName)(name));
|
|
105
|
+
// The field decoder for the fields in the discriminated union. It ensures that discriminated unions cannot be nested.
|
|
106
|
+
const zFieldDecoder = Fields.createFieldJSONDecoder({
|
|
107
|
+
modelNames,
|
|
108
|
+
enumNames,
|
|
109
|
+
}).transform((f) => {
|
|
110
|
+
if (f.kind === 'discriminatedUnion') {
|
|
111
|
+
ctx.addIssue({
|
|
112
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
113
|
+
message: `Discriminated union ${model.name}.${fieldInput.name} cannot contain a discriminated unions as a field!`,
|
|
114
|
+
});
|
|
115
|
+
return zod_1.z.NEVER;
|
|
116
|
+
}
|
|
117
|
+
return f;
|
|
118
|
+
});
|
|
119
|
+
const commonFields = new Map();
|
|
120
|
+
for (const field of fieldInput.commonFields ?? []) {
|
|
121
|
+
const decodedFieldResult = zFieldDecoder.safeParse(field);
|
|
122
|
+
if (!decodedFieldResult.success) {
|
|
123
|
+
ctx.addIssue({
|
|
124
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
125
|
+
message: `Error decoding common field in ${model.name}.${fieldInput.name}: ${decodedFieldResult.error.message}`,
|
|
126
|
+
});
|
|
127
|
+
return zod_1.z.NEVER;
|
|
128
|
+
}
|
|
129
|
+
const decodedField = decodedFieldResult.data;
|
|
130
|
+
const transformedField = Fields.fieldTransformer(decodedField, model, projectSchema, ctx);
|
|
131
|
+
commonFields.set(transformedField.name, addDiscriminatedUnionParent(transformedField, fieldInput.name));
|
|
132
|
+
}
|
|
133
|
+
const members = new Map();
|
|
134
|
+
for (const memberInput of fieldInput.members) {
|
|
135
|
+
const discriminator = toDiscriminator(memberInput.type);
|
|
136
|
+
const label = toDiscriminatorLabel(memberInput.label ?? memberInput.type);
|
|
137
|
+
const memberFields = new Map();
|
|
138
|
+
for (const field of memberInput.fields ?? []) {
|
|
139
|
+
const decodedFieldResult = zFieldDecoder.safeParse(field);
|
|
140
|
+
if (!decodedFieldResult.success) {
|
|
141
|
+
ctx.addIssue({
|
|
142
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
143
|
+
message: `Error decoding field in ${model.name}.${fieldInput.name}: ${decodedFieldResult.error.message}`,
|
|
144
|
+
});
|
|
145
|
+
return zod_1.z.NEVER;
|
|
146
|
+
}
|
|
147
|
+
const decodedField = decodedFieldResult.data;
|
|
148
|
+
if (decodedField.name === 'type') {
|
|
149
|
+
ctx.addIssue({
|
|
150
|
+
code: zod_1.z.ZodIssueCode.custom,
|
|
151
|
+
message: `Field name "type" is reserved for the discriminator in discriminated union ${model.name}.${fieldInput.name}`,
|
|
152
|
+
});
|
|
153
|
+
return zod_1.z.NEVER;
|
|
154
|
+
}
|
|
155
|
+
const transformedField = Fields.fieldTransformer(decodedField, model, projectSchema, ctx);
|
|
156
|
+
memberFields.set(transformedField.name, addDiscriminatedUnionParentMember(transformedField, fieldInput.name, discriminator));
|
|
157
|
+
}
|
|
158
|
+
members.set(discriminator, {
|
|
159
|
+
type: discriminator,
|
|
160
|
+
label,
|
|
161
|
+
fields: memberFields,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
const result = {
|
|
165
|
+
...fieldInput,
|
|
166
|
+
modelName: model.name,
|
|
167
|
+
databaseType: Branded.toDatabaseFieldType('String'),
|
|
168
|
+
isUnique: false,
|
|
169
|
+
type: Branded.toDiscriminatedUnionType((0, utils_1.toPascalCase)(fieldInput.name)),
|
|
170
|
+
kind: 'discriminatedUnion',
|
|
171
|
+
commonFields,
|
|
172
|
+
members,
|
|
173
|
+
};
|
|
174
|
+
return result;
|
|
175
|
+
};
|
|
176
|
+
exports.fieldDiscriminatedUnionTransformer = fieldDiscriminatedUnionTransformer;
|
|
177
|
+
function addDiscriminatedUnionParent(field, duFieldName) {
|
|
178
|
+
const result = {
|
|
179
|
+
...field,
|
|
180
|
+
discriminatedUnionFieldName: duFieldName,
|
|
181
|
+
databaseName: ensureCustomDatabaseName({
|
|
182
|
+
name: field.name,
|
|
183
|
+
databaseName: field.databaseName,
|
|
184
|
+
newName: `${duFieldName}${(0, utils_1.toPascalCase)(field.name)}`,
|
|
185
|
+
}),
|
|
186
|
+
};
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
function addDiscriminatedUnionParentMember(field, duFieldName, duMemberType) {
|
|
190
|
+
const result = {
|
|
191
|
+
...field,
|
|
192
|
+
discriminatedUnionFieldName: duFieldName,
|
|
193
|
+
discriminatedUnionMemberType: duMemberType,
|
|
194
|
+
databaseName: ensureCustomDatabaseName({
|
|
195
|
+
name: field.name,
|
|
196
|
+
databaseName: field.databaseName,
|
|
197
|
+
newName: `${duFieldName}${(0, utils_1.toPascalCase)(duMemberType)}${(0, utils_1.toPascalCase)(field.name)}`,
|
|
198
|
+
}),
|
|
199
|
+
};
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
function ensureCustomDatabaseName({ databaseName, name, newName, }) {
|
|
203
|
+
if (databaseName !== name && databaseName !== (0, utils_1.toSnakeCase)(name)) {
|
|
204
|
+
return databaseName;
|
|
205
|
+
}
|
|
206
|
+
return Branded.toDatabaseFieldName((0, utils_1.toSnakeCase)(newName));
|
|
207
|
+
}
|