@knapsack/app
Version:
Build Design Systems on top of knapsack, by Basalt
140 lines (128 loc) • 3.84 kB
text/typescript
import { parse } from 'url';
import qs from 'qs';
import { BASE_PATHS, apiUrlBase } from './constants';
import { AppState } from '../client/store';
import { PatternRenderData } from '../schemas/api/render';
export function getPatternInfoFromUrl(
url: string,
): { patternId: string; templateId?: string; demoId?: string } | false {
if (url.startsWith(`${BASE_PATHS.PATTERN}/`)) {
const [_, base, patternId, templateId, demoId] = url.split('/');
return {
patternId,
templateId,
demoId,
};
}
return false;
}
/**
* Create a demo url
*/
export function createDemoUrl({
patternId,
templateId,
assetSetId,
demoId,
dataId,
isInIframe = false,
wrapHtml = true,
cacheBuster,
}: PatternRenderData): string {
const url = `${apiUrlBase}/render?${qs.stringify({
patternId,
templateId,
assetSetId,
demoId,
dataId,
isInIframe,
wrapHtml,
cacheBuster,
})}`;
return url;
}
export function getTitleFromPath(path: string, appState: AppState): string {
// clean up passed in path by removing querystrings
const { pathname } = parse(path);
// done cleaning
const paths = pathname.split('/').filter(Boolean);
const [
/**
* Base path for what type; `patterns`
*/
basePath,
/**
* If base path is patterns, this would be patternId
*/
firstParam,
/**
* If base path is patterns, this would be templateId
*/
secondParam,
...restParams
] = paths;
if (`/${basePath}` === BASE_PATHS.PATTERNS) return 'Patterns';
// i.e. `/patterns/:patternId`
if (`/${basePath}` === BASE_PATHS.PATTERN && !secondParam) {
const pattern = appState.patternsState.patterns[firstParam];
if (!pattern) {
const allPatterns = Object.values(appState.patternsState.patterns);
const availablePatternIds = allPatterns.map(p => p.id).join(', ');
const msg = `The pattern "${firstParam}" was not found, these are the available ids: "${availablePatternIds}".`;
console.error(msg);
throw new Error(msg);
}
return pattern.title;
}
// i.e. `/patterns/:patternId/:templateId`
if (pathname.startsWith(BASE_PATHS.PATTERN) && firstParam && secondParam) {
const patternId = firstParam;
const templateId = secondParam;
const pattern = appState.patternsState.patterns[patternId];
if (!pattern) {
const allPatterns = Object.values(appState.patternsState.patterns);
const availablePatternIds = allPatterns.map(p => p.id).join(', ');
const msg = `The pattern "${patternId}" was not found, these are the available ids: "${availablePatternIds}".`;
console.error(msg);
throw new Error(msg);
}
const template = pattern.templates.find(t => t.id === templateId);
if (!template) {
const availableTemplateIds = pattern.templates.map(t => t.id).join(', ');
const msg = `In the pattern "${patternId}", the template "${templateId}" was not found, these are the available ids: "${availableTemplateIds}".`;
console.error(msg);
throw new Error(msg);
}
console.log({ paths, title: template.title });
return template.title;
}
}
// some ideas
// type RouteInfo = {
// url: string;
// method: 'GET' | 'POST';
// query?: object;
// body?: object;
// };
//
// // type KnapsackPatternTemplate = import('../schemas/patterns').KnapsackPatternTemplate;
// export type getPatternRouteResult = KnapsackPattern;
//
// export function getPatternRoute({
// patternId,
// }: {
// patternId: string;
// }): RouteInfo {
// return {
// url: `${apiUrlBase}/pattern/${patternId}`,
// method: 'GET',
// };
// }
//
// const pattern = {
// get: {
// url: ({ patternId }: { patternId: string }) =>
// `${apiUrlBase}/pattern/${patternId}`,
// // resultType: KnapsackPattern
// },
// };