polen
Version:
A framework for delightful GraphQL developer portals
53 lines • 2.29 kB
JavaScript
import { Grafaid } from '#lib/grafaid/index';
import { visit } from 'graphql';
// Or your specific import path for this type
import { ReactRouterAid } from '#lib/react-router-aid/index';
import PROJECT_DATA from 'virtual:polen/project/data.jsonsuper';
import { routes } from '../../routes.js';
// todo: Frameworks tend to colocate ssg data loaders with routes to solve the following
// problem which is we have to map data loaders to paramterized routes.
// Maybe we can figure something out too.
const knownParameterizedRouteExpressions = {
reference_type: `/reference/:type`,
};
export const getRoutesPaths = () => {
const paths = new Set();
const routeExpressions = ReactRouterAid.getRouteExpressions(routes);
for (const exp of routeExpressions) {
if (exp === knownParameterizedRouteExpressions.reference_type) {
if (PROJECT_DATA.schema) {
const schema = PROJECT_DATA.schema.versions[0].after;
const ast = Grafaid.Schema.AST.parse(Grafaid.Schema.print(schema));
visit(ast, {
ObjectTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
InterfaceTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
EnumTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
InputObjectTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
UnionTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
ScalarTypeDefinition(node) {
paths.add(`/reference/${node.name.value}`);
},
});
}
}
else if (ReactRouterAid.isParameterizedPath(exp)) {
throw new Error(`Unhandled parameterized path: ${exp}`);
}
else {
// Static path
paths.add(exp);
}
}
return Array.from(paths).sort(); // Sort for deterministic output
};
//# sourceMappingURL=get-route-paths.js.map