@formspec/build 0.1.0-alpha.32 → 0.1.0-alpha.33
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/dist/analyzer/class-analyzer.d.ts +5 -1
- package/dist/analyzer/class-analyzer.d.ts.map +1 -1
- package/dist/analyzer/tsdoc-parser.d.ts +6 -3
- package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
- package/dist/browser.cjs +65 -7
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +68 -4
- package/dist/browser.js.map +1 -1
- package/dist/cli.cjs +317 -165
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +300 -140
- package/dist/cli.js.map +1 -1
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/generators/discovered-schema.d.ts.map +1 -1
- package/dist/index.cjs +312 -161
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +299 -140
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +270 -127
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.js +276 -125
- package/dist/internals.js.map +1 -1
- package/package.json +4 -4
|
@@ -62,7 +62,11 @@ export interface DeclarationRootInfo {
|
|
|
62
62
|
readonly annotations: readonly AnnotationNode[];
|
|
63
63
|
readonly diagnostics: readonly ConstraintSemanticDiagnostic[];
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
interface AnalyzerMetadataPolicy {
|
|
66
|
+
readonly raw: MetadataPolicyInput | undefined;
|
|
67
|
+
readonly normalized: ReturnType<typeof normalizeMetadataPolicy>;
|
|
68
|
+
}
|
|
69
|
+
export declare function createAnalyzerMetadataPolicy(input?: MetadataPolicyInput): AnalyzerMetadataPolicy;
|
|
66
70
|
export declare function analyzeDeclarationRootInfo(declaration: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration, checker: ts.TypeChecker, file?: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput): DeclarationRootInfo;
|
|
67
71
|
/**
|
|
68
72
|
* Analyzes a class declaration and produces canonical IR FieldNodes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,12 @@
|
|
|
14
14
|
* — Parsed via TSDocParser as custom block tags.
|
|
15
15
|
* Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).
|
|
16
16
|
*
|
|
17
|
-
* 2. **
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* 2. **Metadata and annotation tags** (`@apiName`, `@displayName`,
|
|
18
|
+
* `@format`, `@placeholder`):
|
|
19
|
+
* These are parsed as structured custom block tags so summary extraction
|
|
20
|
+
* stops at recognized FormSpec tags. `@displayName`, `@format`, and
|
|
21
|
+
* `@placeholder` also map onto annotation IR nodes, while `@apiName`
|
|
22
|
+
* remains metadata-only and is resolved separately by the class analyzer.
|
|
20
23
|
*
|
|
21
24
|
* The `@deprecated` tag is a standard TSDoc block tag, parsed structurally.
|
|
22
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAcL,KAAK,4BAA4B,EAGlC,MAAM,6BAA6B,CAAC;AAkBrC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4lBhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1D;AA4DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,SAAK,EACT,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAsSlB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB5D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,mBAAmB,CAmC7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD"}
|
package/dist/browser.cjs
CHANGED
|
@@ -1594,13 +1594,29 @@ function getSchemaExtension(schema, key) {
|
|
|
1594
1594
|
}
|
|
1595
1595
|
|
|
1596
1596
|
// src/extensions/registry.ts
|
|
1597
|
+
var import_internals3 = require("@formspec/core/internals");
|
|
1598
|
+
var import_internal = require("@formspec/analysis/internal");
|
|
1599
|
+
var BUILTIN_METADATA_TAGS = /* @__PURE__ */ new Set(["apiName", "displayName"]);
|
|
1600
|
+
function buildConstraintTagSources(extensions) {
|
|
1601
|
+
return extensions.map((extension) => ({
|
|
1602
|
+
extensionId: extension.extensionId,
|
|
1603
|
+
...extension.constraintTags !== void 0 ? {
|
|
1604
|
+
constraintTags: extension.constraintTags.map((tag) => ({
|
|
1605
|
+
tagName: (0, import_internal.normalizeFormSpecTagName)(tag.tagName)
|
|
1606
|
+
}))
|
|
1607
|
+
} : {}
|
|
1608
|
+
}));
|
|
1609
|
+
}
|
|
1597
1610
|
function createExtensionRegistry(extensions) {
|
|
1611
|
+
const reservedTagSources = buildConstraintTagSources(extensions);
|
|
1598
1612
|
const typeMap = /* @__PURE__ */ new Map();
|
|
1599
1613
|
const typeNameMap = /* @__PURE__ */ new Map();
|
|
1600
1614
|
const constraintMap = /* @__PURE__ */ new Map();
|
|
1601
1615
|
const constraintTagMap = /* @__PURE__ */ new Map();
|
|
1602
1616
|
const builtinBroadeningMap = /* @__PURE__ */ new Map();
|
|
1603
1617
|
const annotationMap = /* @__PURE__ */ new Map();
|
|
1618
|
+
const metadataSlotMap = /* @__PURE__ */ new Map();
|
|
1619
|
+
const metadataTagMap = /* @__PURE__ */ new Map();
|
|
1604
1620
|
for (const ext of extensions) {
|
|
1605
1621
|
if (ext.types !== void 0) {
|
|
1606
1622
|
for (const type of ext.types) {
|
|
@@ -1643,10 +1659,11 @@ function createExtensionRegistry(extensions) {
|
|
|
1643
1659
|
}
|
|
1644
1660
|
if (ext.constraintTags !== void 0) {
|
|
1645
1661
|
for (const tag of ext.constraintTags) {
|
|
1646
|
-
|
|
1647
|
-
|
|
1662
|
+
const canonicalTagName = (0, import_internal.normalizeFormSpecTagName)(tag.tagName);
|
|
1663
|
+
if (constraintTagMap.has(canonicalTagName)) {
|
|
1664
|
+
throw new Error(`Duplicate custom constraint tag: "@${canonicalTagName}"`);
|
|
1648
1665
|
}
|
|
1649
|
-
constraintTagMap.set(
|
|
1666
|
+
constraintTagMap.set(canonicalTagName, {
|
|
1650
1667
|
extensionId: ext.extensionId,
|
|
1651
1668
|
registration: tag
|
|
1652
1669
|
});
|
|
@@ -1661,13 +1678,54 @@ function createExtensionRegistry(extensions) {
|
|
|
1661
1678
|
annotationMap.set(qualifiedId, annotation);
|
|
1662
1679
|
}
|
|
1663
1680
|
}
|
|
1681
|
+
if (ext.metadataSlots !== void 0) {
|
|
1682
|
+
for (const slot of ext.metadataSlots) {
|
|
1683
|
+
if (metadataSlotMap.has(slot.slotId)) {
|
|
1684
|
+
throw new Error(`Duplicate metadata slot ID: "${slot.slotId}"`);
|
|
1685
|
+
}
|
|
1686
|
+
metadataSlotMap.set(slot.slotId, true);
|
|
1687
|
+
const canonicalTagName = (0, import_internal.normalizeFormSpecTagName)(slot.tagName);
|
|
1688
|
+
if (slot.allowBare === false && (slot.qualifiers?.length ?? 0) === 0) {
|
|
1689
|
+
throw new Error(
|
|
1690
|
+
`Metadata tag "@${canonicalTagName}" must allow bare usage or declare at least one qualifier.`
|
|
1691
|
+
);
|
|
1692
|
+
}
|
|
1693
|
+
if (metadataTagMap.has(canonicalTagName)) {
|
|
1694
|
+
throw new Error(`Duplicate metadata tag: "@${canonicalTagName}"`);
|
|
1695
|
+
}
|
|
1696
|
+
if (BUILTIN_METADATA_TAGS.has(canonicalTagName)) {
|
|
1697
|
+
throw new Error(
|
|
1698
|
+
`Metadata tag "@${canonicalTagName}" conflicts with built-in metadata tags.`
|
|
1699
|
+
);
|
|
1700
|
+
}
|
|
1701
|
+
if (constraintTagMap.has(canonicalTagName)) {
|
|
1702
|
+
throw new Error(
|
|
1703
|
+
`Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${canonicalTagName}".`
|
|
1704
|
+
);
|
|
1705
|
+
}
|
|
1706
|
+
if (Object.hasOwn(import_internals3.BUILTIN_CONSTRAINT_DEFINITIONS, (0, import_internals3.normalizeConstraintTagName)(canonicalTagName))) {
|
|
1707
|
+
throw new Error(
|
|
1708
|
+
`Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${(0, import_internals3.normalizeConstraintTagName)(canonicalTagName)}".`
|
|
1709
|
+
);
|
|
1710
|
+
}
|
|
1711
|
+
const existingTag = (0, import_internal.getTagDefinition)(canonicalTagName, reservedTagSources);
|
|
1712
|
+
if (existingTag !== null) {
|
|
1713
|
+
throw BUILTIN_METADATA_TAGS.has(existingTag.canonicalName) ? new Error(
|
|
1714
|
+
`Metadata tag "@${canonicalTagName}" conflicts with built-in metadata tags.`
|
|
1715
|
+
) : new Error(
|
|
1716
|
+
`Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${existingTag.canonicalName}".`
|
|
1717
|
+
);
|
|
1718
|
+
}
|
|
1719
|
+
metadataTagMap.set(canonicalTagName, true);
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1664
1722
|
}
|
|
1665
1723
|
return {
|
|
1666
1724
|
extensions,
|
|
1667
1725
|
findType: (typeId) => typeMap.get(typeId),
|
|
1668
1726
|
findTypeByName: (typeName) => typeNameMap.get(typeName),
|
|
1669
1727
|
findConstraint: (constraintId) => constraintMap.get(constraintId),
|
|
1670
|
-
findConstraintTag: (tagName) => constraintTagMap.get(tagName),
|
|
1728
|
+
findConstraintTag: (tagName) => constraintTagMap.get((0, import_internal.normalizeFormSpecTagName)(tagName)),
|
|
1671
1729
|
findBuiltinConstraintBroadening: (typeId, tagName) => builtinBroadeningMap.get(`${typeId}:${tagName}`),
|
|
1672
1730
|
findAnnotation: (annotationId) => annotationMap.get(annotationId)
|
|
1673
1731
|
};
|
|
@@ -1736,9 +1794,9 @@ var jsonSchema7Schema = import_zod3.z.lazy(
|
|
|
1736
1794
|
);
|
|
1737
1795
|
|
|
1738
1796
|
// src/validate/constraint-validator.ts
|
|
1739
|
-
var
|
|
1797
|
+
var import_internal2 = require("@formspec/analysis/internal");
|
|
1740
1798
|
function validateFieldNode(ctx, field) {
|
|
1741
|
-
const analysis = (0,
|
|
1799
|
+
const analysis = (0, import_internal2.analyzeConstraintTargets)(
|
|
1742
1800
|
field.name,
|
|
1743
1801
|
field.type,
|
|
1744
1802
|
field.constraints,
|
|
@@ -1756,7 +1814,7 @@ function validateFieldNode(ctx, field) {
|
|
|
1756
1814
|
}
|
|
1757
1815
|
function validateObjectProperty(ctx, parentName, property) {
|
|
1758
1816
|
const qualifiedName = `${parentName}.${property.name}`;
|
|
1759
|
-
const analysis = (0,
|
|
1817
|
+
const analysis = (0, import_internal2.analyzeConstraintTargets)(
|
|
1760
1818
|
qualifiedName,
|
|
1761
1819
|
property.type,
|
|
1762
1820
|
property.constraints,
|