apify-schema-tools 3.1.0 → 3.2.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/.node-version +1 -1
- package/CHANGELOG.md +7 -1
- package/biome.json +8 -2
- package/dist/apify-schema-tools.js +12 -9
- package/dist/apify-schema-tools.js.map +1 -1
- package/dist/apify.d.ts +1 -1
- package/dist/apify.d.ts.map +1 -1
- package/dist/apify.js +19 -5
- package/dist/apify.js.map +1 -1
- package/dist/cli/check.d.ts +5 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +86 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +92 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/sync.d.ts +5 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +112 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/configuration.d.ts +14 -5
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js +9 -5
- package/dist/configuration.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +19 -0
- package/dist/main.js.map +1 -0
- package/dist/middle-schema/compare-schemas.d.ts +3 -0
- package/dist/middle-schema/compare-schemas.d.ts.map +1 -0
- package/dist/middle-schema/compare-schemas.js +90 -0
- package/dist/middle-schema/compare-schemas.js.map +1 -0
- package/dist/middle-schema/generate-typescript.d.ts +7 -0
- package/dist/middle-schema/generate-typescript.d.ts.map +1 -0
- package/dist/middle-schema/generate-typescript.js +70 -0
- package/dist/middle-schema/generate-typescript.js.map +1 -0
- package/dist/middle-schema/parse-json-schema.d.ts +4 -0
- package/dist/middle-schema/parse-json-schema.d.ts.map +1 -0
- package/dist/middle-schema/parse-json-schema.js +65 -0
- package/dist/middle-schema/parse-json-schema.js.map +1 -0
- package/dist/middle-schema/parse-typescript.d.ts +4 -0
- package/dist/middle-schema/parse-typescript.d.ts.map +1 -0
- package/dist/middle-schema/parse-typescript.js +199 -0
- package/dist/middle-schema/parse-typescript.js.map +1 -0
- package/dist/middle-schema/schema-types.d.ts +24 -0
- package/dist/middle-schema/schema-types.d.ts.map +1 -0
- package/dist/middle-schema/schema-types.js +14 -0
- package/dist/middle-schema/schema-types.js.map +1 -0
- package/dist/middle-schema/schema.d.ts +24 -0
- package/dist/middle-schema/schema.d.ts.map +1 -0
- package/dist/middle-schema/schema.js +14 -0
- package/dist/middle-schema/schema.js.map +1 -0
- package/dist/schema/entities/abstract-entity.d.ts +5 -0
- package/dist/schema/entities/abstract-entity.d.ts.map +1 -0
- package/dist/schema/entities/abstract-entity.js +3 -0
- package/dist/schema/entities/abstract-entity.js.map +1 -0
- package/dist/schema/entities/primitive-union.d.ts +12 -0
- package/dist/schema/entities/primitive-union.d.ts.map +1 -0
- package/dist/schema/entities/primitive-union.js +74 -0
- package/dist/schema/entities/primitive-union.js.map +1 -0
- package/dist/schema/entities/primitive.d.ts +15 -0
- package/dist/schema/entities/primitive.d.ts.map +1 -0
- package/dist/schema/entities/primitive.js +54 -0
- package/dist/schema/entities/primitive.js.map +1 -0
- package/dist/schema/parsers/json-schema.d.ts +4 -0
- package/dist/schema/parsers/json-schema.d.ts.map +1 -0
- package/dist/schema/parsers/json-schema.js +12 -0
- package/dist/schema/parsers/json-schema.js.map +1 -0
- package/dist/schema/parsers/typescript.d.ts +3 -0
- package/dist/schema/parsers/typescript.d.ts.map +1 -0
- package/dist/schema/parsers/typescript.js +24 -0
- package/dist/schema/parsers/typescript.js.map +1 -0
- package/dist/schemas/input.d.ts +840 -0
- package/dist/schemas/input.d.ts.map +1 -0
- package/dist/schemas/input.js +349 -0
- package/dist/schemas/input.js.map +1 -0
- package/dist/utils/filesystem.d.ts +8 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +16 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/json-schemas-interactive-conflict.d.ts +16 -0
- package/dist/utils/json-schemas-interactive-conflict.d.ts.map +1 -0
- package/dist/utils/json-schemas-interactive-conflict.js +165 -0
- package/dist/utils/json-schemas-interactive-conflict.js.map +1 -0
- package/dist/utils/json-schemas.d.ts +42 -0
- package/dist/utils/json-schemas.d.ts.map +1 -0
- package/dist/utils/json-schemas.js +162 -0
- package/dist/utils/json-schemas.js.map +1 -0
- package/dist/zod/schemas/input.d.ts +840 -0
- package/dist/zod/schemas/input.d.ts.map +1 -0
- package/dist/zod/schemas/input.js +393 -0
- package/dist/zod/schemas/input.js.map +1 -0
- package/package.json +12 -12
- package/samples/all-defaults/.actor/input_schema.json +32 -3
- package/samples/all-defaults/src-schemas/input.json +2 -1
- package/samples/deep-merged-schemas/.actor/input_schema.json +36 -3
- package/samples/merged-schemas/.actor/input_schema.json +27 -3
- package/samples/package-json-config/.actor/input_schema.json +32 -3
- package/samples/package-json-config-merged/.actor/input_schema.json +36 -3
- package/src/apify.ts +21 -6
- package/src/cli/check.ts +114 -0
- package/src/cli/init.ts +125 -0
- package/src/cli/sync.ts +164 -0
- package/src/configuration.ts +17 -7
- package/src/main.ts +25 -0
- package/src/middle-schema/compare-schemas.ts +113 -0
- package/src/middle-schema/generate-typescript.ts +88 -0
- package/src/middle-schema/parse-json-schema.ts +104 -0
- package/src/middle-schema/parse-typescript.ts +239 -0
- package/src/middle-schema/schema-types.ts +40 -0
- package/test/apify.test.ts +410 -2
- package/test/cli/check.test.ts +1571 -0
- package/test/cli/init.test.ts +459 -0
- package/test/cli/sync.test.ts +341 -0
- package/test/common.ts +68 -0
- package/test/configuration.test.ts +8 -8
- package/test/middle-schema/compare-schemas.test.ts +585 -0
- package/test/middle-schema/generate-typescript.test.ts +191 -0
- package/test/middle-schema/parse-json-schema.test.ts +178 -0
- package/test/middle-schema/parse-typescript.test.ts +143 -0
- package/test/{json-schema-conflicts.test.ts → utils/json-schemas-interactive-conflict.test.ts} +2 -2
- package/test/{json-schemas.test.ts → utils/json-schemas.test.ts} +3 -3
- package/src/apify-schema-tools.ts +0 -420
- package/src/typescript.ts +0 -563
- package/test/apify-schema-tools.test.ts +0 -2216
- package/test/typescript.test.ts +0 -1079
- /package/src/{filesystem.ts → utils/filesystem.ts} +0 -0
- /package/src/{json-schema-conflicts.ts → utils/json-schemas-interactive-conflict.ts} +0 -0
- /package/src/{json-schemas.ts → utils/json-schemas.ts} +0 -0
package/dist/configuration.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ declare const INPUTS: readonly ["input", "dataset"];
|
|
|
5
5
|
declare const OUTPUTS: readonly ["json-schemas", "ts-types"];
|
|
6
6
|
type Input = (typeof INPUTS)[number];
|
|
7
7
|
type Output = (typeof OUTPUTS)[number];
|
|
8
|
+
/**
|
|
9
|
+
* These CLI arguments are also available in the configuration file.
|
|
10
|
+
* They are in snake_case because `argparse` uses it for argument names.
|
|
11
|
+
*/
|
|
8
12
|
export interface CommonCliArgs {
|
|
9
13
|
input: Input[];
|
|
10
14
|
output: Output[];
|
|
@@ -17,7 +21,11 @@ export interface CommonCliArgs {
|
|
|
17
21
|
dataset_schema: string;
|
|
18
22
|
output_ts_dir: string;
|
|
19
23
|
}
|
|
20
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Zod schema for the configuration file.
|
|
26
|
+
* Since the configuration is in JSON format, we use camelCase.
|
|
27
|
+
*/
|
|
28
|
+
export declare const CONFIGURATION_SCHEMA: import("zod/v4").ZodObject<{
|
|
21
29
|
input: import("zod/v4").ZodDefault<import("zod/v4").ZodArray<import("zod/v4").ZodEnum<{
|
|
22
30
|
input: "input";
|
|
23
31
|
dataset: "dataset";
|
|
@@ -35,12 +43,13 @@ export declare const Configuration: import("zod/v4").ZodObject<{
|
|
|
35
43
|
datasetSchema: import("zod/v4").ZodDefault<import("zod/v4").ZodString>;
|
|
36
44
|
outputTSDir: import("zod/v4").ZodDefault<import("zod/v4").ZodString>;
|
|
37
45
|
}, import("zod/v4/core").$strip>;
|
|
38
|
-
export
|
|
46
|
+
export type Configuration = zodInfer<typeof CONFIGURATION_SCHEMA>;
|
|
47
|
+
export declare function parseConfigurationFromFileOrDefault(): Configuration;
|
|
39
48
|
export declare function writeConfigurationToPackageJson(args: CommonCliArgs): void;
|
|
40
49
|
/**
|
|
41
|
-
* This function will set as default values the configuration
|
|
42
|
-
* In this way, the CLI arguments can override the configuration.
|
|
50
|
+
* This function will set as default values the configuration file, or the default one.
|
|
51
|
+
* In this way, the CLI arguments can override the configuration file.
|
|
43
52
|
*/
|
|
44
|
-
export declare function addCommonCliArgs(parser: ArgumentParser, configuration: zodInfer<typeof
|
|
53
|
+
export declare function addCommonCliArgs(parser: ArgumentParser, configuration: zodInfer<typeof CONFIGURATION_SCHEMA>): void;
|
|
45
54
|
export {};
|
|
46
55
|
//# sourceMappingURL=configuration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAG9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAiD,KAAK,KAAK,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAW/F,QAAA,MAAM,MAAM,+BAAgC,CAAC;AAC7C,QAAA,MAAM,OAAO,uCAAwC,CAAC;AAEtD,KAAK,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACrC,KAAK,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAG9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAiD,KAAK,KAAK,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAW/F,QAAA,MAAM,MAAM,+BAAgC,CAAC;AAC7C,QAAA,MAAM,OAAO,uCAAwC,CAAC;AAEtD,KAAK,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACrC,KAAK,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;gCAW/B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAgB,mCAAmC,IAAI,aAAa,CAInE;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAmBzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,CAAC,OAAO,oBAAoB,CAAC,GAAG,IAAI,CAiDnH"}
|
package/dist/configuration.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** biome-ignore-all lint/style/useNamingConvention: parsed CLI arguments are in snake_case */
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { array, boolean, enum as enum_, object, string } from "zod/v4";
|
|
4
|
-
import { readFile, writeFile } from "./filesystem.js";
|
|
4
|
+
import { readFile, writeFile } from "./utils/filesystem.js";
|
|
5
5
|
const zod = {
|
|
6
6
|
object,
|
|
7
7
|
array,
|
|
@@ -11,7 +11,11 @@ const zod = {
|
|
|
11
11
|
};
|
|
12
12
|
const INPUTS = ["input", "dataset"];
|
|
13
13
|
const OUTPUTS = ["json-schemas", "ts-types"];
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Zod schema for the configuration file.
|
|
16
|
+
* Since the configuration is in JSON format, we use camelCase.
|
|
17
|
+
*/
|
|
18
|
+
export const CONFIGURATION_SCHEMA = zod.object({
|
|
15
19
|
input: zod.array(zod.enum(INPUTS)).default([...INPUTS]),
|
|
16
20
|
output: zod.array(zod.enum(OUTPUTS)).default([...OUTPUTS]),
|
|
17
21
|
srcInput: zod.string().default("src-schemas/input.json"),
|
|
@@ -26,7 +30,7 @@ export const Configuration = zod.object({
|
|
|
26
30
|
export function parseConfigurationFromFileOrDefault() {
|
|
27
31
|
const packageJsonContent = existsSync("package.json") ? readFile("package.json") : undefined;
|
|
28
32
|
const rawConfig = packageJsonContent ? (JSON.parse(packageJsonContent)["apify-schema-tools"] ?? {}) : {};
|
|
29
|
-
return
|
|
33
|
+
return CONFIGURATION_SCHEMA.parse(rawConfig);
|
|
30
34
|
}
|
|
31
35
|
export function writeConfigurationToPackageJson(args) {
|
|
32
36
|
if (!existsSync("package.json")) {
|
|
@@ -49,8 +53,8 @@ export function writeConfigurationToPackageJson(args) {
|
|
|
49
53
|
writeFile("package.json", JSON.stringify(packageJson, null, 2));
|
|
50
54
|
}
|
|
51
55
|
/**
|
|
52
|
-
* This function will set as default values the configuration
|
|
53
|
-
* In this way, the CLI arguments can override the configuration.
|
|
56
|
+
* This function will set as default values the configuration file, or the default one.
|
|
57
|
+
* In this way, the CLI arguments can override the configuration file.
|
|
54
58
|
*/
|
|
55
59
|
export function addCommonCliArgs(parser, configuration) {
|
|
56
60
|
parser.add_argument("-i", "--input", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAA0B,MAAM,QAAQ,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,GAAG,GAAG;IACX,MAAM;IACN,KAAK;IACL,OAAO;IACP,IAAI,EAAE,KAAK;IACX,MAAM;CACN,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAC;AAC7C,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,UAAU,CAAU,CAAC;AAsBtD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC;IAC9C,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IAC1D,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACxD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC;IACjE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACvC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC7D,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC;IACjE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;CAClD,CAAC,CAAC;AAIH,MAAM,UAAU,mCAAmC;IAClD,MAAM,kBAAkB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,IAAmB;IAClE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnD,WAAW,CAAC,oBAAoB,CAAC,GAAG;QACnC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,aAAa,EAAE,IAAI,CAAC,cAAc;QAClC,WAAW,EAAE,IAAI,CAAC,aAAa;KAC/B,CAAC;IACF,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAE,aAAoD;IAC5G,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE;QACpC,IAAI,EAAE,6CAA6C;QACnD,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC;QACpB,OAAO,EAAE,aAAa,CAAC,KAAK;QAC5B,KAAK,EAAE,GAAG;KACV,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE;QACrC,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,OAAO,EAAE,aAAa,CAAC,MAAM;QAC7B,KAAK,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QAClC,IAAI,EAAE,sCAAsC;QAC5C,OAAO,EAAE,aAAa,CAAC,QAAQ;KAC/B,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACpC,IAAI,EAAE,wCAAwC;QAC9C,OAAO,EAAE,aAAa,CAAC,UAAU;KACjC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QAClC,IAAI,EAAE,6DAA6D;QACnE,OAAO,EAAE,aAAa,CAAC,QAAQ;KAC/B,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACpC,IAAI,EAAE,+DAA+D;QACrE,OAAO,EAAE,aAAa,CAAC,UAAU;KACjC,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE;QACnC,IAAI,EAAE,+DAA+D;QACrE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,aAAa,CAAC,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,gBAAgB,EAAE;QACrC,IAAI,EAAE,+CAA+C;QACrD,OAAO,EAAE,aAAa,CAAC,WAAW;KAClC,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE;QACvC,IAAI,EAAE,iDAAiD;QACvD,OAAO,EAAE,aAAa,CAAC,aAAa;KACpC,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACtC,IAAI,EAAE,+CAA+C;QACrD,OAAO,EAAE,aAAa,CAAC,WAAW;KAClC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,oGAAoG"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** biome-ignore-all lint/style/useNamingConvention: the package `argparse` uses snake_case names */
|
|
3
|
+
import { ArgumentDefaultsHelpFormatter, ArgumentParser } from "argparse";
|
|
4
|
+
import { setupCheckParser } from "./cli/check.js";
|
|
5
|
+
import { setupInitParser } from "./cli/init.js";
|
|
6
|
+
import { setupSyncParser } from "./cli/sync.js";
|
|
7
|
+
import { parseConfigurationFromFileOrDefault } from "./configuration.js";
|
|
8
|
+
const configuration = parseConfigurationFromFileOrDefault();
|
|
9
|
+
const rootParser = new ArgumentParser({
|
|
10
|
+
description: "Apify Schema Tools - Generate JSON schemas and TypeScript files for Actor input and output dataset.",
|
|
11
|
+
formatter_class: ArgumentDefaultsHelpFormatter,
|
|
12
|
+
});
|
|
13
|
+
const subparsers = rootParser.add_subparsers();
|
|
14
|
+
setupInitParser(subparsers, configuration);
|
|
15
|
+
setupSyncParser(subparsers, configuration);
|
|
16
|
+
setupCheckParser(subparsers, configuration);
|
|
17
|
+
const parsedArgs = rootParser.parse_args();
|
|
18
|
+
parsedArgs.func(parsedArgs);
|
|
19
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,oGAAoG;AAEpG,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,aAAa,GAAG,mCAAmC,EAAE,CAAC;AAE5D,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC;IACrC,WAAW,EAAE,qGAAqG;IAClH,eAAe,EAAE,6BAA6B;CAC9C,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;AAE/C,eAAe,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3C,eAAe,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3C,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE5C,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;AAC3C,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-schemas.d.ts","sourceRoot":"","sources":["../../src/middle-schema/compare-schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAMN,KAAK,YAAY,EAEjB,MAAM,mBAAmB,CAAC;AA+E3B,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAwBpG"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { equals } from "ramda";
|
|
2
|
+
import { isMiddleBasicVar, isMiddleEnum, isMiddleObject, } from "./schema-types.js";
|
|
3
|
+
function compareObjectProperties(key, propA, propB, ignoreDocs) {
|
|
4
|
+
if (!isMiddleObject(propB)) {
|
|
5
|
+
console.error(`Property "${key}" is an interface in one schema but not in the other.`);
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
if (!compareMiddleObjects(propA, propB, ignoreDocs)) {
|
|
9
|
+
console.error(`Property "${key}" interfaces do not match.`);
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
function compareEnumProperties(key, propA, propB) {
|
|
15
|
+
if (!isMiddleEnum(propB)) {
|
|
16
|
+
console.error(`Property "${key}" is an enum in one schema but not in the other.`);
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (JSON.stringify(propA.enum) !== JSON.stringify(propB.enum)) {
|
|
20
|
+
console.error(`Property "${key}" enums do not match: ${JSON.stringify(propA.enum)} vs ${JSON.stringify(propB.enum)}`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
function compareBasicVarProperties(key, propA, propB) {
|
|
26
|
+
if (!isMiddleBasicVar(propB)) {
|
|
27
|
+
console.error(`Property "${key}" is a basic var in one schema but not in the other.`);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (!equals(propA.type, propB.type)) {
|
|
31
|
+
console.error(`Property "${key}" types do not match: ${JSON.stringify(propA.type)} vs ${JSON.stringify(propB.type)}`);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function compareProperties(key, propA, propB, ignoreDocs) {
|
|
37
|
+
if (propA.isArray !== propB.isArray) {
|
|
38
|
+
console.error(`Property "${key}" has different array status: ${propA.isArray} vs ${propB.isArray}`);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (propA.isRequired !== propB.isRequired) {
|
|
42
|
+
console.error(`Property "${key}" has different required status: ${propA.isRequired} vs ${propB.isRequired}`);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (!ignoreDocs && propA.doc !== propB.doc) {
|
|
46
|
+
console.error(`Property "${key}" has different documentation: "${propA.doc}" vs "${propB.doc}"`);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (isMiddleObject(propA)) {
|
|
50
|
+
return compareObjectProperties(key, propA, propB, ignoreDocs);
|
|
51
|
+
}
|
|
52
|
+
if (isMiddleEnum(propA)) {
|
|
53
|
+
return compareEnumProperties(key, propA, propB);
|
|
54
|
+
}
|
|
55
|
+
return compareBasicVarProperties(key, propA, propB);
|
|
56
|
+
}
|
|
57
|
+
function compareAdditionalProperties(a, b, ignoreDocs) {
|
|
58
|
+
if (!(a.additionalProperties || b.additionalProperties)) {
|
|
59
|
+
return true; // Both have no additional properties
|
|
60
|
+
}
|
|
61
|
+
if (!(a.additionalProperties && b.additionalProperties)) {
|
|
62
|
+
console.error(`One interface has additionalProperties defined, but the other does not.
|
|
63
|
+
If you generated an interface from a JSON schema, pay attention that "additionalProperties" is set to an empty schema by default.`);
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return compareProperties("[key: string]", a.additionalProperties, b.additionalProperties, ignoreDocs);
|
|
67
|
+
}
|
|
68
|
+
export function compareMiddleObjects(a, b, ignoreDocs) {
|
|
69
|
+
if (Object.keys(a.properties).length !== Object.keys(b.properties).length) {
|
|
70
|
+
console.error("Interfaces have different number of properties.");
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
for (const key in a.properties) {
|
|
74
|
+
if (Object.hasOwn(a.properties, key)) {
|
|
75
|
+
if (!(key in b.properties)) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const propA = a.properties[key];
|
|
79
|
+
const propB = b.properties[key];
|
|
80
|
+
if (!compareProperties(key, propA, propB, ignoreDocs)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!compareAdditionalProperties(a, b, ignoreDocs)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=compare-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-schemas.js","sourceRoot":"","sources":["../../src/middle-schema/compare-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type MiddleObject, type MiddleSchema } from "./schema-types.js";
|
|
2
|
+
export declare const TYPESCRIPT_FILE_HEADER = "/**\n * This file was automatically generated by apify-schema-tools.\n * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,\n * and run apify-schema-tools' \"sync\" command to regenerate this file.\n */\n\n";
|
|
3
|
+
export declare function serializeMiddleSchemaToTypeScript(schema: MiddleSchema, indentLevel?: number): string;
|
|
4
|
+
export declare function serializeMiddleObjectToTypeScript(name: string, schema: MiddleObject): string;
|
|
5
|
+
export declare function writeTypeScriptFile(filePath: string, content: string): void;
|
|
6
|
+
export declare function readGeneratedTypeScriptFile(filePath: string): string;
|
|
7
|
+
//# sourceMappingURL=generate-typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-typescript.d.ts","sourceRoot":"","sources":["../../src/middle-schema/generate-typescript.ts"],"names":[],"mappings":"AACA,OAAO,EAMN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,sBAAsB,sOAOlC,CAAC;AAyCF,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,SAAI,GAAG,MAAM,CAa/F;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAI5F;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3E;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readFile, writeFile } from "../utils/filesystem.js";
|
|
2
|
+
import { isMiddleBasicVar, isMiddleEnum, isMiddleObject, } from "./schema-types.js";
|
|
3
|
+
export const TYPESCRIPT_FILE_HEADER = `\
|
|
4
|
+
/**
|
|
5
|
+
* This file was automatically generated by apify-schema-tools.
|
|
6
|
+
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
|
7
|
+
* and run apify-schema-tools' "sync" command to regenerate this file.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
`;
|
|
11
|
+
function serializeInterfaceSchema(schema, indentLevel) {
|
|
12
|
+
const indent = "\t".repeat(indentLevel);
|
|
13
|
+
const properties = Object.entries(schema.properties);
|
|
14
|
+
if (properties.length === 0 && !schema.additionalProperties) {
|
|
15
|
+
return "{}";
|
|
16
|
+
}
|
|
17
|
+
const innerIndentLevel = indentLevel + 1;
|
|
18
|
+
const innerIndent = "\t".repeat(innerIndentLevel);
|
|
19
|
+
let result = "{";
|
|
20
|
+
for (const [key, value] of properties) {
|
|
21
|
+
if (value.doc) {
|
|
22
|
+
result += `\n${innerIndent}/**\n${innerIndent} * ${value.doc}\n${innerIndent} */`;
|
|
23
|
+
}
|
|
24
|
+
result += `\n${innerIndent}${key}${value.isRequired ? "" : "?"}: ${serializeMiddleSchemaToTypeScript(value, innerIndentLevel)};`;
|
|
25
|
+
}
|
|
26
|
+
if (schema.additionalProperties) {
|
|
27
|
+
result += `\n${innerIndent}[key: string]: ${serializeMiddleSchemaToTypeScript(schema.additionalProperties, innerIndentLevel)};`;
|
|
28
|
+
}
|
|
29
|
+
result += `\n${indent}}`;
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
function serializeEnumSchema(schema) {
|
|
33
|
+
const serializedEnum = JSON.stringify(schema.enum).replace(/\[|\]/g, "").replace(/,/g, " | ");
|
|
34
|
+
return schema.isArray && schema.enum.length > 1 ? `(${serializedEnum})` : serializedEnum;
|
|
35
|
+
}
|
|
36
|
+
function serializeBasicVarSchema(schema) {
|
|
37
|
+
if (Array.isArray(schema.type)) {
|
|
38
|
+
return schema.isArray ? `(${schema.type.join(" | ")})` : schema.type.join(" | ");
|
|
39
|
+
}
|
|
40
|
+
return schema.type;
|
|
41
|
+
}
|
|
42
|
+
export function serializeMiddleSchemaToTypeScript(schema, indentLevel = 0) {
|
|
43
|
+
let result = "";
|
|
44
|
+
if (isMiddleObject(schema)) {
|
|
45
|
+
result = serializeInterfaceSchema(schema, indentLevel);
|
|
46
|
+
}
|
|
47
|
+
else if (isMiddleEnum(schema)) {
|
|
48
|
+
result = serializeEnumSchema(schema);
|
|
49
|
+
}
|
|
50
|
+
else if (isMiddleBasicVar(schema)) {
|
|
51
|
+
result = serializeBasicVarSchema(schema);
|
|
52
|
+
}
|
|
53
|
+
if (schema.isArray) {
|
|
54
|
+
result += "[]";
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
export function serializeMiddleObjectToTypeScript(name, schema) {
|
|
59
|
+
const serializedSchema = serializeMiddleSchemaToTypeScript(schema);
|
|
60
|
+
const docComment = schema.doc ? `/**\n * ${schema.doc}\n */\n` : "";
|
|
61
|
+
return `${docComment}export interface ${name} ${serializedSchema}${schema.isRequired ? "" : " | undefined"}`;
|
|
62
|
+
}
|
|
63
|
+
export function writeTypeScriptFile(filePath, content) {
|
|
64
|
+
writeFile(filePath, TYPESCRIPT_FILE_HEADER + content);
|
|
65
|
+
}
|
|
66
|
+
export function readGeneratedTypeScriptFile(filePath) {
|
|
67
|
+
const content = readFile(filePath);
|
|
68
|
+
return content.replace(TYPESCRIPT_FILE_HEADER, "");
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=generate-typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-typescript.js","sourceRoot":"","sources":["../../src/middle-schema/generate-typescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACN,gBAAgB,EAChB,YAAY,EACZ,cAAc,GAKd,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;CAOrC,CAAC;AAEF,SAAS,wBAAwB,CAAC,MAAoB,EAAE,WAAmB;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,gBAAgB,GAAG,WAAW,GAAG,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,WAAW,QAAQ,WAAW,MAAM,KAAK,CAAC,GAAG,KAAK,WAAW,KAAK,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,KAAK,WAAW,GAAG,GAAG,GAC/B,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzB,KAAK,iCAAiC,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,WAAW,kBAAkB,iCAAiC,CAC5E,MAAM,CAAC,oBAAoB,EAC3B,gBAAgB,CAChB,GAAG,CAAC;IACN,CAAC;IACD,MAAM,IAAI,KAAK,MAAM,GAAG,CAAC;IACzB,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9F,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;AAC1F,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAsB;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAAoB,EAAE,WAAW,GAAG,CAAC;IACtF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAAY,EAAE,MAAoB;IACnF,MAAM,gBAAgB,GAAG,iCAAiC,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,GAAG,UAAU,oBAAoB,IAAI,IAAI,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IACpE,SAAS,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json-schema.d.ts","sourceRoot":"","sources":["../../src/middle-schema/parse-json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAIN,KAAK,YAAY,EAEjB,MAAM,mBAAmB,CAAC;AA6F3B,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE3E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { isArraySchema, isObjectSchema } from "../utils/json-schemas.js";
|
|
2
|
+
import { isAllowedType, } from "./schema-types.js";
|
|
3
|
+
const JSON_SCHEMA_TYPE_TO_TS_TYPE = {
|
|
4
|
+
integer: "number",
|
|
5
|
+
};
|
|
6
|
+
function generateMiddleObject(schema, doc, isArray, isRequired) {
|
|
7
|
+
const requiredProperties = schema.required ?? [];
|
|
8
|
+
const properties = Object.fromEntries(Object.entries(schema.properties ?? {}).map(([key, value]) => {
|
|
9
|
+
return [key, jsonSchemaToMiddleSchema(value, false, requiredProperties.includes(key))];
|
|
10
|
+
}));
|
|
11
|
+
let additionalProperties;
|
|
12
|
+
if (schema.additionalProperties === true || schema.additionalProperties === undefined) {
|
|
13
|
+
// If additionalProperties is true or undefined, we parse it as an "empty" schema
|
|
14
|
+
additionalProperties = { doc: undefined, isArray: false, isRequired: true, type: "unknown" };
|
|
15
|
+
}
|
|
16
|
+
else if (schema.additionalProperties !== false) {
|
|
17
|
+
additionalProperties = jsonSchemaToMiddleSchema(schema.additionalProperties, false, true);
|
|
18
|
+
}
|
|
19
|
+
return { doc, isArray, isRequired, properties, additionalProperties };
|
|
20
|
+
}
|
|
21
|
+
function generateArrayMiddleSchema(schema, doc, isRequired) {
|
|
22
|
+
if (Array.isArray(schema.items)) {
|
|
23
|
+
throw new Error("Array schema with multiple items is not supported");
|
|
24
|
+
}
|
|
25
|
+
if (!schema.items) {
|
|
26
|
+
return { doc, isArray: true, isRequired, type: "unknown" };
|
|
27
|
+
}
|
|
28
|
+
return jsonSchemaToMiddleSchema(schema.items, true, isRequired, doc);
|
|
29
|
+
}
|
|
30
|
+
function generateMiddleBasicVar(schema, doc, isArray, isRequired) {
|
|
31
|
+
const types = [];
|
|
32
|
+
for (const type of Array.isArray(schema.type) ? schema.type : [schema.type ?? "unknown"]) {
|
|
33
|
+
const tsType = JSON_SCHEMA_TYPE_TO_TS_TYPE[type] ?? type;
|
|
34
|
+
if (!isAllowedType(tsType)) {
|
|
35
|
+
throw new Error(`Unsupported JSON schema type: ${type}`);
|
|
36
|
+
}
|
|
37
|
+
types.push(tsType);
|
|
38
|
+
}
|
|
39
|
+
if (schema.nullable) {
|
|
40
|
+
types.push("null");
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
doc,
|
|
44
|
+
isArray,
|
|
45
|
+
isRequired,
|
|
46
|
+
type: types.length === 1 ? types[0] : types,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function jsonSchemaToMiddleSchema(schema, isArray, isRequired, inheritedDoc) {
|
|
50
|
+
const doc = inheritedDoc ?? schema.description;
|
|
51
|
+
if (isObjectSchema(schema)) {
|
|
52
|
+
return generateMiddleObject(schema, doc, isArray, isRequired);
|
|
53
|
+
}
|
|
54
|
+
if (isArraySchema(schema)) {
|
|
55
|
+
return generateArrayMiddleSchema(schema, doc, isRequired);
|
|
56
|
+
}
|
|
57
|
+
if (schema.enum) {
|
|
58
|
+
return { doc, isArray, isRequired, enum: schema.enum };
|
|
59
|
+
}
|
|
60
|
+
return generateMiddleBasicVar(schema, doc, isArray, isRequired);
|
|
61
|
+
}
|
|
62
|
+
export function jsonSchemaToMiddleObject(schema) {
|
|
63
|
+
return jsonSchemaToMiddleSchema(schema, false, true);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=parse-json-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json-schema.js","sourceRoot":"","sources":["../../src/middle-schema/parse-json-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-typescript.d.ts","sourceRoot":"","sources":["../../src/middle-schema/parse-typescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAIxF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQlE;AAmND,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAenE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { isAllowedType } from "./schema-types.js";
|
|
2
|
+
const TYPESCRIPT_HEADER_REGEX = /\/\*\*[\s\S]*?\*\//;
|
|
3
|
+
export function removeTypeScriptHeader(fileContent) {
|
|
4
|
+
// Match the first jsdoc and remove it
|
|
5
|
+
const headerMatch = fileContent.match(TYPESCRIPT_HEADER_REGEX);
|
|
6
|
+
if (!headerMatch || headerMatch.index === undefined) {
|
|
7
|
+
throw new Error("No header found in the TypeScript file");
|
|
8
|
+
}
|
|
9
|
+
const headerEndIndex = headerMatch.index + headerMatch[0].length;
|
|
10
|
+
return fileContent.slice(headerEndIndex).trim();
|
|
11
|
+
}
|
|
12
|
+
const WHITESPACE_REGEX = /\s/;
|
|
13
|
+
function skipWhitespace(body, i) {
|
|
14
|
+
let cursor = i;
|
|
15
|
+
while (cursor < body.length && WHITESPACE_REGEX.test(body[cursor])) {
|
|
16
|
+
cursor++;
|
|
17
|
+
}
|
|
18
|
+
return cursor;
|
|
19
|
+
}
|
|
20
|
+
const TYPESCRIPT_DOC_DECORATIONS_REGEX = /^\s*\*\s?/;
|
|
21
|
+
const TYPESCRIPT_DOC_PREFIX = "/**";
|
|
22
|
+
function tryParseJsDoc(body, i) {
|
|
23
|
+
if (body.slice(i, i + TYPESCRIPT_DOC_PREFIX.length) === TYPESCRIPT_DOC_PREFIX) {
|
|
24
|
+
const docEnd = body.indexOf("*/", i);
|
|
25
|
+
if (docEnd !== -1) {
|
|
26
|
+
const docContent = body.slice(i + TYPESCRIPT_DOC_PREFIX.length, docEnd);
|
|
27
|
+
const docLines = docContent.split("\n");
|
|
28
|
+
const cleanDoc = docLines
|
|
29
|
+
.map((line) => line.replace(TYPESCRIPT_DOC_DECORATIONS_REGEX, "").trim())
|
|
30
|
+
.filter((line) => line.length > 0)
|
|
31
|
+
.join(" ");
|
|
32
|
+
return { doc: cleanDoc || undefined, nextIndex: docEnd + 2 };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function extractTypeString(body, i) {
|
|
38
|
+
let braceDepth = 0;
|
|
39
|
+
let typeEnd = i;
|
|
40
|
+
while (typeEnd < body.length) {
|
|
41
|
+
const char = body[typeEnd];
|
|
42
|
+
if (char === "{") {
|
|
43
|
+
braceDepth++;
|
|
44
|
+
}
|
|
45
|
+
else if (char === "}") {
|
|
46
|
+
braceDepth--;
|
|
47
|
+
if (braceDepth < 0) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (char === ";" && braceDepth === 0) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
typeEnd++;
|
|
55
|
+
}
|
|
56
|
+
let typeStr = body.slice(i, typeEnd).trim();
|
|
57
|
+
const isArray = typeStr.endsWith("[]");
|
|
58
|
+
if (isArray) {
|
|
59
|
+
typeStr = typeStr.slice(0, -2).trim();
|
|
60
|
+
}
|
|
61
|
+
const isObject = typeStr.startsWith("{") && typeStr.endsWith("}");
|
|
62
|
+
if (isObject) {
|
|
63
|
+
typeStr = typeStr.slice(1, -1).trim();
|
|
64
|
+
}
|
|
65
|
+
return { typeStr, isArray, isObject, typeEnd };
|
|
66
|
+
}
|
|
67
|
+
function parseTypeScriptValue(text) {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(text.trim());
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error(`Invalid TypeScript value: ${text}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function extractSchemaFromText(text, currentDoc, isRequired, isArray, isObject) {
|
|
76
|
+
let schema;
|
|
77
|
+
if (isObject) {
|
|
78
|
+
const { properties: nestedProperties, additionalProperties: additionalNestedProperties } = parseInterfaceProperties(text);
|
|
79
|
+
schema = {
|
|
80
|
+
doc: currentDoc,
|
|
81
|
+
isArray,
|
|
82
|
+
isRequired,
|
|
83
|
+
properties: nestedProperties,
|
|
84
|
+
additionalProperties: additionalNestedProperties,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
else if (text.includes("|")) {
|
|
88
|
+
const unionBody = isArray ? text.slice(1, -1) : text;
|
|
89
|
+
const unionParts = unionBody.split("|").map((part) => part.trim());
|
|
90
|
+
// Since we currently do not support complex unions, we check if all parts are allowed types
|
|
91
|
+
if (unionParts.every((part) => isAllowedType(part))) {
|
|
92
|
+
schema = {
|
|
93
|
+
doc: currentDoc,
|
|
94
|
+
isArray,
|
|
95
|
+
isRequired,
|
|
96
|
+
type: unionParts,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
schema = {
|
|
101
|
+
doc: currentDoc,
|
|
102
|
+
isArray,
|
|
103
|
+
isRequired,
|
|
104
|
+
enum: unionParts.map((value) => parseTypeScriptValue(value)),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (isAllowedType(text)) {
|
|
109
|
+
schema = {
|
|
110
|
+
doc: currentDoc,
|
|
111
|
+
isArray,
|
|
112
|
+
isRequired,
|
|
113
|
+
type: text,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
schema = {
|
|
118
|
+
doc: currentDoc,
|
|
119
|
+
isArray,
|
|
120
|
+
isRequired,
|
|
121
|
+
enum: [parseTypeScriptValue(text)],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return schema;
|
|
125
|
+
}
|
|
126
|
+
const TYPESCRIPT_ADDITIONAL_PROPERTIES_REGEX = /^\s*\[\s*key\s*:\s*string\s*\]\s*:\s*/;
|
|
127
|
+
const TYPESCRIPT_PROPERTY_REGEX = /^(\w+)(\?)?:\s*/;
|
|
128
|
+
function tryParseProperty(body, i, currentDoc) {
|
|
129
|
+
let cursor = i;
|
|
130
|
+
let propName;
|
|
131
|
+
let isRequired;
|
|
132
|
+
const bodySlice = body.slice(cursor);
|
|
133
|
+
const additionalPropertiesMatch = bodySlice.match(TYPESCRIPT_ADDITIONAL_PROPERTIES_REGEX);
|
|
134
|
+
if (additionalPropertiesMatch) {
|
|
135
|
+
cursor += additionalPropertiesMatch[0].length;
|
|
136
|
+
isRequired = true;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const propMatch = bodySlice.match(TYPESCRIPT_PROPERTY_REGEX);
|
|
140
|
+
if (!propMatch) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
propName = propMatch[1];
|
|
144
|
+
isRequired = !propMatch[2];
|
|
145
|
+
cursor += propMatch[0].length;
|
|
146
|
+
}
|
|
147
|
+
const { typeStr, isArray, isObject, typeEnd } = extractTypeString(body, cursor);
|
|
148
|
+
const schema = extractSchemaFromText(typeStr, currentDoc, isRequired, isArray, isObject);
|
|
149
|
+
let nextIndex = typeEnd;
|
|
150
|
+
if (body[nextIndex] === ";") {
|
|
151
|
+
nextIndex++;
|
|
152
|
+
}
|
|
153
|
+
return { propName, schema, nextIndex };
|
|
154
|
+
}
|
|
155
|
+
function parseInterfaceProperties(body) {
|
|
156
|
+
const properties = {};
|
|
157
|
+
let additionalProperties;
|
|
158
|
+
let i = 0;
|
|
159
|
+
let currentDoc;
|
|
160
|
+
while (i < body.length) {
|
|
161
|
+
i = skipWhitespace(body, i);
|
|
162
|
+
const docResult = tryParseJsDoc(body, i);
|
|
163
|
+
if (docResult) {
|
|
164
|
+
currentDoc = docResult.doc;
|
|
165
|
+
i = docResult.nextIndex;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const propResult = tryParseProperty(body, i, currentDoc);
|
|
169
|
+
if (propResult) {
|
|
170
|
+
if (propResult.propName) {
|
|
171
|
+
properties[propResult.propName] = propResult.schema;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
additionalProperties = propResult.schema;
|
|
175
|
+
}
|
|
176
|
+
currentDoc = undefined;
|
|
177
|
+
i = propResult.nextIndex;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
i++;
|
|
181
|
+
}
|
|
182
|
+
return { properties, additionalProperties };
|
|
183
|
+
}
|
|
184
|
+
const TYPESCRIPT_JSDOC_REGEX = /\/\*\*\s*\n\s*\*\s*(.*?)\s*\n\s*\*\//;
|
|
185
|
+
const TYPESCRIPT_INTERFACE_REGEX = /export interface (\w+) \{([\s\S]*)\}$/;
|
|
186
|
+
export function parseTypeScriptInterface(text) {
|
|
187
|
+
// Extract JSDoc comment
|
|
188
|
+
const docMatch = text.match(TYPESCRIPT_JSDOC_REGEX);
|
|
189
|
+
const doc = docMatch ? docMatch[1] : undefined;
|
|
190
|
+
// Extract interface declaration
|
|
191
|
+
const interfaceMatch = text.match(TYPESCRIPT_INTERFACE_REGEX);
|
|
192
|
+
if (!interfaceMatch) {
|
|
193
|
+
throw new Error("Invalid TypeScript interface format");
|
|
194
|
+
}
|
|
195
|
+
const body = interfaceMatch[2];
|
|
196
|
+
const { properties, additionalProperties } = parseInterfaceProperties(body);
|
|
197
|
+
return { doc, isArray: false, isRequired: true, properties, additionalProperties };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=parse-typescript.js.map
|