apify-schema-tools 2.0.1
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/.cspell/custom-dictionary.txt +4 -0
- package/.husky/pre-commit +33 -0
- package/.node-version +1 -0
- package/CHANGELOG.md +88 -0
- package/LICENSE +201 -0
- package/README.md +312 -0
- package/biome.json +31 -0
- package/dist/apify-schema-tools.d.ts +3 -0
- package/dist/apify-schema-tools.d.ts.map +1 -0
- package/dist/apify-schema-tools.js +197 -0
- package/dist/apify-schema-tools.js.map +1 -0
- package/dist/apify.d.ts +11 -0
- package/dist/apify.d.ts.map +1 -0
- package/dist/apify.js +107 -0
- package/dist/apify.js.map +1 -0
- package/dist/configuration.d.ts +43 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +87 -0
- package/dist/configuration.js.map +1 -0
- package/dist/filesystem.d.ts +8 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +16 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/json-schemas.d.ts +34 -0
- package/dist/json-schemas.d.ts.map +1 -0
- package/dist/json-schemas.js +185 -0
- package/dist/json-schemas.js.map +1 -0
- package/dist/typescript.d.ts +26 -0
- package/dist/typescript.d.ts.map +1 -0
- package/dist/typescript.js +316 -0
- package/dist/typescript.js.map +1 -0
- package/package.json +60 -0
- package/samples/all-defaults/.actor/actor.json +15 -0
- package/samples/all-defaults/.actor/dataset_schema.json +32 -0
- package/samples/all-defaults/.actor/input_schema.json +53 -0
- package/samples/all-defaults/src/generated/dataset.ts +24 -0
- package/samples/all-defaults/src/generated/input-utils.ts +60 -0
- package/samples/all-defaults/src/generated/input.ts +42 -0
- package/samples/all-defaults/src-schemas/dataset-item.json +28 -0
- package/samples/all-defaults/src-schemas/input.json +73 -0
- package/samples/deep-merged-schemas/.actor/actor.json +15 -0
- package/samples/deep-merged-schemas/.actor/dataset_schema.json +37 -0
- package/samples/deep-merged-schemas/.actor/input_schema.json +61 -0
- package/samples/deep-merged-schemas/add-schemas/dataset-item.json +10 -0
- package/samples/deep-merged-schemas/add-schemas/input.json +33 -0
- package/samples/deep-merged-schemas/src/generated/dataset.ts +28 -0
- package/samples/deep-merged-schemas/src/generated/input-utils.ts +66 -0
- package/samples/deep-merged-schemas/src/generated/input.ts +47 -0
- package/samples/deep-merged-schemas/src-schemas/dataset-item.json +28 -0
- package/samples/deep-merged-schemas/src-schemas/input.json +73 -0
- package/samples/merged-schemas/.actor/actor.json +15 -0
- package/samples/merged-schemas/.actor/dataset_schema.json +37 -0
- package/samples/merged-schemas/.actor/input_schema.json +58 -0
- package/samples/merged-schemas/add-schemas/dataset-item.json +10 -0
- package/samples/merged-schemas/add-schemas/input.json +33 -0
- package/samples/merged-schemas/src/generated/dataset.ts +28 -0
- package/samples/merged-schemas/src/generated/input-utils.ts +57 -0
- package/samples/merged-schemas/src/generated/input.ts +42 -0
- package/samples/merged-schemas/src-schemas/dataset-item.json +28 -0
- package/samples/merged-schemas/src-schemas/input.json +73 -0
- package/samples/package-json-config/.actor/actor.json +15 -0
- package/samples/package-json-config/.actor/dataset_schema.json +32 -0
- package/samples/package-json-config/.actor/input_schema.json +53 -0
- package/samples/package-json-config/custom-src-schemas/dataset-item.json +28 -0
- package/samples/package-json-config/custom-src-schemas/input.json +73 -0
- package/samples/package-json-config/package.json +11 -0
- package/samples/package-json-config/src/custom-generated/dataset.ts +24 -0
- package/samples/package-json-config/src/custom-generated/input-utils.ts +60 -0
- package/samples/package-json-config/src/custom-generated/input.ts +42 -0
- package/src/apify-schema-tools.ts +302 -0
- package/src/apify.ts +124 -0
- package/src/configuration.ts +110 -0
- package/src/filesystem.ts +18 -0
- package/src/json-schemas.ts +252 -0
- package/src/typescript.ts +381 -0
- package/test/apify-schema-tools.test.ts +2064 -0
- package/test/apify.test.ts +28 -0
- package/test/common.ts +19 -0
- package/test/configuration.test.ts +642 -0
- package/test/json-schemas.test.ts +587 -0
- package/test/typescript.test.ts +817 -0
- package/tsconfig.json +18 -0
- package/update-samples.sh +27 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as R from "ramda";
|
|
2
|
+
import { readFile, writeFile } from "./filesystem.js";
|
|
3
|
+
function isOrderedSchemaProperty(property) {
|
|
4
|
+
return typeof property.position === "number";
|
|
5
|
+
}
|
|
6
|
+
export function isArraySchema(schema) {
|
|
7
|
+
return schema.type === "array";
|
|
8
|
+
}
|
|
9
|
+
export function isObjectSchema(schema) {
|
|
10
|
+
return schema.type === "object";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Schemas are expected to be of type object at the root level.
|
|
14
|
+
*/
|
|
15
|
+
export function readJsonSchema(filePath) {
|
|
16
|
+
return JSON.parse(readFile(filePath));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Schemas are expected to be of type object at the root level.
|
|
20
|
+
*/
|
|
21
|
+
export function writeJsonSchema(filePath, schema) {
|
|
22
|
+
writeFile(filePath, JSON.stringify(schema, null, 4));
|
|
23
|
+
}
|
|
24
|
+
export function readJsonSchemaField(filePath, fieldName) {
|
|
25
|
+
const existingSchema = readJsonSchema(filePath);
|
|
26
|
+
if (!(fieldName in existingSchema)) {
|
|
27
|
+
throw new Error(`Field "${fieldName}" not found in schema "${filePath}"`);
|
|
28
|
+
}
|
|
29
|
+
if (!isObjectSchema(existingSchema[fieldName])) {
|
|
30
|
+
throw new Error(`Schema "${filePath} > ${fieldName}" is not an object schema`);
|
|
31
|
+
}
|
|
32
|
+
return existingSchema[fieldName];
|
|
33
|
+
}
|
|
34
|
+
export function writeSchemaToField(filePath, schema, fieldName) {
|
|
35
|
+
const existingSchema = readJsonSchema(filePath);
|
|
36
|
+
existingSchema[fieldName] = schema;
|
|
37
|
+
writeJsonSchema(filePath, existingSchema);
|
|
38
|
+
}
|
|
39
|
+
// Filtering properties
|
|
40
|
+
export function filterValidSchemaProperties(schema, validRootKeys, validPropertyKeys, validPropertyTypes, validPropertyKeysByType) {
|
|
41
|
+
const result = R.pick(validRootKeys, schema);
|
|
42
|
+
if (result.properties) {
|
|
43
|
+
result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => {
|
|
44
|
+
if (!value.type) {
|
|
45
|
+
throw new Error(`Property "${key}" is missing a type in the input schema`);
|
|
46
|
+
}
|
|
47
|
+
if (typeof value.type !== "string") {
|
|
48
|
+
throw new Error(`Property "${key}" has an invalid type "${value.type}" in the input schema: non-string types are not supported`);
|
|
49
|
+
}
|
|
50
|
+
if (!validPropertyTypes.includes(value.type)) {
|
|
51
|
+
throw new Error(`Invalid property type "${value.type}" for property "${key}" in the input schema`);
|
|
52
|
+
}
|
|
53
|
+
const validKeys = [...validPropertyKeys, ...(validPropertyKeysByType[value.type] ?? [])];
|
|
54
|
+
return [key, R.pick(validKeys, value)];
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
if (!isObjectSchema(result)) {
|
|
58
|
+
throw new Error("The resulting schema, after filtering valid properties, is not a valid object schema");
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
// Merging schemas
|
|
63
|
+
function mergeProperties(baseProperty, additionalProperty, deep) {
|
|
64
|
+
if (!deep) {
|
|
65
|
+
// If not deep merging, we just take the additional property
|
|
66
|
+
return additionalProperty;
|
|
67
|
+
}
|
|
68
|
+
if (isObjectSchema(baseProperty) && isObjectSchema(additionalProperty)) {
|
|
69
|
+
return mergeObjectSchemas(baseProperty, additionalProperty, deep);
|
|
70
|
+
}
|
|
71
|
+
if (isArraySchema(baseProperty) && isArraySchema(additionalProperty)) {
|
|
72
|
+
return mergeArraySchemas(baseProperty, additionalProperty, deep);
|
|
73
|
+
}
|
|
74
|
+
// If the property is not an object or array, we just take the additional property
|
|
75
|
+
return additionalProperty;
|
|
76
|
+
}
|
|
77
|
+
function mergeArraySchemas(baseSchema, additionalSchema, deep) {
|
|
78
|
+
const baseItems = baseSchema.items;
|
|
79
|
+
const additionalItems = additionalSchema.items;
|
|
80
|
+
if (baseItems && !Array.isArray(baseItems) && additionalItems && !Array.isArray(additionalItems)) {
|
|
81
|
+
return {
|
|
82
|
+
...baseSchema,
|
|
83
|
+
...additionalSchema,
|
|
84
|
+
items: mergeProperties(baseItems, additionalItems, deep),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
...baseSchema,
|
|
89
|
+
...additionalSchema,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function mergeObjectSchemas(baseSchema, additionalSchema, deep = true) {
|
|
93
|
+
const baseProperties = baseSchema.properties || {};
|
|
94
|
+
const additionalProperties = additionalSchema.properties || {};
|
|
95
|
+
const propertiesWithPosition = [];
|
|
96
|
+
const propertiesWithoutPosition = [];
|
|
97
|
+
function addProperty(key, property) {
|
|
98
|
+
if (isOrderedSchemaProperty(property)) {
|
|
99
|
+
propertiesWithPosition.push([key, property]);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
propertiesWithoutPosition.push([key, property]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
for (const [key, baseProperty] of Object.entries(baseProperties)) {
|
|
106
|
+
if (key in additionalProperties) {
|
|
107
|
+
const additionalProperty = additionalProperties[key];
|
|
108
|
+
addProperty(key, mergeProperties(baseProperty, additionalProperty, deep));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
addProperty(key, baseProperty);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Add properties that only exist in additional schema
|
|
115
|
+
for (const [key, additionalProperty] of Object.entries(additionalProperties)) {
|
|
116
|
+
if (!(key in baseProperties)) {
|
|
117
|
+
addProperty(key, additionalProperty);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
propertiesWithPosition.sort((a, b) => {
|
|
121
|
+
return a[1].position - b[1].position;
|
|
122
|
+
});
|
|
123
|
+
const properties = {
|
|
124
|
+
...Object.fromEntries(propertiesWithPosition),
|
|
125
|
+
...Object.fromEntries(propertiesWithoutPosition),
|
|
126
|
+
};
|
|
127
|
+
const required = baseSchema.required || additionalSchema.required
|
|
128
|
+
? Array.from(new Set([...(baseSchema.required || []), ...(additionalSchema.required || [])]))
|
|
129
|
+
: undefined;
|
|
130
|
+
return {
|
|
131
|
+
...baseSchema,
|
|
132
|
+
...additionalSchema,
|
|
133
|
+
properties,
|
|
134
|
+
required,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// Compare schemas
|
|
138
|
+
/**
|
|
139
|
+
* Fields which is safe to omit without breaking the JSON schema.
|
|
140
|
+
*/
|
|
141
|
+
const OMISSIBLE_FIELDS = ["title", "description"];
|
|
142
|
+
function omitFieldsFromSchema(schema, omitFields) {
|
|
143
|
+
const filteredSchema = R.omit(omitFields, schema);
|
|
144
|
+
if (isObjectSchema(filteredSchema) && filteredSchema.properties) {
|
|
145
|
+
filteredSchema.properties = Object.fromEntries(Object.entries(filteredSchema.properties).map(([key, value]) => {
|
|
146
|
+
return [key, omitFieldsFromSchema(value, omitFields)];
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
return filteredSchema;
|
|
150
|
+
}
|
|
151
|
+
const DESCRIPTION_FIELDS = ["title", "description"];
|
|
152
|
+
export function compareSchemas(a, b, ignoreDescriptions) {
|
|
153
|
+
return R.equals(ignoreDescriptions ? omitFieldsFromSchema(a, DESCRIPTION_FIELDS) : a, ignoreDescriptions ? omitFieldsFromSchema(b, DESCRIPTION_FIELDS) : b);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Compare descriptions of source and output schemas.
|
|
157
|
+
* Ignore properties that were removed from the source schema, or that were added to the source schema.
|
|
158
|
+
*/
|
|
159
|
+
export function compareDescriptions(sourceSchema, outputSchema) {
|
|
160
|
+
if (sourceSchema.title !== outputSchema.title || sourceSchema.description !== outputSchema.description) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
if (isObjectSchema(sourceSchema) && isObjectSchema(outputSchema)) {
|
|
164
|
+
if (sourceSchema.properties && outputSchema.properties) {
|
|
165
|
+
for (const [key, value] of Object.entries(sourceSchema.properties)) {
|
|
166
|
+
if (!(key in outputSchema.properties)) {
|
|
167
|
+
continue; // property is not present in the output schema
|
|
168
|
+
}
|
|
169
|
+
const otherValue = outputSchema.properties[key];
|
|
170
|
+
if (!compareDescriptions(value, otherValue)) {
|
|
171
|
+
return false; // property descriptions do not match
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (isArraySchema(sourceSchema) && isArraySchema(outputSchema)) {
|
|
177
|
+
if (sourceSchema.items && outputSchema.items) {
|
|
178
|
+
if (!compareDescriptions(sourceSchema.items, outputSchema.items)) {
|
|
179
|
+
return false; // items descriptions do not match
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=json-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schemas.js","sourceRoot":"","sources":["../src/json-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ObjectSchema } from "./json-schemas.js";
|
|
2
|
+
export declare function writeTypeScriptFile(filePath: string, content: string): void;
|
|
3
|
+
export declare function readGeneratedTypeScriptFile(filePath: string): string;
|
|
4
|
+
interface TypeScriptBasicData {
|
|
5
|
+
doc?: string;
|
|
6
|
+
isRequired: boolean;
|
|
7
|
+
isArray: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface TypeScriptBasicType extends TypeScriptBasicData {
|
|
10
|
+
type: string | string[];
|
|
11
|
+
}
|
|
12
|
+
interface TypeScriptEnum extends TypeScriptBasicData {
|
|
13
|
+
enum: unknown[];
|
|
14
|
+
}
|
|
15
|
+
export interface TypeScriptInterface extends TypeScriptBasicData {
|
|
16
|
+
properties: Record<string, TypeScriptSchema>;
|
|
17
|
+
}
|
|
18
|
+
export type TypeScriptSchema = TypeScriptBasicType | TypeScriptEnum | TypeScriptInterface;
|
|
19
|
+
export declare function jsonSchemaToTypeScriptInterface(schema: ObjectSchema): TypeScriptInterface;
|
|
20
|
+
export declare function serializeTypeScriptSchema(schema: TypeScriptSchema, indentLevel?: number): string;
|
|
21
|
+
export declare function serializeTypeScriptInterface(name: string, schema: TypeScriptInterface): string;
|
|
22
|
+
export declare function removeTypeScriptHeader(fileContent: string): string;
|
|
23
|
+
export declare function parseTypeScriptInterface(text: string): TypeScriptInterface;
|
|
24
|
+
export declare function compareTypescriptInterfaces(a: TypeScriptInterface, b: TypeScriptInterface, ignoreDocs?: boolean): boolean;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAiC,MAAM,mBAAmB,CAAC;AAuBrF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3E;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,UAAU,mBAAmB;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,mBAAoB,SAAQ,mBAAmB;IACxD,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxB;AAMD,UAAU,cAAe,SAAQ,mBAAmB;IACnD,IAAI,EAAE,OAAO,EAAE,CAAC;CAChB;AAMD,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC/D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC7C;AAMD,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAiD1F,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,mBAAmB,CAEzF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,SAAI,GAAG,MAAM,CAmC3F;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAI9F;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQlE;AAkID,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAe1E;AAED,wBAAgB,2BAA2B,CAC1C,CAAC,EAAE,mBAAmB,EACtB,CAAC,EAAE,mBAAmB,EACtB,UAAU,CAAC,EAAE,OAAO,GAClB,OAAO,CA4DT"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import * as R from "ramda";
|
|
2
|
+
import { readFile, writeFile } from "./filesystem.js";
|
|
3
|
+
import { isArraySchema, isObjectSchema } from "./json-schemas.js";
|
|
4
|
+
const TYPESCRIPT_FILE_HEADER = `\
|
|
5
|
+
/**
|
|
6
|
+
* This file was automatically generated by apify-schema-tools.
|
|
7
|
+
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
8
|
+
* and run apify-schema-tools' "sync" command to regenerate this file.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
`;
|
|
12
|
+
const TYPESCRIPT_ALLOWED_TYPES = ["string", "number", "boolean", "object", "null", "unknown"];
|
|
13
|
+
function isAllowedType(type) {
|
|
14
|
+
return TYPESCRIPT_ALLOWED_TYPES.includes(type);
|
|
15
|
+
}
|
|
16
|
+
const JSON_SCHEMA_TYPE_TO_TS_TYPE = {
|
|
17
|
+
integer: "number",
|
|
18
|
+
};
|
|
19
|
+
export function writeTypeScriptFile(filePath, content) {
|
|
20
|
+
writeFile(filePath, TYPESCRIPT_FILE_HEADER + content);
|
|
21
|
+
}
|
|
22
|
+
export function readGeneratedTypeScriptFile(filePath) {
|
|
23
|
+
const content = readFile(filePath);
|
|
24
|
+
return content.replace(TYPESCRIPT_FILE_HEADER, "");
|
|
25
|
+
}
|
|
26
|
+
function isTypeScriptBasicType(schema) {
|
|
27
|
+
return "type" in schema;
|
|
28
|
+
}
|
|
29
|
+
function isTypeScriptEnum(schema) {
|
|
30
|
+
return "enum" in schema;
|
|
31
|
+
}
|
|
32
|
+
function isTypeScriptInterface(schema) {
|
|
33
|
+
return "properties" in schema;
|
|
34
|
+
}
|
|
35
|
+
function jsonSchemaToTypeScriptSchema(schema, isArray, isRequired, inheritedDoc) {
|
|
36
|
+
const doc = inheritedDoc ?? schema.description;
|
|
37
|
+
if (isObjectSchema(schema)) {
|
|
38
|
+
const requiredProperties = schema.required ?? [];
|
|
39
|
+
const properties = Object.fromEntries(Object.entries(schema.properties ?? {}).map(([key, value]) => {
|
|
40
|
+
return [key, jsonSchemaToTypeScriptSchema(value, false, requiredProperties.includes(key))];
|
|
41
|
+
}));
|
|
42
|
+
return { doc, isArray, isRequired, properties };
|
|
43
|
+
}
|
|
44
|
+
if (isArraySchema(schema)) {
|
|
45
|
+
if (Array.isArray(schema.items)) {
|
|
46
|
+
throw new Error("Array schema with multiple items is not supported");
|
|
47
|
+
}
|
|
48
|
+
if (!schema.items) {
|
|
49
|
+
return { doc, isArray, isRequired, type: "unknown" };
|
|
50
|
+
}
|
|
51
|
+
return jsonSchemaToTypeScriptSchema(schema.items, true, isRequired, doc);
|
|
52
|
+
}
|
|
53
|
+
if (schema.enum) {
|
|
54
|
+
return { doc, isArray, isRequired, enum: schema.enum };
|
|
55
|
+
}
|
|
56
|
+
const types = [];
|
|
57
|
+
for (const type of Array.isArray(schema.type) ? schema.type : [schema.type ?? "unknown"]) {
|
|
58
|
+
const tsType = JSON_SCHEMA_TYPE_TO_TS_TYPE[type] ?? type;
|
|
59
|
+
if (!isAllowedType(tsType)) {
|
|
60
|
+
throw new Error(`Unsupported JSON schema type: ${type}`);
|
|
61
|
+
}
|
|
62
|
+
types.push(tsType);
|
|
63
|
+
}
|
|
64
|
+
if (schema.nullable) {
|
|
65
|
+
types.push("null");
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
doc,
|
|
69
|
+
isArray,
|
|
70
|
+
isRequired,
|
|
71
|
+
type: types.length === 1 ? types[0] : types,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function jsonSchemaToTypeScriptInterface(schema) {
|
|
75
|
+
return jsonSchemaToTypeScriptSchema(schema, false, true);
|
|
76
|
+
}
|
|
77
|
+
export function serializeTypeScriptSchema(schema, indentLevel = 0) {
|
|
78
|
+
const indent = "\t".repeat(indentLevel);
|
|
79
|
+
let result = "";
|
|
80
|
+
if (isTypeScriptInterface(schema)) {
|
|
81
|
+
const properties = Object.entries(schema.properties);
|
|
82
|
+
if (properties.length === 0) {
|
|
83
|
+
return "{}";
|
|
84
|
+
}
|
|
85
|
+
const innerIndentLevel = indentLevel + 1;
|
|
86
|
+
const innerIndent = "\t".repeat(innerIndentLevel);
|
|
87
|
+
result += "{";
|
|
88
|
+
for (const [key, value] of properties) {
|
|
89
|
+
if (value.doc) {
|
|
90
|
+
result += `\n${innerIndent}/**\n${innerIndent} * ${value.doc}\n${innerIndent} */`;
|
|
91
|
+
}
|
|
92
|
+
result += `\n${innerIndent}${key}${value.isRequired ? "" : "?"}: ${serializeTypeScriptSchema(value, innerIndentLevel)};`;
|
|
93
|
+
}
|
|
94
|
+
result += `\n${indent}}`;
|
|
95
|
+
}
|
|
96
|
+
else if (isTypeScriptEnum(schema)) {
|
|
97
|
+
const serializedEnum = JSON.stringify(schema.enum).replace(/\[|\]/g, "").replace(/,/g, " | ");
|
|
98
|
+
result += schema.isArray && schema.enum.length > 1 ? `(${serializedEnum})` : serializedEnum;
|
|
99
|
+
}
|
|
100
|
+
else if (Array.isArray(schema.type)) {
|
|
101
|
+
const serializedTypes = schema.type.join(" | ");
|
|
102
|
+
result += schema.isArray ? `(${serializedTypes})` : serializedTypes;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
result += schema.type;
|
|
106
|
+
}
|
|
107
|
+
if (schema.isArray) {
|
|
108
|
+
result += "[]";
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
export function serializeTypeScriptInterface(name, schema) {
|
|
113
|
+
const serializedSchema = serializeTypeScriptSchema(schema);
|
|
114
|
+
const docComment = schema.doc ? `/**\n * ${schema.doc}\n */\n` : "";
|
|
115
|
+
return `${docComment}export interface ${name} ${serializedSchema}${schema.isRequired ? "" : " | undefined"}`;
|
|
116
|
+
}
|
|
117
|
+
export function removeTypeScriptHeader(fileContent) {
|
|
118
|
+
// Match the first jsdoc and remove it
|
|
119
|
+
const headerMatch = fileContent.match(/\/\*\*[\s\S]*?\*\//);
|
|
120
|
+
if (!headerMatch || headerMatch.index === undefined) {
|
|
121
|
+
throw new Error("No header found in the TypeScript file");
|
|
122
|
+
}
|
|
123
|
+
const headerEndIndex = headerMatch.index + headerMatch[0].length;
|
|
124
|
+
return fileContent.slice(headerEndIndex).trim();
|
|
125
|
+
}
|
|
126
|
+
function parseInterfaceProperties(body) {
|
|
127
|
+
const properties = {};
|
|
128
|
+
let i = 0;
|
|
129
|
+
let currentDoc;
|
|
130
|
+
while (i < body.length) {
|
|
131
|
+
const char = body[i];
|
|
132
|
+
// Skip whitespace
|
|
133
|
+
if (/\s/.test(char)) {
|
|
134
|
+
i++;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Parse JSDoc comment
|
|
138
|
+
if (body.slice(i, i + 3) === "/**") {
|
|
139
|
+
const docEnd = body.indexOf("*/", i);
|
|
140
|
+
if (docEnd !== -1) {
|
|
141
|
+
const docContent = body.slice(i + 3, docEnd);
|
|
142
|
+
const docLines = docContent.split("\n");
|
|
143
|
+
const cleanDoc = docLines
|
|
144
|
+
.map((line) => line.replace(/^\s*\*\s?/, "").trim())
|
|
145
|
+
.filter((line) => line.length > 0)
|
|
146
|
+
.join(" ");
|
|
147
|
+
currentDoc = cleanDoc || undefined;
|
|
148
|
+
i = docEnd + 2;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Parse property
|
|
153
|
+
const propMatch = body.slice(i).match(/^(\w+)(\?)?:\s*/);
|
|
154
|
+
if (propMatch) {
|
|
155
|
+
const propName = propMatch[1];
|
|
156
|
+
const isRequired = !propMatch[2];
|
|
157
|
+
i += propMatch[0].length;
|
|
158
|
+
// Find the type
|
|
159
|
+
const typeStart = i;
|
|
160
|
+
let braceDepth = 0;
|
|
161
|
+
let typeEnd = i;
|
|
162
|
+
while (typeEnd < body.length) {
|
|
163
|
+
const char = body[typeEnd];
|
|
164
|
+
if (char === "{") {
|
|
165
|
+
braceDepth++;
|
|
166
|
+
}
|
|
167
|
+
else if (char === "}") {
|
|
168
|
+
braceDepth--;
|
|
169
|
+
if (braceDepth < 0) {
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (char === ";" && braceDepth === 0) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
typeEnd++;
|
|
177
|
+
}
|
|
178
|
+
let typeStr = body.slice(typeStart, typeEnd).trim();
|
|
179
|
+
const isArray = typeStr.endsWith("[]");
|
|
180
|
+
if (isArray) {
|
|
181
|
+
typeStr = typeStr.slice(0, -2).trim(); // Remove the "[]" part
|
|
182
|
+
}
|
|
183
|
+
// Parse the type
|
|
184
|
+
let schema;
|
|
185
|
+
if (typeStr.startsWith("{") && typeStr.endsWith("}")) {
|
|
186
|
+
// Object type
|
|
187
|
+
const objectBody = typeStr.slice(1, -1); // Remove { and }
|
|
188
|
+
const nestedProperties = parseInterfaceProperties(objectBody);
|
|
189
|
+
schema = {
|
|
190
|
+
doc: currentDoc,
|
|
191
|
+
isArray,
|
|
192
|
+
isRequired,
|
|
193
|
+
properties: nestedProperties,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
else if (typeStr.includes("|")) {
|
|
197
|
+
const unionBody = isArray
|
|
198
|
+
? typeStr.slice(1, -1) // Remove ( and )
|
|
199
|
+
: typeStr;
|
|
200
|
+
const unionParts = unionBody.split("|").map((part) => part.trim());
|
|
201
|
+
if (unionParts.every((part) => isAllowedType(part))) {
|
|
202
|
+
// Multiple primitive types
|
|
203
|
+
schema = {
|
|
204
|
+
doc: currentDoc,
|
|
205
|
+
isArray,
|
|
206
|
+
isRequired,
|
|
207
|
+
type: unionParts,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Enum
|
|
212
|
+
try {
|
|
213
|
+
const enumValues = JSON.parse(`[${unionBody.replace(/\|/g, ",")}]`);
|
|
214
|
+
schema = {
|
|
215
|
+
doc: currentDoc,
|
|
216
|
+
isArray,
|
|
217
|
+
isRequired,
|
|
218
|
+
enum: enumValues,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
throw new Error(`Invalid enum format for property "${propName}": ${typeStr}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Primitive type
|
|
228
|
+
schema = {
|
|
229
|
+
doc: currentDoc,
|
|
230
|
+
isArray,
|
|
231
|
+
isRequired,
|
|
232
|
+
type: typeStr,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
properties[propName] = schema;
|
|
236
|
+
currentDoc = undefined;
|
|
237
|
+
i = typeEnd;
|
|
238
|
+
// Skip semicolon
|
|
239
|
+
if (body[i] === ";") {
|
|
240
|
+
i++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
i++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return properties;
|
|
248
|
+
}
|
|
249
|
+
export function parseTypeScriptInterface(text) {
|
|
250
|
+
// Extract JSDoc comment
|
|
251
|
+
const docMatch = text.match(/\/\*\*\s*\n\s*\*\s*(.*?)\s*\n\s*\*\//);
|
|
252
|
+
const doc = docMatch ? docMatch[1] : undefined;
|
|
253
|
+
// Extract interface declaration
|
|
254
|
+
const interfaceMatch = text.match(/export interface (\w+) \{([\s\S]*)\}$/);
|
|
255
|
+
if (!interfaceMatch) {
|
|
256
|
+
throw new Error("Invalid TypeScript interface format");
|
|
257
|
+
}
|
|
258
|
+
const body = interfaceMatch[2];
|
|
259
|
+
const properties = parseInterfaceProperties(body);
|
|
260
|
+
return { doc, isArray: false, isRequired: true, properties };
|
|
261
|
+
}
|
|
262
|
+
export function compareTypescriptInterfaces(a, b, ignoreDocs) {
|
|
263
|
+
if (Object.keys(a.properties).length !== Object.keys(b.properties).length) {
|
|
264
|
+
console.error("Interfaces have different number of properties.");
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
for (const key in a.properties) {
|
|
268
|
+
if (!(key in b.properties)) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
const propA = a.properties[key];
|
|
272
|
+
const propB = b.properties[key];
|
|
273
|
+
if (propA.isArray !== propB.isArray) {
|
|
274
|
+
console.error(`Property "${key}" has different array status: ${propA.isArray} vs ${propB.isArray}`);
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
if (propA.isRequired !== propB.isRequired) {
|
|
278
|
+
console.error(`Property "${key}" has different required status: ${propA.isRequired} vs ${propB.isRequired}`);
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
if (!ignoreDocs && propA.doc !== propB.doc) {
|
|
282
|
+
console.error(`Property "${key}" has different documentation: "${propA.doc}" vs "${propB.doc}"`);
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
if (isTypeScriptInterface(propA)) {
|
|
286
|
+
if (!isTypeScriptInterface(propB)) {
|
|
287
|
+
console.error(`Property "${key}" is an interface in one schema but not in the other.`);
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (!compareTypescriptInterfaces(propA, propB, ignoreDocs)) {
|
|
291
|
+
console.error(`Property "${key}" interfaces do not match.`);
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (isTypeScriptEnum(propA)) {
|
|
296
|
+
if (!isTypeScriptEnum(propB)) {
|
|
297
|
+
console.error(`Property "${key}" is an enum in one schema but not in the other.`);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
if (JSON.stringify(propA.enum) !== JSON.stringify(propB.enum)) {
|
|
301
|
+
console.error(`Property "${key}" enums do not match: ${JSON.stringify(propA.enum)} vs ${JSON.stringify(propB.enum)}`);
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else if (!isTypeScriptBasicType(propB)) {
|
|
306
|
+
console.error(`Property "${key}" is a basic type in one schema but not in the other.`);
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
else if (!R.equals(propA.type, propB.type)) {
|
|
310
|
+
console.error(`Property "${key}" types do not match: ${JSON.stringify(propA.type)} vs ${JSON.stringify(propB.type)}`);
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "apify-schema-tools",
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "Apify schema managing tools.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"apify-schema-tools": "dist/apify-schema-tools.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"prepare": "husky",
|
|
14
|
+
"check": "biome check .",
|
|
15
|
+
"check:write": "biome check . --write"
|
|
16
|
+
},
|
|
17
|
+
"author": "gullmar",
|
|
18
|
+
"license": "Apache-2.0",
|
|
19
|
+
"keywords": ["apify", "schema", "tools", "cli", "typescript", "json-schema", "synchronization", "validation"],
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://codeberg.org/gullmar/apify-schema-tools.git"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://codeberg.org/gullmar/apify-schema-tools#readme",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@apify/tsconfig": "^0.1.1",
|
|
28
|
+
"@biomejs/biome": "1.9.4",
|
|
29
|
+
"@types/argparse": "^2.0.17",
|
|
30
|
+
"@types/json-schema": "^7.0.15",
|
|
31
|
+
"@types/minimist": "^1.2.5",
|
|
32
|
+
"@types/node": "^24.0.1",
|
|
33
|
+
"@types/ramda": "^0.30.2",
|
|
34
|
+
"apify": "^3.4.2",
|
|
35
|
+
"cspell": "^9.0.2",
|
|
36
|
+
"husky": "^9.1.7",
|
|
37
|
+
"typescript": "^5.8.3",
|
|
38
|
+
"vitest": "^3.2.3"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"argparse": "^2.0.1",
|
|
42
|
+
"ramda": "^0.30.1",
|
|
43
|
+
"zod": "^3.25.74"
|
|
44
|
+
},
|
|
45
|
+
"cspell": {
|
|
46
|
+
"version": "0.2",
|
|
47
|
+
"ignorePaths": [],
|
|
48
|
+
"dictionaryDefinitions": [
|
|
49
|
+
{
|
|
50
|
+
"name": "custom-dictionary",
|
|
51
|
+
"path": "./.cspell/custom-dictionary.txt",
|
|
52
|
+
"addWords": true
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"dictionaries": ["custom-dictionary"],
|
|
56
|
+
"words": [],
|
|
57
|
+
"ignoreWords": [],
|
|
58
|
+
"import": []
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"actorSpecification": 1,
|
|
3
|
+
"name": "web-scraper",
|
|
4
|
+
"title": "Web Scraper",
|
|
5
|
+
"description": "A web scraper.",
|
|
6
|
+
"version": "0.0",
|
|
7
|
+
"meta": {
|
|
8
|
+
"templateId": "ts-crawlee-playwright-chrome"
|
|
9
|
+
},
|
|
10
|
+
"input": "./input_schema.json",
|
|
11
|
+
"storages": {
|
|
12
|
+
"dataset": "./dataset_schema.json"
|
|
13
|
+
},
|
|
14
|
+
"dockerfile": "./Dockerfile"
|
|
15
|
+
}
|