@formspec/build 0.1.0-alpha.38 → 0.1.0-alpha.39
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/README.md +41 -2
- package/dist/analyzer/program.d.ts +13 -0
- package/dist/analyzer/program.d.ts.map +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/build-alpha.d.ts +268 -5
- package/dist/build-beta.d.ts +268 -5
- package/dist/build-internal.d.ts +268 -5
- package/dist/build.d.ts +268 -5
- package/dist/cli.cjs +279 -45
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +279 -45
- package/dist/cli.js.map +1 -1
- package/dist/generators/class-schema.d.ts +184 -5
- package/dist/generators/class-schema.d.ts.map +1 -1
- package/dist/generators/discovered-schema.d.ts +9 -0
- package/dist/generators/discovered-schema.d.ts.map +1 -1
- package/dist/index.cjs +280 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +276 -45
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +134 -31
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.d.ts +4 -3
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +132 -31
- package/dist/internals.js.map +1 -1
- package/dist/validate/constraint-validator.d.ts +64 -2
- package/dist/validate/constraint-validator.d.ts.map +1 -1
- package/dist/validate/index.d.ts +1 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/internals.d.ts
CHANGED
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
export { canonicalizeChainDSL } from "./canonicalize/index.js";
|
|
15
15
|
export { canonicalizeTSDoc } from "./canonicalize/index.js";
|
|
16
16
|
export type { TSDocSource } from "./canonicalize/index.js";
|
|
17
|
-
export { createProgramContext, createProgramContextFromProgram, findClassByName, findInterfaceByName, findTypeAliasByName, analyzeNamedTypeToIRFromProgramContext, } from "./analyzer/program.js";
|
|
17
|
+
export { createProgramContext, createProgramContextFromProgram, findClassByName, findInterfaceByName, findTypeAliasByName, analyzeNamedTypeToIRFromProgramContextDetailed, analyzeNamedTypeToIRFromProgramContext, } from "./analyzer/program.js";
|
|
18
18
|
export { analyzeClassToIR, analyzeInterfaceToIR, analyzeTypeAliasToIR, } from "./analyzer/class-analyzer.js";
|
|
19
19
|
export type { DiscriminatorResolutionOptions, IRClassAnalysis, FieldLayoutMetadata, AnalyzeTypeAliasToIRResult, } from "./analyzer/class-analyzer.js";
|
|
20
|
-
export {
|
|
21
|
-
export
|
|
20
|
+
export type { AnalyzeNamedTypeToIRDetailedResult } from "./analyzer/program.js";
|
|
21
|
+
export { generateClassSchemas, generateClassSchemasDetailed } from "./generators/class-schema.js";
|
|
22
|
+
export type { ClassSchemas, DetailedClassSchemasResult } from "./generators/class-schema.js";
|
|
22
23
|
export { generateJsonSchemaFromIR } from "./json-schema/ir-generator.js";
|
|
23
24
|
export type { GenerateJsonSchemaFromIROptions, JsonSchema2020, } from "./json-schema/ir-generator.js";
|
|
24
25
|
export { generateUiSchemaFromIR } from "./ui-schema/ir-generator.js";
|
package/dist/internals.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,8CAA8C,EAC9C,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAClG,YAAY,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG7F,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,YAAY,EACV,+BAA+B,EAC/B,cAAc,GACf,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/internals.js
CHANGED
|
@@ -3882,29 +3882,35 @@ function findFallbackAliasDuplicatePropertyNames(typeNode, checker) {
|
|
|
3882
3882
|
}
|
|
3883
3883
|
return [...duplicates].sort();
|
|
3884
3884
|
}
|
|
3885
|
-
function
|
|
3885
|
+
function analyzeNamedTypeToIRFromProgramContextDetailed(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
3886
3886
|
const analysisFilePath = path.resolve(filePath);
|
|
3887
3887
|
const classDecl = findClassByName(ctx.sourceFile, typeName);
|
|
3888
3888
|
if (classDecl !== null) {
|
|
3889
|
-
return
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3889
|
+
return {
|
|
3890
|
+
ok: true,
|
|
3891
|
+
analysis: analyzeClassToIR(
|
|
3892
|
+
classDecl,
|
|
3893
|
+
ctx.checker,
|
|
3894
|
+
analysisFilePath,
|
|
3895
|
+
extensionRegistry,
|
|
3896
|
+
metadataPolicy,
|
|
3897
|
+
discriminatorOptions
|
|
3898
|
+
)
|
|
3899
|
+
};
|
|
3897
3900
|
}
|
|
3898
3901
|
const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
|
|
3899
3902
|
if (interfaceDecl !== null) {
|
|
3900
|
-
return
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3903
|
+
return {
|
|
3904
|
+
ok: true,
|
|
3905
|
+
analysis: analyzeInterfaceToIR(
|
|
3906
|
+
interfaceDecl,
|
|
3907
|
+
ctx.checker,
|
|
3908
|
+
analysisFilePath,
|
|
3909
|
+
extensionRegistry,
|
|
3910
|
+
metadataPolicy,
|
|
3911
|
+
discriminatorOptions
|
|
3912
|
+
)
|
|
3913
|
+
};
|
|
3908
3914
|
}
|
|
3909
3915
|
const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
|
|
3910
3916
|
if (typeAlias !== null) {
|
|
@@ -3917,11 +3923,20 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3917
3923
|
discriminatorOptions
|
|
3918
3924
|
);
|
|
3919
3925
|
if (result.ok) {
|
|
3920
|
-
return result.analysis;
|
|
3926
|
+
return { ok: true, analysis: result.analysis };
|
|
3921
3927
|
}
|
|
3922
3928
|
const fallbackEligible = result.kind === "not-object-like" && isResolvableObjectLikeAliasTypeNode(typeAlias.type) && containsTypeReferenceInObjectLikeAlias(typeAlias.type);
|
|
3923
3929
|
if (!fallbackEligible) {
|
|
3924
|
-
|
|
3930
|
+
return {
|
|
3931
|
+
ok: false,
|
|
3932
|
+
diagnostics: [
|
|
3933
|
+
makeProgramDiagnostic(
|
|
3934
|
+
result.kind === "duplicate-properties" ? "DUPLICATE_ROOT_PROPERTIES" : "UNSUPPORTED_ROOT_TYPE",
|
|
3935
|
+
result.error,
|
|
3936
|
+
makeNodeProvenance(typeAlias, analysisFilePath)
|
|
3937
|
+
)
|
|
3938
|
+
]
|
|
3939
|
+
};
|
|
3925
3940
|
}
|
|
3926
3941
|
const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(
|
|
3927
3942
|
typeAlias.type,
|
|
@@ -3930,9 +3945,16 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3930
3945
|
if (duplicatePropertyNames.length > 0) {
|
|
3931
3946
|
const sourceFile = typeAlias.getSourceFile();
|
|
3932
3947
|
const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3948
|
+
return {
|
|
3949
|
+
ok: false,
|
|
3950
|
+
diagnostics: [
|
|
3951
|
+
makeProgramDiagnostic(
|
|
3952
|
+
"DUPLICATE_ROOT_PROPERTIES",
|
|
3953
|
+
`Type alias "${typeAlias.name.text}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`,
|
|
3954
|
+
makeNodeProvenance(typeAlias, analysisFilePath)
|
|
3955
|
+
)
|
|
3956
|
+
]
|
|
3957
|
+
};
|
|
3936
3958
|
}
|
|
3937
3959
|
const rootInfo = analyzeDeclarationRootInfo(
|
|
3938
3960
|
typeAlias,
|
|
@@ -3962,17 +3984,75 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3962
3984
|
diagnostics
|
|
3963
3985
|
);
|
|
3964
3986
|
if (fallbackAnalysis !== null) {
|
|
3965
|
-
return fallbackAnalysis;
|
|
3987
|
+
return { ok: true, analysis: fallbackAnalysis };
|
|
3966
3988
|
}
|
|
3967
|
-
|
|
3989
|
+
return {
|
|
3990
|
+
ok: false,
|
|
3991
|
+
diagnostics: [
|
|
3992
|
+
makeProgramDiagnostic(
|
|
3993
|
+
"UNSUPPORTED_ROOT_TYPE",
|
|
3994
|
+
result.error,
|
|
3995
|
+
makeNodeProvenance(typeAlias, analysisFilePath)
|
|
3996
|
+
)
|
|
3997
|
+
]
|
|
3998
|
+
};
|
|
3968
3999
|
}
|
|
3969
|
-
|
|
3970
|
-
|
|
4000
|
+
return {
|
|
4001
|
+
ok: false,
|
|
4002
|
+
diagnostics: [
|
|
4003
|
+
makeProgramDiagnostic(
|
|
4004
|
+
"TYPE_NOT_FOUND",
|
|
4005
|
+
`Type "${typeName}" not found as a class, interface, or type alias in ${analysisFilePath}`,
|
|
4006
|
+
makeFileProvenance(analysisFilePath)
|
|
4007
|
+
)
|
|
4008
|
+
]
|
|
4009
|
+
};
|
|
4010
|
+
}
|
|
4011
|
+
function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
4012
|
+
const result = analyzeNamedTypeToIRFromProgramContextDetailed(
|
|
4013
|
+
ctx,
|
|
4014
|
+
filePath,
|
|
4015
|
+
typeName,
|
|
4016
|
+
extensionRegistry,
|
|
4017
|
+
metadataPolicy,
|
|
4018
|
+
discriminatorOptions
|
|
3971
4019
|
);
|
|
4020
|
+
if (result.ok) {
|
|
4021
|
+
return result.analysis;
|
|
4022
|
+
}
|
|
4023
|
+
throw new Error(result.diagnostics.map((diagnostic) => diagnostic.message).join("\n"));
|
|
4024
|
+
}
|
|
4025
|
+
function makeProgramDiagnostic(code, message, primaryLocation) {
|
|
4026
|
+
return {
|
|
4027
|
+
code,
|
|
4028
|
+
message,
|
|
4029
|
+
severity: "error",
|
|
4030
|
+
primaryLocation,
|
|
4031
|
+
relatedLocations: []
|
|
4032
|
+
};
|
|
4033
|
+
}
|
|
4034
|
+
function makeNodeProvenance(node, filePath) {
|
|
4035
|
+
const sourceFile = node.getSourceFile();
|
|
4036
|
+
const position = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
4037
|
+
return {
|
|
4038
|
+
surface: "tsdoc",
|
|
4039
|
+
file: filePath,
|
|
4040
|
+
line: position.line + 1,
|
|
4041
|
+
column: position.character,
|
|
4042
|
+
length: node.getWidth()
|
|
4043
|
+
};
|
|
4044
|
+
}
|
|
4045
|
+
function makeFileProvenance(filePath) {
|
|
4046
|
+
return {
|
|
4047
|
+
surface: "tsdoc",
|
|
4048
|
+
file: filePath,
|
|
4049
|
+
line: 1,
|
|
4050
|
+
column: 0
|
|
4051
|
+
};
|
|
3972
4052
|
}
|
|
3973
4053
|
|
|
3974
4054
|
// src/generators/class-schema.ts
|
|
3975
|
-
import "typescript";
|
|
4055
|
+
import * as ts5 from "typescript";
|
|
3976
4056
|
|
|
3977
4057
|
// src/metadata/collision-guards.ts
|
|
3978
4058
|
function assertUniqueSerializedNames(entries, scope) {
|
|
@@ -5036,11 +5116,25 @@ function validateIR(ir, options) {
|
|
|
5036
5116
|
|
|
5037
5117
|
// src/generators/class-schema.ts
|
|
5038
5118
|
function generateClassSchemas(analysis, source, options) {
|
|
5039
|
-
const
|
|
5119
|
+
const result = generateClassSchemasDetailed(analysis, source, options);
|
|
5120
|
+
if (!result.ok || result.jsonSchema === void 0 || result.uiSchema === void 0) {
|
|
5121
|
+
throw new Error(formatValidationError(result.diagnostics));
|
|
5122
|
+
}
|
|
5123
|
+
return {
|
|
5124
|
+
jsonSchema: result.jsonSchema,
|
|
5125
|
+
uiSchema: result.uiSchema
|
|
5126
|
+
};
|
|
5127
|
+
}
|
|
5128
|
+
function generateClassSchemasDetailed(analysis, source, options) {
|
|
5129
|
+
const analysisDiagnostics = analysis.diagnostics ?? [];
|
|
5130
|
+
const errorDiagnostics = analysisDiagnostics.filter(
|
|
5040
5131
|
(diagnostic) => diagnostic.severity === "error"
|
|
5041
5132
|
);
|
|
5042
|
-
if (errorDiagnostics
|
|
5043
|
-
|
|
5133
|
+
if (errorDiagnostics.length > 0) {
|
|
5134
|
+
return {
|
|
5135
|
+
ok: false,
|
|
5136
|
+
diagnostics: analysisDiagnostics
|
|
5137
|
+
};
|
|
5044
5138
|
}
|
|
5045
5139
|
const ir = canonicalizeTSDoc(
|
|
5046
5140
|
analysis,
|
|
@@ -5054,9 +5148,14 @@ function generateClassSchemas(analysis, source, options) {
|
|
|
5054
5148
|
...options?.vendorPrefix !== void 0 && { vendorPrefix: options.vendorPrefix }
|
|
5055
5149
|
});
|
|
5056
5150
|
if (!validationResult.valid) {
|
|
5057
|
-
|
|
5151
|
+
return {
|
|
5152
|
+
ok: false,
|
|
5153
|
+
diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics]
|
|
5154
|
+
};
|
|
5058
5155
|
}
|
|
5059
5156
|
return {
|
|
5157
|
+
ok: true,
|
|
5158
|
+
diagnostics: [...analysisDiagnostics, ...validationResult.diagnostics],
|
|
5060
5159
|
jsonSchema: generateJsonSchemaFromIR(ir, options),
|
|
5061
5160
|
uiSchema: generateUiSchemaFromIR(ir)
|
|
5062
5161
|
};
|
|
@@ -5341,6 +5440,7 @@ export {
|
|
|
5341
5440
|
analyzeClassToIR,
|
|
5342
5441
|
analyzeInterfaceToIR,
|
|
5343
5442
|
analyzeNamedTypeToIRFromProgramContext,
|
|
5443
|
+
analyzeNamedTypeToIRFromProgramContextDetailed,
|
|
5344
5444
|
analyzeTypeAliasToIR,
|
|
5345
5445
|
canonicalizeChainDSL,
|
|
5346
5446
|
canonicalizeTSDoc,
|
|
@@ -5352,6 +5452,7 @@ export {
|
|
|
5352
5452
|
findInterfaceByName,
|
|
5353
5453
|
findTypeAliasByName,
|
|
5354
5454
|
generateClassSchemas,
|
|
5455
|
+
generateClassSchemasDetailed,
|
|
5355
5456
|
generateJsonSchemaFromIR,
|
|
5356
5457
|
generateMethodSchemas,
|
|
5357
5458
|
generateUiSchemaFromIR,
|