Skip to content

Commit aa01a89

Browse files
authored
fix(schema | api-ref): improve variable declaration extraction, internal type-ref resolution, module indexing, and includeFiles glob support (#10043)
1 parent c32e216 commit aa01a89

File tree

106 files changed

+4916
-3812
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+4916
-3812
lines changed

.bitmap

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,20 @@
765765
"mainFile": "index.ts",
766766
"rootDir": "scopes/ui-foundation/harmony-ui-app/harmony-ui-app"
767767
},
768+
"hooks/use-api": {
769+
"name": "hooks/use-api",
770+
"scope": "teambit.api-reference",
771+
"version": "0.0.56",
772+
"mainFile": "index.ts",
773+
"rootDir": "components/hooks/use-api"
774+
},
775+
"hooks/use-api-renderers": {
776+
"name": "hooks/use-api-renderers",
777+
"scope": "teambit.api-reference",
778+
"version": "0.0.36",
779+
"mainFile": "index.ts",
780+
"rootDir": "components/hooks/use-api-renderers"
781+
},
768782
"hooks/use-cloud-scopes": {
769783
"name": "hooks/use-cloud-scopes",
770784
"scope": "teambit.cloud",
@@ -961,6 +975,20 @@
961975
"mainFile": "index.ts",
962976
"rootDir": "scopes/compositions/model/composition-type"
963977
},
978+
"models/api-node-renderer": {
979+
"name": "models/api-node-renderer",
980+
"scope": "teambit.api-reference",
981+
"version": "0.0.52",
982+
"mainFile": "index.ts",
983+
"rootDir": "components/models/api-node-renderer"
984+
},
985+
"models/api-reference-model": {
986+
"name": "models/api-reference-model",
987+
"scope": "teambit.api-reference",
988+
"version": "0.0.52",
989+
"mainFile": "index.ts",
990+
"rootDir": "components/models/api-reference-model"
991+
},
964992
"models/cloud-scope": {
965993
"name": "models/cloud-scope",
966994
"scope": "teambit.cloud",
@@ -1276,6 +1304,13 @@
12761304
"mainFile": "index.ts",
12771305
"rootDir": "scopes/scope/objects"
12781306
},
1307+
"overview/renderers/grouped-schema-nodes-overview-summary": {
1308+
"name": "overview/renderers/grouped-schema-nodes-overview-summary",
1309+
"scope": "teambit.api-reference",
1310+
"version": "0.0.46",
1311+
"mainFile": "index.ts",
1312+
"rootDir": "components/overview/renderers/grouped-schema-nodes-overview-summary"
1313+
},
12791314
"panels": {
12801315
"name": "panels",
12811316
"scope": "teambit.ui-foundation",
@@ -1430,13 +1465,167 @@
14301465
"mainFile": "index.ts",
14311466
"rootDir": "scopes/component/renaming"
14321467
},
1468+
"renderers/api-node-details": {
1469+
"name": "renderers/api-node-details",
1470+
"scope": "teambit.api-reference",
1471+
"version": "0.0.81",
1472+
"mainFile": "index.ts",
1473+
"rootDir": "components/renderers/api-node-details"
1474+
},
1475+
"renderers/class": {
1476+
"name": "renderers/class",
1477+
"scope": "teambit.api-reference",
1478+
"version": "0.0.83",
1479+
"mainFile": "index.ts",
1480+
"rootDir": "components/renderers/class"
1481+
},
1482+
"renderers/decorator": {
1483+
"name": "renderers/decorator",
1484+
"scope": "teambit.api-reference",
1485+
"version": "0.0.39",
1486+
"mainFile": "index.ts",
1487+
"rootDir": "components/renderers/decorator"
1488+
},
14331489
"renderers/default-node-renderers": {
14341490
"name": "renderers/default-node-renderers",
14351491
"scope": "teambit.api-reference",
14361492
"version": "0.0.1",
14371493
"mainFile": "index.ts",
14381494
"rootDir": "components/renderers/default-node-renderers"
14391495
},
1496+
"renderers/enum": {
1497+
"name": "renderers/enum",
1498+
"scope": "teambit.api-reference",
1499+
"version": "0.0.83",
1500+
"mainFile": "index.ts",
1501+
"rootDir": "components/renderers/enum"
1502+
},
1503+
"renderers/function": {
1504+
"name": "renderers/function",
1505+
"scope": "teambit.api-reference",
1506+
"version": "0.0.85",
1507+
"mainFile": "index.ts",
1508+
"rootDir": "components/renderers/function"
1509+
},
1510+
"renderers/grouped-schema-nodes-summary": {
1511+
"name": "renderers/grouped-schema-nodes-summary",
1512+
"scope": "teambit.api-reference",
1513+
"version": "0.0.79",
1514+
"mainFile": "index.ts",
1515+
"rootDir": "components/renderers/grouped-schema-nodes-summary"
1516+
},
1517+
"renderers/inference-type": {
1518+
"name": "renderers/inference-type",
1519+
"scope": "teambit.api-reference",
1520+
"version": "0.0.63",
1521+
"mainFile": "index.ts",
1522+
"rootDir": "components/renderers/inference-type"
1523+
},
1524+
"renderers/interface": {
1525+
"name": "renderers/interface",
1526+
"scope": "teambit.api-reference",
1527+
"version": "0.0.83",
1528+
"mainFile": "index.ts",
1529+
"rootDir": "components/renderers/interface"
1530+
},
1531+
"renderers/parameter": {
1532+
"name": "renderers/parameter",
1533+
"scope": "teambit.api-reference",
1534+
"version": "0.0.66",
1535+
"mainFile": "index.ts",
1536+
"rootDir": "components/renderers/parameter"
1537+
},
1538+
"renderers/react": {
1539+
"name": "renderers/react",
1540+
"scope": "teambit.api-reference",
1541+
"version": "0.0.68",
1542+
"mainFile": "index.ts",
1543+
"rootDir": "components/renderers/react"
1544+
},
1545+
"renderers/schema-node-member-summary": {
1546+
"name": "renderers/schema-node-member-summary",
1547+
"scope": "teambit.api-reference",
1548+
"version": "0.0.77",
1549+
"mainFile": "index.ts",
1550+
"rootDir": "components/renderers/schema-node-member-summary"
1551+
},
1552+
"renderers/schema-nodes-index": {
1553+
"name": "renderers/schema-nodes-index",
1554+
"scope": "teambit.api-reference",
1555+
"version": "0.0.71",
1556+
"mainFile": "index.ts",
1557+
"rootDir": "components/renderers/schema-nodes-index"
1558+
},
1559+
"renderers/this": {
1560+
"name": "renderers/this",
1561+
"scope": "teambit.api-reference",
1562+
"version": "0.0.70",
1563+
"mainFile": "index.ts",
1564+
"rootDir": "components/renderers/this"
1565+
},
1566+
"renderers/tuple-type": {
1567+
"name": "renderers/tuple-type",
1568+
"scope": "teambit.api-reference",
1569+
"version": "0.0.14",
1570+
"mainFile": "index.ts",
1571+
"rootDir": "components/renderers/tuple-type"
1572+
},
1573+
"renderers/type": {
1574+
"name": "renderers/type",
1575+
"scope": "teambit.api-reference",
1576+
"version": "0.0.81",
1577+
"mainFile": "index.ts",
1578+
"rootDir": "components/renderers/type"
1579+
},
1580+
"renderers/type-array": {
1581+
"name": "renderers/type-array",
1582+
"scope": "teambit.api-reference",
1583+
"version": "0.0.54",
1584+
"mainFile": "index.ts",
1585+
"rootDir": "components/renderers/type-array"
1586+
},
1587+
"renderers/type-intersection": {
1588+
"name": "renderers/type-intersection",
1589+
"scope": "teambit.api-reference",
1590+
"version": "0.0.54",
1591+
"mainFile": "index.ts",
1592+
"rootDir": "components/renderers/type-intersection"
1593+
},
1594+
"renderers/type-literal": {
1595+
"name": "renderers/type-literal",
1596+
"scope": "teambit.api-reference",
1597+
"version": "0.0.74",
1598+
"mainFile": "index.ts",
1599+
"rootDir": "components/renderers/type-literal"
1600+
},
1601+
"renderers/type-ref": {
1602+
"name": "renderers/type-ref",
1603+
"scope": "teambit.api-reference",
1604+
"version": "0.0.98",
1605+
"mainFile": "index.ts",
1606+
"rootDir": "components/renderers/type-ref"
1607+
},
1608+
"renderers/type-union": {
1609+
"name": "renderers/type-union",
1610+
"scope": "teambit.api-reference",
1611+
"version": "0.0.54",
1612+
"mainFile": "index.ts",
1613+
"rootDir": "components/renderers/type-union"
1614+
},
1615+
"renderers/unresolved": {
1616+
"name": "renderers/unresolved",
1617+
"scope": "teambit.api-reference",
1618+
"version": "0.0.81",
1619+
"mainFile": "index.ts",
1620+
"rootDir": "components/renderers/unresolved"
1621+
},
1622+
"renderers/variable": {
1623+
"name": "renderers/variable",
1624+
"scope": "teambit.api-reference",
1625+
"version": "0.0.81",
1626+
"mainFile": "index.ts",
1627+
"rootDir": "components/renderers/variable"
1628+
},
14401629
"schema": {
14411630
"name": "schema",
14421631
"scope": "teambit.semantics",
@@ -1458,6 +1647,13 @@
14581647
"mainFile": "index.ts",
14591648
"rootDir": "scopes/workspace/scripts"
14601649
},
1650+
"sections/api-reference-page": {
1651+
"name": "sections/api-reference-page",
1652+
"scope": "teambit.api-reference",
1653+
"version": "0.0.119",
1654+
"mainFile": "index.ts",
1655+
"rootDir": "components/sections/api-reference-page"
1656+
},
14611657
"sidebar": {
14621658
"name": "sidebar",
14631659
"scope": "teambit.ui-foundation",
@@ -2053,6 +2249,13 @@
20532249
"mainFile": "index.ts",
20542250
"rootDir": "components/legacy/utils"
20552251
},
2252+
"utils/sort-api-nodes": {
2253+
"name": "utils/sort-api-nodes",
2254+
"scope": "teambit.api-reference",
2255+
"version": "0.0.52",
2256+
"mainFile": "index.ts",
2257+
"rootDir": "components/utils/sort-api-nodes"
2258+
},
20562259
"validator": {
20572260
"name": "validator",
20582261
"scope": "teambit.defender",

components/entities/semantic-schema/schemas/module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,8 @@ export class ModuleSchema extends SchemaNode {
8585
module.namespace = namespace;
8686
return module;
8787
}
88+
89+
static isModuleSchema(node: SchemaNode): node is ModuleSchema {
90+
return 'exports' in node && 'internals' in node;
91+
}
8892
}

components/entities/semantic-schema/schemas/type-ref.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@ export class TypeRefSchema extends SchemaNode {
4242
/**
4343
* if the reference is not exported from the component, it can be internal to the file.
4444
*/
45-
readonly internalFilePath?: string
45+
readonly internalFilePath?: string,
46+
47+
/**
48+
* source file path where the type ref is defined
49+
*/
50+
readonly sourceFilePath?: string
4651
) {
4752
super();
4853
this.componentId = componentId;
@@ -123,6 +128,7 @@ export class TypeRefSchema extends SchemaNode {
123128
componentId: this.componentId ? this.componentId.toObject() : undefined,
124129
packageName: this.packageName,
125130
internalFilePath: this.internalFilePath,
131+
sourceFilePath: this.sourceFilePath,
126132
typeArgs: this.typeArgs?.map((type) => type.toObject()),
127133
};
128134
}
@@ -138,7 +144,14 @@ export class TypeRefSchema extends SchemaNode {
138144
}
139145
const packageName = obj.packageName;
140146
const internalFilePath = obj.internalFilePath;
147+
const sourceFilePath = obj.sourceFilePath;
141148
const typeArgs = obj.typeArgs?.map((type: any) => SchemaRegistry.fromObject(type));
142-
return new TypeRefSchema(location, name, componentId, packageName, internalFilePath).withTypeArgs(typeArgs);
149+
return new TypeRefSchema(location, name, componentId, packageName, internalFilePath, sourceFilePath).withTypeArgs(
150+
typeArgs
151+
);
152+
}
153+
154+
static isTypeRefSchema(node: SchemaNode): node is TypeRefSchema {
155+
return node.__schema === 'TypeRefSchema';
143156
}
144157
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { APIRefRenderersProvider, useAPIRefRenderers, APIRefRenderersContext } from './use-api-renderers';
2+
export type { APIRefRenderersProviderProps } from './use-api-renderers';
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { APINodeRenderer } from '@teambit/api-reference.models.api-node-renderer';
2+
import type { ReactNode } from 'react';
3+
import React, { createContext, useContext } from 'react';
4+
5+
export const APIRefRenderersContext = createContext<{
6+
nodeRenderers: APINodeRenderer[];
7+
}>({
8+
nodeRenderers: [],
9+
});
10+
11+
export type APIRefRenderersProviderProps = {
12+
children: ReactNode;
13+
nodeRenderers: APINodeRenderer[];
14+
};
15+
16+
export const APIRefRenderersProvider: React.FC<APIRefRenderersProviderProps> = ({ children, nodeRenderers }) => {
17+
return (
18+
<APIRefRenderersContext.Provider
19+
value={{
20+
nodeRenderers,
21+
}}
22+
>
23+
{children}
24+
</APIRefRenderersContext.Provider>
25+
);
26+
};
27+
28+
export const useAPIRefRenderers = () => {
29+
return useContext(APIRefRenderersContext);
30+
};

components/hooks/use-api/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { useAPI } from './use-api';
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { useDataQuery } from '@teambit/ui-foundation.ui.hooks.use-data-query';
2+
import { gql } from '@apollo/client';
3+
import { APIReferenceModel } from '@teambit/api-reference.models.api-reference-model';
4+
import type { APINodeRenderer } from '@teambit/api-reference.models.api-node-renderer';
5+
6+
const GET_SCHEMA = gql`
7+
query Schema($componentId: String!, $skipInternals: Boolean) {
8+
getHost {
9+
id # used for GQL caching
10+
getSchema(id: $componentId, skipInternals: $skipInternals)
11+
}
12+
}
13+
`;
14+
15+
export function useAPI(
16+
componentId?: string,
17+
apiNodeRenderers: APINodeRenderer[] = [],
18+
options?: {
19+
skipInternals?: boolean;
20+
}
21+
): { apiModel?: APIReferenceModel; loading?: boolean } {
22+
const { data, loading } = useDataQuery(GET_SCHEMA, {
23+
variables: {
24+
componentId,
25+
skipInternals: options?.skipInternals,
26+
skip: !componentId,
27+
},
28+
});
29+
30+
const apiModel = data?.getHost?.getSchema ? APIReferenceModel.from(data, apiNodeRenderers) : undefined;
31+
32+
return {
33+
loading,
34+
apiModel,
35+
};
36+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { SchemaNode } from '@teambit/semantics.entities.semantic-schema';
2+
import type { ComponentType, HTMLAttributes } from 'react';
3+
import type { APINode, APIReferenceModel } from '@teambit/api-reference.models.api-reference-model';
4+
5+
export type APINodeRenderProps = {
6+
apiNode: APINode;
7+
apiRefModel: APIReferenceModel;
8+
renderers: APINodeRenderer[];
9+
depth?: number;
10+
metadata?: Record<string, any>;
11+
} & HTMLAttributes<HTMLDivElement>;
12+
13+
export type APINodeRenderer = {
14+
predicate: (node: SchemaNode) => boolean;
15+
Component: ComponentType<APINodeRenderProps>;
16+
OverviewComponent?: ComponentType<APINodeRenderProps>;
17+
nodeType: string;
18+
icon?: { url: string; name: string };
19+
default?: boolean;
20+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import nodeStyles from './node.module.scss';
2+
3+
export { APINodeRenderer, APINodeRenderProps } from './api-node-renderer';
4+
export { nodeStyles };

0 commit comments

Comments
 (0)