@knapsack/renderer-react 4.66.8 → 4.66.10
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/CHANGELOG.md +4 -0
- package/dist/index.js +35 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +38 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
- fix bug where code usage block creates invalid HTML [#4390](https://github.com/knapsack-labs/app-monorepo/pull/4390) ([@EvanLovely](https://github.com/EvanLovely))
|
|
6
6
|
|
|
7
|
+
#### 🏠 Internal
|
|
8
|
+
|
|
9
|
+
- make types for `slotsOptions` and add Renderer support [#4389](https://github.com/knapsack-labs/app-monorepo/pull/4389) ([@EvanLovely](https://github.com/EvanLovely))
|
|
10
|
+
|
|
7
11
|
#### Authors: 1
|
|
8
12
|
|
|
9
13
|
- Evan Lovely ([@EvanLovely](https://github.com/EvanLovely))
|
package/dist/index.js
CHANGED
|
@@ -729,6 +729,7 @@ var createReactPattern = (0, import_creator_utils.createCreator)({
|
|
|
729
729
|
// src/renderer-react.ts
|
|
730
730
|
var { pkg } = (0, import_file_utils3.findUpPkgJson)(__dirname);
|
|
731
731
|
import_app2.log.setupUpdateNotifier({ ...pkg, name: pkg.name, version: pkg.version });
|
|
732
|
+
var { hasSlotOptions } = import_app2.KnapsackRendererBase;
|
|
732
733
|
var KnapsackReactRenderer = class _KnapsackReactRenderer extends import_renderer_webpack_base.KnapsackRendererWebpackBase {
|
|
733
734
|
static {
|
|
734
735
|
__name(this, "KnapsackReactRenderer");
|
|
@@ -778,6 +779,7 @@ var KnapsackReactRenderer = class _KnapsackReactRenderer extends import_renderer
|
|
|
778
779
|
enableDataDemos: true,
|
|
779
780
|
enableTemplateDemos: true,
|
|
780
781
|
hasSlotsSupport: true,
|
|
782
|
+
hasSlotOptionsSupport: true,
|
|
781
783
|
version: pkg.version,
|
|
782
784
|
hasInferSpecSupport: true,
|
|
783
785
|
syntaxHighlightingLanguage: "jsx",
|
|
@@ -1068,7 +1070,7 @@ ${errorHtmlMsg}
|
|
|
1068
1070
|
const { pattern, template, patternManifest, demo } = opt;
|
|
1069
1071
|
if (demo?.type && _KnapsackReactRenderer.isDataDemo(demo)) {
|
|
1070
1072
|
const {
|
|
1071
|
-
data: { props, slots }
|
|
1073
|
+
data: { props, slots, slotsOptionsComputed }
|
|
1072
1074
|
} = demo;
|
|
1073
1075
|
const importInfo = this.getJsImport({
|
|
1074
1076
|
patternId: pattern.id,
|
|
@@ -1088,7 +1090,7 @@ ${errorHtmlMsg}
|
|
|
1088
1090
|
const slotUsages = await Promise.all(
|
|
1089
1091
|
slotNames.map(async (slotName) => {
|
|
1090
1092
|
const slotItems = slots[slotName];
|
|
1091
|
-
const
|
|
1093
|
+
const slotItemsUsages = await Promise.all(
|
|
1092
1094
|
slotItems.filter((slotItem) => {
|
|
1093
1095
|
if (!(0, import_types2.isSlottedText)(slotItem)) {
|
|
1094
1096
|
if (!slotItem.patternId)
|
|
@@ -1139,12 +1141,29 @@ ${errorHtmlMsg}
|
|
|
1139
1141
|
);
|
|
1140
1142
|
return {
|
|
1141
1143
|
slotName,
|
|
1142
|
-
|
|
1144
|
+
slotItemsUsages
|
|
1143
1145
|
};
|
|
1144
1146
|
})
|
|
1145
1147
|
);
|
|
1146
|
-
slotUsages.forEach(({ slotName,
|
|
1147
|
-
|
|
1148
|
+
slotUsages.forEach(({ slotName, slotItemsUsages }) => {
|
|
1149
|
+
const slotOptionsComputed = slotsOptionsComputed?.[slotName];
|
|
1150
|
+
if (hasSlotOptions(slotOptionsComputed)) {
|
|
1151
|
+
const { attributes, cssClasses, styles, wrappingElementName } = slotOptionsComputed;
|
|
1152
|
+
const openTag = `<${wrappingElementName}
|
|
1153
|
+
${(0, import_utils3.isEmpty)(styles) ? "" : `style={${JSON.stringify(styles)}}`}
|
|
1154
|
+
${(0, import_utils3.isEmpty)(cssClasses) ? "" : `className="${cssClasses.join(" ")}"`}
|
|
1155
|
+
${Object.entries(attributes).map(([key, value]) => `${key}="${value}"`).join(" ")}
|
|
1156
|
+
>`;
|
|
1157
|
+
if (slotName === "children") {
|
|
1158
|
+
children.push(openTag);
|
|
1159
|
+
} else {
|
|
1160
|
+
extraProps.push({
|
|
1161
|
+
key: slotName,
|
|
1162
|
+
value: openTag
|
|
1163
|
+
});
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
slotItemsUsages.forEach((usage2) => {
|
|
1148
1167
|
if (slotName === "children") {
|
|
1149
1168
|
children.push(usage2);
|
|
1150
1169
|
} else {
|
|
@@ -1154,6 +1173,17 @@ ${errorHtmlMsg}
|
|
|
1154
1173
|
});
|
|
1155
1174
|
}
|
|
1156
1175
|
});
|
|
1176
|
+
if (hasSlotOptions(slotOptionsComputed)) {
|
|
1177
|
+
const closeTag = `</${slotOptionsComputed.wrappingElementName}>`;
|
|
1178
|
+
if (slotName === "children") {
|
|
1179
|
+
children.push(closeTag);
|
|
1180
|
+
} else {
|
|
1181
|
+
extraProps.push({
|
|
1182
|
+
key: slotName,
|
|
1183
|
+
value: closeTag
|
|
1184
|
+
});
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1157
1187
|
});
|
|
1158
1188
|
}
|
|
1159
1189
|
const usage = await getUsage({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/renderer-react.ts","../src/utils.ts","../src/react-creators.ts"],"sourcesContent":["export * from './renderer-react';\n","import sleep from 'sleep-promise';\nimport { KnapsackRendererWebpackBase } from '@knapsack/renderer-webpack-base';\nimport {\n pascalCase,\n Except,\n isFirstLetterCapital,\n isObject,\n} from '@knapsack/utils';\nimport { knapsackEvents, log } from '@knapsack/app';\nimport {\n KsRendererClientGlobal,\n KnapsackFile,\n KsJsImport,\n isSlottedText,\n isSlottedTemplateReference,\n isSlottedTemplateDemo,\n KnapsackPatternTemplate,\n KsTemplateSpec,\n TemplateSuggestion,\n rendererIds,\n RendererId,\n} from '@knapsack/types';\nimport type {\n KnapsackRenderParams,\n KnapsackTemplateRenderer,\n KnapsackTemplateRendererBase,\n KnapsackTemplateRendererResults,\n Patterns,\n} from '@knapsack/app/types';\nimport {\n exists,\n findUpPkgJson,\n getJsExportNames,\n readFile,\n formatCode,\n} from '@knapsack/file-utils';\nimport type { ReactNode } from 'react';\nimport { join, relative, parse } from 'path';\nimport {\n clearInferSpecCache,\n copyReactAssets,\n getDemoAppUsage,\n getReactDocs,\n getUsage,\n} from './utils';\nimport { createReactPattern } from './react-creators';\n\nconst { pkg } = findUpPkgJson(__dirname);\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nlog.setupUpdateNotifier({ ...pkg, name: pkg.name!, version: pkg.version! });\n\nexport type DemoWrapperProps = {\n children: React.ReactNode;\n patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[];\n} & Except<KnapsackRenderParams, 'patternManifest'>;\n\nexport class KnapsackReactRenderer\n extends KnapsackRendererWebpackBase\n implements KnapsackTemplateRenderer\n{\n /**\n * `react.js` & `react-dom.js` root relative paths\n */\n assets: string[];\n babelConfig: Record<string, unknown>;\n creators: KnapsackTemplateRenderer['creators'];\n private demoWrapperPath: string;\n\n private disableReactStrictMode?: boolean;\n\n constructor({\n webpackConfig,\n demoWrapperPath = join(__dirname, './demo-wrapper.mjs'),\n id = rendererIds.react,\n disableReactStrictMode,\n }: {\n webpackConfig?: ConstructorParameters<\n typeof KnapsackRendererWebpackBase\n >[0]['webpackConfig'];\n demoWrapperPath?: string;\n /** When using React v18+, this option allows a workspace to _disable_ React's Strict Mode from running in Knapsack's React Renderer (StrictMode is enabled by default).\n *\n * See https://reactjs.org/docs/strict-mode.html for more info\n * */\n disableReactStrictMode?: boolean;\n /** Don't set if calling from `knapsack.config.js`, only use if creating a new Renderer based on the React Renderer */\n id?: RendererId;\n } = {}) {\n super({\n id,\n extension: '.jsx',\n language: 'jsx',\n webpackConfig,\n });\n this.language = 'jsx';\n this.assets = [];\n this.demoWrapperPath = demoWrapperPath;\n\n // Half-borrowing the API Synax for this from the latest version of Next.js\n this.disableReactStrictMode = disableReactStrictMode;\n this.creators = [createReactPattern];\n }\n\n async init(opt: { patterns: Patterns; cacheDir: string }): Promise<void> {\n await super.init(opt);\n this.assets = await copyReactAssets(this.outputDir, this.publicPath);\n if (!(await exists(this.demoWrapperPath))) {\n throw new Error(\n `Could not find demo wrapper at: \"${this.demoWrapperPath}\"`,\n );\n }\n }\n\n getMeta: KnapsackTemplateRenderer['getMeta'] = () => ({\n id: this.id,\n title: 'React',\n aliasUse: 'optional',\n aliasTitle: 'Named Export',\n aliasIsJsNamedExport: true,\n aliasDescription:\n 'If `export X` was used instead of `export default`, then provide X.',\n enableDataDemos: true,\n enableTemplateDemos: true,\n hasSlotsSupport: true,\n version: pkg.version,\n hasInferSpecSupport: true,\n syntaxHighlightingLanguage: 'jsx',\n hasTemplateSuggestionsSupport: true,\n prototypingTemplate: {\n path: '@knapsack/renderer-react/prototype-template',\n spec: {\n isInferred: false,\n props: {\n type: 'object',\n properties: {},\n },\n slots: {\n children: { title: 'Children' },\n },\n },\n },\n });\n\n changeCase(str: string): string {\n return pascalCase(str);\n }\n\n createWebpackConfig(): ReturnType<\n KnapsackRendererWebpackBase['createWebpackConfig']\n > {\n const config = super.createWebpackConfig();\n\n config.externals = {\n react: 'React',\n 'react-dom': 'ReactDOM',\n };\n\n return config;\n }\n\n getJsImports(): ReturnType<KnapsackRendererWebpackBase['getJsImports']> {\n const imports = super.getJsImports();\n imports.push(\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: this.demoWrapperPath,\n name: 'DemoWrapper',\n },\n },\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: join(__dirname, './error-catcher.mjs'),\n name: 'ErrorCatcher',\n },\n },\n );\n return imports;\n }\n\n async prepClientRenderResults({\n usage,\n demoApp,\n imports: xImports,\n renderOptions: { pattern, template, demo },\n }: {\n usage: string;\n demoApp: string;\n imports: KsJsImport[];\n renderOptions: KnapsackRenderParams;\n }): Promise<KnapsackTemplateRendererResults> {\n const extraImportNames = this.getJsImports().flatMap((imp) =>\n imp.type === 'extra' ? [imp.importInfo.name] : [],\n );\n const { imports, isDeclaredVarsUnique, nameCollisions } =\n this.makeKsJsImportsUnique({ imports: xImports });\n\n if (!isDeclaredVarsUnique) {\n log.error(`${nameCollisions.join(', ')} are declared multiple times`, {\n imports,\n });\n }\n\n // import names; i.e. `KsButton`\n const importNames = [\n ...imports.map(({ importInfo: { name } }) => name),\n ...extraImportNames,\n ];\n\n const patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[] = imports.flatMap((imp) => {\n if (imp.type === 'pattern-template') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n },\n ];\n }\n if (imp.type === 'pattern-template-demo') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n demoId: imp.demoId,\n },\n ];\n }\n return [];\n });\n\n const demoWrapperProps: Omit<DemoWrapperProps, 'children'> = {\n patternsUsed,\n pattern,\n template,\n demo,\n };\n const demoWrapperCode = await getUsage({\n templateName: 'DemoWrapper',\n props: demoWrapperProps,\n children: `<DemoApp />`,\n // extraProps,\n });\n\n /**\n * IMPORTANT: this function is stringified and then executed in the browser - it cannot use anything in scope (other functions, vars, etc)\n */\n async function renderReact({\n patterns,\n theExtraImportNames,\n ksGlobal,\n }: {\n patterns: typeof patternsUsed;\n theExtraImportNames: typeof extraImportNames;\n ksGlobal: KsRendererClientGlobal<ReactNode>;\n }): Promise<Record<string, ReactNode>> {\n if (!ksGlobal) {\n throw new Error('\"window.knapsack\" is null');\n }\n const components = await ksGlobal.getAllImports({\n patterns,\n extras: theExtraImportNames.map((name) => ({ name })),\n });\n return components;\n }\n\n let code = `\n\n${renderReact.toString()}\n${renderReact.name}({\n ksGlobal: window.knapsack,\n patterns: ${JSON.stringify(patternsUsed)},\n theExtraImportNames: ${JSON.stringify(extraImportNames)},\n}).then((components) => {\n const { ${importNames.join(', ')} } = components;\n const root = document.getElementById('render-root');\n\n ${demoApp}\n\n const reactDomVersion = parseInt(ReactDOM.version.split('.')[0], 10);\n\n const ReactRendererResult = () => {\n if (reactDomVersion < 17 || ${this.disableReactStrictMode}){\n return (\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n )\n }\n\n return (\n <React.StrictMode>\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n </React.StrictMode>\n )\n };\n\n\n if (reactDomVersion > 17){\n ReactDOM.createRoot(root).render(\n <ReactRendererResult />\n )\n } else {\n ReactDOM.render(\n <ReactRendererResult />,\n root\n );\n }\n}).catch((err) => {\n console.error(err);\n const root = document.getElementById('render-root');\n // Create a new <div> element to contain the error message\n const errorMsgDiv = document.createElement('div');\n // Insert the new <div> element before the existing element\n root.parentNode.insertBefore(errorMsgDiv, root);\n // add error message so users can see it\n errorMsgDiv.innerHTML = '<h1>Component Error</h1><p>' + err.message + '</p>';\n});\n `;\n\n let codeHadError = false;\n let errorHtmlMsg = '';\n\n try {\n code = await this.babelCodeForBrowser({\n code,\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before babel error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n\n if (!codeHadError) {\n try {\n code = await formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before prettier error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n }\n\n const html = `\n ${this.assets.map((asset) => `<script src=\"${asset}\"></script>`).join('\\n')}\n\n ${this.createHtmlTagsForAssetPaths({\n assets: this.getWebpackAssetPaths(),\n // we need the scripts to finish adding methods to the global knapsack object synchronously before the client-side code runs that is in the <script> tag below\n scriptTagsAreAsync: false,\n })}\n\n <div id=\"render-root\" class=\"knapsack-pattern-direct-parent\" data-dev-note=\"Knapsack React Template Wrapper\"></div>\n <script type=\"application/javascript\">${code}</script>\n${errorHtmlMsg}\n\n `;\n\n return {\n ok: !codeHadError,\n html: await formatCode({\n contents: html,\n path: 'x.html', // doing this to set format language\n }),\n usage,\n templateLanguage: this.language,\n };\n }\n\n async render(\n opt: KnapsackRenderParams,\n ): Promise<KnapsackTemplateRendererResults> {\n if (KnapsackReactRenderer.isTemplateDemo(opt.demo)) {\n // when getting a template demos path sometimes we have a race condition where the client asks for it before the server knows about it.\n // so we try several times in a row to get it\n /** The amount of time in ms to wait between attempts; when we run out of array items, we give up and throw the error */\n const waits = [5, 10, 20, 50, 100, 1000, 1000];\n let templateDemoPath: string;\n let attempt = 0;\n\n while (true) {\n try {\n templateDemoPath = opt.patternManifest.getTemplateDemoAbsolutePath({\n patternId: opt.pattern.id,\n templateId: opt.template.id,\n demoId: opt.demo.id,\n });\n // got it!\n break;\n } catch (e) {\n const waitTime = waits[attempt];\n if (!waitTime) {\n throw new Error(e);\n }\n attempt += 1;\n // eslint-disable-next-line no-await-in-loop\n await sleep(waitTime);\n }\n }\n\n const [templateFileContents, { usage, imports }] = await Promise.all([\n readFile(templateDemoPath),\n this.getUsageAndImports(opt),\n ]);\n const demoApp = await getDemoAppUsage({\n children: usage,\n });\n const results = await this.prepClientRenderResults({\n usage: templateFileContents,\n demoApp,\n imports,\n renderOptions: opt,\n });\n\n return results;\n }\n\n if (KnapsackReactRenderer.isDataDemo(opt.demo)) {\n const { usage, imports } = await this.getUsageAndImports(opt);\n const { code: importCode } = this.createJsImportCodeBlock({\n imports,\n });\n\n const [demoAppUsage, demoApp] = await Promise.all([\n getDemoAppUsage({\n children: usage,\n imports: importCode,\n }),\n getDemoAppUsage({\n children: usage,\n }),\n ]);\n\n return this.prepClientRenderResults({\n demoApp,\n usage: demoAppUsage,\n imports,\n renderOptions: opt,\n });\n }\n }\n\n async getUsageAndImports(opt: KnapsackRenderParams): Promise<{\n usage: string;\n imports: KsJsImport[];\n }> {\n const { pattern, template, patternManifest, demo } = opt;\n if (demo?.type && KnapsackReactRenderer.isDataDemo(demo)) {\n const {\n data: { props, slots },\n } = demo;\n\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const importInfos: KsJsImport[] = [importInfo];\n const children: string[] = [];\n const extraProps: { key: string; value: string }[] = [];\n\n if (slots) {\n const slotNames = Object.keys(slots);\n const slotUsages = await Promise.all(\n slotNames.map(async (slotName) => {\n const slotItems = slots[slotName];\n const usages = await Promise.all(\n slotItems\n // remove any incomplete item - happens when users are filling out form\n .filter((slotItem) => {\n if (!isSlottedText(slotItem)) {\n if (!slotItem.patternId) return false;\n if (!slotItem.templateId) return false;\n if (isSlottedTemplateDemo(slotItem) && !slotItem.demoId) {\n return false;\n }\n }\n return true;\n })\n .map(async (slotItem) => {\n if (isSlottedText(slotItem)) {\n if (slotItems.length === 1 && slotName !== 'children') {\n // The ` prevents multi-line strings from causing error (even though they don't show a line break)\n return `\\`${slotItem.text}\\``;\n }\n return slotItem.text;\n }\n\n const slotPattern = patternManifest.getPattern(\n slotItem.patternId,\n );\n\n const slotTemplate = slotPattern.templates.find(\n (t) => t.id === slotItem.templateId,\n );\n if (isSlottedTemplateReference(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n if (isSlottedTemplateDemo(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n demo:\n slotItem.demo ||\n this.patterns.demosById[slotItem.demoId],\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n\n throw new Error(\n `Unknown slot item: ${JSON.stringify(slotItem)}`,\n );\n }),\n );\n return {\n slotName,\n usages,\n };\n }),\n );\n\n slotUsages.forEach(({ slotName, usages }) => {\n usages.forEach((usage) => {\n if (slotName === 'children') {\n children.push(usage);\n } else {\n extraProps.push({\n key: slotName,\n value: usage,\n });\n }\n });\n });\n }\n\n const usage = await getUsage({\n templateName,\n props,\n children: children.join('\\n'),\n extraProps,\n });\n\n return {\n usage,\n imports: importInfos,\n };\n }\n\n if (demo?.type && KnapsackReactRenderer.isTemplateDemo(demo)) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n demoId: demo.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template-demo: ${pattern.id}-${template.id}-${demo.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const usage = await getUsage({ templateName });\n\n return {\n usage,\n imports: [importInfo],\n };\n }\n\n if (!demo) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n return {\n /**\n * i.e. Given a React Component, `Button`, normally this would be `<Button>` with a demo, but since there is none this will just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n * @see {SlottedTemplate}\n */\n usage: templateName,\n imports: [importInfo],\n };\n }\n\n throw new Error(\n `Unhandled demo type for ${pattern.id}-${template.id}: ${JSON.stringify(\n demo,\n )}`,\n );\n }\n\n async getUsage(opt: KnapsackRenderParams): Promise<string> {\n const { usage } = await this.getUsageAndImports(opt);\n return usage;\n }\n\n inferSpec: KnapsackTemplateRendererBase['inferSpec'] = async ({\n template,\n templatePath,\n }: {\n template: KnapsackPatternTemplate;\n templatePath: string;\n }): Promise<KsTemplateSpec | false> => {\n const spec = await getReactDocs({\n src: template.path,\n exportName: template.alias || 'default',\n resolveFromDir: this.config.data,\n });\n if (spec !== false) {\n const totalProps = Object.keys(spec?.props?.properties || {}).length;\n const totalSlots = Object.keys(spec?.slots || {}).length;\n if (totalProps === 0 && totalSlots === 0) {\n return false;\n }\n }\n return spec;\n };\n\n async watch(opt: Parameters<KnapsackTemplateRendererBase['watch']>[0]) {\n await super.watch(opt);\n knapsackEvents.onPatternTemplateChanged(() => {\n clearInferSpecCache();\n });\n }\n\n getTemplateMeta: KnapsackTemplateRendererBase['getTemplateMeta'] = async ({\n pattern,\n template,\n }) => {\n const files: KnapsackFile[] = [];\n if (template?.spec?.props) {\n const schema = JSON.parse(JSON.stringify(template.spec.props));\n if (template?.spec?.slots) {\n Object.entries(template.spec.slots).forEach(([id, info]) => {\n schema.properties[id] = {\n typeof: 'function',\n tsType: 'React.ReactNode',\n\n description: info.allowedPatternIds\n ? `${info.description}. Only use: ${info.allowedPatternIds.join(\n ', ',\n )}`\n : info.description,\n };\n schema.required = schema.required ?? [];\n if (info.isRequired) schema.required.push(id);\n });\n }\n const typeDefs =\n await KnapsackReactRenderer.convertSchemaToTypeScriptDefs({\n schema,\n title: `${this.changeCase(pattern.id)}Props`,\n // @todo pull in base url\n description: `[Knapsack Docs](http://localhost:3999/pattern/${pattern.id}/${template.id})`,\n patternId: pattern.id,\n templateId: template.id,\n postBanner: `import * as React from 'react';`,\n });\n\n files.push({\n contents: typeDefs,\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.d.ts`,\n });\n files.push({\n contents: JSON.stringify(schema, null, ' '),\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.json`,\n });\n }\n return files;\n };\n\n alterTemplateMetaFiles: KnapsackTemplateRendererBase['alterTemplateMetaFiles'] =\n async ({ files, metaDir }) => {\n const imports: string[] = [];\n\n const ext = '.spec.d.ts';\n files.forEach((file) => {\n if (file.path.endsWith(ext)) {\n const { base } = parse(file.path);\n const [patternId, templateId] = base.split('.');\n const isFirst = templateId === this.id;\n const exportName = this.changeCase(`${patternId}Props`);\n const exportNameWithTemplateId = this.changeCase(\n `${patternId}-${templateId}Props`,\n );\n imports.push(\n `export { ${\n isFirst\n ? exportName\n : `${exportName} as ${exportNameWithTemplateId}`\n } } from './${relative(metaDir, file.path).replace('.d.ts', '')}';`,\n );\n }\n });\n\n // extra line at end of file\n imports.push('');\n\n return [\n ...files,\n {\n contents: imports.join('\\n'),\n encoding: 'utf8',\n path: join(metaDir, 'react.d.ts'),\n },\n ];\n };\n\n async getTemplateSuggestions({\n newPath,\n }: Parameters<\n KnapsackTemplateRendererBase['getTemplateSuggestions']\n >[0]): ReturnType<KnapsackTemplateRendererBase['getTemplateSuggestions']> {\n const { data: dataDir } = this.patterns.userConfig;\n const { allTemplateDemos, allTemplates } = this.getMyTemplates();\n const usedSuggestions: TemplateSuggestion[] = [\n ...allTemplateDemos,\n ...allTemplates,\n ].map(({ path, alias }) => {\n return {\n path,\n alias: alias || 'default',\n };\n });\n\n const allPaths = [\n ...new Set([newPath, ...usedSuggestions.map(({ path }) => path)]),\n ];\n const {\n resolve: { alias },\n } = this.createWebpackConfig();\n const aliasConfig: Record<string, string> = {};\n if (isObject(alias)) {\n Object.entries(alias).forEach(([key, value]) => {\n if (typeof value === 'string') {\n aliasConfig[key] = value;\n }\n });\n }\n const allSuggestions: TemplateSuggestion[] = await Promise.all(\n allPaths.map(async (path): Promise<TemplateSuggestion[]> => {\n if (!path) return [];\n try {\n const { exports, errorMsg } = await getJsExportNames({\n path,\n resolveFromDir: dataDir,\n alias: aliasConfig,\n });\n if (errorMsg) {\n throw new Error(errorMsg);\n }\n return (\n exports\n // only allow names that start with a capital letter (i.e. React Component names)\n // will exclude helper functions and custom hooks\n .filter((e) => e === 'default' || isFirstLetterCapital(e))\n .map((name) => ({\n alias: name,\n path,\n }))\n );\n } catch (e) {\n // only want this showing with verbose since template suggestions are not critical\n log.verbose(\n `Error getting import names for ${path}: ${e.message}`,\n null,\n this.logPrefix,\n );\n return [];\n }\n }),\n ).then((results) => {\n // sadly `Promise.all` & `.flatMap` just don't work, so this:\n return results.flat();\n });\n\n const suggestions = allSuggestions.filter((s) => {\n return !usedSuggestions.find(\n (us) => us.alias === s.alias && us.path === s.path,\n );\n });\n\n return {\n suggestions,\n };\n }\n}\n","import { log } from '@knapsack/app';\nimport {\n getModulePkgJson,\n readFile,\n copy,\n formatCode,\n resolvePath,\n findUp,\n} from '@knapsack/file-utils';\nimport { removeWrappingDoubleQuotes } from '@knapsack/utils';\nimport path from 'path';\nimport type { Documentation } from 'react-docgen';\nimport type { ComponentDoc, ParserOptions } from 'react-docgen-typescript';\nimport { KsTemplateSpec, isNumberProp, isOptionsProp } from '@knapsack/types';\n\ntype GetSpecParams = {\n src: string;\n exportName?: string;\n};\n\n/**\n * The name of the type, which is usually corresponds to the function name in `React.PropTypes`. However, for types define with `oneOf`, we use `\"enum\"` and for `oneOfType` we use `\"union\"`. If a custom function is provided or the type cannot be resolved to anything of `React.PropTypes`, we use `\"custom\"`.\n */\ntype RdTypeName =\n | 'number'\n | 'string'\n | 'custom'\n | 'union'\n | 'bool'\n | 'node'\n | 'func';\n\n/**\n * Some types accept parameters which define the type in more detail (such as `arrayOf`, `instanceOf`, `oneOf`, etc). Those are stored in `<typeValue>`. The data type of `<typeValue>` depends on the type definition.\n */\ntype RdTypeValue = string;\n\ntype RdProps = {\n [prop: string]: {\n defaultValue?: {\n value: string;\n computed: boolean;\n };\n type: {\n name: RdTypeName;\n value?: RdTypeValue;\n raw?: string;\n };\n flowType?: string;\n tsType?: string;\n description?: string;\n required: boolean;\n };\n};\n\ntype RdResults = {\n /**\n * Name of function, class, or const\n */\n displayName: string;\n description?: string;\n props: RdProps;\n};\n\nfunction renderUsageTemplate({\n templateName,\n attributes,\n children,\n}: {\n templateName: string;\n attributes: string;\n children: string;\n}) {\n return `\n <${templateName}\n ${attributes}\n ${\n children\n ? `>\n ${children}\n </${templateName}>`\n : '/>'\n }\n `;\n}\n\nfunction renderDemoAppTemplate({\n imports,\n children,\n}: {\n imports: string;\n children: string;\n}) {\n return `${imports}\n\nfunction DemoApp() {\n return (\n ${children}\n )\n}\n`;\n}\n\nexport async function getUsage(data: {\n templateName: string;\n props?: Record<string, unknown>;\n children?: string;\n extraProps?: {\n key: string;\n value: string;\n }[];\n format?: boolean;\n}): Promise<string> {\n const props = Object.keys(data.props || {}).map((key) => {\n const value = data.props[key];\n return {\n key,\n value,\n };\n });\n\n const { templateName, children, extraProps = [] } = data;\n if (!templateName) {\n throw new Error(\n `Cannot getUsage of a React Component when no \"templateName\" is provided.`,\n );\n }\n\n const attributes: string[] = props.map(({ key, value }) => {\n switch (typeof value) {\n case 'string':\n // Is this a function like `() => {}` but not a \"sizes\" attribute for an image like `(min-width: 400px) 50vw, 100vw`?\n if (value.startsWith('(') && value.includes('=>')) {\n return `${key}={${value}}`;\n }\n return `${key}=\"${value}\"`;\n case 'boolean':\n return value ? `${key}` : `${key}={${value}}`;\n default:\n return `${key}={${JSON.stringify(value)}}`;\n }\n });\n\n const extraAttributes: string[] = [];\n const slotProps: { [key: string]: string[] } = {};\n\n extraProps.forEach(({ key, value }) => {\n slotProps[key] = slotProps[key] ?? [];\n slotProps[key].push(value);\n });\n\n Object.entries(slotProps).forEach(([key, values]) => {\n const value = values.length === 1 ? values[0] : `<>${values.join('\\n')}</>`;\n extraAttributes.push(`${key}={${value}}`);\n });\n\n const result = renderUsageTemplate({\n templateName,\n attributes: [...attributes, ...extraAttributes].join(' '),\n children,\n });\n return data.format\n ? formatCode({\n contents: result,\n path: 'x.tsx', // doing this to set format language\n })\n .then((code) => code.trim())\n .catch(() => result.trim()) // if format fails, just return the unformatted code\n : result.trim();\n}\n\nexport async function getDemoAppUsage({\n children,\n imports,\n}: {\n children: string;\n imports?: string;\n}): Promise<string> {\n const code = renderDemoAppTemplate({\n children,\n imports,\n });\n return formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n}\n\nasync function getTypeScriptInfoFromFile({ src }: { src: string }): Promise<{\n info: ComponentDoc[];\n}> {\n const tsConfigPath = await findUp('tsconfig.json', {\n cwd: path.dirname(src),\n });\n const rdTs = await import('react-docgen-typescript');\n const config: ParserOptions = {\n shouldExtractLiteralValuesFromEnum: true,\n savePropValueAsString: true,\n skipChildrenPropWithoutDoc: false,\n // In addition to the ones listed here, which had not strangely included these below ~ https://github.com/styleguidist/react-docgen-typescript/blob/287e7012843cb26fed8f4bd8ee24e462c25a1414/src/parser.ts#L308\n customComponentTypes: ['VoidFunctionComponent', 'VFC'],\n };\n const parse = tsConfigPath\n ? rdTs.withCustomConfig(tsConfigPath, config).parse\n : rdTs.withDefaultConfig(config).parse;\n return {\n info: parse(src),\n };\n}\n\nfunction extractSpecFromTypeScriptInfo({\n info: results,\n exportName,\n}: {\n info: ComponentDoc[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n if (!results) return false;\n const spec: KsTemplateSpec = {\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {\n // children: {\n // title: 'children',\n // },\n },\n };\n\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect({ result, isDefaultExport, exportName }, 'ts result');\n if (!result) return false;\n\n const { displayName } = result;\n // log.inspect({ result }, 'result');\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { name, description, defaultValue, required, type, parent } =\n propDef;\n\n // `type.name` can include `| undefined` if tsConfig has `strict: true`. So we need to handle these scenarios:\n // `string` or `string | undefined`\n // `'left' | 'right'` or `'left' | 'right' | undefined`\n const propType = type?.name\n ?.replace('| undefined', '')\n // remove generics. things like `FC<{}>` and `FC<Props>` should become `FC`\n .replace(/<.*/g, '')\n .trim();\n\n switch (propType) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'number':\n spec.props.properties[propName] = {\n type: 'number',\n };\n break;\n case 'boolean':\n case 'bool':\n if (defaultValue && 'value' in defaultValue) {\n // comes in as `'true'` - this turns it to `true`\n defaultValue.value = defaultValue.value === 'true';\n }\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'enum':\n type EnumType = {\n name: string;\n raw: string;\n value: {\n /** Looks like `'\"option1\"'` - beware of string that contains `\"` */\n value: string;\n }[];\n };\n spec.props.properties[propName] = {\n type: 'string',\n // yes there is a double \"value\" & yes it is confusing\n enum: [\n // ensure list is unique\n ...new Set<string>(\n (type as EnumType).value\n .map(({ value }) => removeWrappingDoubleQuotes(value?.trim()))\n .filter(Boolean),\n ),\n ],\n };\n break;\n case 'ReactNode':\n case 'React.ReactNode':\n case 'React.ReactElement':\n case 'ReactElement':\n spec.slots[propName] = {\n title: propName,\n };\n if (description) {\n spec.slots[propName] = {\n ...spec.slots[propName],\n description,\n };\n }\n break;\n case 'VFC':\n case 'FC':\n spec.slots[propName] = {\n title: propName,\n description: description || 'A reference to a component',\n isTemplateReference: true,\n allowOnlyOne: true,\n disallowText: true,\n };\n break;\n default: {\n if (type?.name?.startsWith('(')) {\n // functions\n spec.props.properties[propName] = {\n // description: `\\`${type.name}\\` ${description}`,\n typeof: 'function',\n tsType: propDef?.type?.name,\n };\n } else if (type?.name?.includes('|')) {\n // enums / unions (multi-choice strings)\n // comes in like this: `{ name: '\"option1\" | \"option2\" | \"option3\"' }`\n const options = type.name\n .split('|')\n .map((enumItem) => removeWrappingDoubleQuotes(enumItem.trim()))\n .filter(Boolean);\n\n if (options?.length) {\n spec.props.properties[propName] = {\n type: 'string',\n // ensuring list is unique\n enum: [...new Set(options)],\n };\n }\n } else {\n spec.props.properties[propName] = {\n tsType: propDef?.type?.name,\n };\n }\n }\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n if (isNumberProp(spec.props.properties[propName])) {\n spec.props.properties[propName].default = parseFloat(\n defaultValue.value,\n );\n } else {\n spec.props.properties[propName].default =\n removeWrappingDoubleQuotes(defaultValue.value);\n }\n }\n }\n\n // console.log('type', type);\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React TypeScript file',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nasync function getPropTypesInfoFromFile({ src }: { src: string }): Promise<{\n info: Documentation[];\n}> {\n const reactDocs = await import('react-docgen');\n const { builtinResolvers } = reactDocs;\n const fileSrc = await readFile(src);\n const { FindExportedDefinitionsResolver } = builtinResolvers;\n const results: Documentation[] = reactDocs.parse(fileSrc, {\n resolver: new FindExportedDefinitionsResolver(),\n handlers: null,\n filename: src,\n // babelrc: false,\n });\n return {\n info: results,\n };\n}\n\nfunction extractSpecFromPropTypesInfo({\n info: results,\n exportName,\n}: {\n info: Documentation[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect(results, 'JSX PropTypes Results');\n // console.log(JSON.stringify(result, null, ' '));\n\n const spec: KsTemplateSpec = {\n isInferred: true,\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {},\n };\n\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { required, description, defaultValue } = propDef;\n switch (propDef?.type?.name) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'func':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'bool':\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'node':\n spec.slots[propName] = {\n title: propName,\n description,\n };\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n spec.props.properties[propName].default =\n typeof defaultValue.value === 'string'\n ? removeWrappingDoubleQuotes(defaultValue.value)\n : defaultValue.value;\n }\n }\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React PropTypes',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nfunction cleanUpSpec({\n spec,\n}: {\n spec: KsTemplateSpec | false;\n}): KsTemplateSpec | false {\n if (spec === false) return spec;\n // ok to mutate b/c spec was just created before passing in here\n Object.entries(spec?.props?.properties || {}).forEach(([propName, prop]) => {\n if (isOptionsProp(prop)) {\n // If the default is not in the enum, it should not be there\n // OR the enum is wrong\n if (!prop.enum.includes(prop.default)) {\n prop.default = undefined;\n }\n }\n });\n\n return spec;\n}\n\nasync function getReactModuleInfoUncached({\n src: unknownSrc,\n resolveFromDir,\n}: {\n src: string;\n resolveFromDir: string;\n}): Promise<\n | {\n type: 'typescript';\n info: ComponentDoc[];\n }\n | {\n type: 'propTypes';\n info: Documentation[];\n }\n | {\n type: 'unknown';\n }\n> {\n const typesInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n resolveType: 'types',\n });\n if (typesInfo.exists) {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: typesInfo.absolutePath,\n });\n if (typeScriptInfo) {\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n }\n const jsInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n });\n if (!jsInfo.exists) return { type: 'unknown' };\n const { ext } = path.parse(jsInfo.absolutePath);\n switch (ext) {\n case '.jsx': {\n const propTypesInfo = await getPropTypesInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'propTypes',\n info: propTypesInfo.info,\n };\n }\n case '.ts':\n case '.tsx': {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n default:\n return {\n type: 'unknown',\n };\n }\n}\n\nconst getReactModuleInfoCache = new Map<\n string,\n ReturnType<typeof getReactModuleInfoUncached>\n>();\nexport const clearInferSpecCache = () => {\n log.info(`Clearing React TypeScript inferSpec cache...`);\n getReactModuleInfoCache.clear();\n};\nasync function getReactModuleInfo(\n args: Parameters<typeof getReactModuleInfoUncached>[0],\n) {\n const cacheKey = JSON.stringify(args);\n if (!getReactModuleInfoCache.has(cacheKey)) {\n getReactModuleInfoCache.set(cacheKey, getReactModuleInfoUncached(args));\n }\n return getReactModuleInfoCache.get(cacheKey);\n}\n\nasync function getReactSpec({\n src,\n exportName,\n resolveFromDir,\n}: GetSpecParams & {\n resolveFromDir: string;\n}): Promise<KsTemplateSpec | false> {\n const reactModuleInfo = await getReactModuleInfo({\n src,\n resolveFromDir,\n });\n switch (reactModuleInfo.type) {\n case 'typescript':\n return extractSpecFromTypeScriptInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'propTypes':\n return extractSpecFromPropTypesInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'unknown':\n default:\n return false;\n }\n}\n\nexport async function getReactDocs(\n opt: GetSpecParams & {\n resolveFromDir: string;\n },\n): Promise<KsTemplateSpec | false> {\n return cleanUpSpec({\n spec: await getReactSpec(opt),\n });\n}\n\nexport async function copyReactAssets(\n distDirAbsolute: string,\n publicPath: string,\n): Promise<string[]> {\n try {\n const { version: reactVersion } = getModulePkgJson('react');\n const { version: reactDomVersion } = getModulePkgJson('react-dom');\n\n // switch to resolving the root NPM package dir vs the entire file via require.resolve\n // workaround due to NPM packages using the exports field; prevents these from being auto-resolved\n const reactRoot = path.dirname(\n require.resolve('react', {\n paths: [process.cwd()],\n }),\n );\n const reactDomRoot = path.dirname(\n require.resolve('react-dom', {\n paths: [process.cwd()],\n }),\n );\n await Promise.all([\n copy(\n path.join(reactRoot, 'umd/react.development.js'),\n path.join(distDirAbsolute, `react.development.${reactVersion}.js`),\n ),\n copy(\n path.join(reactRoot, 'umd/react.production.min.js'),\n path.join(distDirAbsolute, `react.production.min.${reactVersion}.js`),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.production.min.js'),\n path.join(\n distDirAbsolute,\n `react-dom.production.min.${reactDomVersion}.js`,\n ),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.development.js'),\n path.join(\n distDirAbsolute,\n `react-dom.development.${reactDomVersion}.js`,\n ),\n ),\n ]);\n const reactFileSuffix =\n process.env.NODE_ENV === 'production' ? 'production.min' : 'development';\n\n return [\n path.join(publicPath, `react.${reactFileSuffix}.${reactVersion}.js`),\n path.join(\n publicPath,\n `react-dom.${reactFileSuffix}.${reactDomVersion}.js`,\n ),\n ];\n } catch (error) {\n log.warn(\n 'Error trying to copy \"react\" and \"react-dom\" JS files, are they installed? We want to use your exact versions.',\n error,\n 'templateRenderer:react',\n );\n process.exit(1);\n }\n}\n","import { getJsExportNames } from '@knapsack/file-utils';\nimport { createCreator, tasks, Task } from '@knapsack/creator-utils';\nimport {\n readKsPatternConfigs,\n writeKsPatternConfig,\n readKsNavConfig,\n addKsNavItems,\n writeDemo,\n} from '@knapsack/ks-file-utils';\nimport { Demo, KnapsackPattern } from '@knapsack/types';\nimport { makeShortId } from '@knapsack/utils';\n\nfunction isCapitalLetter(char: string): boolean {\n return char.toUpperCase() === char;\n}\n\nfunction startsWithCapitalLetter(str: string): boolean {\n return isCapitalLetter(str[0]);\n}\n\nfunction createPatternData({\n importName,\n id,\n title = importName,\n pkgPath,\n initialDemoId,\n}: {\n importName: string;\n id: string;\n title?: string;\n pkgPath: string;\n initialDemoId: string;\n}): KnapsackPattern {\n return {\n id,\n title,\n description: '',\n statuses: {\n main: 'ready',\n },\n templates: [\n {\n id: 'react',\n title: 'react',\n path: pkgPath,\n alias: importName,\n templateLanguageId: 'react',\n spec: {\n isInferred: true,\n },\n demoIds: [initialDemoId],\n blockIds: [],\n },\n ],\n tabs: [\n {\n type: 'template',\n id: 'react',\n },\n ],\n subPages: [],\n };\n}\n\nexport const createReactPattern = createCreator({\n id: 'react-patterns',\n title: 'React Ks Patterns',\n description: 'Adds React templates as Knapsack Patterns',\n getQuestions: async () => ({\n pkgPath: {\n type: 'text',\n title: 'Package path',\n },\n importPrefix: {\n type: 'text',\n title: 'Import Prefix to Remove',\n },\n }),\n getTasks: async ({ answers: { pkgPath, importPrefix = '' }, config }) => {\n const dataDir = config.dest;\n const currentPatterns = await readKsPatternConfigs({\n dataDir,\n });\n const currentReactPatternsImportNames = currentPatterns.reduce(\n (cur, pattern) => {\n const reactTemplates =\n pattern.templates?.filter((t) => t.templateLanguageId === 'react') ??\n [];\n cur.push(...reactTemplates.map((t) => t.alias));\n return cur;\n },\n [] as string[],\n );\n const { exports: allImports } = await getJsExportNames({\n path: pkgPath,\n });\n return [\n {\n title: 'Pick Imports to add',\n task: (_, task) =>\n tasks.runSubCreator({\n task,\n config,\n creator: createCreator({\n id: 'react-pattern-import-names',\n getQuestions: async () => ({\n importNames: {\n type: 'choices',\n choices: allImports\n .filter(\n (importName) =>\n startsWithCapitalLetter(importName) &&\n !currentReactPatternsImportNames.includes(importName),\n )\n .map((importName) => ({\n value: importName,\n })),\n },\n }),\n getTasks: async ({ answers: { importNames } }) => {\n const patterns = importNames.map((importName) => ({\n importName,\n patternId: importName.startsWith(importPrefix)\n ? importName.slice(importPrefix.length).toLowerCase()\n : importName.toLowerCase(),\n }));\n return [\n ...patterns.map(\n ({ importName, patternId }): Task => ({\n title: `Add ${importName} React Template`,\n task: async (__, subTask) => {\n const initialDemo: Demo = {\n type: 'data',\n id: makeShortId(),\n title: 'Main',\n patternId,\n templateId: 'react',\n data: {\n props: {},\n slots: {},\n },\n };\n const pattern = createPatternData({\n id: patternId,\n importName,\n pkgPath,\n initialDemoId: initialDemo.id,\n });\n\n await Promise.all([\n writeDemo({\n dataDir,\n demo: initialDemo,\n }),\n writeKsPatternConfig({\n dataDir,\n patternId,\n data: pattern,\n }),\n ]);\n },\n }),\n ),\n {\n title: `Updating Nav`,\n task: async (__, subTask) => {\n const { byId } = await readKsNavConfig({\n dataDir,\n });\n // attempt to find a nav group to put patterns under\n const componentsGroup = Object.values(byId).find(\n ({ path, name, id }) => {\n // we only want groups (i.e. not pages or patterns)\n if (path) return false;\n if (name.toLowerCase() === 'patterns') return true;\n if (name.toLowerCase() === 'components') return true;\n return false;\n },\n );\n await addKsNavItems({\n dataDir,\n navItems: patterns.map(({ patternId }) => ({\n navId: patternId,\n navPath: `/pattern/${patternId}`,\n navParent: componentsGroup?.id || 'root',\n })),\n });\n },\n },\n ];\n },\n }),\n }),\n },\n ];\n },\n});\n"],"mappings":"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","names":["import_utils","import_app","import_types","import_file_utils","import_path","path","parse","import_file_utils","import_utils","path","sleep","usage","path","alias","exports"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/renderer-react.ts","../src/utils.ts","../src/react-creators.ts"],"sourcesContent":["export * from './renderer-react';\n","import sleep from 'sleep-promise';\nimport { KnapsackRendererWebpackBase } from '@knapsack/renderer-webpack-base';\nimport {\n pascalCase,\n Except,\n isFirstLetterCapital,\n isObject,\n isEmpty,\n} from '@knapsack/utils';\nimport { knapsackEvents, log, KnapsackRendererBase } from '@knapsack/app';\nimport {\n KsRendererClientGlobal,\n KnapsackFile,\n KsJsImport,\n isSlottedText,\n isSlottedTemplateReference,\n isSlottedTemplateDemo,\n KnapsackPatternTemplate,\n KsTemplateSpec,\n TemplateSuggestion,\n rendererIds,\n RendererId,\n} from '@knapsack/types';\nimport type {\n KnapsackRenderParams,\n KnapsackTemplateRenderer,\n KnapsackTemplateRendererBase,\n KnapsackTemplateRendererResults,\n Patterns,\n} from '@knapsack/app/types';\nimport {\n exists,\n findUpPkgJson,\n getJsExportNames,\n readFile,\n formatCode,\n} from '@knapsack/file-utils';\nimport type { ReactNode } from 'react';\nimport { join, relative, parse } from 'path';\nimport {\n clearInferSpecCache,\n copyReactAssets,\n getDemoAppUsage,\n getReactDocs,\n getUsage,\n} from './utils';\nimport { createReactPattern } from './react-creators';\n\nconst { pkg } = findUpPkgJson(__dirname);\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nlog.setupUpdateNotifier({ ...pkg, name: pkg.name!, version: pkg.version! });\n\n// static methods only\nconst { hasSlotOptions } = KnapsackRendererBase;\n\nexport type DemoWrapperProps = {\n children: React.ReactNode;\n patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[];\n} & Except<KnapsackRenderParams, 'patternManifest'>;\n\nexport class KnapsackReactRenderer\n extends KnapsackRendererWebpackBase\n implements KnapsackTemplateRenderer\n{\n /**\n * `react.js` & `react-dom.js` root relative paths\n */\n assets: string[];\n babelConfig: Record<string, unknown>;\n creators: KnapsackTemplateRenderer['creators'];\n private demoWrapperPath: string;\n\n private disableReactStrictMode?: boolean;\n\n constructor({\n webpackConfig,\n demoWrapperPath = join(__dirname, './demo-wrapper.mjs'),\n id = rendererIds.react,\n disableReactStrictMode,\n }: {\n webpackConfig?: ConstructorParameters<\n typeof KnapsackRendererWebpackBase\n >[0]['webpackConfig'];\n demoWrapperPath?: string;\n /** When using React v18+, this option allows a workspace to _disable_ React's Strict Mode from running in Knapsack's React Renderer (StrictMode is enabled by default).\n *\n * See https://reactjs.org/docs/strict-mode.html for more info\n * */\n disableReactStrictMode?: boolean;\n /** Don't set if calling from `knapsack.config.js`, only use if creating a new Renderer based on the React Renderer */\n id?: RendererId;\n } = {}) {\n super({\n id,\n extension: '.jsx',\n language: 'jsx',\n webpackConfig,\n });\n this.language = 'jsx';\n this.assets = [];\n this.demoWrapperPath = demoWrapperPath;\n\n // Half-borrowing the API Synax for this from the latest version of Next.js\n this.disableReactStrictMode = disableReactStrictMode;\n this.creators = [createReactPattern];\n }\n\n async init(opt: { patterns: Patterns; cacheDir: string }): Promise<void> {\n await super.init(opt);\n this.assets = await copyReactAssets(this.outputDir, this.publicPath);\n if (!(await exists(this.demoWrapperPath))) {\n throw new Error(\n `Could not find demo wrapper at: \"${this.demoWrapperPath}\"`,\n );\n }\n }\n\n getMeta: KnapsackTemplateRenderer['getMeta'] = () => ({\n id: this.id,\n title: 'React',\n aliasUse: 'optional',\n aliasTitle: 'Named Export',\n aliasIsJsNamedExport: true,\n aliasDescription:\n 'If `export X` was used instead of `export default`, then provide X.',\n enableDataDemos: true,\n enableTemplateDemos: true,\n hasSlotsSupport: true,\n hasSlotOptionsSupport: true,\n version: pkg.version,\n hasInferSpecSupport: true,\n syntaxHighlightingLanguage: 'jsx',\n hasTemplateSuggestionsSupport: true,\n prototypingTemplate: {\n path: '@knapsack/renderer-react/prototype-template',\n spec: {\n isInferred: false,\n props: {\n type: 'object',\n properties: {},\n },\n slots: {\n children: { title: 'Children' },\n },\n },\n },\n });\n\n changeCase(str: string): string {\n return pascalCase(str);\n }\n\n createWebpackConfig(): ReturnType<\n KnapsackRendererWebpackBase['createWebpackConfig']\n > {\n const config = super.createWebpackConfig();\n\n config.externals = {\n react: 'React',\n 'react-dom': 'ReactDOM',\n };\n\n return config;\n }\n\n getJsImports(): ReturnType<KnapsackRendererWebpackBase['getJsImports']> {\n const imports = super.getJsImports();\n imports.push(\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: this.demoWrapperPath,\n name: 'DemoWrapper',\n },\n },\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: join(__dirname, './error-catcher.mjs'),\n name: 'ErrorCatcher',\n },\n },\n );\n return imports;\n }\n\n async prepClientRenderResults({\n usage,\n demoApp,\n imports: xImports,\n renderOptions: { pattern, template, demo },\n }: {\n usage: string;\n demoApp: string;\n imports: KsJsImport[];\n renderOptions: KnapsackRenderParams;\n }): Promise<KnapsackTemplateRendererResults> {\n const extraImportNames = this.getJsImports().flatMap((imp) =>\n imp.type === 'extra' ? [imp.importInfo.name] : [],\n );\n const { imports, isDeclaredVarsUnique, nameCollisions } =\n this.makeKsJsImportsUnique({ imports: xImports });\n\n if (!isDeclaredVarsUnique) {\n log.error(`${nameCollisions.join(', ')} are declared multiple times`, {\n imports,\n });\n }\n\n // import names; i.e. `KsButton`\n const importNames = [\n ...imports.map(({ importInfo: { name } }) => name),\n ...extraImportNames,\n ];\n\n const patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[] = imports.flatMap((imp) => {\n if (imp.type === 'pattern-template') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n },\n ];\n }\n if (imp.type === 'pattern-template-demo') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n demoId: imp.demoId,\n },\n ];\n }\n return [];\n });\n\n const demoWrapperProps: Omit<DemoWrapperProps, 'children'> = {\n patternsUsed,\n pattern,\n template,\n demo,\n };\n const demoWrapperCode = await getUsage({\n templateName: 'DemoWrapper',\n props: demoWrapperProps,\n children: `<DemoApp />`,\n // extraProps,\n });\n\n /**\n * IMPORTANT: this function is stringified and then executed in the browser - it cannot use anything in scope (other functions, vars, etc)\n */\n async function renderReact({\n patterns,\n theExtraImportNames,\n ksGlobal,\n }: {\n patterns: typeof patternsUsed;\n theExtraImportNames: typeof extraImportNames;\n ksGlobal: KsRendererClientGlobal<ReactNode>;\n }): Promise<Record<string, ReactNode>> {\n if (!ksGlobal) {\n throw new Error('\"window.knapsack\" is null');\n }\n const components = await ksGlobal.getAllImports({\n patterns,\n extras: theExtraImportNames.map((name) => ({ name })),\n });\n return components;\n }\n\n let code = `\n\n${renderReact.toString()}\n${renderReact.name}({\n ksGlobal: window.knapsack,\n patterns: ${JSON.stringify(patternsUsed)},\n theExtraImportNames: ${JSON.stringify(extraImportNames)},\n}).then((components) => {\n const { ${importNames.join(', ')} } = components;\n const root = document.getElementById('render-root');\n\n ${demoApp}\n\n const reactDomVersion = parseInt(ReactDOM.version.split('.')[0], 10);\n\n const ReactRendererResult = () => {\n if (reactDomVersion < 17 || ${this.disableReactStrictMode}){\n return (\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n )\n }\n\n return (\n <React.StrictMode>\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n </React.StrictMode>\n )\n };\n\n\n if (reactDomVersion > 17){\n ReactDOM.createRoot(root).render(\n <ReactRendererResult />\n )\n } else {\n ReactDOM.render(\n <ReactRendererResult />,\n root\n );\n }\n}).catch((err) => {\n console.error(err);\n const root = document.getElementById('render-root');\n // Create a new <div> element to contain the error message\n const errorMsgDiv = document.createElement('div');\n // Insert the new <div> element before the existing element\n root.parentNode.insertBefore(errorMsgDiv, root);\n // add error message so users can see it\n errorMsgDiv.innerHTML = '<h1>Component Error</h1><p>' + err.message + '</p>';\n});\n `;\n\n let codeHadError = false;\n let errorHtmlMsg = '';\n\n try {\n code = await this.babelCodeForBrowser({\n code,\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before babel error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n\n if (!codeHadError) {\n try {\n code = await formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before prettier error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n }\n\n const html = `\n ${this.assets.map((asset) => `<script src=\"${asset}\"></script>`).join('\\n')}\n\n ${this.createHtmlTagsForAssetPaths({\n assets: this.getWebpackAssetPaths(),\n // we need the scripts to finish adding methods to the global knapsack object synchronously before the client-side code runs that is in the <script> tag below\n scriptTagsAreAsync: false,\n })}\n\n <div id=\"render-root\" class=\"knapsack-pattern-direct-parent\" data-dev-note=\"Knapsack React Template Wrapper\"></div>\n <script type=\"application/javascript\">${code}</script>\n${errorHtmlMsg}\n\n `;\n\n return {\n ok: !codeHadError,\n html: await formatCode({\n contents: html,\n path: 'x.html', // doing this to set format language\n }),\n usage,\n templateLanguage: this.language,\n };\n }\n\n async render(\n opt: KnapsackRenderParams,\n ): Promise<KnapsackTemplateRendererResults> {\n if (KnapsackReactRenderer.isTemplateDemo(opt.demo)) {\n // when getting a template demos path sometimes we have a race condition where the client asks for it before the server knows about it.\n // so we try several times in a row to get it\n /** The amount of time in ms to wait between attempts; when we run out of array items, we give up and throw the error */\n const waits = [5, 10, 20, 50, 100, 1000, 1000];\n let templateDemoPath: string;\n let attempt = 0;\n\n while (true) {\n try {\n templateDemoPath = opt.patternManifest.getTemplateDemoAbsolutePath({\n patternId: opt.pattern.id,\n templateId: opt.template.id,\n demoId: opt.demo.id,\n });\n // got it!\n break;\n } catch (e) {\n const waitTime = waits[attempt];\n if (!waitTime) {\n throw new Error(e);\n }\n attempt += 1;\n // eslint-disable-next-line no-await-in-loop\n await sleep(waitTime);\n }\n }\n\n const [templateFileContents, { usage, imports }] = await Promise.all([\n readFile(templateDemoPath),\n this.getUsageAndImports(opt),\n ]);\n const demoApp = await getDemoAppUsage({\n children: usage,\n });\n const results = await this.prepClientRenderResults({\n usage: templateFileContents,\n demoApp,\n imports,\n renderOptions: opt,\n });\n\n return results;\n }\n\n if (KnapsackReactRenderer.isDataDemo(opt.demo)) {\n const { usage, imports } = await this.getUsageAndImports(opt);\n const { code: importCode } = this.createJsImportCodeBlock({\n imports,\n });\n\n const [demoAppUsage, demoApp] = await Promise.all([\n getDemoAppUsage({\n children: usage,\n imports: importCode,\n }),\n getDemoAppUsage({\n children: usage,\n }),\n ]);\n\n return this.prepClientRenderResults({\n demoApp,\n usage: demoAppUsage,\n imports,\n renderOptions: opt,\n });\n }\n }\n\n async getUsageAndImports(opt: KnapsackRenderParams): Promise<{\n usage: string;\n imports: KsJsImport[];\n }> {\n const { pattern, template, patternManifest, demo } = opt;\n if (demo?.type && KnapsackReactRenderer.isDataDemo(demo)) {\n const {\n data: { props, slots, slotsOptionsComputed },\n } = demo;\n\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const importInfos: KsJsImport[] = [importInfo];\n const children: string[] = [];\n const extraProps: { key: string; value: string }[] = [];\n\n if (slots) {\n const slotNames = Object.keys(slots);\n const slotUsages = await Promise.all(\n slotNames.map(async (slotName) => {\n const slotItems = slots[slotName];\n const slotItemsUsages = await Promise.all(\n slotItems\n // remove any incomplete item - happens when users are filling out form\n .filter((slotItem) => {\n if (!isSlottedText(slotItem)) {\n if (!slotItem.patternId) return false;\n if (!slotItem.templateId) return false;\n if (isSlottedTemplateDemo(slotItem) && !slotItem.demoId) {\n return false;\n }\n }\n return true;\n })\n .map(async (slotItem) => {\n if (isSlottedText(slotItem)) {\n if (slotItems.length === 1 && slotName !== 'children') {\n // The ` prevents multi-line strings from causing error (even though they don't show a line break)\n return `\\`${slotItem.text}\\``;\n }\n return slotItem.text;\n }\n\n const slotPattern = patternManifest.getPattern(\n slotItem.patternId,\n );\n\n const slotTemplate = slotPattern.templates.find(\n (t) => t.id === slotItem.templateId,\n );\n if (isSlottedTemplateReference(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n if (isSlottedTemplateDemo(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n demo:\n slotItem.demo ||\n this.patterns.demosById[slotItem.demoId],\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n\n throw new Error(\n `Unknown slot item: ${JSON.stringify(slotItem)}`,\n );\n }),\n );\n return {\n slotName,\n slotItemsUsages,\n };\n }),\n );\n\n slotUsages.forEach(({ slotName, slotItemsUsages }) => {\n const slotOptionsComputed = slotsOptionsComputed?.[slotName];\n if (hasSlotOptions(slotOptionsComputed)) {\n const { attributes, cssClasses, styles, wrappingElementName } =\n slotOptionsComputed;\n const openTag = `<${wrappingElementName}\n ${isEmpty(styles) ? '' : `style={${JSON.stringify(styles)}}`}\n ${isEmpty(cssClasses) ? '' : `className=\"${cssClasses.join(' ')}\"`}\n ${Object.entries(attributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')}\n >`;\n if (slotName === 'children') {\n children.push(openTag);\n } else {\n extraProps.push({\n key: slotName,\n value: openTag,\n });\n }\n }\n\n slotItemsUsages.forEach((usage) => {\n if (slotName === 'children') {\n children.push(usage);\n } else {\n extraProps.push({\n key: slotName,\n value: usage,\n });\n }\n });\n\n if (hasSlotOptions(slotOptionsComputed)) {\n const closeTag = `</${slotOptionsComputed.wrappingElementName}>`;\n if (slotName === 'children') {\n children.push(closeTag);\n } else {\n extraProps.push({\n key: slotName,\n value: closeTag,\n });\n }\n }\n });\n }\n\n const usage = await getUsage({\n templateName,\n props,\n children: children.join('\\n'),\n extraProps,\n });\n\n return {\n usage,\n imports: importInfos,\n };\n }\n\n if (demo?.type && KnapsackReactRenderer.isTemplateDemo(demo)) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n demoId: demo.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template-demo: ${pattern.id}-${template.id}-${demo.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const usage = await getUsage({ templateName });\n\n return {\n usage,\n imports: [importInfo],\n };\n }\n\n if (!demo) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n return {\n /**\n * i.e. Given a React Component, `Button`, normally this would be `<Button>` with a demo, but since there is none this will just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n * @see {SlottedTemplate}\n */\n usage: templateName,\n imports: [importInfo],\n };\n }\n\n throw new Error(\n `Unhandled demo type for ${pattern.id}-${template.id}: ${JSON.stringify(\n demo,\n )}`,\n );\n }\n\n async getUsage(opt: KnapsackRenderParams): Promise<string> {\n const { usage } = await this.getUsageAndImports(opt);\n return usage;\n }\n\n inferSpec: KnapsackTemplateRendererBase['inferSpec'] = async ({\n template,\n templatePath,\n }: {\n template: KnapsackPatternTemplate;\n templatePath: string;\n }): Promise<KsTemplateSpec | false> => {\n const spec = await getReactDocs({\n src: template.path,\n exportName: template.alias || 'default',\n resolveFromDir: this.config.data,\n });\n if (spec !== false) {\n const totalProps = Object.keys(spec?.props?.properties || {}).length;\n const totalSlots = Object.keys(spec?.slots || {}).length;\n if (totalProps === 0 && totalSlots === 0) {\n return false;\n }\n }\n return spec;\n };\n\n async watch(opt: Parameters<KnapsackTemplateRendererBase['watch']>[0]) {\n await super.watch(opt);\n knapsackEvents.onPatternTemplateChanged(() => {\n clearInferSpecCache();\n });\n }\n\n getTemplateMeta: KnapsackTemplateRendererBase['getTemplateMeta'] = async ({\n pattern,\n template,\n }) => {\n const files: KnapsackFile[] = [];\n if (template?.spec?.props) {\n const schema = JSON.parse(JSON.stringify(template.spec.props));\n if (template?.spec?.slots) {\n Object.entries(template.spec.slots).forEach(([id, info]) => {\n schema.properties[id] = {\n typeof: 'function',\n tsType: 'React.ReactNode',\n\n description: info.allowedPatternIds\n ? `${info.description}. Only use: ${info.allowedPatternIds.join(\n ', ',\n )}`\n : info.description,\n };\n schema.required = schema.required ?? [];\n if (info.isRequired) schema.required.push(id);\n });\n }\n const typeDefs =\n await KnapsackReactRenderer.convertSchemaToTypeScriptDefs({\n schema,\n title: `${this.changeCase(pattern.id)}Props`,\n // @todo pull in base url\n description: `[Knapsack Docs](http://localhost:3999/pattern/${pattern.id}/${template.id})`,\n patternId: pattern.id,\n templateId: template.id,\n postBanner: `import * as React from 'react';`,\n });\n\n files.push({\n contents: typeDefs,\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.d.ts`,\n });\n files.push({\n contents: JSON.stringify(schema, null, ' '),\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.json`,\n });\n }\n return files;\n };\n\n alterTemplateMetaFiles: KnapsackTemplateRendererBase['alterTemplateMetaFiles'] =\n async ({ files, metaDir }) => {\n const imports: string[] = [];\n\n const ext = '.spec.d.ts';\n files.forEach((file) => {\n if (file.path.endsWith(ext)) {\n const { base } = parse(file.path);\n const [patternId, templateId] = base.split('.');\n const isFirst = templateId === this.id;\n const exportName = this.changeCase(`${patternId}Props`);\n const exportNameWithTemplateId = this.changeCase(\n `${patternId}-${templateId}Props`,\n );\n imports.push(\n `export { ${\n isFirst\n ? exportName\n : `${exportName} as ${exportNameWithTemplateId}`\n } } from './${relative(metaDir, file.path).replace('.d.ts', '')}';`,\n );\n }\n });\n\n // extra line at end of file\n imports.push('');\n\n return [\n ...files,\n {\n contents: imports.join('\\n'),\n encoding: 'utf8',\n path: join(metaDir, 'react.d.ts'),\n },\n ];\n };\n\n async getTemplateSuggestions({\n newPath,\n }: Parameters<\n KnapsackTemplateRendererBase['getTemplateSuggestions']\n >[0]): ReturnType<KnapsackTemplateRendererBase['getTemplateSuggestions']> {\n const { data: dataDir } = this.patterns.userConfig;\n const { allTemplateDemos, allTemplates } = this.getMyTemplates();\n const usedSuggestions: TemplateSuggestion[] = [\n ...allTemplateDemos,\n ...allTemplates,\n ].map(({ path, alias }) => {\n return {\n path,\n alias: alias || 'default',\n };\n });\n\n const allPaths = [\n ...new Set([newPath, ...usedSuggestions.map(({ path }) => path)]),\n ];\n const {\n resolve: { alias },\n } = this.createWebpackConfig();\n const aliasConfig: Record<string, string> = {};\n if (isObject(alias)) {\n Object.entries(alias).forEach(([key, value]) => {\n if (typeof value === 'string') {\n aliasConfig[key] = value;\n }\n });\n }\n const allSuggestions: TemplateSuggestion[] = await Promise.all(\n allPaths.map(async (path): Promise<TemplateSuggestion[]> => {\n if (!path) return [];\n try {\n const { exports, errorMsg } = await getJsExportNames({\n path,\n resolveFromDir: dataDir,\n alias: aliasConfig,\n });\n if (errorMsg) {\n throw new Error(errorMsg);\n }\n return (\n exports\n // only allow names that start with a capital letter (i.e. React Component names)\n // will exclude helper functions and custom hooks\n .filter((e) => e === 'default' || isFirstLetterCapital(e))\n .map((name) => ({\n alias: name,\n path,\n }))\n );\n } catch (e) {\n // only want this showing with verbose since template suggestions are not critical\n log.verbose(\n `Error getting import names for ${path}: ${e.message}`,\n null,\n this.logPrefix,\n );\n return [];\n }\n }),\n ).then((results) => {\n // sadly `Promise.all` & `.flatMap` just don't work, so this:\n return results.flat();\n });\n\n const suggestions = allSuggestions.filter((s) => {\n return !usedSuggestions.find(\n (us) => us.alias === s.alias && us.path === s.path,\n );\n });\n\n return {\n suggestions,\n };\n }\n}\n","import { log } from '@knapsack/app';\nimport {\n getModulePkgJson,\n readFile,\n copy,\n formatCode,\n resolvePath,\n findUp,\n} from '@knapsack/file-utils';\nimport { removeWrappingDoubleQuotes } from '@knapsack/utils';\nimport path from 'path';\nimport type { Documentation } from 'react-docgen';\nimport type { ComponentDoc, ParserOptions } from 'react-docgen-typescript';\nimport { KsTemplateSpec, isNumberProp, isOptionsProp } from '@knapsack/types';\n\ntype GetSpecParams = {\n src: string;\n exportName?: string;\n};\n\n/**\n * The name of the type, which is usually corresponds to the function name in `React.PropTypes`. However, for types define with `oneOf`, we use `\"enum\"` and for `oneOfType` we use `\"union\"`. If a custom function is provided or the type cannot be resolved to anything of `React.PropTypes`, we use `\"custom\"`.\n */\ntype RdTypeName =\n | 'number'\n | 'string'\n | 'custom'\n | 'union'\n | 'bool'\n | 'node'\n | 'func';\n\n/**\n * Some types accept parameters which define the type in more detail (such as `arrayOf`, `instanceOf`, `oneOf`, etc). Those are stored in `<typeValue>`. The data type of `<typeValue>` depends on the type definition.\n */\ntype RdTypeValue = string;\n\ntype RdProps = {\n [prop: string]: {\n defaultValue?: {\n value: string;\n computed: boolean;\n };\n type: {\n name: RdTypeName;\n value?: RdTypeValue;\n raw?: string;\n };\n flowType?: string;\n tsType?: string;\n description?: string;\n required: boolean;\n };\n};\n\ntype RdResults = {\n /**\n * Name of function, class, or const\n */\n displayName: string;\n description?: string;\n props: RdProps;\n};\n\nfunction renderUsageTemplate({\n templateName,\n attributes,\n children,\n}: {\n templateName: string;\n attributes: string;\n children: string;\n}) {\n return `\n <${templateName}\n ${attributes}\n ${\n children\n ? `>\n ${children}\n </${templateName}>`\n : '/>'\n }\n `;\n}\n\nfunction renderDemoAppTemplate({\n imports,\n children,\n}: {\n imports: string;\n children: string;\n}) {\n return `${imports}\n\nfunction DemoApp() {\n return (\n ${children}\n )\n}\n`;\n}\n\nexport async function getUsage(data: {\n templateName: string;\n props?: Record<string, unknown>;\n children?: string;\n extraProps?: {\n key: string;\n value: string;\n }[];\n format?: boolean;\n}): Promise<string> {\n const props = Object.keys(data.props || {}).map((key) => {\n const value = data.props[key];\n return {\n key,\n value,\n };\n });\n\n const { templateName, children, extraProps = [] } = data;\n if (!templateName) {\n throw new Error(\n `Cannot getUsage of a React Component when no \"templateName\" is provided.`,\n );\n }\n\n const attributes: string[] = props.map(({ key, value }) => {\n switch (typeof value) {\n case 'string':\n // Is this a function like `() => {}` but not a \"sizes\" attribute for an image like `(min-width: 400px) 50vw, 100vw`?\n if (value.startsWith('(') && value.includes('=>')) {\n return `${key}={${value}}`;\n }\n return `${key}=\"${value}\"`;\n case 'boolean':\n return value ? `${key}` : `${key}={${value}}`;\n default:\n return `${key}={${JSON.stringify(value)}}`;\n }\n });\n\n const extraAttributes: string[] = [];\n const slotProps: { [key: string]: string[] } = {};\n\n extraProps.forEach(({ key, value }) => {\n slotProps[key] = slotProps[key] ?? [];\n slotProps[key].push(value);\n });\n\n Object.entries(slotProps).forEach(([key, values]) => {\n const value = values.length === 1 ? values[0] : `<>${values.join('\\n')}</>`;\n extraAttributes.push(`${key}={${value}}`);\n });\n\n const result = renderUsageTemplate({\n templateName,\n attributes: [...attributes, ...extraAttributes].join(' '),\n children,\n });\n return data.format\n ? formatCode({\n contents: result,\n path: 'x.tsx', // doing this to set format language\n })\n .then((code) => code.trim())\n .catch(() => result.trim()) // if format fails, just return the unformatted code\n : result.trim();\n}\n\nexport async function getDemoAppUsage({\n children,\n imports,\n}: {\n children: string;\n imports?: string;\n}): Promise<string> {\n const code = renderDemoAppTemplate({\n children,\n imports,\n });\n return formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n}\n\nasync function getTypeScriptInfoFromFile({ src }: { src: string }): Promise<{\n info: ComponentDoc[];\n}> {\n const tsConfigPath = await findUp('tsconfig.json', {\n cwd: path.dirname(src),\n });\n const rdTs = await import('react-docgen-typescript');\n const config: ParserOptions = {\n shouldExtractLiteralValuesFromEnum: true,\n savePropValueAsString: true,\n skipChildrenPropWithoutDoc: false,\n // In addition to the ones listed here, which had not strangely included these below ~ https://github.com/styleguidist/react-docgen-typescript/blob/287e7012843cb26fed8f4bd8ee24e462c25a1414/src/parser.ts#L308\n customComponentTypes: ['VoidFunctionComponent', 'VFC'],\n };\n const parse = tsConfigPath\n ? rdTs.withCustomConfig(tsConfigPath, config).parse\n : rdTs.withDefaultConfig(config).parse;\n return {\n info: parse(src),\n };\n}\n\nfunction extractSpecFromTypeScriptInfo({\n info: results,\n exportName,\n}: {\n info: ComponentDoc[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n if (!results) return false;\n const spec: KsTemplateSpec = {\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {\n // children: {\n // title: 'children',\n // },\n },\n };\n\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect({ result, isDefaultExport, exportName }, 'ts result');\n if (!result) return false;\n\n const { displayName } = result;\n // log.inspect({ result }, 'result');\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { name, description, defaultValue, required, type, parent } =\n propDef;\n\n // `type.name` can include `| undefined` if tsConfig has `strict: true`. So we need to handle these scenarios:\n // `string` or `string | undefined`\n // `'left' | 'right'` or `'left' | 'right' | undefined`\n const propType = type?.name\n ?.replace('| undefined', '')\n // remove generics. things like `FC<{}>` and `FC<Props>` should become `FC`\n .replace(/<.*/g, '')\n .trim();\n\n switch (propType) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'number':\n spec.props.properties[propName] = {\n type: 'number',\n };\n break;\n case 'boolean':\n case 'bool':\n if (defaultValue && 'value' in defaultValue) {\n // comes in as `'true'` - this turns it to `true`\n defaultValue.value = defaultValue.value === 'true';\n }\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'enum':\n type EnumType = {\n name: string;\n raw: string;\n value: {\n /** Looks like `'\"option1\"'` - beware of string that contains `\"` */\n value: string;\n }[];\n };\n spec.props.properties[propName] = {\n type: 'string',\n // yes there is a double \"value\" & yes it is confusing\n enum: [\n // ensure list is unique\n ...new Set<string>(\n (type as EnumType).value\n .map(({ value }) => removeWrappingDoubleQuotes(value?.trim()))\n .filter(Boolean),\n ),\n ],\n };\n break;\n case 'ReactNode':\n case 'React.ReactNode':\n case 'React.ReactElement':\n case 'ReactElement':\n spec.slots[propName] = {\n title: propName,\n };\n if (description) {\n spec.slots[propName] = {\n ...spec.slots[propName],\n description,\n };\n }\n break;\n case 'VFC':\n case 'FC':\n spec.slots[propName] = {\n title: propName,\n description: description || 'A reference to a component',\n isTemplateReference: true,\n allowOnlyOne: true,\n disallowText: true,\n };\n break;\n default: {\n if (type?.name?.startsWith('(')) {\n // functions\n spec.props.properties[propName] = {\n // description: `\\`${type.name}\\` ${description}`,\n typeof: 'function',\n tsType: propDef?.type?.name,\n };\n } else if (type?.name?.includes('|')) {\n // enums / unions (multi-choice strings)\n // comes in like this: `{ name: '\"option1\" | \"option2\" | \"option3\"' }`\n const options = type.name\n .split('|')\n .map((enumItem) => removeWrappingDoubleQuotes(enumItem.trim()))\n .filter(Boolean);\n\n if (options?.length) {\n spec.props.properties[propName] = {\n type: 'string',\n // ensuring list is unique\n enum: [...new Set(options)],\n };\n }\n } else {\n spec.props.properties[propName] = {\n tsType: propDef?.type?.name,\n };\n }\n }\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n if (isNumberProp(spec.props.properties[propName])) {\n spec.props.properties[propName].default = parseFloat(\n defaultValue.value,\n );\n } else {\n spec.props.properties[propName].default =\n removeWrappingDoubleQuotes(defaultValue.value);\n }\n }\n }\n\n // console.log('type', type);\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React TypeScript file',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nasync function getPropTypesInfoFromFile({ src }: { src: string }): Promise<{\n info: Documentation[];\n}> {\n const reactDocs = await import('react-docgen');\n const { builtinResolvers } = reactDocs;\n const fileSrc = await readFile(src);\n const { FindExportedDefinitionsResolver } = builtinResolvers;\n const results: Documentation[] = reactDocs.parse(fileSrc, {\n resolver: new FindExportedDefinitionsResolver(),\n handlers: null,\n filename: src,\n // babelrc: false,\n });\n return {\n info: results,\n };\n}\n\nfunction extractSpecFromPropTypesInfo({\n info: results,\n exportName,\n}: {\n info: Documentation[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect(results, 'JSX PropTypes Results');\n // console.log(JSON.stringify(result, null, ' '));\n\n const spec: KsTemplateSpec = {\n isInferred: true,\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {},\n };\n\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { required, description, defaultValue } = propDef;\n switch (propDef?.type?.name) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'func':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'bool':\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'node':\n spec.slots[propName] = {\n title: propName,\n description,\n };\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n spec.props.properties[propName].default =\n typeof defaultValue.value === 'string'\n ? removeWrappingDoubleQuotes(defaultValue.value)\n : defaultValue.value;\n }\n }\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React PropTypes',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nfunction cleanUpSpec({\n spec,\n}: {\n spec: KsTemplateSpec | false;\n}): KsTemplateSpec | false {\n if (spec === false) return spec;\n // ok to mutate b/c spec was just created before passing in here\n Object.entries(spec?.props?.properties || {}).forEach(([propName, prop]) => {\n if (isOptionsProp(prop)) {\n // If the default is not in the enum, it should not be there\n // OR the enum is wrong\n if (!prop.enum.includes(prop.default)) {\n prop.default = undefined;\n }\n }\n });\n\n return spec;\n}\n\nasync function getReactModuleInfoUncached({\n src: unknownSrc,\n resolveFromDir,\n}: {\n src: string;\n resolveFromDir: string;\n}): Promise<\n | {\n type: 'typescript';\n info: ComponentDoc[];\n }\n | {\n type: 'propTypes';\n info: Documentation[];\n }\n | {\n type: 'unknown';\n }\n> {\n const typesInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n resolveType: 'types',\n });\n if (typesInfo.exists) {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: typesInfo.absolutePath,\n });\n if (typeScriptInfo) {\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n }\n const jsInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n });\n if (!jsInfo.exists) return { type: 'unknown' };\n const { ext } = path.parse(jsInfo.absolutePath);\n switch (ext) {\n case '.jsx': {\n const propTypesInfo = await getPropTypesInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'propTypes',\n info: propTypesInfo.info,\n };\n }\n case '.ts':\n case '.tsx': {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n default:\n return {\n type: 'unknown',\n };\n }\n}\n\nconst getReactModuleInfoCache = new Map<\n string,\n ReturnType<typeof getReactModuleInfoUncached>\n>();\nexport const clearInferSpecCache = () => {\n log.info(`Clearing React TypeScript inferSpec cache...`);\n getReactModuleInfoCache.clear();\n};\nasync function getReactModuleInfo(\n args: Parameters<typeof getReactModuleInfoUncached>[0],\n) {\n const cacheKey = JSON.stringify(args);\n if (!getReactModuleInfoCache.has(cacheKey)) {\n getReactModuleInfoCache.set(cacheKey, getReactModuleInfoUncached(args));\n }\n return getReactModuleInfoCache.get(cacheKey);\n}\n\nasync function getReactSpec({\n src,\n exportName,\n resolveFromDir,\n}: GetSpecParams & {\n resolveFromDir: string;\n}): Promise<KsTemplateSpec | false> {\n const reactModuleInfo = await getReactModuleInfo({\n src,\n resolveFromDir,\n });\n switch (reactModuleInfo.type) {\n case 'typescript':\n return extractSpecFromTypeScriptInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'propTypes':\n return extractSpecFromPropTypesInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'unknown':\n default:\n return false;\n }\n}\n\nexport async function getReactDocs(\n opt: GetSpecParams & {\n resolveFromDir: string;\n },\n): Promise<KsTemplateSpec | false> {\n return cleanUpSpec({\n spec: await getReactSpec(opt),\n });\n}\n\nexport async function copyReactAssets(\n distDirAbsolute: string,\n publicPath: string,\n): Promise<string[]> {\n try {\n const { version: reactVersion } = getModulePkgJson('react');\n const { version: reactDomVersion } = getModulePkgJson('react-dom');\n\n // switch to resolving the root NPM package dir vs the entire file via require.resolve\n // workaround due to NPM packages using the exports field; prevents these from being auto-resolved\n const reactRoot = path.dirname(\n require.resolve('react', {\n paths: [process.cwd()],\n }),\n );\n const reactDomRoot = path.dirname(\n require.resolve('react-dom', {\n paths: [process.cwd()],\n }),\n );\n await Promise.all([\n copy(\n path.join(reactRoot, 'umd/react.development.js'),\n path.join(distDirAbsolute, `react.development.${reactVersion}.js`),\n ),\n copy(\n path.join(reactRoot, 'umd/react.production.min.js'),\n path.join(distDirAbsolute, `react.production.min.${reactVersion}.js`),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.production.min.js'),\n path.join(\n distDirAbsolute,\n `react-dom.production.min.${reactDomVersion}.js`,\n ),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.development.js'),\n path.join(\n distDirAbsolute,\n `react-dom.development.${reactDomVersion}.js`,\n ),\n ),\n ]);\n const reactFileSuffix =\n process.env.NODE_ENV === 'production' ? 'production.min' : 'development';\n\n return [\n path.join(publicPath, `react.${reactFileSuffix}.${reactVersion}.js`),\n path.join(\n publicPath,\n `react-dom.${reactFileSuffix}.${reactDomVersion}.js`,\n ),\n ];\n } catch (error) {\n log.warn(\n 'Error trying to copy \"react\" and \"react-dom\" JS files, are they installed? We want to use your exact versions.',\n error,\n 'templateRenderer:react',\n );\n process.exit(1);\n }\n}\n","import { getJsExportNames } from '@knapsack/file-utils';\nimport { createCreator, tasks, Task } from '@knapsack/creator-utils';\nimport {\n readKsPatternConfigs,\n writeKsPatternConfig,\n readKsNavConfig,\n addKsNavItems,\n writeDemo,\n} from '@knapsack/ks-file-utils';\nimport { Demo, KnapsackPattern } from '@knapsack/types';\nimport { makeShortId } from '@knapsack/utils';\n\nfunction isCapitalLetter(char: string): boolean {\n return char.toUpperCase() === char;\n}\n\nfunction startsWithCapitalLetter(str: string): boolean {\n return isCapitalLetter(str[0]);\n}\n\nfunction createPatternData({\n importName,\n id,\n title = importName,\n pkgPath,\n initialDemoId,\n}: {\n importName: string;\n id: string;\n title?: string;\n pkgPath: string;\n initialDemoId: string;\n}): KnapsackPattern {\n return {\n id,\n title,\n description: '',\n statuses: {\n main: 'ready',\n },\n templates: [\n {\n id: 'react',\n title: 'react',\n path: pkgPath,\n alias: importName,\n templateLanguageId: 'react',\n spec: {\n isInferred: true,\n },\n demoIds: [initialDemoId],\n blockIds: [],\n },\n ],\n tabs: [\n {\n type: 'template',\n id: 'react',\n },\n ],\n subPages: [],\n };\n}\n\nexport const createReactPattern = createCreator({\n id: 'react-patterns',\n title: 'React Ks Patterns',\n description: 'Adds React templates as Knapsack Patterns',\n getQuestions: async () => ({\n pkgPath: {\n type: 'text',\n title: 'Package path',\n },\n importPrefix: {\n type: 'text',\n title: 'Import Prefix to Remove',\n },\n }),\n getTasks: async ({ answers: { pkgPath, importPrefix = '' }, config }) => {\n const dataDir = config.dest;\n const currentPatterns = await readKsPatternConfigs({\n dataDir,\n });\n const currentReactPatternsImportNames = currentPatterns.reduce(\n (cur, pattern) => {\n const reactTemplates =\n pattern.templates?.filter((t) => t.templateLanguageId === 'react') ??\n [];\n cur.push(...reactTemplates.map((t) => t.alias));\n return cur;\n },\n [] as string[],\n );\n const { exports: allImports } = await getJsExportNames({\n path: pkgPath,\n });\n return [\n {\n title: 'Pick Imports to add',\n task: (_, task) =>\n tasks.runSubCreator({\n task,\n config,\n creator: createCreator({\n id: 'react-pattern-import-names',\n getQuestions: async () => ({\n importNames: {\n type: 'choices',\n choices: allImports\n .filter(\n (importName) =>\n startsWithCapitalLetter(importName) &&\n !currentReactPatternsImportNames.includes(importName),\n )\n .map((importName) => ({\n value: importName,\n })),\n },\n }),\n getTasks: async ({ answers: { importNames } }) => {\n const patterns = importNames.map((importName) => ({\n importName,\n patternId: importName.startsWith(importPrefix)\n ? importName.slice(importPrefix.length).toLowerCase()\n : importName.toLowerCase(),\n }));\n return [\n ...patterns.map(\n ({ importName, patternId }): Task => ({\n title: `Add ${importName} React Template`,\n task: async (__, subTask) => {\n const initialDemo: Demo = {\n type: 'data',\n id: makeShortId(),\n title: 'Main',\n patternId,\n templateId: 'react',\n data: {\n props: {},\n slots: {},\n },\n };\n const pattern = createPatternData({\n id: patternId,\n importName,\n pkgPath,\n initialDemoId: initialDemo.id,\n });\n\n await Promise.all([\n writeDemo({\n dataDir,\n demo: initialDemo,\n }),\n writeKsPatternConfig({\n dataDir,\n patternId,\n data: pattern,\n }),\n ]);\n },\n }),\n ),\n {\n title: `Updating Nav`,\n task: async (__, subTask) => {\n const { byId } = await readKsNavConfig({\n dataDir,\n });\n // attempt to find a nav group to put patterns under\n const componentsGroup = Object.values(byId).find(\n ({ path, name, id }) => {\n // we only want groups (i.e. not pages or patterns)\n if (path) return false;\n if (name.toLowerCase() === 'patterns') return true;\n if (name.toLowerCase() === 'components') return true;\n return false;\n },\n );\n await addKsNavItems({\n dataDir,\n navItems: patterns.map(({ patternId }) => ({\n navId: patternId,\n navPath: `/pattern/${patternId}`,\n navParent: componentsGroup?.id || 'root',\n })),\n });\n },\n },\n ];\n },\n }),\n }),\n },\n ];\n },\n});\n"],"mappings":"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","names":["import_utils","import_app","import_types","import_file_utils","import_path","path","parse","import_file_utils","import_utils","path","sleep","usage","path","alias","exports"]}
|
package/dist/index.mjs
CHANGED
|
@@ -21,9 +21,10 @@ import { KnapsackRendererWebpackBase } from "@knapsack/renderer-webpack-base";
|
|
|
21
21
|
import {
|
|
22
22
|
pascalCase,
|
|
23
23
|
isFirstLetterCapital,
|
|
24
|
-
isObject
|
|
24
|
+
isObject,
|
|
25
|
+
isEmpty
|
|
25
26
|
} from "@knapsack/utils";
|
|
26
|
-
import { knapsackEvents, log as log2 } from "@knapsack/app";
|
|
27
|
+
import { knapsackEvents, log as log2, KnapsackRendererBase } from "@knapsack/app";
|
|
27
28
|
import {
|
|
28
29
|
isSlottedText,
|
|
29
30
|
isSlottedTemplateReference,
|
|
@@ -738,6 +739,7 @@ var createReactPattern = createCreator({
|
|
|
738
739
|
// src/renderer-react.ts
|
|
739
740
|
var { pkg } = findUpPkgJson(__dirname);
|
|
740
741
|
log2.setupUpdateNotifier({ ...pkg, name: pkg.name, version: pkg.version });
|
|
742
|
+
var { hasSlotOptions } = KnapsackRendererBase;
|
|
741
743
|
var KnapsackReactRenderer = class _KnapsackReactRenderer extends KnapsackRendererWebpackBase {
|
|
742
744
|
static {
|
|
743
745
|
__name(this, "KnapsackReactRenderer");
|
|
@@ -787,6 +789,7 @@ var KnapsackReactRenderer = class _KnapsackReactRenderer extends KnapsackRendere
|
|
|
787
789
|
enableDataDemos: true,
|
|
788
790
|
enableTemplateDemos: true,
|
|
789
791
|
hasSlotsSupport: true,
|
|
792
|
+
hasSlotOptionsSupport: true,
|
|
790
793
|
version: pkg.version,
|
|
791
794
|
hasInferSpecSupport: true,
|
|
792
795
|
syntaxHighlightingLanguage: "jsx",
|
|
@@ -1077,7 +1080,7 @@ ${errorHtmlMsg}
|
|
|
1077
1080
|
const { pattern, template, patternManifest, demo } = opt;
|
|
1078
1081
|
if (demo?.type && _KnapsackReactRenderer.isDataDemo(demo)) {
|
|
1079
1082
|
const {
|
|
1080
|
-
data: { props, slots }
|
|
1083
|
+
data: { props, slots, slotsOptionsComputed }
|
|
1081
1084
|
} = demo;
|
|
1082
1085
|
const importInfo = this.getJsImport({
|
|
1083
1086
|
patternId: pattern.id,
|
|
@@ -1097,7 +1100,7 @@ ${errorHtmlMsg}
|
|
|
1097
1100
|
const slotUsages = await Promise.all(
|
|
1098
1101
|
slotNames.map(async (slotName) => {
|
|
1099
1102
|
const slotItems = slots[slotName];
|
|
1100
|
-
const
|
|
1103
|
+
const slotItemsUsages = await Promise.all(
|
|
1101
1104
|
slotItems.filter((slotItem) => {
|
|
1102
1105
|
if (!isSlottedText(slotItem)) {
|
|
1103
1106
|
if (!slotItem.patternId)
|
|
@@ -1148,12 +1151,29 @@ ${errorHtmlMsg}
|
|
|
1148
1151
|
);
|
|
1149
1152
|
return {
|
|
1150
1153
|
slotName,
|
|
1151
|
-
|
|
1154
|
+
slotItemsUsages
|
|
1152
1155
|
};
|
|
1153
1156
|
})
|
|
1154
1157
|
);
|
|
1155
|
-
slotUsages.forEach(({ slotName,
|
|
1156
|
-
|
|
1158
|
+
slotUsages.forEach(({ slotName, slotItemsUsages }) => {
|
|
1159
|
+
const slotOptionsComputed = slotsOptionsComputed?.[slotName];
|
|
1160
|
+
if (hasSlotOptions(slotOptionsComputed)) {
|
|
1161
|
+
const { attributes, cssClasses, styles, wrappingElementName } = slotOptionsComputed;
|
|
1162
|
+
const openTag = `<${wrappingElementName}
|
|
1163
|
+
${isEmpty(styles) ? "" : `style={${JSON.stringify(styles)}}`}
|
|
1164
|
+
${isEmpty(cssClasses) ? "" : `className="${cssClasses.join(" ")}"`}
|
|
1165
|
+
${Object.entries(attributes).map(([key, value]) => `${key}="${value}"`).join(" ")}
|
|
1166
|
+
>`;
|
|
1167
|
+
if (slotName === "children") {
|
|
1168
|
+
children.push(openTag);
|
|
1169
|
+
} else {
|
|
1170
|
+
extraProps.push({
|
|
1171
|
+
key: slotName,
|
|
1172
|
+
value: openTag
|
|
1173
|
+
});
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
slotItemsUsages.forEach((usage2) => {
|
|
1157
1177
|
if (slotName === "children") {
|
|
1158
1178
|
children.push(usage2);
|
|
1159
1179
|
} else {
|
|
@@ -1163,6 +1183,17 @@ ${errorHtmlMsg}
|
|
|
1163
1183
|
});
|
|
1164
1184
|
}
|
|
1165
1185
|
});
|
|
1186
|
+
if (hasSlotOptions(slotOptionsComputed)) {
|
|
1187
|
+
const closeTag = `</${slotOptionsComputed.wrappingElementName}>`;
|
|
1188
|
+
if (slotName === "children") {
|
|
1189
|
+
children.push(closeTag);
|
|
1190
|
+
} else {
|
|
1191
|
+
extraProps.push({
|
|
1192
|
+
key: slotName,
|
|
1193
|
+
value: closeTag
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1166
1197
|
});
|
|
1167
1198
|
}
|
|
1168
1199
|
const usage = await getUsage({
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/.pnpm/tsup@8.0.2_@microsoft+api-extractor@7.43.8_@types+node@20.14.9__@swc+core@1.3.57_postcss@8.4._c7ofiv7d7od3vtkxwbcxujiyae/node_modules/tsup/assets/esm_shims.js","../src/renderer-react.ts","../src/utils.ts","../src/react-creators.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import sleep from 'sleep-promise';\nimport { KnapsackRendererWebpackBase } from '@knapsack/renderer-webpack-base';\nimport {\n pascalCase,\n Except,\n isFirstLetterCapital,\n isObject,\n} from '@knapsack/utils';\nimport { knapsackEvents, log } from '@knapsack/app';\nimport {\n KsRendererClientGlobal,\n KnapsackFile,\n KsJsImport,\n isSlottedText,\n isSlottedTemplateReference,\n isSlottedTemplateDemo,\n KnapsackPatternTemplate,\n KsTemplateSpec,\n TemplateSuggestion,\n rendererIds,\n RendererId,\n} from '@knapsack/types';\nimport type {\n KnapsackRenderParams,\n KnapsackTemplateRenderer,\n KnapsackTemplateRendererBase,\n KnapsackTemplateRendererResults,\n Patterns,\n} from '@knapsack/app/types';\nimport {\n exists,\n findUpPkgJson,\n getJsExportNames,\n readFile,\n formatCode,\n} from '@knapsack/file-utils';\nimport type { ReactNode } from 'react';\nimport { join, relative, parse } from 'path';\nimport {\n clearInferSpecCache,\n copyReactAssets,\n getDemoAppUsage,\n getReactDocs,\n getUsage,\n} from './utils';\nimport { createReactPattern } from './react-creators';\n\nconst { pkg } = findUpPkgJson(__dirname);\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nlog.setupUpdateNotifier({ ...pkg, name: pkg.name!, version: pkg.version! });\n\nexport type DemoWrapperProps = {\n children: React.ReactNode;\n patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[];\n} & Except<KnapsackRenderParams, 'patternManifest'>;\n\nexport class KnapsackReactRenderer\n extends KnapsackRendererWebpackBase\n implements KnapsackTemplateRenderer\n{\n /**\n * `react.js` & `react-dom.js` root relative paths\n */\n assets: string[];\n babelConfig: Record<string, unknown>;\n creators: KnapsackTemplateRenderer['creators'];\n private demoWrapperPath: string;\n\n private disableReactStrictMode?: boolean;\n\n constructor({\n webpackConfig,\n demoWrapperPath = join(__dirname, './demo-wrapper.mjs'),\n id = rendererIds.react,\n disableReactStrictMode,\n }: {\n webpackConfig?: ConstructorParameters<\n typeof KnapsackRendererWebpackBase\n >[0]['webpackConfig'];\n demoWrapperPath?: string;\n /** When using React v18+, this option allows a workspace to _disable_ React's Strict Mode from running in Knapsack's React Renderer (StrictMode is enabled by default).\n *\n * See https://reactjs.org/docs/strict-mode.html for more info\n * */\n disableReactStrictMode?: boolean;\n /** Don't set if calling from `knapsack.config.js`, only use if creating a new Renderer based on the React Renderer */\n id?: RendererId;\n } = {}) {\n super({\n id,\n extension: '.jsx',\n language: 'jsx',\n webpackConfig,\n });\n this.language = 'jsx';\n this.assets = [];\n this.demoWrapperPath = demoWrapperPath;\n\n // Half-borrowing the API Synax for this from the latest version of Next.js\n this.disableReactStrictMode = disableReactStrictMode;\n this.creators = [createReactPattern];\n }\n\n async init(opt: { patterns: Patterns; cacheDir: string }): Promise<void> {\n await super.init(opt);\n this.assets = await copyReactAssets(this.outputDir, this.publicPath);\n if (!(await exists(this.demoWrapperPath))) {\n throw new Error(\n `Could not find demo wrapper at: \"${this.demoWrapperPath}\"`,\n );\n }\n }\n\n getMeta: KnapsackTemplateRenderer['getMeta'] = () => ({\n id: this.id,\n title: 'React',\n aliasUse: 'optional',\n aliasTitle: 'Named Export',\n aliasIsJsNamedExport: true,\n aliasDescription:\n 'If `export X` was used instead of `export default`, then provide X.',\n enableDataDemos: true,\n enableTemplateDemos: true,\n hasSlotsSupport: true,\n version: pkg.version,\n hasInferSpecSupport: true,\n syntaxHighlightingLanguage: 'jsx',\n hasTemplateSuggestionsSupport: true,\n prototypingTemplate: {\n path: '@knapsack/renderer-react/prototype-template',\n spec: {\n isInferred: false,\n props: {\n type: 'object',\n properties: {},\n },\n slots: {\n children: { title: 'Children' },\n },\n },\n },\n });\n\n changeCase(str: string): string {\n return pascalCase(str);\n }\n\n createWebpackConfig(): ReturnType<\n KnapsackRendererWebpackBase['createWebpackConfig']\n > {\n const config = super.createWebpackConfig();\n\n config.externals = {\n react: 'React',\n 'react-dom': 'ReactDOM',\n };\n\n return config;\n }\n\n getJsImports(): ReturnType<KnapsackRendererWebpackBase['getJsImports']> {\n const imports = super.getJsImports();\n imports.push(\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: this.demoWrapperPath,\n name: 'DemoWrapper',\n },\n },\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: join(__dirname, './error-catcher.mjs'),\n name: 'ErrorCatcher',\n },\n },\n );\n return imports;\n }\n\n async prepClientRenderResults({\n usage,\n demoApp,\n imports: xImports,\n renderOptions: { pattern, template, demo },\n }: {\n usage: string;\n demoApp: string;\n imports: KsJsImport[];\n renderOptions: KnapsackRenderParams;\n }): Promise<KnapsackTemplateRendererResults> {\n const extraImportNames = this.getJsImports().flatMap((imp) =>\n imp.type === 'extra' ? [imp.importInfo.name] : [],\n );\n const { imports, isDeclaredVarsUnique, nameCollisions } =\n this.makeKsJsImportsUnique({ imports: xImports });\n\n if (!isDeclaredVarsUnique) {\n log.error(`${nameCollisions.join(', ')} are declared multiple times`, {\n imports,\n });\n }\n\n // import names; i.e. `KsButton`\n const importNames = [\n ...imports.map(({ importInfo: { name } }) => name),\n ...extraImportNames,\n ];\n\n const patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[] = imports.flatMap((imp) => {\n if (imp.type === 'pattern-template') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n },\n ];\n }\n if (imp.type === 'pattern-template-demo') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n demoId: imp.demoId,\n },\n ];\n }\n return [];\n });\n\n const demoWrapperProps: Omit<DemoWrapperProps, 'children'> = {\n patternsUsed,\n pattern,\n template,\n demo,\n };\n const demoWrapperCode = await getUsage({\n templateName: 'DemoWrapper',\n props: demoWrapperProps,\n children: `<DemoApp />`,\n // extraProps,\n });\n\n /**\n * IMPORTANT: this function is stringified and then executed in the browser - it cannot use anything in scope (other functions, vars, etc)\n */\n async function renderReact({\n patterns,\n theExtraImportNames,\n ksGlobal,\n }: {\n patterns: typeof patternsUsed;\n theExtraImportNames: typeof extraImportNames;\n ksGlobal: KsRendererClientGlobal<ReactNode>;\n }): Promise<Record<string, ReactNode>> {\n if (!ksGlobal) {\n throw new Error('\"window.knapsack\" is null');\n }\n const components = await ksGlobal.getAllImports({\n patterns,\n extras: theExtraImportNames.map((name) => ({ name })),\n });\n return components;\n }\n\n let code = `\n\n${renderReact.toString()}\n${renderReact.name}({\n ksGlobal: window.knapsack,\n patterns: ${JSON.stringify(patternsUsed)},\n theExtraImportNames: ${JSON.stringify(extraImportNames)},\n}).then((components) => {\n const { ${importNames.join(', ')} } = components;\n const root = document.getElementById('render-root');\n\n ${demoApp}\n\n const reactDomVersion = parseInt(ReactDOM.version.split('.')[0], 10);\n\n const ReactRendererResult = () => {\n if (reactDomVersion < 17 || ${this.disableReactStrictMode}){\n return (\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n )\n }\n\n return (\n <React.StrictMode>\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n </React.StrictMode>\n )\n };\n\n\n if (reactDomVersion > 17){\n ReactDOM.createRoot(root).render(\n <ReactRendererResult />\n )\n } else {\n ReactDOM.render(\n <ReactRendererResult />,\n root\n );\n }\n}).catch((err) => {\n console.error(err);\n const root = document.getElementById('render-root');\n // Create a new <div> element to contain the error message\n const errorMsgDiv = document.createElement('div');\n // Insert the new <div> element before the existing element\n root.parentNode.insertBefore(errorMsgDiv, root);\n // add error message so users can see it\n errorMsgDiv.innerHTML = '<h1>Component Error</h1><p>' + err.message + '</p>';\n});\n `;\n\n let codeHadError = false;\n let errorHtmlMsg = '';\n\n try {\n code = await this.babelCodeForBrowser({\n code,\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before babel error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n\n if (!codeHadError) {\n try {\n code = await formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before prettier error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n }\n\n const html = `\n ${this.assets.map((asset) => `<script src=\"${asset}\"></script>`).join('\\n')}\n\n ${this.createHtmlTagsForAssetPaths({\n assets: this.getWebpackAssetPaths(),\n // we need the scripts to finish adding methods to the global knapsack object synchronously before the client-side code runs that is in the <script> tag below\n scriptTagsAreAsync: false,\n })}\n\n <div id=\"render-root\" class=\"knapsack-pattern-direct-parent\" data-dev-note=\"Knapsack React Template Wrapper\"></div>\n <script type=\"application/javascript\">${code}</script>\n${errorHtmlMsg}\n\n `;\n\n return {\n ok: !codeHadError,\n html: await formatCode({\n contents: html,\n path: 'x.html', // doing this to set format language\n }),\n usage,\n templateLanguage: this.language,\n };\n }\n\n async render(\n opt: KnapsackRenderParams,\n ): Promise<KnapsackTemplateRendererResults> {\n if (KnapsackReactRenderer.isTemplateDemo(opt.demo)) {\n // when getting a template demos path sometimes we have a race condition where the client asks for it before the server knows about it.\n // so we try several times in a row to get it\n /** The amount of time in ms to wait between attempts; when we run out of array items, we give up and throw the error */\n const waits = [5, 10, 20, 50, 100, 1000, 1000];\n let templateDemoPath: string;\n let attempt = 0;\n\n while (true) {\n try {\n templateDemoPath = opt.patternManifest.getTemplateDemoAbsolutePath({\n patternId: opt.pattern.id,\n templateId: opt.template.id,\n demoId: opt.demo.id,\n });\n // got it!\n break;\n } catch (e) {\n const waitTime = waits[attempt];\n if (!waitTime) {\n throw new Error(e);\n }\n attempt += 1;\n // eslint-disable-next-line no-await-in-loop\n await sleep(waitTime);\n }\n }\n\n const [templateFileContents, { usage, imports }] = await Promise.all([\n readFile(templateDemoPath),\n this.getUsageAndImports(opt),\n ]);\n const demoApp = await getDemoAppUsage({\n children: usage,\n });\n const results = await this.prepClientRenderResults({\n usage: templateFileContents,\n demoApp,\n imports,\n renderOptions: opt,\n });\n\n return results;\n }\n\n if (KnapsackReactRenderer.isDataDemo(opt.demo)) {\n const { usage, imports } = await this.getUsageAndImports(opt);\n const { code: importCode } = this.createJsImportCodeBlock({\n imports,\n });\n\n const [demoAppUsage, demoApp] = await Promise.all([\n getDemoAppUsage({\n children: usage,\n imports: importCode,\n }),\n getDemoAppUsage({\n children: usage,\n }),\n ]);\n\n return this.prepClientRenderResults({\n demoApp,\n usage: demoAppUsage,\n imports,\n renderOptions: opt,\n });\n }\n }\n\n async getUsageAndImports(opt: KnapsackRenderParams): Promise<{\n usage: string;\n imports: KsJsImport[];\n }> {\n const { pattern, template, patternManifest, demo } = opt;\n if (demo?.type && KnapsackReactRenderer.isDataDemo(demo)) {\n const {\n data: { props, slots },\n } = demo;\n\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const importInfos: KsJsImport[] = [importInfo];\n const children: string[] = [];\n const extraProps: { key: string; value: string }[] = [];\n\n if (slots) {\n const slotNames = Object.keys(slots);\n const slotUsages = await Promise.all(\n slotNames.map(async (slotName) => {\n const slotItems = slots[slotName];\n const usages = await Promise.all(\n slotItems\n // remove any incomplete item - happens when users are filling out form\n .filter((slotItem) => {\n if (!isSlottedText(slotItem)) {\n if (!slotItem.patternId) return false;\n if (!slotItem.templateId) return false;\n if (isSlottedTemplateDemo(slotItem) && !slotItem.demoId) {\n return false;\n }\n }\n return true;\n })\n .map(async (slotItem) => {\n if (isSlottedText(slotItem)) {\n if (slotItems.length === 1 && slotName !== 'children') {\n // The ` prevents multi-line strings from causing error (even though they don't show a line break)\n return `\\`${slotItem.text}\\``;\n }\n return slotItem.text;\n }\n\n const slotPattern = patternManifest.getPattern(\n slotItem.patternId,\n );\n\n const slotTemplate = slotPattern.templates.find(\n (t) => t.id === slotItem.templateId,\n );\n if (isSlottedTemplateReference(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n if (isSlottedTemplateDemo(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n demo:\n slotItem.demo ||\n this.patterns.demosById[slotItem.demoId],\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n\n throw new Error(\n `Unknown slot item: ${JSON.stringify(slotItem)}`,\n );\n }),\n );\n return {\n slotName,\n usages,\n };\n }),\n );\n\n slotUsages.forEach(({ slotName, usages }) => {\n usages.forEach((usage) => {\n if (slotName === 'children') {\n children.push(usage);\n } else {\n extraProps.push({\n key: slotName,\n value: usage,\n });\n }\n });\n });\n }\n\n const usage = await getUsage({\n templateName,\n props,\n children: children.join('\\n'),\n extraProps,\n });\n\n return {\n usage,\n imports: importInfos,\n };\n }\n\n if (demo?.type && KnapsackReactRenderer.isTemplateDemo(demo)) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n demoId: demo.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template-demo: ${pattern.id}-${template.id}-${demo.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const usage = await getUsage({ templateName });\n\n return {\n usage,\n imports: [importInfo],\n };\n }\n\n if (!demo) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n return {\n /**\n * i.e. Given a React Component, `Button`, normally this would be `<Button>` with a demo, but since there is none this will just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n * @see {SlottedTemplate}\n */\n usage: templateName,\n imports: [importInfo],\n };\n }\n\n throw new Error(\n `Unhandled demo type for ${pattern.id}-${template.id}: ${JSON.stringify(\n demo,\n )}`,\n );\n }\n\n async getUsage(opt: KnapsackRenderParams): Promise<string> {\n const { usage } = await this.getUsageAndImports(opt);\n return usage;\n }\n\n inferSpec: KnapsackTemplateRendererBase['inferSpec'] = async ({\n template,\n templatePath,\n }: {\n template: KnapsackPatternTemplate;\n templatePath: string;\n }): Promise<KsTemplateSpec | false> => {\n const spec = await getReactDocs({\n src: template.path,\n exportName: template.alias || 'default',\n resolveFromDir: this.config.data,\n });\n if (spec !== false) {\n const totalProps = Object.keys(spec?.props?.properties || {}).length;\n const totalSlots = Object.keys(spec?.slots || {}).length;\n if (totalProps === 0 && totalSlots === 0) {\n return false;\n }\n }\n return spec;\n };\n\n async watch(opt: Parameters<KnapsackTemplateRendererBase['watch']>[0]) {\n await super.watch(opt);\n knapsackEvents.onPatternTemplateChanged(() => {\n clearInferSpecCache();\n });\n }\n\n getTemplateMeta: KnapsackTemplateRendererBase['getTemplateMeta'] = async ({\n pattern,\n template,\n }) => {\n const files: KnapsackFile[] = [];\n if (template?.spec?.props) {\n const schema = JSON.parse(JSON.stringify(template.spec.props));\n if (template?.spec?.slots) {\n Object.entries(template.spec.slots).forEach(([id, info]) => {\n schema.properties[id] = {\n typeof: 'function',\n tsType: 'React.ReactNode',\n\n description: info.allowedPatternIds\n ? `${info.description}. Only use: ${info.allowedPatternIds.join(\n ', ',\n )}`\n : info.description,\n };\n schema.required = schema.required ?? [];\n if (info.isRequired) schema.required.push(id);\n });\n }\n const typeDefs =\n await KnapsackReactRenderer.convertSchemaToTypeScriptDefs({\n schema,\n title: `${this.changeCase(pattern.id)}Props`,\n // @todo pull in base url\n description: `[Knapsack Docs](http://localhost:3999/pattern/${pattern.id}/${template.id})`,\n patternId: pattern.id,\n templateId: template.id,\n postBanner: `import * as React from 'react';`,\n });\n\n files.push({\n contents: typeDefs,\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.d.ts`,\n });\n files.push({\n contents: JSON.stringify(schema, null, ' '),\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.json`,\n });\n }\n return files;\n };\n\n alterTemplateMetaFiles: KnapsackTemplateRendererBase['alterTemplateMetaFiles'] =\n async ({ files, metaDir }) => {\n const imports: string[] = [];\n\n const ext = '.spec.d.ts';\n files.forEach((file) => {\n if (file.path.endsWith(ext)) {\n const { base } = parse(file.path);\n const [patternId, templateId] = base.split('.');\n const isFirst = templateId === this.id;\n const exportName = this.changeCase(`${patternId}Props`);\n const exportNameWithTemplateId = this.changeCase(\n `${patternId}-${templateId}Props`,\n );\n imports.push(\n `export { ${\n isFirst\n ? exportName\n : `${exportName} as ${exportNameWithTemplateId}`\n } } from './${relative(metaDir, file.path).replace('.d.ts', '')}';`,\n );\n }\n });\n\n // extra line at end of file\n imports.push('');\n\n return [\n ...files,\n {\n contents: imports.join('\\n'),\n encoding: 'utf8',\n path: join(metaDir, 'react.d.ts'),\n },\n ];\n };\n\n async getTemplateSuggestions({\n newPath,\n }: Parameters<\n KnapsackTemplateRendererBase['getTemplateSuggestions']\n >[0]): ReturnType<KnapsackTemplateRendererBase['getTemplateSuggestions']> {\n const { data: dataDir } = this.patterns.userConfig;\n const { allTemplateDemos, allTemplates } = this.getMyTemplates();\n const usedSuggestions: TemplateSuggestion[] = [\n ...allTemplateDemos,\n ...allTemplates,\n ].map(({ path, alias }) => {\n return {\n path,\n alias: alias || 'default',\n };\n });\n\n const allPaths = [\n ...new Set([newPath, ...usedSuggestions.map(({ path }) => path)]),\n ];\n const {\n resolve: { alias },\n } = this.createWebpackConfig();\n const aliasConfig: Record<string, string> = {};\n if (isObject(alias)) {\n Object.entries(alias).forEach(([key, value]) => {\n if (typeof value === 'string') {\n aliasConfig[key] = value;\n }\n });\n }\n const allSuggestions: TemplateSuggestion[] = await Promise.all(\n allPaths.map(async (path): Promise<TemplateSuggestion[]> => {\n if (!path) return [];\n try {\n const { exports, errorMsg } = await getJsExportNames({\n path,\n resolveFromDir: dataDir,\n alias: aliasConfig,\n });\n if (errorMsg) {\n throw new Error(errorMsg);\n }\n return (\n exports\n // only allow names that start with a capital letter (i.e. React Component names)\n // will exclude helper functions and custom hooks\n .filter((e) => e === 'default' || isFirstLetterCapital(e))\n .map((name) => ({\n alias: name,\n path,\n }))\n );\n } catch (e) {\n // only want this showing with verbose since template suggestions are not critical\n log.verbose(\n `Error getting import names for ${path}: ${e.message}`,\n null,\n this.logPrefix,\n );\n return [];\n }\n }),\n ).then((results) => {\n // sadly `Promise.all` & `.flatMap` just don't work, so this:\n return results.flat();\n });\n\n const suggestions = allSuggestions.filter((s) => {\n return !usedSuggestions.find(\n (us) => us.alias === s.alias && us.path === s.path,\n );\n });\n\n return {\n suggestions,\n };\n }\n}\n","import { log } from '@knapsack/app';\nimport {\n getModulePkgJson,\n readFile,\n copy,\n formatCode,\n resolvePath,\n findUp,\n} from '@knapsack/file-utils';\nimport { removeWrappingDoubleQuotes } from '@knapsack/utils';\nimport path from 'path';\nimport type { Documentation } from 'react-docgen';\nimport type { ComponentDoc, ParserOptions } from 'react-docgen-typescript';\nimport { KsTemplateSpec, isNumberProp, isOptionsProp } from '@knapsack/types';\n\ntype GetSpecParams = {\n src: string;\n exportName?: string;\n};\n\n/**\n * The name of the type, which is usually corresponds to the function name in `React.PropTypes`. However, for types define with `oneOf`, we use `\"enum\"` and for `oneOfType` we use `\"union\"`. If a custom function is provided or the type cannot be resolved to anything of `React.PropTypes`, we use `\"custom\"`.\n */\ntype RdTypeName =\n | 'number'\n | 'string'\n | 'custom'\n | 'union'\n | 'bool'\n | 'node'\n | 'func';\n\n/**\n * Some types accept parameters which define the type in more detail (such as `arrayOf`, `instanceOf`, `oneOf`, etc). Those are stored in `<typeValue>`. The data type of `<typeValue>` depends on the type definition.\n */\ntype RdTypeValue = string;\n\ntype RdProps = {\n [prop: string]: {\n defaultValue?: {\n value: string;\n computed: boolean;\n };\n type: {\n name: RdTypeName;\n value?: RdTypeValue;\n raw?: string;\n };\n flowType?: string;\n tsType?: string;\n description?: string;\n required: boolean;\n };\n};\n\ntype RdResults = {\n /**\n * Name of function, class, or const\n */\n displayName: string;\n description?: string;\n props: RdProps;\n};\n\nfunction renderUsageTemplate({\n templateName,\n attributes,\n children,\n}: {\n templateName: string;\n attributes: string;\n children: string;\n}) {\n return `\n <${templateName}\n ${attributes}\n ${\n children\n ? `>\n ${children}\n </${templateName}>`\n : '/>'\n }\n `;\n}\n\nfunction renderDemoAppTemplate({\n imports,\n children,\n}: {\n imports: string;\n children: string;\n}) {\n return `${imports}\n\nfunction DemoApp() {\n return (\n ${children}\n )\n}\n`;\n}\n\nexport async function getUsage(data: {\n templateName: string;\n props?: Record<string, unknown>;\n children?: string;\n extraProps?: {\n key: string;\n value: string;\n }[];\n format?: boolean;\n}): Promise<string> {\n const props = Object.keys(data.props || {}).map((key) => {\n const value = data.props[key];\n return {\n key,\n value,\n };\n });\n\n const { templateName, children, extraProps = [] } = data;\n if (!templateName) {\n throw new Error(\n `Cannot getUsage of a React Component when no \"templateName\" is provided.`,\n );\n }\n\n const attributes: string[] = props.map(({ key, value }) => {\n switch (typeof value) {\n case 'string':\n // Is this a function like `() => {}` but not a \"sizes\" attribute for an image like `(min-width: 400px) 50vw, 100vw`?\n if (value.startsWith('(') && value.includes('=>')) {\n return `${key}={${value}}`;\n }\n return `${key}=\"${value}\"`;\n case 'boolean':\n return value ? `${key}` : `${key}={${value}}`;\n default:\n return `${key}={${JSON.stringify(value)}}`;\n }\n });\n\n const extraAttributes: string[] = [];\n const slotProps: { [key: string]: string[] } = {};\n\n extraProps.forEach(({ key, value }) => {\n slotProps[key] = slotProps[key] ?? [];\n slotProps[key].push(value);\n });\n\n Object.entries(slotProps).forEach(([key, values]) => {\n const value = values.length === 1 ? values[0] : `<>${values.join('\\n')}</>`;\n extraAttributes.push(`${key}={${value}}`);\n });\n\n const result = renderUsageTemplate({\n templateName,\n attributes: [...attributes, ...extraAttributes].join(' '),\n children,\n });\n return data.format\n ? formatCode({\n contents: result,\n path: 'x.tsx', // doing this to set format language\n })\n .then((code) => code.trim())\n .catch(() => result.trim()) // if format fails, just return the unformatted code\n : result.trim();\n}\n\nexport async function getDemoAppUsage({\n children,\n imports,\n}: {\n children: string;\n imports?: string;\n}): Promise<string> {\n const code = renderDemoAppTemplate({\n children,\n imports,\n });\n return formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n}\n\nasync function getTypeScriptInfoFromFile({ src }: { src: string }): Promise<{\n info: ComponentDoc[];\n}> {\n const tsConfigPath = await findUp('tsconfig.json', {\n cwd: path.dirname(src),\n });\n const rdTs = await import('react-docgen-typescript');\n const config: ParserOptions = {\n shouldExtractLiteralValuesFromEnum: true,\n savePropValueAsString: true,\n skipChildrenPropWithoutDoc: false,\n // In addition to the ones listed here, which had not strangely included these below ~ https://github.com/styleguidist/react-docgen-typescript/blob/287e7012843cb26fed8f4bd8ee24e462c25a1414/src/parser.ts#L308\n customComponentTypes: ['VoidFunctionComponent', 'VFC'],\n };\n const parse = tsConfigPath\n ? rdTs.withCustomConfig(tsConfigPath, config).parse\n : rdTs.withDefaultConfig(config).parse;\n return {\n info: parse(src),\n };\n}\n\nfunction extractSpecFromTypeScriptInfo({\n info: results,\n exportName,\n}: {\n info: ComponentDoc[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n if (!results) return false;\n const spec: KsTemplateSpec = {\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {\n // children: {\n // title: 'children',\n // },\n },\n };\n\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect({ result, isDefaultExport, exportName }, 'ts result');\n if (!result) return false;\n\n const { displayName } = result;\n // log.inspect({ result }, 'result');\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { name, description, defaultValue, required, type, parent } =\n propDef;\n\n // `type.name` can include `| undefined` if tsConfig has `strict: true`. So we need to handle these scenarios:\n // `string` or `string | undefined`\n // `'left' | 'right'` or `'left' | 'right' | undefined`\n const propType = type?.name\n ?.replace('| undefined', '')\n // remove generics. things like `FC<{}>` and `FC<Props>` should become `FC`\n .replace(/<.*/g, '')\n .trim();\n\n switch (propType) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'number':\n spec.props.properties[propName] = {\n type: 'number',\n };\n break;\n case 'boolean':\n case 'bool':\n if (defaultValue && 'value' in defaultValue) {\n // comes in as `'true'` - this turns it to `true`\n defaultValue.value = defaultValue.value === 'true';\n }\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'enum':\n type EnumType = {\n name: string;\n raw: string;\n value: {\n /** Looks like `'\"option1\"'` - beware of string that contains `\"` */\n value: string;\n }[];\n };\n spec.props.properties[propName] = {\n type: 'string',\n // yes there is a double \"value\" & yes it is confusing\n enum: [\n // ensure list is unique\n ...new Set<string>(\n (type as EnumType).value\n .map(({ value }) => removeWrappingDoubleQuotes(value?.trim()))\n .filter(Boolean),\n ),\n ],\n };\n break;\n case 'ReactNode':\n case 'React.ReactNode':\n case 'React.ReactElement':\n case 'ReactElement':\n spec.slots[propName] = {\n title: propName,\n };\n if (description) {\n spec.slots[propName] = {\n ...spec.slots[propName],\n description,\n };\n }\n break;\n case 'VFC':\n case 'FC':\n spec.slots[propName] = {\n title: propName,\n description: description || 'A reference to a component',\n isTemplateReference: true,\n allowOnlyOne: true,\n disallowText: true,\n };\n break;\n default: {\n if (type?.name?.startsWith('(')) {\n // functions\n spec.props.properties[propName] = {\n // description: `\\`${type.name}\\` ${description}`,\n typeof: 'function',\n tsType: propDef?.type?.name,\n };\n } else if (type?.name?.includes('|')) {\n // enums / unions (multi-choice strings)\n // comes in like this: `{ name: '\"option1\" | \"option2\" | \"option3\"' }`\n const options = type.name\n .split('|')\n .map((enumItem) => removeWrappingDoubleQuotes(enumItem.trim()))\n .filter(Boolean);\n\n if (options?.length) {\n spec.props.properties[propName] = {\n type: 'string',\n // ensuring list is unique\n enum: [...new Set(options)],\n };\n }\n } else {\n spec.props.properties[propName] = {\n tsType: propDef?.type?.name,\n };\n }\n }\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n if (isNumberProp(spec.props.properties[propName])) {\n spec.props.properties[propName].default = parseFloat(\n defaultValue.value,\n );\n } else {\n spec.props.properties[propName].default =\n removeWrappingDoubleQuotes(defaultValue.value);\n }\n }\n }\n\n // console.log('type', type);\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React TypeScript file',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nasync function getPropTypesInfoFromFile({ src }: { src: string }): Promise<{\n info: Documentation[];\n}> {\n const reactDocs = await import('react-docgen');\n const { builtinResolvers } = reactDocs;\n const fileSrc = await readFile(src);\n const { FindExportedDefinitionsResolver } = builtinResolvers;\n const results: Documentation[] = reactDocs.parse(fileSrc, {\n resolver: new FindExportedDefinitionsResolver(),\n handlers: null,\n filename: src,\n // babelrc: false,\n });\n return {\n info: results,\n };\n}\n\nfunction extractSpecFromPropTypesInfo({\n info: results,\n exportName,\n}: {\n info: Documentation[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect(results, 'JSX PropTypes Results');\n // console.log(JSON.stringify(result, null, ' '));\n\n const spec: KsTemplateSpec = {\n isInferred: true,\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {},\n };\n\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { required, description, defaultValue } = propDef;\n switch (propDef?.type?.name) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'func':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'bool':\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'node':\n spec.slots[propName] = {\n title: propName,\n description,\n };\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n spec.props.properties[propName].default =\n typeof defaultValue.value === 'string'\n ? removeWrappingDoubleQuotes(defaultValue.value)\n : defaultValue.value;\n }\n }\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React PropTypes',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nfunction cleanUpSpec({\n spec,\n}: {\n spec: KsTemplateSpec | false;\n}): KsTemplateSpec | false {\n if (spec === false) return spec;\n // ok to mutate b/c spec was just created before passing in here\n Object.entries(spec?.props?.properties || {}).forEach(([propName, prop]) => {\n if (isOptionsProp(prop)) {\n // If the default is not in the enum, it should not be there\n // OR the enum is wrong\n if (!prop.enum.includes(prop.default)) {\n prop.default = undefined;\n }\n }\n });\n\n return spec;\n}\n\nasync function getReactModuleInfoUncached({\n src: unknownSrc,\n resolveFromDir,\n}: {\n src: string;\n resolveFromDir: string;\n}): Promise<\n | {\n type: 'typescript';\n info: ComponentDoc[];\n }\n | {\n type: 'propTypes';\n info: Documentation[];\n }\n | {\n type: 'unknown';\n }\n> {\n const typesInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n resolveType: 'types',\n });\n if (typesInfo.exists) {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: typesInfo.absolutePath,\n });\n if (typeScriptInfo) {\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n }\n const jsInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n });\n if (!jsInfo.exists) return { type: 'unknown' };\n const { ext } = path.parse(jsInfo.absolutePath);\n switch (ext) {\n case '.jsx': {\n const propTypesInfo = await getPropTypesInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'propTypes',\n info: propTypesInfo.info,\n };\n }\n case '.ts':\n case '.tsx': {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n default:\n return {\n type: 'unknown',\n };\n }\n}\n\nconst getReactModuleInfoCache = new Map<\n string,\n ReturnType<typeof getReactModuleInfoUncached>\n>();\nexport const clearInferSpecCache = () => {\n log.info(`Clearing React TypeScript inferSpec cache...`);\n getReactModuleInfoCache.clear();\n};\nasync function getReactModuleInfo(\n args: Parameters<typeof getReactModuleInfoUncached>[0],\n) {\n const cacheKey = JSON.stringify(args);\n if (!getReactModuleInfoCache.has(cacheKey)) {\n getReactModuleInfoCache.set(cacheKey, getReactModuleInfoUncached(args));\n }\n return getReactModuleInfoCache.get(cacheKey);\n}\n\nasync function getReactSpec({\n src,\n exportName,\n resolveFromDir,\n}: GetSpecParams & {\n resolveFromDir: string;\n}): Promise<KsTemplateSpec | false> {\n const reactModuleInfo = await getReactModuleInfo({\n src,\n resolveFromDir,\n });\n switch (reactModuleInfo.type) {\n case 'typescript':\n return extractSpecFromTypeScriptInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'propTypes':\n return extractSpecFromPropTypesInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'unknown':\n default:\n return false;\n }\n}\n\nexport async function getReactDocs(\n opt: GetSpecParams & {\n resolveFromDir: string;\n },\n): Promise<KsTemplateSpec | false> {\n return cleanUpSpec({\n spec: await getReactSpec(opt),\n });\n}\n\nexport async function copyReactAssets(\n distDirAbsolute: string,\n publicPath: string,\n): Promise<string[]> {\n try {\n const { version: reactVersion } = getModulePkgJson('react');\n const { version: reactDomVersion } = getModulePkgJson('react-dom');\n\n // switch to resolving the root NPM package dir vs the entire file via require.resolve\n // workaround due to NPM packages using the exports field; prevents these from being auto-resolved\n const reactRoot = path.dirname(\n require.resolve('react', {\n paths: [process.cwd()],\n }),\n );\n const reactDomRoot = path.dirname(\n require.resolve('react-dom', {\n paths: [process.cwd()],\n }),\n );\n await Promise.all([\n copy(\n path.join(reactRoot, 'umd/react.development.js'),\n path.join(distDirAbsolute, `react.development.${reactVersion}.js`),\n ),\n copy(\n path.join(reactRoot, 'umd/react.production.min.js'),\n path.join(distDirAbsolute, `react.production.min.${reactVersion}.js`),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.production.min.js'),\n path.join(\n distDirAbsolute,\n `react-dom.production.min.${reactDomVersion}.js`,\n ),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.development.js'),\n path.join(\n distDirAbsolute,\n `react-dom.development.${reactDomVersion}.js`,\n ),\n ),\n ]);\n const reactFileSuffix =\n process.env.NODE_ENV === 'production' ? 'production.min' : 'development';\n\n return [\n path.join(publicPath, `react.${reactFileSuffix}.${reactVersion}.js`),\n path.join(\n publicPath,\n `react-dom.${reactFileSuffix}.${reactDomVersion}.js`,\n ),\n ];\n } catch (error) {\n log.warn(\n 'Error trying to copy \"react\" and \"react-dom\" JS files, are they installed? We want to use your exact versions.',\n error,\n 'templateRenderer:react',\n );\n process.exit(1);\n }\n}\n","import { getJsExportNames } from '@knapsack/file-utils';\nimport { createCreator, tasks, Task } from '@knapsack/creator-utils';\nimport {\n readKsPatternConfigs,\n writeKsPatternConfig,\n readKsNavConfig,\n addKsNavItems,\n writeDemo,\n} from '@knapsack/ks-file-utils';\nimport { Demo, KnapsackPattern } from '@knapsack/types';\nimport { makeShortId } from '@knapsack/utils';\n\nfunction isCapitalLetter(char: string): boolean {\n return char.toUpperCase() === char;\n}\n\nfunction startsWithCapitalLetter(str: string): boolean {\n return isCapitalLetter(str[0]);\n}\n\nfunction createPatternData({\n importName,\n id,\n title = importName,\n pkgPath,\n initialDemoId,\n}: {\n importName: string;\n id: string;\n title?: string;\n pkgPath: string;\n initialDemoId: string;\n}): KnapsackPattern {\n return {\n id,\n title,\n description: '',\n statuses: {\n main: 'ready',\n },\n templates: [\n {\n id: 'react',\n title: 'react',\n path: pkgPath,\n alias: importName,\n templateLanguageId: 'react',\n spec: {\n isInferred: true,\n },\n demoIds: [initialDemoId],\n blockIds: [],\n },\n ],\n tabs: [\n {\n type: 'template',\n id: 'react',\n },\n ],\n subPages: [],\n };\n}\n\nexport const createReactPattern = createCreator({\n id: 'react-patterns',\n title: 'React Ks Patterns',\n description: 'Adds React templates as Knapsack Patterns',\n getQuestions: async () => ({\n pkgPath: {\n type: 'text',\n title: 'Package path',\n },\n importPrefix: {\n type: 'text',\n title: 'Import Prefix to Remove',\n },\n }),\n getTasks: async ({ answers: { pkgPath, importPrefix = '' }, config }) => {\n const dataDir = config.dest;\n const currentPatterns = await readKsPatternConfigs({\n dataDir,\n });\n const currentReactPatternsImportNames = currentPatterns.reduce(\n (cur, pattern) => {\n const reactTemplates =\n pattern.templates?.filter((t) => t.templateLanguageId === 'react') ??\n [];\n cur.push(...reactTemplates.map((t) => t.alias));\n return cur;\n },\n [] as string[],\n );\n const { exports: allImports } = await getJsExportNames({\n path: pkgPath,\n });\n return [\n {\n title: 'Pick Imports to add',\n task: (_, task) =>\n tasks.runSubCreator({\n task,\n config,\n creator: createCreator({\n id: 'react-pattern-import-names',\n getQuestions: async () => ({\n importNames: {\n type: 'choices',\n choices: allImports\n .filter(\n (importName) =>\n startsWithCapitalLetter(importName) &&\n !currentReactPatternsImportNames.includes(importName),\n )\n .map((importName) => ({\n value: importName,\n })),\n },\n }),\n getTasks: async ({ answers: { importNames } }) => {\n const patterns = importNames.map((importName) => ({\n importName,\n patternId: importName.startsWith(importPrefix)\n ? importName.slice(importPrefix.length).toLowerCase()\n : importName.toLowerCase(),\n }));\n return [\n ...patterns.map(\n ({ importName, patternId }): Task => ({\n title: `Add ${importName} React Template`,\n task: async (__, subTask) => {\n const initialDemo: Demo = {\n type: 'data',\n id: makeShortId(),\n title: 'Main',\n patternId,\n templateId: 'react',\n data: {\n props: {},\n slots: {},\n },\n };\n const pattern = createPatternData({\n id: patternId,\n importName,\n pkgPath,\n initialDemoId: initialDemo.id,\n });\n\n await Promise.all([\n writeDemo({\n dataDir,\n demo: initialDemo,\n }),\n writeKsPatternConfig({\n dataDir,\n patternId,\n data: pattern,\n }),\n ]);\n },\n }),\n ),\n {\n title: `Updating Nav`,\n task: async (__, subTask) => {\n const { byId } = await readKsNavConfig({\n dataDir,\n });\n // attempt to find a nav group to put patterns under\n const componentsGroup = Object.values(byId).find(\n ({ path, name, id }) => {\n // we only want groups (i.e. not pages or patterns)\n if (path) return false;\n if (name.toLowerCase() === 'patterns') return true;\n if (name.toLowerCase() === 'components') return true;\n return false;\n },\n );\n await addKsNavItems({\n dataDir,\n navItems: patterns.map(({ patternId }) => ({\n navId: patternId,\n navPath: `/pattern/${patternId}`,\n navParent: componentsGroup?.id || 'root',\n })),\n });\n },\n },\n ];\n },\n }),\n }),\n },\n ];\n },\n});\n"],"mappings":";;;;;;;;;;;AACA,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,IAAM,cAAc,6BAAM,cAAc,YAAY,GAAG,GAAnC;AACpB,IAAM,aAAa,6BAAM,KAAK,QAAQ,YAAY,CAAC,GAAhC;AAEZ,IAAM,YAA4B,2BAAW;;;ACPpD,OAAO,WAAW;AAClB,SAAS,mCAAmC;AAC5C;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB,OAAAA,YAAW;AACpC;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,OAEK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA,oBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,OACK;AAEP,SAAS,MAAM,UAAU,aAAa;;;ACrCtC,SAAS,WAAW;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kCAAkC;AAC3C,OAAOC,WAAU;AAGjB,SAAyB,cAAc,qBAAqB;AAmD5D,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SAAO;AAAA,OACF,YAAY;AAAA,QACX,UAAU;AAAA,QAEV,WACI;AAAA,UACF,QAAQ;AAAA,UACR,YAAY,MACV,IACN;AAAA;AAEN;AApBS;AAsBT,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGG;AACD,SAAO,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA,MAIb,QAAQ;AAAA;AAAA;AAAA;AAId;AAfS;AAiBT,eAAsB,SAAS,MASX;AAClB,QAAM,QAAQ,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ;AACvD,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,EAAE,cAAc,UAAU,aAAa,CAAC,EAAE,IAAI;AACpD,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAuB,MAAM,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM;AACzD,YAAQ,OAAO,OAAO;AAAA,MACpB,KAAK;AAEH,YAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AACjD,iBAAO,GAAG,GAAG,KAAK,KAAK;AAAA,QACzB;AACA,eAAO,GAAG,GAAG,KAAK,KAAK;AAAA,MACzB,KAAK;AACH,eAAO,QAAQ,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,KAAK;AAAA,MAC5C;AACE,eAAO,GAAG,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,QAAM,kBAA4B,CAAC;AACnC,QAAM,YAAyC,CAAC;AAEhD,aAAW,QAAQ,CAAC,EAAE,KAAK,MAAM,MAAM;AACrC,cAAU,GAAG,IAAI,UAAU,GAAG,KAAK,CAAC;AACpC,cAAU,GAAG,EAAE,KAAK,KAAK;AAAA,EAC3B,CAAC;AAED,SAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,MAAM;AACnD,UAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC;AACtE,oBAAgB,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG;AAAA,EAC1C,CAAC;AAED,QAAM,SAAS,oBAAoB;AAAA,IACjC;AAAA,IACA,YAAY,CAAC,GAAG,YAAY,GAAG,eAAe,EAAE,KAAK,GAAG;AAAA,IACxD;AAAA,EACF,CAAC;AACD,SAAO,KAAK,SACR,WAAW;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA;AAAA,EACR,CAAC,EACE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAC1B,MAAM,MAAM,OAAO,KAAK,CAAC,IAC5B,OAAO,KAAK;AAClB;AAlEsB;AAoEtB,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AACF,GAGoB;AAClB,QAAM,OAAO,sBAAsB;AAAA,IACjC;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,WAAW;AAAA,IAChB,UAAU;AAAA,IACV,MAAM;AAAA;AAAA,EACR,CAAC;AACH;AAfsB;AAiBtB,eAAe,0BAA0B,EAAE,IAAI,GAE5C;AACD,QAAM,eAAe,MAAM,OAAO,iBAAiB;AAAA,IACjD,KAAKC,MAAK,QAAQ,GAAG;AAAA,EACvB,CAAC;AACD,QAAM,OAAO,MAAM,OAAO,yBAAyB;AACnD,QAAM,SAAwB;AAAA,IAC5B,oCAAoC;AAAA,IACpC,uBAAuB;AAAA,IACvB,4BAA4B;AAAA;AAAA,IAE5B,sBAAsB,CAAC,yBAAyB,KAAK;AAAA,EACvD;AACA,QAAMC,SAAQ,eACV,KAAK,iBAAiB,cAAc,MAAM,EAAE,QAC5C,KAAK,kBAAkB,MAAM,EAAE;AACnC,SAAO;AAAA,IACL,MAAMA,OAAM,GAAG;AAAA,EACjB;AACF;AApBe;AAsBf,SAAS,8BAA8B;AAAA,EACrC,MAAM;AAAA,EACN;AACF,GAG2B;AACzB,MAAI;AACF,QAAI,CAAC;AAAS,aAAO;AACrB,UAAM,OAAuB;AAAA,MAC3B,OAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,QACX,YAAY,CAAC;AAAA,MACf;AAAA,MACA,OAAO;AAAA;AAAA;AAAA;AAAA,MAIP;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,cAAc,eAAe;AAGtD,UAAM,SAAS,kBACX,QAAQ,IAAI,IACZ,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU;AAGpD,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,EAAE,YAAY,IAAI;AAExB,WAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,OAAO,MAAM;AACnE,YAAM,EAAE,MAAM,aAAa,cAAc,UAAU,MAAM,OAAO,IAC9D;AAKF,YAAM,WAAW,MAAM,MACnB,QAAQ,eAAe,EAAE,EAE1B,QAAQ,QAAQ,EAAE,EAClB,KAAK;AAER,cAAQ,UAAU;AAAA,QAChB,KAAK;AACH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AACH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,cAAI,gBAAgB,WAAW,cAAc;AAE3C,yBAAa,QAAQ,aAAa,UAAU;AAAA,UAC9C;AACA,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AASH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA;AAAA,YAEN,MAAM;AAAA;AAAA,cAEJ,GAAG,IAAI;AAAA,gBACJ,KAAkB,MAChB,IAAI,CAAC,EAAE,MAAM,MAAM,2BAA2B,OAAO,KAAK,CAAC,CAAC,EAC5D,OAAO,OAAO;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,eAAK,MAAM,QAAQ,IAAI;AAAA,YACrB,OAAO;AAAA,UACT;AACA,cAAI,aAAa;AACf,iBAAK,MAAM,QAAQ,IAAI;AAAA,cACrB,GAAG,KAAK,MAAM,QAAQ;AAAA,cACtB;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,eAAK,MAAM,QAAQ,IAAI;AAAA,YACrB,OAAO;AAAA,YACP,aAAa,eAAe;AAAA,YAC5B,qBAAqB;AAAA,YACrB,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AACA;AAAA,QACF,SAAS;AACP,cAAI,MAAM,MAAM,WAAW,GAAG,GAAG;AAE/B,iBAAK,MAAM,WAAW,QAAQ,IAAI;AAAA;AAAA,cAEhC,QAAQ;AAAA,cACR,QAAQ,SAAS,MAAM;AAAA,YACzB;AAAA,UACF,WAAW,MAAM,MAAM,SAAS,GAAG,GAAG;AAGpC,kBAAM,UAAU,KAAK,KAClB,MAAM,GAAG,EACT,IAAI,CAAC,aAAa,2BAA2B,SAAS,KAAK,CAAC,CAAC,EAC7D,OAAO,OAAO;AAEjB,gBAAI,SAAS,QAAQ;AACnB,mBAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,gBAChC,MAAM;AAAA;AAAA,gBAEN,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAAA,cAC5B;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,cAChC,QAAQ,SAAS,MAAM;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,MAAM,WAAW,QAAQ,GAAG;AACnC,YAAI;AAAU,eAAK,MAAM,SAAS,KAAK,QAAQ;AAC/C,YAAI,eAAe,CAAC,KAAK,MAAM,WAAW,QAAQ,EAAE,aAAa;AAC/D,eAAK,MAAM,WAAW,QAAQ,EAAE,cAAc;AAAA,QAChD;AACA,YAAI,gBAAgB,WAAW,cAAc;AAC3C,cAAI,aAAa,KAAK,MAAM,WAAW,QAAQ,CAAC,GAAG;AACjD,iBAAK,MAAM,WAAW,QAAQ,EAAE,UAAU;AAAA,cACxC,aAAa;AAAA,YACf;AAAA,UACF,OAAO;AACL,iBAAK,MAAM,WAAW,QAAQ,EAAE,UAC9B,2BAA2B,aAAa,KAAK;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IAGF,CAAC;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAnLS;AAqLT,eAAe,yBAAyB,EAAE,IAAI,GAE3C;AACD,QAAM,YAAY,MAAM,OAAO,cAAc;AAC7C,QAAM,EAAE,iBAAiB,IAAI;AAC7B,QAAM,UAAU,MAAM,SAAS,GAAG;AAClC,QAAM,EAAE,gCAAgC,IAAI;AAC5C,QAAM,UAA2B,UAAU,MAAM,SAAS;AAAA,IACxD,UAAU,IAAI,gCAAgC;AAAA,IAC9C,UAAU;AAAA,IACV,UAAU;AAAA;AAAA,EAEZ,CAAC;AACD,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAhBe;AAkBf,SAAS,6BAA6B;AAAA,EACpC,MAAM;AAAA,EACN;AACF,GAG2B;AACzB,MAAI;AACF,UAAM,kBAAkB,CAAC,cAAc,eAAe;AAGtD,UAAM,SAAS,kBACX,QAAQ,IAAI,IACZ,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU;AAKpD,UAAM,OAAuB;AAAA,MAC3B,YAAY;AAAA,MACZ,OAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,QACX,YAAY,CAAC;AAAA,MACf;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAEA,WAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,OAAO,MAAM;AACnE,YAAM,EAAE,UAAU,aAAa,aAAa,IAAI;AAChD,cAAQ,SAAS,MAAM,MAAM;AAAA,QAC3B,KAAK;AACH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AACH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AACH,eAAK,MAAM,WAAW,QAAQ,IAAI;AAAA,YAChC,MAAM;AAAA,UACR;AACA;AAAA,QACF,KAAK;AACH,eAAK,MAAM,QAAQ,IAAI;AAAA,YACrB,OAAO;AAAA,YACP;AAAA,UACF;AAAA,MACJ;AAGA,UAAI,KAAK,MAAM,WAAW,QAAQ,GAAG;AACnC,YAAI;AAAU,eAAK,MAAM,SAAS,KAAK,QAAQ;AAC/C,YAAI,eAAe,CAAC,KAAK,MAAM,WAAW,QAAQ,EAAE,aAAa;AAC/D,eAAK,MAAM,WAAW,QAAQ,EAAE,cAAc;AAAA,QAChD;AACA,YAAI,gBAAgB,WAAW,cAAc;AAC3C,eAAK,MAAM,WAAW,QAAQ,EAAE,UAC9B,OAAO,aAAa,UAAU,WAC1B,2BAA2B,aAAa,KAAK,IAC7C,aAAa;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAjFS;AAmFT,SAAS,YAAY;AAAA,EACnB;AACF,GAE2B;AACzB,MAAI,SAAS;AAAO,WAAO;AAE3B,SAAO,QAAQ,MAAM,OAAO,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,IAAI,MAAM;AAC1E,QAAI,cAAc,IAAI,GAAG;AAGvB,UAAI,CAAC,KAAK,KAAK,SAAS,KAAK,OAAO,GAAG;AACrC,aAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAlBS;AAoBT,eAAe,2BAA2B;AAAA,EACxC,KAAK;AAAA,EACL;AACF,GAeE;AACA,QAAM,YAAY,MAAM,YAAY;AAAA,IAClC,MAAM;AAAA,IACN;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AACD,MAAI,UAAU,QAAQ;AACpB,UAAM,iBAAiB,MAAM,0BAA0B;AAAA,MACrD,KAAK,UAAU;AAAA,IACjB,CAAC;AACD,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,eAAe;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACD,MAAI,CAAC,OAAO;AAAQ,WAAO,EAAE,MAAM,UAAU;AAC7C,QAAM,EAAE,IAAI,IAAID,MAAK,MAAM,OAAO,YAAY;AAC9C,UAAQ,KAAK;AAAA,IACX,KAAK,QAAQ;AACX,YAAM,gBAAgB,MAAM,yBAAyB;AAAA,QACnD,KAAK,OAAO;AAAA,MACd,CAAC;AACD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,cAAc;AAAA,MACtB;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAQ;AACX,YAAM,iBAAiB,MAAM,0BAA0B;AAAA,QACrD,KAAK,OAAO;AAAA,MACd,CAAC;AACD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,eAAe;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AACE,aAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA,EACJ;AACF;AAlEe;AAoEf,IAAM,0BAA0B,oBAAI,IAGlC;AACK,IAAM,sBAAsB,6BAAM;AACvC,MAAI,KAAK,8CAA8C;AACvD,0BAAwB,MAAM;AAChC,GAHmC;AAInC,eAAe,mBACb,MACA;AACA,QAAM,WAAW,KAAK,UAAU,IAAI;AACpC,MAAI,CAAC,wBAAwB,IAAI,QAAQ,GAAG;AAC1C,4BAAwB,IAAI,UAAU,2BAA2B,IAAI,CAAC;AAAA,EACxE;AACA,SAAO,wBAAwB,IAAI,QAAQ;AAC7C;AARe;AAUf,eAAe,aAAa;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAEoC;AAClC,QAAM,kBAAkB,MAAM,mBAAmB;AAAA,IAC/C;AAAA,IACA;AAAA,EACF,CAAC;AACD,UAAQ,gBAAgB,MAAM;AAAA,IAC5B,KAAK;AACH,aAAO,8BAA8B;AAAA,QACnC,MAAM,gBAAgB;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AACH,aAAO,6BAA6B;AAAA,QAClC,MAAM,gBAAgB;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AA1Be;AA4Bf,eAAsB,aACpB,KAGiC;AACjC,SAAO,YAAY;AAAA,IACjB,MAAM,MAAM,aAAa,GAAG;AAAA,EAC9B,CAAC;AACH;AARsB;AAUtB,eAAsB,gBACpB,iBACA,YACmB;AACnB,MAAI;AACF,UAAM,EAAE,SAAS,aAAa,IAAI,iBAAiB,OAAO;AAC1D,UAAM,EAAE,SAAS,gBAAgB,IAAI,iBAAiB,WAAW;AAIjE,UAAM,YAAYA,MAAK;AAAA,MACrB,UAAQ,QAAQ,SAAS;AAAA,QACvB,OAAO,CAAC,QAAQ,IAAI,CAAC;AAAA,MACvB,CAAC;AAAA,IACH;AACA,UAAM,eAAeA,MAAK;AAAA,MACxB,UAAQ,QAAQ,aAAa;AAAA,QAC3B,OAAO,CAAC,QAAQ,IAAI,CAAC;AAAA,MACvB,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,IAAI;AAAA,MAChB;AAAA,QACEA,MAAK,KAAK,WAAW,0BAA0B;AAAA,QAC/CA,MAAK,KAAK,iBAAiB,qBAAqB,YAAY,KAAK;AAAA,MACnE;AAAA,MACA;AAAA,QACEA,MAAK,KAAK,WAAW,6BAA6B;AAAA,QAClDA,MAAK,KAAK,iBAAiB,wBAAwB,YAAY,KAAK;AAAA,MACtE;AAAA,MACA;AAAA,QACEA,MAAK,KAAK,cAAc,iCAAiC;AAAA,QACzDA,MAAK;AAAA,UACH;AAAA,UACA,4BAA4B,eAAe;AAAA,QAC7C;AAAA,MACF;AAAA,MACA;AAAA,QACEA,MAAK,KAAK,cAAc,8BAA8B;AAAA,QACtDA,MAAK;AAAA,UACH;AAAA,UACA,yBAAyB,eAAe;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,kBACJ,QAAQ,IAAI,aAAa,eAAe,mBAAmB;AAE7D,WAAO;AAAA,MACLA,MAAK,KAAK,YAAY,SAAS,eAAe,IAAI,YAAY,KAAK;AAAA,MACnEA,MAAK;AAAA,QACH;AAAA,QACA,aAAa,eAAe,IAAI,eAAe;AAAA,MACjD;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AA9DsB;;;AC5nBtB,SAAS,wBAAwB;AACjC,SAAS,eAAe,aAAmB;AAC3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,mBAAmB;AAE5B,SAAS,gBAAgB,MAAuB;AAC9C,SAAO,KAAK,YAAY,MAAM;AAChC;AAFS;AAIT,SAAS,wBAAwB,KAAsB;AACrD,SAAO,gBAAgB,IAAI,CAAC,CAAC;AAC/B;AAFS;AAIT,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAMoB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,MACR,MAAM;AAAA,IACR;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,oBAAoB;AAAA,QACpB,MAAM;AAAA,UACJ,YAAY;AAAA,QACd;AAAA,QACA,SAAS,CAAC,aAAa;AAAA,QACvB,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AA1CS;AA4CF,IAAM,qBAAqB,cAAc;AAAA,EAC9C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,cAAc,aAAa;AAAA,IACzB,SAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,UAAU,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe,GAAG,GAAG,OAAO,MAAM;AACvE,UAAM,UAAU,OAAO;AACvB,UAAM,kBAAkB,MAAM,qBAAqB;AAAA,MACjD;AAAA,IACF,CAAC;AACD,UAAM,kCAAkC,gBAAgB;AAAA,MACtD,CAAC,KAAK,YAAY;AAChB,cAAM,iBACJ,QAAQ,WAAW,OAAO,CAAC,MAAM,EAAE,uBAAuB,OAAO,KACjE,CAAC;AACH,YAAI,KAAK,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC9C,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AACA,UAAM,EAAE,SAAS,WAAW,IAAI,MAAM,iBAAiB;AAAA,MACrD,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,MAAM,CAAC,GAAG,SACR,MAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA,SAAS,cAAc;AAAA,YACrB,IAAI;AAAA,YACJ,cAAc,aAAa;AAAA,cACzB,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,SAAS,WACN;AAAA,kBACC,CAAC,eACC,wBAAwB,UAAU,KAClC,CAAC,gCAAgC,SAAS,UAAU;AAAA,gBACxD,EACC,IAAI,CAAC,gBAAgB;AAAA,kBACpB,OAAO;AAAA,gBACT,EAAE;AAAA,cACN;AAAA,YACF;AAAA,YACA,UAAU,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;AAChD,oBAAM,WAAW,YAAY,IAAI,CAAC,gBAAgB;AAAA,gBAChD;AAAA,gBACA,WAAW,WAAW,WAAW,YAAY,IACzC,WAAW,MAAM,aAAa,MAAM,EAAE,YAAY,IAClD,WAAW,YAAY;AAAA,cAC7B,EAAE;AACF,qBAAO;AAAA,gBACL,GAAG,SAAS;AAAA,kBACV,CAAC,EAAE,YAAY,UAAU,OAAa;AAAA,oBACpC,OAAO,OAAO,UAAU;AAAA,oBACxB,MAAM,OAAO,IAAI,YAAY;AAC3B,4BAAM,cAAoB;AAAA,wBACxB,MAAM;AAAA,wBACN,IAAI,YAAY;AAAA,wBAChB,OAAO;AAAA,wBACP;AAAA,wBACA,YAAY;AAAA,wBACZ,MAAM;AAAA,0BACJ,OAAO,CAAC;AAAA,0BACR,OAAO,CAAC;AAAA,wBACV;AAAA,sBACF;AACA,4BAAM,UAAU,kBAAkB;AAAA,wBAChC,IAAI;AAAA,wBACJ;AAAA,wBACA;AAAA,wBACA,eAAe,YAAY;AAAA,sBAC7B,CAAC;AAED,4BAAM,QAAQ,IAAI;AAAA,wBAChB,UAAU;AAAA,0BACR;AAAA,0BACA,MAAM;AAAA,wBACR,CAAC;AAAA,wBACD,qBAAqB;AAAA,0BACnB;AAAA,0BACA;AAAA,0BACA,MAAM;AAAA,wBACR,CAAC;AAAA,sBACH,CAAC;AAAA,oBACH;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,MAAM,OAAO,IAAI,YAAY;AAC3B,0BAAM,EAAE,KAAK,IAAI,MAAM,gBAAgB;AAAA,sBACrC;AAAA,oBACF,CAAC;AAED,0BAAM,kBAAkB,OAAO,OAAO,IAAI,EAAE;AAAA,sBAC1C,CAAC,EAAE,MAAAE,OAAM,MAAM,GAAG,MAAM;AAEtB,4BAAIA;AAAM,iCAAO;AACjB,4BAAI,KAAK,YAAY,MAAM;AAAY,iCAAO;AAC9C,4BAAI,KAAK,YAAY,MAAM;AAAc,iCAAO;AAChD,+BAAO;AAAA,sBACT;AAAA,oBACF;AACA,0BAAM,cAAc;AAAA,sBAClB;AAAA,sBACA,UAAU,SAAS,IAAI,CAAC,EAAE,UAAU,OAAO;AAAA,wBACzC,OAAO;AAAA,wBACP,SAAS,YAAY,SAAS;AAAA,wBAC9B,WAAW,iBAAiB,MAAM;AAAA,sBACpC,EAAE;AAAA,oBACJ,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AFrJD,IAAM,EAAE,IAAI,IAAI,cAAc,SAAS;AAEvCC,KAAI,oBAAoB,EAAE,GAAG,KAAK,MAAM,IAAI,MAAO,SAAS,IAAI,QAAS,CAAC;AAWnE,IAAM,wBAAN,MAAM,+BACH,4BAEV;AAAA,EA/DA,OA+DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EAEA;AAAA,EAER,YAAY;AAAA,IACV;AAAA,IACA,kBAAkB,KAAK,WAAW,oBAAoB;AAAA,IACtD,KAAK,YAAY;AAAA,IACjB;AAAA,EACF,IAYI,CAAC,GAAG;AACN,UAAM;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,MACX,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD,SAAK,WAAW;AAChB,SAAK,SAAS,CAAC;AACf,SAAK,kBAAkB;AAGvB,SAAK,yBAAyB;AAC9B,SAAK,WAAW,CAAC,kBAAkB;AAAA,EACrC;AAAA,EAEA,MAAM,KAAK,KAA8D;AACvE,UAAM,MAAM,KAAK,GAAG;AACpB,SAAK,SAAS,MAAM,gBAAgB,KAAK,WAAW,KAAK,UAAU;AACnE,QAAI,CAAE,MAAM,OAAO,KAAK,eAAe,GAAI;AACzC,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,eAAe;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAA+C,OAAO;AAAA,IACpD,IAAI,KAAK;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,sBAAsB;AAAA,IACtB,kBACE;AAAA,IACF,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,SAAS,IAAI;AAAA,IACb,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,qBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,YAAY;AAAA,QACZ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY,CAAC;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,UAAU,EAAE,OAAO,WAAW;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,KAAqB;AAC9B,WAAO,WAAW,GAAG;AAAA,EACvB;AAAA,EAEA,sBAEE;AACA,UAAM,SAAS,MAAM,oBAAoB;AAEzC,WAAO,YAAY;AAAA,MACjB,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAwE;AACtE,UAAM,UAAU,MAAM,aAAa;AACnC,YAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,UACN,MAAM,KAAK,WAAW,qBAAqB;AAAA,UAC3C,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,eAAe,EAAE,SAAS,UAAU,KAAK;AAAA,EAC3C,GAK6C;AAC3C,UAAM,mBAAmB,KAAK,aAAa,EAAE;AAAA,MAAQ,CAAC,QACpD,IAAI,SAAS,UAAU,CAAC,IAAI,WAAW,IAAI,IAAI,CAAC;AAAA,IAClD;AACA,UAAM,EAAE,SAAS,sBAAsB,eAAe,IACpD,KAAK,sBAAsB,EAAE,SAAS,SAAS,CAAC;AAElD,QAAI,CAAC,sBAAsB;AACzB,MAAAA,KAAI,MAAM,GAAG,eAAe,KAAK,IAAI,CAAC,gCAAgC;AAAA,QACpE;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,cAAc;AAAA,MAClB,GAAG,QAAQ,IAAI,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,IAAI;AAAA,MACjD,GAAG;AAAA,IACL;AAEA,UAAM,eAIA,QAAQ,QAAQ,CAAC,QAAQ;AAC7B,UAAI,IAAI,SAAS,oBAAoB;AACnC,eAAO;AAAA,UACL;AAAA,YACE,WAAW,IAAI;AAAA,YACf,YAAY,IAAI;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,UAAI,IAAI,SAAS,yBAAyB;AACxC,eAAO;AAAA,UACL;AAAA,YACE,WAAW,IAAI;AAAA,YACf,YAAY,IAAI;AAAA,YAChB,QAAQ,IAAI;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV,CAAC;AAED,UAAM,mBAAuD;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,kBAAkB,MAAM,SAAS;AAAA,MACrC,cAAc;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA;AAAA,IAEZ,CAAC;AAKD,mBAAe,YAAY;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAIuC;AACrC,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AACA,YAAM,aAAa,MAAM,SAAS,cAAc;AAAA,QAC9C;AAAA,QACA,QAAQ,oBAAoB,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;AAAA,MACtD,CAAC;AACD,aAAO;AAAA,IACT;AAjBe;AAmBf,QAAI,OAAO;AAAA;AAAA,EAEb,YAAY,SAAS,CAAC;AAAA,EACtB,YAAY,IAAI;AAAA;AAAA,cAEJ,KAAK,UAAU,YAAY,CAAC;AAAA,yBACjB,KAAK,UAAU,gBAAgB,CAAC;AAAA;AAAA,YAE7C,YAAY,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAG9B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKuB,KAAK,sBAAsB;AAAA;AAAA;AAAA,YAGjD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQf,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BvB,QAAI,eAAe;AACnB,QAAI,eAAe;AAEnB,QAAI;AACF,aAAO,MAAM,KAAK,oBAAoB;AAAA,QACpC;AAAA,MACF,CAAC;AAAA,IACH,SAAS,GAAG;AACV,qBAAe;AACf,cAAQ,IAAI,IAAI;AAChB,cAAQ,IAAI,0CAA0C;AACtD,cAAQ,MAAM,EAAE,OAAO;AACvB,aAAO,iBAAiB,KAAK,UAAU,EAAE,OAAO,CAAC;AACjD,qBAAe,cAAc,EAAE,OAAO;AAAA,IACxC;AAEA,QAAI,CAAC,cAAc;AACjB,UAAI;AACF,eAAO,MAAMC,YAAW;AAAA,UACtB,UAAU;AAAA,UACV,MAAM;AAAA;AAAA,QACR,CAAC;AAAA,MACH,SAAS,GAAG;AACV,uBAAe;AACf,gBAAQ,IAAI,IAAI;AAChB,gBAAQ,IAAI,6CAA6C;AACzD,gBAAQ,MAAM,EAAE,OAAO;AACvB,eAAO,iBAAiB,KAAK,UAAU,EAAE,OAAO,CAAC;AACjD,uBAAe,cAAc,EAAE,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,MACX,KAAK,OAAO,IAAI,CAAC,UAAU,gBAAgB,KAAK,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,MAEzE,KAAK,4BAA4B;AAAA,MACjC,QAAQ,KAAK,qBAAqB;AAAA;AAAA,MAElC,oBAAoB;AAAA,IACtB,CAAC,CAAC;AAAA;AAAA;AAAA,4CAGsC,IAAI;AAAA,EAC9C,YAAY;AAAA;AAAA;AAIV,WAAO;AAAA,MACL,IAAI,CAAC;AAAA,MACL,MAAM,MAAMA,YAAW;AAAA,QACrB,UAAU;AAAA,QACV,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,MACD;AAAA,MACA,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,KAC0C;AAC1C,QAAI,uBAAsB,eAAe,IAAI,IAAI,GAAG;AAIlD,YAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,KAAK,KAAM,GAAI;AAC7C,UAAI;AACJ,UAAI,UAAU;AAEd,aAAO,MAAM;AACX,YAAI;AACF,6BAAmB,IAAI,gBAAgB,4BAA4B;AAAA,YACjE,WAAW,IAAI,QAAQ;AAAA,YACvB,YAAY,IAAI,SAAS;AAAA,YACzB,QAAQ,IAAI,KAAK;AAAA,UACnB,CAAC;AAED;AAAA,QACF,SAAS,GAAG;AACV,gBAAM,WAAW,MAAM,OAAO;AAC9B,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,CAAC;AAAA,UACnB;AACA,qBAAW;AAEX,gBAAM,MAAM,QAAQ;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,CAAC,sBAAsB,EAAE,OAAO,QAAQ,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnEC,UAAS,gBAAgB;AAAA,QACzB,KAAK,mBAAmB,GAAG;AAAA,MAC7B,CAAC;AACD,YAAM,UAAU,MAAM,gBAAgB;AAAA,QACpC,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,UAAU,MAAM,KAAK,wBAAwB;AAAA,QACjD,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAED,aAAO;AAAA,IACT;AAEA,QAAI,uBAAsB,WAAW,IAAI,IAAI,GAAG;AAC9C,YAAM,EAAE,OAAO,QAAQ,IAAI,MAAM,KAAK,mBAAmB,GAAG;AAC5D,YAAM,EAAE,MAAM,WAAW,IAAI,KAAK,wBAAwB;AAAA,QACxD;AAAA,MACF,CAAC;AAED,YAAM,CAAC,cAAc,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,QAChD,gBAAgB;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,QACX,CAAC;AAAA,QACD,gBAAgB;AAAA,UACd,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,CAAC;AAED,aAAO,KAAK,wBAAwB;AAAA,QAClC;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,KAGtB;AACD,UAAM,EAAE,SAAS,UAAU,iBAAiB,KAAK,IAAI;AACrD,QAAI,MAAM,QAAQ,uBAAsB,WAAW,IAAI,GAAG;AACxD,YAAM;AAAA,QACJ,MAAM,EAAE,OAAO,MAAM;AAAA,MACvB,IAAI;AAEJ,YAAM,aAAa,KAAK,YAAY;AAAA,QAClC,WAAW,QAAQ;AAAA,QACnB,YAAY,SAAS;AAAA,MACvB,CAAC;AACD,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR,+CAA+C,QAAQ,EAAE,IAAI,SAAS,EAAE;AAAA,QAC1E;AAAA,MACF;AACA,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI,WAAW;AAEhD,YAAM,cAA4B,CAAC,UAAU;AAC7C,YAAM,WAAqB,CAAC;AAC5B,YAAM,aAA+C,CAAC;AAEtD,UAAI,OAAO;AACT,cAAM,YAAY,OAAO,KAAK,KAAK;AACnC,cAAM,aAAa,MAAM,QAAQ;AAAA,UAC/B,UAAU,IAAI,OAAO,aAAa;AAChC,kBAAM,YAAY,MAAM,QAAQ;AAChC,kBAAM,SAAS,MAAM,QAAQ;AAAA,cAC3B,UAEG,OAAO,CAAC,aAAa;AACpB,oBAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,sBAAI,CAAC,SAAS;AAAW,2BAAO;AAChC,sBAAI,CAAC,SAAS;AAAY,2BAAO;AACjC,sBAAI,sBAAsB,QAAQ,KAAK,CAAC,SAAS,QAAQ;AACvD,2BAAO;AAAA,kBACT;AAAA,gBACF;AACA,uBAAO;AAAA,cACT,CAAC,EACA,IAAI,OAAO,aAAa;AACvB,oBAAI,cAAc,QAAQ,GAAG;AAC3B,sBAAI,UAAU,WAAW,KAAK,aAAa,YAAY;AAErD,2BAAO,KAAK,SAAS,IAAI;AAAA,kBAC3B;AACA,yBAAO,SAAS;AAAA,gBAClB;AAEA,sBAAM,cAAc,gBAAgB;AAAA,kBAClC,SAAS;AAAA,gBACX;AAEA,sBAAM,eAAe,YAAY,UAAU;AAAA,kBACzC,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,gBAC3B;AACA,oBAAI,2BAA2B,QAAQ,GAAG;AACxC,wBAAM,EAAE,OAAAC,QAAO,QAAQ,IAAI,MAAM,KAAK,mBAAmB;AAAA,oBACvD,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV;AAAA,kBACF,CAAC;AACD,8BAAY,KAAK,GAAG,OAAO;AAC3B,yBAAOA;AAAA,gBACT;AACA,oBAAI,sBAAsB,QAAQ,GAAG;AACnC,wBAAM,EAAE,OAAAA,QAAO,QAAQ,IAAI,MAAM,KAAK,mBAAmB;AAAA,oBACvD,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,MACE,SAAS,QACT,KAAK,SAAS,UAAU,SAAS,MAAM;AAAA,oBACzC;AAAA,kBACF,CAAC;AACD,8BAAY,KAAK,GAAG,OAAO;AAC3B,yBAAOA;AAAA,gBACT;AAEA,sBAAM,IAAI;AAAA,kBACR,sBAAsB,KAAK,UAAU,QAAQ,CAAC;AAAA,gBAChD;AAAA,cACF,CAAC;AAAA,YACL;AACA,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,mBAAW,QAAQ,CAAC,EAAE,UAAU,OAAO,MAAM;AAC3C,iBAAO,QAAQ,CAACA,WAAU;AACxB,gBAAI,aAAa,YAAY;AAC3B,uBAAS,KAAKA,MAAK;AAAA,YACrB,OAAO;AACL,yBAAW,KAAK;AAAA,gBACd,KAAK;AAAA,gBACL,OAAOA;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,MAAM,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,UAAU,SAAS,KAAK,IAAI;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,uBAAsB,eAAe,IAAI,GAAG;AAC5D,YAAM,aAAa,KAAK,YAAY;AAAA,QAClC,WAAW,QAAQ;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR,oDAAoD,QAAQ,EAAE,IAAI,SAAS,EAAE,IAAI,KAAK,EAAE;AAAA,QAC1F;AAAA,MACF;AACA,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI,WAAW;AAEhD,YAAM,QAAQ,MAAM,SAAS,EAAE,aAAa,CAAC;AAE7C,aAAO;AAAA,QACL;AAAA,QACA,SAAS,CAAC,UAAU;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,aAAa,KAAK,YAAY;AAAA,QAClC,WAAW,QAAQ;AAAA,QACnB,YAAY,SAAS;AAAA,MACvB,CAAC;AACD,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR,+CAA+C,QAAQ,EAAE,IAAI,SAAS,EAAE;AAAA,QAC1E;AAAA,MACF;AACA,YAAM,EAAE,MAAM,MAAM,aAAa,IAAI,WAAW;AAEhD,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAML,OAAO;AAAA,QACP,SAAS,CAAC,UAAU;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR,2BAA2B,QAAQ,EAAE,IAAI,SAAS,EAAE,KAAK,KAAK;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,KAA4C;AACzD,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,mBAAmB,GAAG;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,YAAuD,OAAO;AAAA,IAC5D;AAAA,IACA;AAAA,EACF,MAGuC;AACrC,UAAM,OAAO,MAAM,aAAa;AAAA,MAC9B,KAAK,SAAS;AAAA,MACd,YAAY,SAAS,SAAS;AAAA,MAC9B,gBAAgB,KAAK,OAAO;AAAA,IAC9B,CAAC;AACD,QAAI,SAAS,OAAO;AAClB,YAAM,aAAa,OAAO,KAAK,MAAM,OAAO,cAAc,CAAC,CAAC,EAAE;AAC9D,YAAM,aAAa,OAAO,KAAK,MAAM,SAAS,CAAC,CAAC,EAAE;AAClD,UAAI,eAAe,KAAK,eAAe,GAAG;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,KAA2D;AACrE,UAAM,MAAM,MAAM,GAAG;AACrB,mBAAe,yBAAyB,MAAM;AAC5C,0BAAoB;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,kBAAmE,OAAO;AAAA,IACxE;AAAA,IACA;AAAA,EACF,MAAM;AACJ,UAAM,QAAwB,CAAC;AAC/B,QAAI,UAAU,MAAM,OAAO;AACzB,YAAM,SAAS,KAAK,MAAM,KAAK,UAAU,SAAS,KAAK,KAAK,CAAC;AAC7D,UAAI,UAAU,MAAM,OAAO;AACzB,eAAO,QAAQ,SAAS,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,MAAM;AAC1D,iBAAO,WAAW,EAAE,IAAI;AAAA,YACtB,QAAQ;AAAA,YACR,QAAQ;AAAA,YAER,aAAa,KAAK,oBACd,GAAG,KAAK,WAAW,eAAe,KAAK,kBAAkB;AAAA,cACvD;AAAA,YACF,CAAC,KACD,KAAK;AAAA,UACX;AACA,iBAAO,WAAW,OAAO,YAAY,CAAC;AACtC,cAAI,KAAK;AAAY,mBAAO,SAAS,KAAK,EAAE;AAAA,QAC9C,CAAC;AAAA,MACH;AACA,YAAM,WACJ,MAAM,uBAAsB,8BAA8B;AAAA,QACxD;AAAA,QACA,OAAO,GAAG,KAAK,WAAW,QAAQ,EAAE,CAAC;AAAA;AAAA,QAErC,aAAa,iDAAiD,QAAQ,EAAE,IAAI,SAAS,EAAE;AAAA,QACvF,WAAW,QAAQ;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,YAAY;AAAA,MACd,CAAC;AAEH,YAAM,KAAK;AAAA,QACT,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM,GAAG,QAAQ,EAAE,IAAI,SAAS,EAAE;AAAA,MACpC,CAAC;AACD,YAAM,KAAK;AAAA,QACT,UAAU,KAAK,UAAU,QAAQ,MAAM,IAAI;AAAA,QAC3C,UAAU;AAAA,QACV,MAAM,GAAG,QAAQ,EAAE,IAAI,SAAS,EAAE;AAAA,MACpC,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,yBACE,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5B,UAAM,UAAoB,CAAC;AAE3B,UAAM,MAAM;AACZ,UAAM,QAAQ,CAAC,SAAS;AACtB,UAAI,KAAK,KAAK,SAAS,GAAG,GAAG;AAC3B,cAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAI;AAChC,cAAM,CAAC,WAAW,UAAU,IAAI,KAAK,MAAM,GAAG;AAC9C,cAAM,UAAU,eAAe,KAAK;AACpC,cAAM,aAAa,KAAK,WAAW,GAAG,SAAS,OAAO;AACtD,cAAM,2BAA2B,KAAK;AAAA,UACpC,GAAG,SAAS,IAAI,UAAU;AAAA,QAC5B;AACA,gBAAQ;AAAA,UACN,YACE,UACI,aACA,GAAG,UAAU,OAAO,wBAAwB,EAClD,cAAc,SAAS,SAAS,KAAK,IAAI,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF,CAAC;AAGD,YAAQ,KAAK,EAAE;AAEf,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,QACE,UAAU,QAAQ,KAAK,IAAI;AAAA,QAC3B,UAAU;AAAA,QACV,MAAM,KAAK,SAAS,YAAY;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEF,MAAM,uBAAuB;AAAA,IAC3B;AAAA,EACF,GAE0E;AACxE,UAAM,EAAE,MAAM,QAAQ,IAAI,KAAK,SAAS;AACxC,UAAM,EAAE,kBAAkB,aAAa,IAAI,KAAK,eAAe;AAC/D,UAAM,kBAAwC;AAAA,MAC5C,GAAG;AAAA,MACH,GAAG;AAAA,IACL,EAAE,IAAI,CAAC,EAAE,MAAAC,OAAM,OAAAC,OAAM,MAAM;AACzB,aAAO;AAAA,QACL,MAAAD;AAAA,QACA,OAAOC,UAAS;AAAA,MAClB;AAAA,IACF,CAAC;AAED,UAAM,WAAW;AAAA,MACf,GAAG,oBAAI,IAAI,CAAC,SAAS,GAAG,gBAAgB,IAAI,CAAC,EAAE,MAAAD,MAAK,MAAMA,KAAI,CAAC,CAAC;AAAA,IAClE;AACA,UAAM;AAAA,MACJ,SAAS,EAAE,MAAM;AAAA,IACnB,IAAI,KAAK,oBAAoB;AAC7B,UAAM,cAAsC,CAAC;AAC7C,QAAI,SAAS,KAAK,GAAG;AACnB,aAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9C,YAAI,OAAO,UAAU,UAAU;AAC7B,sBAAY,GAAG,IAAI;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,iBAAuC,MAAM,QAAQ;AAAA,MACzD,SAAS,IAAI,OAAOA,UAAwC;AAC1D,YAAI,CAACA;AAAM,iBAAO,CAAC;AACnB,YAAI;AACF,gBAAM,EAAE,SAAS,SAAS,IAAI,MAAME,kBAAiB;AAAA,YACnD,MAAAF;AAAA,YACA,gBAAgB;AAAA,YAChB,OAAO;AAAA,UACT,CAAC;AACD,cAAI,UAAU;AACZ,kBAAM,IAAI,MAAM,QAAQ;AAAA,UAC1B;AACA,iBACE,QAGG,OAAO,CAAC,MAAM,MAAM,aAAa,qBAAqB,CAAC,CAAC,EACxD,IAAI,CAAC,UAAU;AAAA,YACd,OAAO;AAAA,YACP,MAAAA;AAAA,UACF,EAAE;AAAA,QAER,SAAS,GAAG;AAEV,UAAAJ,KAAI;AAAA,YACF,kCAAkCI,KAAI,KAAK,EAAE,OAAO;AAAA,YACpD;AAAA,YACA,KAAK;AAAA,UACP;AACA,iBAAO,CAAC;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,EAAE,KAAK,CAAC,YAAY;AAElB,aAAO,QAAQ,KAAK;AAAA,IACtB,CAAC;AAED,UAAM,cAAc,eAAe,OAAO,CAAC,MAAM;AAC/C,aAAO,CAAC,gBAAgB;AAAA,QACtB,CAAC,OAAO,GAAG,UAAU,EAAE,SAAS,GAAG,SAAS,EAAE;AAAA,MAChD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;","names":["log","getJsExportNames","readFile","formatCode","path","path","parse","path","log","formatCode","readFile","usage","path","alias","getJsExportNames"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../node_modules/.pnpm/tsup@8.0.2_@microsoft+api-extractor@7.43.8_@types+node@20.14.9__@swc+core@1.3.57_postcss@8.4._c7ofiv7d7od3vtkxwbcxujiyae/node_modules/tsup/assets/esm_shims.js","../src/renderer-react.ts","../src/utils.ts","../src/react-creators.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport { fileURLToPath } from 'url'\nimport path from 'path'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import sleep from 'sleep-promise';\nimport { KnapsackRendererWebpackBase } from '@knapsack/renderer-webpack-base';\nimport {\n pascalCase,\n Except,\n isFirstLetterCapital,\n isObject,\n isEmpty,\n} from '@knapsack/utils';\nimport { knapsackEvents, log, KnapsackRendererBase } from '@knapsack/app';\nimport {\n KsRendererClientGlobal,\n KnapsackFile,\n KsJsImport,\n isSlottedText,\n isSlottedTemplateReference,\n isSlottedTemplateDemo,\n KnapsackPatternTemplate,\n KsTemplateSpec,\n TemplateSuggestion,\n rendererIds,\n RendererId,\n} from '@knapsack/types';\nimport type {\n KnapsackRenderParams,\n KnapsackTemplateRenderer,\n KnapsackTemplateRendererBase,\n KnapsackTemplateRendererResults,\n Patterns,\n} from '@knapsack/app/types';\nimport {\n exists,\n findUpPkgJson,\n getJsExportNames,\n readFile,\n formatCode,\n} from '@knapsack/file-utils';\nimport type { ReactNode } from 'react';\nimport { join, relative, parse } from 'path';\nimport {\n clearInferSpecCache,\n copyReactAssets,\n getDemoAppUsage,\n getReactDocs,\n getUsage,\n} from './utils';\nimport { createReactPattern } from './react-creators';\n\nconst { pkg } = findUpPkgJson(__dirname);\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nlog.setupUpdateNotifier({ ...pkg, name: pkg.name!, version: pkg.version! });\n\n// static methods only\nconst { hasSlotOptions } = KnapsackRendererBase;\n\nexport type DemoWrapperProps = {\n children: React.ReactNode;\n patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[];\n} & Except<KnapsackRenderParams, 'patternManifest'>;\n\nexport class KnapsackReactRenderer\n extends KnapsackRendererWebpackBase\n implements KnapsackTemplateRenderer\n{\n /**\n * `react.js` & `react-dom.js` root relative paths\n */\n assets: string[];\n babelConfig: Record<string, unknown>;\n creators: KnapsackTemplateRenderer['creators'];\n private demoWrapperPath: string;\n\n private disableReactStrictMode?: boolean;\n\n constructor({\n webpackConfig,\n demoWrapperPath = join(__dirname, './demo-wrapper.mjs'),\n id = rendererIds.react,\n disableReactStrictMode,\n }: {\n webpackConfig?: ConstructorParameters<\n typeof KnapsackRendererWebpackBase\n >[0]['webpackConfig'];\n demoWrapperPath?: string;\n /** When using React v18+, this option allows a workspace to _disable_ React's Strict Mode from running in Knapsack's React Renderer (StrictMode is enabled by default).\n *\n * See https://reactjs.org/docs/strict-mode.html for more info\n * */\n disableReactStrictMode?: boolean;\n /** Don't set if calling from `knapsack.config.js`, only use if creating a new Renderer based on the React Renderer */\n id?: RendererId;\n } = {}) {\n super({\n id,\n extension: '.jsx',\n language: 'jsx',\n webpackConfig,\n });\n this.language = 'jsx';\n this.assets = [];\n this.demoWrapperPath = demoWrapperPath;\n\n // Half-borrowing the API Synax for this from the latest version of Next.js\n this.disableReactStrictMode = disableReactStrictMode;\n this.creators = [createReactPattern];\n }\n\n async init(opt: { patterns: Patterns; cacheDir: string }): Promise<void> {\n await super.init(opt);\n this.assets = await copyReactAssets(this.outputDir, this.publicPath);\n if (!(await exists(this.demoWrapperPath))) {\n throw new Error(\n `Could not find demo wrapper at: \"${this.demoWrapperPath}\"`,\n );\n }\n }\n\n getMeta: KnapsackTemplateRenderer['getMeta'] = () => ({\n id: this.id,\n title: 'React',\n aliasUse: 'optional',\n aliasTitle: 'Named Export',\n aliasIsJsNamedExport: true,\n aliasDescription:\n 'If `export X` was used instead of `export default`, then provide X.',\n enableDataDemos: true,\n enableTemplateDemos: true,\n hasSlotsSupport: true,\n hasSlotOptionsSupport: true,\n version: pkg.version,\n hasInferSpecSupport: true,\n syntaxHighlightingLanguage: 'jsx',\n hasTemplateSuggestionsSupport: true,\n prototypingTemplate: {\n path: '@knapsack/renderer-react/prototype-template',\n spec: {\n isInferred: false,\n props: {\n type: 'object',\n properties: {},\n },\n slots: {\n children: { title: 'Children' },\n },\n },\n },\n });\n\n changeCase(str: string): string {\n return pascalCase(str);\n }\n\n createWebpackConfig(): ReturnType<\n KnapsackRendererWebpackBase['createWebpackConfig']\n > {\n const config = super.createWebpackConfig();\n\n config.externals = {\n react: 'React',\n 'react-dom': 'ReactDOM',\n };\n\n return config;\n }\n\n getJsImports(): ReturnType<KnapsackRendererWebpackBase['getJsImports']> {\n const imports = super.getJsImports();\n imports.push(\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: this.demoWrapperPath,\n name: 'DemoWrapper',\n },\n },\n {\n type: 'extra',\n importInfo: {\n type: 'default',\n path: join(__dirname, './error-catcher.mjs'),\n name: 'ErrorCatcher',\n },\n },\n );\n return imports;\n }\n\n async prepClientRenderResults({\n usage,\n demoApp,\n imports: xImports,\n renderOptions: { pattern, template, demo },\n }: {\n usage: string;\n demoApp: string;\n imports: KsJsImport[];\n renderOptions: KnapsackRenderParams;\n }): Promise<KnapsackTemplateRendererResults> {\n const extraImportNames = this.getJsImports().flatMap((imp) =>\n imp.type === 'extra' ? [imp.importInfo.name] : [],\n );\n const { imports, isDeclaredVarsUnique, nameCollisions } =\n this.makeKsJsImportsUnique({ imports: xImports });\n\n if (!isDeclaredVarsUnique) {\n log.error(`${nameCollisions.join(', ')} are declared multiple times`, {\n imports,\n });\n }\n\n // import names; i.e. `KsButton`\n const importNames = [\n ...imports.map(({ importInfo: { name } }) => name),\n ...extraImportNames,\n ];\n\n const patternsUsed: {\n patternId: string;\n templateId: string;\n demoId?: string;\n }[] = imports.flatMap((imp) => {\n if (imp.type === 'pattern-template') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n },\n ];\n }\n if (imp.type === 'pattern-template-demo') {\n return [\n {\n patternId: imp.patternId,\n templateId: imp.templateId,\n demoId: imp.demoId,\n },\n ];\n }\n return [];\n });\n\n const demoWrapperProps: Omit<DemoWrapperProps, 'children'> = {\n patternsUsed,\n pattern,\n template,\n demo,\n };\n const demoWrapperCode = await getUsage({\n templateName: 'DemoWrapper',\n props: demoWrapperProps,\n children: `<DemoApp />`,\n // extraProps,\n });\n\n /**\n * IMPORTANT: this function is stringified and then executed in the browser - it cannot use anything in scope (other functions, vars, etc)\n */\n async function renderReact({\n patterns,\n theExtraImportNames,\n ksGlobal,\n }: {\n patterns: typeof patternsUsed;\n theExtraImportNames: typeof extraImportNames;\n ksGlobal: KsRendererClientGlobal<ReactNode>;\n }): Promise<Record<string, ReactNode>> {\n if (!ksGlobal) {\n throw new Error('\"window.knapsack\" is null');\n }\n const components = await ksGlobal.getAllImports({\n patterns,\n extras: theExtraImportNames.map((name) => ({ name })),\n });\n return components;\n }\n\n let code = `\n\n${renderReact.toString()}\n${renderReact.name}({\n ksGlobal: window.knapsack,\n patterns: ${JSON.stringify(patternsUsed)},\n theExtraImportNames: ${JSON.stringify(extraImportNames)},\n}).then((components) => {\n const { ${importNames.join(', ')} } = components;\n const root = document.getElementById('render-root');\n\n ${demoApp}\n\n const reactDomVersion = parseInt(ReactDOM.version.split('.')[0], 10);\n\n const ReactRendererResult = () => {\n if (reactDomVersion < 17 || ${this.disableReactStrictMode}){\n return (\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n )\n }\n\n return (\n <React.StrictMode>\n <ErrorCatcher>\n ${demoWrapperCode}\n </ErrorCatcher>\n </React.StrictMode>\n )\n };\n\n\n if (reactDomVersion > 17){\n ReactDOM.createRoot(root).render(\n <ReactRendererResult />\n )\n } else {\n ReactDOM.render(\n <ReactRendererResult />,\n root\n );\n }\n}).catch((err) => {\n console.error(err);\n const root = document.getElementById('render-root');\n // Create a new <div> element to contain the error message\n const errorMsgDiv = document.createElement('div');\n // Insert the new <div> element before the existing element\n root.parentNode.insertBefore(errorMsgDiv, root);\n // add error message so users can see it\n errorMsgDiv.innerHTML = '<h1>Component Error</h1><p>' + err.message + '</p>';\n});\n `;\n\n let codeHadError = false;\n let errorHtmlMsg = '';\n\n try {\n code = await this.babelCodeForBrowser({\n code,\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before babel error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n\n if (!codeHadError) {\n try {\n code = await formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n } catch (e) {\n codeHadError = true;\n console.log(code);\n console.log('---original code before prettier error ^---');\n console.trace(e.message);\n code = `console.error(${JSON.stringify(e.message)});`;\n errorHtmlMsg = `<pre><code>${e.message}</code></pre>`;\n }\n }\n\n const html = `\n ${this.assets.map((asset) => `<script src=\"${asset}\"></script>`).join('\\n')}\n\n ${this.createHtmlTagsForAssetPaths({\n assets: this.getWebpackAssetPaths(),\n // we need the scripts to finish adding methods to the global knapsack object synchronously before the client-side code runs that is in the <script> tag below\n scriptTagsAreAsync: false,\n })}\n\n <div id=\"render-root\" class=\"knapsack-pattern-direct-parent\" data-dev-note=\"Knapsack React Template Wrapper\"></div>\n <script type=\"application/javascript\">${code}</script>\n${errorHtmlMsg}\n\n `;\n\n return {\n ok: !codeHadError,\n html: await formatCode({\n contents: html,\n path: 'x.html', // doing this to set format language\n }),\n usage,\n templateLanguage: this.language,\n };\n }\n\n async render(\n opt: KnapsackRenderParams,\n ): Promise<KnapsackTemplateRendererResults> {\n if (KnapsackReactRenderer.isTemplateDemo(opt.demo)) {\n // when getting a template demos path sometimes we have a race condition where the client asks for it before the server knows about it.\n // so we try several times in a row to get it\n /** The amount of time in ms to wait between attempts; when we run out of array items, we give up and throw the error */\n const waits = [5, 10, 20, 50, 100, 1000, 1000];\n let templateDemoPath: string;\n let attempt = 0;\n\n while (true) {\n try {\n templateDemoPath = opt.patternManifest.getTemplateDemoAbsolutePath({\n patternId: opt.pattern.id,\n templateId: opt.template.id,\n demoId: opt.demo.id,\n });\n // got it!\n break;\n } catch (e) {\n const waitTime = waits[attempt];\n if (!waitTime) {\n throw new Error(e);\n }\n attempt += 1;\n // eslint-disable-next-line no-await-in-loop\n await sleep(waitTime);\n }\n }\n\n const [templateFileContents, { usage, imports }] = await Promise.all([\n readFile(templateDemoPath),\n this.getUsageAndImports(opt),\n ]);\n const demoApp = await getDemoAppUsage({\n children: usage,\n });\n const results = await this.prepClientRenderResults({\n usage: templateFileContents,\n demoApp,\n imports,\n renderOptions: opt,\n });\n\n return results;\n }\n\n if (KnapsackReactRenderer.isDataDemo(opt.demo)) {\n const { usage, imports } = await this.getUsageAndImports(opt);\n const { code: importCode } = this.createJsImportCodeBlock({\n imports,\n });\n\n const [demoAppUsage, demoApp] = await Promise.all([\n getDemoAppUsage({\n children: usage,\n imports: importCode,\n }),\n getDemoAppUsage({\n children: usage,\n }),\n ]);\n\n return this.prepClientRenderResults({\n demoApp,\n usage: demoAppUsage,\n imports,\n renderOptions: opt,\n });\n }\n }\n\n async getUsageAndImports(opt: KnapsackRenderParams): Promise<{\n usage: string;\n imports: KsJsImport[];\n }> {\n const { pattern, template, patternManifest, demo } = opt;\n if (demo?.type && KnapsackReactRenderer.isDataDemo(demo)) {\n const {\n data: { props, slots, slotsOptionsComputed },\n } = demo;\n\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const importInfos: KsJsImport[] = [importInfo];\n const children: string[] = [];\n const extraProps: { key: string; value: string }[] = [];\n\n if (slots) {\n const slotNames = Object.keys(slots);\n const slotUsages = await Promise.all(\n slotNames.map(async (slotName) => {\n const slotItems = slots[slotName];\n const slotItemsUsages = await Promise.all(\n slotItems\n // remove any incomplete item - happens when users are filling out form\n .filter((slotItem) => {\n if (!isSlottedText(slotItem)) {\n if (!slotItem.patternId) return false;\n if (!slotItem.templateId) return false;\n if (isSlottedTemplateDemo(slotItem) && !slotItem.demoId) {\n return false;\n }\n }\n return true;\n })\n .map(async (slotItem) => {\n if (isSlottedText(slotItem)) {\n if (slotItems.length === 1 && slotName !== 'children') {\n // The ` prevents multi-line strings from causing error (even though they don't show a line break)\n return `\\`${slotItem.text}\\``;\n }\n return slotItem.text;\n }\n\n const slotPattern = patternManifest.getPattern(\n slotItem.patternId,\n );\n\n const slotTemplate = slotPattern.templates.find(\n (t) => t.id === slotItem.templateId,\n );\n if (isSlottedTemplateReference(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n if (isSlottedTemplateDemo(slotItem)) {\n const { usage, imports } = await this.getUsageAndImports({\n pattern: slotPattern,\n template: slotTemplate,\n demo:\n slotItem.demo ||\n this.patterns.demosById[slotItem.demoId],\n patternManifest,\n });\n importInfos.push(...imports);\n return usage;\n }\n\n throw new Error(\n `Unknown slot item: ${JSON.stringify(slotItem)}`,\n );\n }),\n );\n return {\n slotName,\n slotItemsUsages,\n };\n }),\n );\n\n slotUsages.forEach(({ slotName, slotItemsUsages }) => {\n const slotOptionsComputed = slotsOptionsComputed?.[slotName];\n if (hasSlotOptions(slotOptionsComputed)) {\n const { attributes, cssClasses, styles, wrappingElementName } =\n slotOptionsComputed;\n const openTag = `<${wrappingElementName}\n ${isEmpty(styles) ? '' : `style={${JSON.stringify(styles)}}`}\n ${isEmpty(cssClasses) ? '' : `className=\"${cssClasses.join(' ')}\"`}\n ${Object.entries(attributes)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')}\n >`;\n if (slotName === 'children') {\n children.push(openTag);\n } else {\n extraProps.push({\n key: slotName,\n value: openTag,\n });\n }\n }\n\n slotItemsUsages.forEach((usage) => {\n if (slotName === 'children') {\n children.push(usage);\n } else {\n extraProps.push({\n key: slotName,\n value: usage,\n });\n }\n });\n\n if (hasSlotOptions(slotOptionsComputed)) {\n const closeTag = `</${slotOptionsComputed.wrappingElementName}>`;\n if (slotName === 'children') {\n children.push(closeTag);\n } else {\n extraProps.push({\n key: slotName,\n value: closeTag,\n });\n }\n }\n });\n }\n\n const usage = await getUsage({\n templateName,\n props,\n children: children.join('\\n'),\n extraProps,\n });\n\n return {\n usage,\n imports: importInfos,\n };\n }\n\n if (demo?.type && KnapsackReactRenderer.isTemplateDemo(demo)) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n demoId: demo.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template-demo: ${pattern.id}-${template.id}-${demo.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n const usage = await getUsage({ templateName });\n\n return {\n usage,\n imports: [importInfo],\n };\n }\n\n if (!demo) {\n const importInfo = this.getJsImport({\n patternId: pattern.id,\n templateId: template.id,\n });\n if (!importInfo) {\n throw new Error(\n `Could not find import for pattern-template: ${pattern.id}-${template.id}`,\n );\n }\n const { type, name: templateName } = importInfo.importInfo;\n\n return {\n /**\n * i.e. Given a React Component, `Button`, normally this would be `<Button>` with a demo, but since there is none this will just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n * @see {SlottedTemplate}\n */\n usage: templateName,\n imports: [importInfo],\n };\n }\n\n throw new Error(\n `Unhandled demo type for ${pattern.id}-${template.id}: ${JSON.stringify(\n demo,\n )}`,\n );\n }\n\n async getUsage(opt: KnapsackRenderParams): Promise<string> {\n const { usage } = await this.getUsageAndImports(opt);\n return usage;\n }\n\n inferSpec: KnapsackTemplateRendererBase['inferSpec'] = async ({\n template,\n templatePath,\n }: {\n template: KnapsackPatternTemplate;\n templatePath: string;\n }): Promise<KsTemplateSpec | false> => {\n const spec = await getReactDocs({\n src: template.path,\n exportName: template.alias || 'default',\n resolveFromDir: this.config.data,\n });\n if (spec !== false) {\n const totalProps = Object.keys(spec?.props?.properties || {}).length;\n const totalSlots = Object.keys(spec?.slots || {}).length;\n if (totalProps === 0 && totalSlots === 0) {\n return false;\n }\n }\n return spec;\n };\n\n async watch(opt: Parameters<KnapsackTemplateRendererBase['watch']>[0]) {\n await super.watch(opt);\n knapsackEvents.onPatternTemplateChanged(() => {\n clearInferSpecCache();\n });\n }\n\n getTemplateMeta: KnapsackTemplateRendererBase['getTemplateMeta'] = async ({\n pattern,\n template,\n }) => {\n const files: KnapsackFile[] = [];\n if (template?.spec?.props) {\n const schema = JSON.parse(JSON.stringify(template.spec.props));\n if (template?.spec?.slots) {\n Object.entries(template.spec.slots).forEach(([id, info]) => {\n schema.properties[id] = {\n typeof: 'function',\n tsType: 'React.ReactNode',\n\n description: info.allowedPatternIds\n ? `${info.description}. Only use: ${info.allowedPatternIds.join(\n ', ',\n )}`\n : info.description,\n };\n schema.required = schema.required ?? [];\n if (info.isRequired) schema.required.push(id);\n });\n }\n const typeDefs =\n await KnapsackReactRenderer.convertSchemaToTypeScriptDefs({\n schema,\n title: `${this.changeCase(pattern.id)}Props`,\n // @todo pull in base url\n description: `[Knapsack Docs](http://localhost:3999/pattern/${pattern.id}/${template.id})`,\n patternId: pattern.id,\n templateId: template.id,\n postBanner: `import * as React from 'react';`,\n });\n\n files.push({\n contents: typeDefs,\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.d.ts`,\n });\n files.push({\n contents: JSON.stringify(schema, null, ' '),\n encoding: 'utf8',\n path: `${pattern.id}.${template.id}.spec.json`,\n });\n }\n return files;\n };\n\n alterTemplateMetaFiles: KnapsackTemplateRendererBase['alterTemplateMetaFiles'] =\n async ({ files, metaDir }) => {\n const imports: string[] = [];\n\n const ext = '.spec.d.ts';\n files.forEach((file) => {\n if (file.path.endsWith(ext)) {\n const { base } = parse(file.path);\n const [patternId, templateId] = base.split('.');\n const isFirst = templateId === this.id;\n const exportName = this.changeCase(`${patternId}Props`);\n const exportNameWithTemplateId = this.changeCase(\n `${patternId}-${templateId}Props`,\n );\n imports.push(\n `export { ${\n isFirst\n ? exportName\n : `${exportName} as ${exportNameWithTemplateId}`\n } } from './${relative(metaDir, file.path).replace('.d.ts', '')}';`,\n );\n }\n });\n\n // extra line at end of file\n imports.push('');\n\n return [\n ...files,\n {\n contents: imports.join('\\n'),\n encoding: 'utf8',\n path: join(metaDir, 'react.d.ts'),\n },\n ];\n };\n\n async getTemplateSuggestions({\n newPath,\n }: Parameters<\n KnapsackTemplateRendererBase['getTemplateSuggestions']\n >[0]): ReturnType<KnapsackTemplateRendererBase['getTemplateSuggestions']> {\n const { data: dataDir } = this.patterns.userConfig;\n const { allTemplateDemos, allTemplates } = this.getMyTemplates();\n const usedSuggestions: TemplateSuggestion[] = [\n ...allTemplateDemos,\n ...allTemplates,\n ].map(({ path, alias }) => {\n return {\n path,\n alias: alias || 'default',\n };\n });\n\n const allPaths = [\n ...new Set([newPath, ...usedSuggestions.map(({ path }) => path)]),\n ];\n const {\n resolve: { alias },\n } = this.createWebpackConfig();\n const aliasConfig: Record<string, string> = {};\n if (isObject(alias)) {\n Object.entries(alias).forEach(([key, value]) => {\n if (typeof value === 'string') {\n aliasConfig[key] = value;\n }\n });\n }\n const allSuggestions: TemplateSuggestion[] = await Promise.all(\n allPaths.map(async (path): Promise<TemplateSuggestion[]> => {\n if (!path) return [];\n try {\n const { exports, errorMsg } = await getJsExportNames({\n path,\n resolveFromDir: dataDir,\n alias: aliasConfig,\n });\n if (errorMsg) {\n throw new Error(errorMsg);\n }\n return (\n exports\n // only allow names that start with a capital letter (i.e. React Component names)\n // will exclude helper functions and custom hooks\n .filter((e) => e === 'default' || isFirstLetterCapital(e))\n .map((name) => ({\n alias: name,\n path,\n }))\n );\n } catch (e) {\n // only want this showing with verbose since template suggestions are not critical\n log.verbose(\n `Error getting import names for ${path}: ${e.message}`,\n null,\n this.logPrefix,\n );\n return [];\n }\n }),\n ).then((results) => {\n // sadly `Promise.all` & `.flatMap` just don't work, so this:\n return results.flat();\n });\n\n const suggestions = allSuggestions.filter((s) => {\n return !usedSuggestions.find(\n (us) => us.alias === s.alias && us.path === s.path,\n );\n });\n\n return {\n suggestions,\n };\n }\n}\n","import { log } from '@knapsack/app';\nimport {\n getModulePkgJson,\n readFile,\n copy,\n formatCode,\n resolvePath,\n findUp,\n} from '@knapsack/file-utils';\nimport { removeWrappingDoubleQuotes } from '@knapsack/utils';\nimport path from 'path';\nimport type { Documentation } from 'react-docgen';\nimport type { ComponentDoc, ParserOptions } from 'react-docgen-typescript';\nimport { KsTemplateSpec, isNumberProp, isOptionsProp } from '@knapsack/types';\n\ntype GetSpecParams = {\n src: string;\n exportName?: string;\n};\n\n/**\n * The name of the type, which is usually corresponds to the function name in `React.PropTypes`. However, for types define with `oneOf`, we use `\"enum\"` and for `oneOfType` we use `\"union\"`. If a custom function is provided or the type cannot be resolved to anything of `React.PropTypes`, we use `\"custom\"`.\n */\ntype RdTypeName =\n | 'number'\n | 'string'\n | 'custom'\n | 'union'\n | 'bool'\n | 'node'\n | 'func';\n\n/**\n * Some types accept parameters which define the type in more detail (such as `arrayOf`, `instanceOf`, `oneOf`, etc). Those are stored in `<typeValue>`. The data type of `<typeValue>` depends on the type definition.\n */\ntype RdTypeValue = string;\n\ntype RdProps = {\n [prop: string]: {\n defaultValue?: {\n value: string;\n computed: boolean;\n };\n type: {\n name: RdTypeName;\n value?: RdTypeValue;\n raw?: string;\n };\n flowType?: string;\n tsType?: string;\n description?: string;\n required: boolean;\n };\n};\n\ntype RdResults = {\n /**\n * Name of function, class, or const\n */\n displayName: string;\n description?: string;\n props: RdProps;\n};\n\nfunction renderUsageTemplate({\n templateName,\n attributes,\n children,\n}: {\n templateName: string;\n attributes: string;\n children: string;\n}) {\n return `\n <${templateName}\n ${attributes}\n ${\n children\n ? `>\n ${children}\n </${templateName}>`\n : '/>'\n }\n `;\n}\n\nfunction renderDemoAppTemplate({\n imports,\n children,\n}: {\n imports: string;\n children: string;\n}) {\n return `${imports}\n\nfunction DemoApp() {\n return (\n ${children}\n )\n}\n`;\n}\n\nexport async function getUsage(data: {\n templateName: string;\n props?: Record<string, unknown>;\n children?: string;\n extraProps?: {\n key: string;\n value: string;\n }[];\n format?: boolean;\n}): Promise<string> {\n const props = Object.keys(data.props || {}).map((key) => {\n const value = data.props[key];\n return {\n key,\n value,\n };\n });\n\n const { templateName, children, extraProps = [] } = data;\n if (!templateName) {\n throw new Error(\n `Cannot getUsage of a React Component when no \"templateName\" is provided.`,\n );\n }\n\n const attributes: string[] = props.map(({ key, value }) => {\n switch (typeof value) {\n case 'string':\n // Is this a function like `() => {}` but not a \"sizes\" attribute for an image like `(min-width: 400px) 50vw, 100vw`?\n if (value.startsWith('(') && value.includes('=>')) {\n return `${key}={${value}}`;\n }\n return `${key}=\"${value}\"`;\n case 'boolean':\n return value ? `${key}` : `${key}={${value}}`;\n default:\n return `${key}={${JSON.stringify(value)}}`;\n }\n });\n\n const extraAttributes: string[] = [];\n const slotProps: { [key: string]: string[] } = {};\n\n extraProps.forEach(({ key, value }) => {\n slotProps[key] = slotProps[key] ?? [];\n slotProps[key].push(value);\n });\n\n Object.entries(slotProps).forEach(([key, values]) => {\n const value = values.length === 1 ? values[0] : `<>${values.join('\\n')}</>`;\n extraAttributes.push(`${key}={${value}}`);\n });\n\n const result = renderUsageTemplate({\n templateName,\n attributes: [...attributes, ...extraAttributes].join(' '),\n children,\n });\n return data.format\n ? formatCode({\n contents: result,\n path: 'x.tsx', // doing this to set format language\n })\n .then((code) => code.trim())\n .catch(() => result.trim()) // if format fails, just return the unformatted code\n : result.trim();\n}\n\nexport async function getDemoAppUsage({\n children,\n imports,\n}: {\n children: string;\n imports?: string;\n}): Promise<string> {\n const code = renderDemoAppTemplate({\n children,\n imports,\n });\n return formatCode({\n contents: code,\n path: 'x.tsx', // doing this to set format language\n });\n}\n\nasync function getTypeScriptInfoFromFile({ src }: { src: string }): Promise<{\n info: ComponentDoc[];\n}> {\n const tsConfigPath = await findUp('tsconfig.json', {\n cwd: path.dirname(src),\n });\n const rdTs = await import('react-docgen-typescript');\n const config: ParserOptions = {\n shouldExtractLiteralValuesFromEnum: true,\n savePropValueAsString: true,\n skipChildrenPropWithoutDoc: false,\n // In addition to the ones listed here, which had not strangely included these below ~ https://github.com/styleguidist/react-docgen-typescript/blob/287e7012843cb26fed8f4bd8ee24e462c25a1414/src/parser.ts#L308\n customComponentTypes: ['VoidFunctionComponent', 'VFC'],\n };\n const parse = tsConfigPath\n ? rdTs.withCustomConfig(tsConfigPath, config).parse\n : rdTs.withDefaultConfig(config).parse;\n return {\n info: parse(src),\n };\n}\n\nfunction extractSpecFromTypeScriptInfo({\n info: results,\n exportName,\n}: {\n info: ComponentDoc[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n if (!results) return false;\n const spec: KsTemplateSpec = {\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {\n // children: {\n // title: 'children',\n // },\n },\n };\n\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect({ result, isDefaultExport, exportName }, 'ts result');\n if (!result) return false;\n\n const { displayName } = result;\n // log.inspect({ result }, 'result');\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { name, description, defaultValue, required, type, parent } =\n propDef;\n\n // `type.name` can include `| undefined` if tsConfig has `strict: true`. So we need to handle these scenarios:\n // `string` or `string | undefined`\n // `'left' | 'right'` or `'left' | 'right' | undefined`\n const propType = type?.name\n ?.replace('| undefined', '')\n // remove generics. things like `FC<{}>` and `FC<Props>` should become `FC`\n .replace(/<.*/g, '')\n .trim();\n\n switch (propType) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'number':\n spec.props.properties[propName] = {\n type: 'number',\n };\n break;\n case 'boolean':\n case 'bool':\n if (defaultValue && 'value' in defaultValue) {\n // comes in as `'true'` - this turns it to `true`\n defaultValue.value = defaultValue.value === 'true';\n }\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'enum':\n type EnumType = {\n name: string;\n raw: string;\n value: {\n /** Looks like `'\"option1\"'` - beware of string that contains `\"` */\n value: string;\n }[];\n };\n spec.props.properties[propName] = {\n type: 'string',\n // yes there is a double \"value\" & yes it is confusing\n enum: [\n // ensure list is unique\n ...new Set<string>(\n (type as EnumType).value\n .map(({ value }) => removeWrappingDoubleQuotes(value?.trim()))\n .filter(Boolean),\n ),\n ],\n };\n break;\n case 'ReactNode':\n case 'React.ReactNode':\n case 'React.ReactElement':\n case 'ReactElement':\n spec.slots[propName] = {\n title: propName,\n };\n if (description) {\n spec.slots[propName] = {\n ...spec.slots[propName],\n description,\n };\n }\n break;\n case 'VFC':\n case 'FC':\n spec.slots[propName] = {\n title: propName,\n description: description || 'A reference to a component',\n isTemplateReference: true,\n allowOnlyOne: true,\n disallowText: true,\n };\n break;\n default: {\n if (type?.name?.startsWith('(')) {\n // functions\n spec.props.properties[propName] = {\n // description: `\\`${type.name}\\` ${description}`,\n typeof: 'function',\n tsType: propDef?.type?.name,\n };\n } else if (type?.name?.includes('|')) {\n // enums / unions (multi-choice strings)\n // comes in like this: `{ name: '\"option1\" | \"option2\" | \"option3\"' }`\n const options = type.name\n .split('|')\n .map((enumItem) => removeWrappingDoubleQuotes(enumItem.trim()))\n .filter(Boolean);\n\n if (options?.length) {\n spec.props.properties[propName] = {\n type: 'string',\n // ensuring list is unique\n enum: [...new Set(options)],\n };\n }\n } else {\n spec.props.properties[propName] = {\n tsType: propDef?.type?.name,\n };\n }\n }\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n if (isNumberProp(spec.props.properties[propName])) {\n spec.props.properties[propName].default = parseFloat(\n defaultValue.value,\n );\n } else {\n spec.props.properties[propName].default =\n removeWrappingDoubleQuotes(defaultValue.value);\n }\n }\n }\n\n // console.log('type', type);\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React TypeScript file',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nasync function getPropTypesInfoFromFile({ src }: { src: string }): Promise<{\n info: Documentation[];\n}> {\n const reactDocs = await import('react-docgen');\n const { builtinResolvers } = reactDocs;\n const fileSrc = await readFile(src);\n const { FindExportedDefinitionsResolver } = builtinResolvers;\n const results: Documentation[] = reactDocs.parse(fileSrc, {\n resolver: new FindExportedDefinitionsResolver(),\n handlers: null,\n filename: src,\n // babelrc: false,\n });\n return {\n info: results,\n };\n}\n\nfunction extractSpecFromPropTypesInfo({\n info: results,\n exportName,\n}: {\n info: Documentation[];\n exportName: string;\n}): KsTemplateSpec | false {\n try {\n const isDefaultExport = !exportName || exportName === 'default';\n\n // if `isDefaultExport` then we just grab last result since `export default` TENDS to be last. that'll we can do really...\n const result = isDefaultExport\n ? results.pop()\n : results.find((r) => r.displayName === exportName);\n\n // log.inspect(results, 'JSX PropTypes Results');\n // console.log(JSON.stringify(result, null, ' '));\n\n const spec: KsTemplateSpec = {\n isInferred: true,\n props: {\n $schema: 'http://json-schema.org/draft-07/schema',\n type: 'object',\n required: [],\n properties: {},\n },\n slots: {},\n };\n\n Object.entries(result?.props || {}).forEach(([propName, propDef]) => {\n const { required, description, defaultValue } = propDef;\n switch (propDef?.type?.name) {\n case 'string':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'func':\n spec.props.properties[propName] = {\n type: 'string',\n };\n break;\n case 'bool':\n spec.props.properties[propName] = {\n type: 'boolean',\n };\n break;\n case 'node':\n spec.slots[propName] = {\n title: propName,\n description,\n };\n }\n\n // assigning info that all would have\n if (spec.props.properties[propName]) {\n if (required) spec.props.required.push(propName);\n if (description && !spec.props.properties[propName].description) {\n spec.props.properties[propName].description = description;\n }\n if (defaultValue && 'value' in defaultValue) {\n spec.props.properties[propName].default =\n typeof defaultValue.value === 'string'\n ? removeWrappingDoubleQuotes(defaultValue.value)\n : defaultValue.value;\n }\n }\n });\n\n return spec;\n } catch (error) {\n log.verbose(\n 'Could not infer spec from React PropTypes',\n {\n exportName,\n error,\n },\n 'react renderer',\n );\n return false;\n }\n}\n\nfunction cleanUpSpec({\n spec,\n}: {\n spec: KsTemplateSpec | false;\n}): KsTemplateSpec | false {\n if (spec === false) return spec;\n // ok to mutate b/c spec was just created before passing in here\n Object.entries(spec?.props?.properties || {}).forEach(([propName, prop]) => {\n if (isOptionsProp(prop)) {\n // If the default is not in the enum, it should not be there\n // OR the enum is wrong\n if (!prop.enum.includes(prop.default)) {\n prop.default = undefined;\n }\n }\n });\n\n return spec;\n}\n\nasync function getReactModuleInfoUncached({\n src: unknownSrc,\n resolveFromDir,\n}: {\n src: string;\n resolveFromDir: string;\n}): Promise<\n | {\n type: 'typescript';\n info: ComponentDoc[];\n }\n | {\n type: 'propTypes';\n info: Documentation[];\n }\n | {\n type: 'unknown';\n }\n> {\n const typesInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n resolveType: 'types',\n });\n if (typesInfo.exists) {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: typesInfo.absolutePath,\n });\n if (typeScriptInfo) {\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n }\n const jsInfo = await resolvePath({\n path: unknownSrc,\n resolveFromDir,\n });\n if (!jsInfo.exists) return { type: 'unknown' };\n const { ext } = path.parse(jsInfo.absolutePath);\n switch (ext) {\n case '.jsx': {\n const propTypesInfo = await getPropTypesInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'propTypes',\n info: propTypesInfo.info,\n };\n }\n case '.ts':\n case '.tsx': {\n const typeScriptInfo = await getTypeScriptInfoFromFile({\n src: jsInfo.absolutePath,\n });\n return {\n type: 'typescript',\n info: typeScriptInfo.info,\n };\n }\n default:\n return {\n type: 'unknown',\n };\n }\n}\n\nconst getReactModuleInfoCache = new Map<\n string,\n ReturnType<typeof getReactModuleInfoUncached>\n>();\nexport const clearInferSpecCache = () => {\n log.info(`Clearing React TypeScript inferSpec cache...`);\n getReactModuleInfoCache.clear();\n};\nasync function getReactModuleInfo(\n args: Parameters<typeof getReactModuleInfoUncached>[0],\n) {\n const cacheKey = JSON.stringify(args);\n if (!getReactModuleInfoCache.has(cacheKey)) {\n getReactModuleInfoCache.set(cacheKey, getReactModuleInfoUncached(args));\n }\n return getReactModuleInfoCache.get(cacheKey);\n}\n\nasync function getReactSpec({\n src,\n exportName,\n resolveFromDir,\n}: GetSpecParams & {\n resolveFromDir: string;\n}): Promise<KsTemplateSpec | false> {\n const reactModuleInfo = await getReactModuleInfo({\n src,\n resolveFromDir,\n });\n switch (reactModuleInfo.type) {\n case 'typescript':\n return extractSpecFromTypeScriptInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'propTypes':\n return extractSpecFromPropTypesInfo({\n info: reactModuleInfo.info,\n exportName,\n });\n case 'unknown':\n default:\n return false;\n }\n}\n\nexport async function getReactDocs(\n opt: GetSpecParams & {\n resolveFromDir: string;\n },\n): Promise<KsTemplateSpec | false> {\n return cleanUpSpec({\n spec: await getReactSpec(opt),\n });\n}\n\nexport async function copyReactAssets(\n distDirAbsolute: string,\n publicPath: string,\n): Promise<string[]> {\n try {\n const { version: reactVersion } = getModulePkgJson('react');\n const { version: reactDomVersion } = getModulePkgJson('react-dom');\n\n // switch to resolving the root NPM package dir vs the entire file via require.resolve\n // workaround due to NPM packages using the exports field; prevents these from being auto-resolved\n const reactRoot = path.dirname(\n require.resolve('react', {\n paths: [process.cwd()],\n }),\n );\n const reactDomRoot = path.dirname(\n require.resolve('react-dom', {\n paths: [process.cwd()],\n }),\n );\n await Promise.all([\n copy(\n path.join(reactRoot, 'umd/react.development.js'),\n path.join(distDirAbsolute, `react.development.${reactVersion}.js`),\n ),\n copy(\n path.join(reactRoot, 'umd/react.production.min.js'),\n path.join(distDirAbsolute, `react.production.min.${reactVersion}.js`),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.production.min.js'),\n path.join(\n distDirAbsolute,\n `react-dom.production.min.${reactDomVersion}.js`,\n ),\n ),\n copy(\n path.join(reactDomRoot, 'umd/react-dom.development.js'),\n path.join(\n distDirAbsolute,\n `react-dom.development.${reactDomVersion}.js`,\n ),\n ),\n ]);\n const reactFileSuffix =\n process.env.NODE_ENV === 'production' ? 'production.min' : 'development';\n\n return [\n path.join(publicPath, `react.${reactFileSuffix}.${reactVersion}.js`),\n path.join(\n publicPath,\n `react-dom.${reactFileSuffix}.${reactDomVersion}.js`,\n ),\n ];\n } catch (error) {\n log.warn(\n 'Error trying to copy \"react\" and \"react-dom\" JS files, are they installed? We want to use your exact versions.',\n error,\n 'templateRenderer:react',\n );\n process.exit(1);\n }\n}\n","import { getJsExportNames } from '@knapsack/file-utils';\nimport { createCreator, tasks, Task } from '@knapsack/creator-utils';\nimport {\n readKsPatternConfigs,\n writeKsPatternConfig,\n readKsNavConfig,\n addKsNavItems,\n writeDemo,\n} from '@knapsack/ks-file-utils';\nimport { Demo, KnapsackPattern } from '@knapsack/types';\nimport { makeShortId } from '@knapsack/utils';\n\nfunction isCapitalLetter(char: string): boolean {\n return char.toUpperCase() === char;\n}\n\nfunction startsWithCapitalLetter(str: string): boolean {\n return isCapitalLetter(str[0]);\n}\n\nfunction createPatternData({\n importName,\n id,\n title = importName,\n pkgPath,\n initialDemoId,\n}: {\n importName: string;\n id: string;\n title?: string;\n pkgPath: string;\n initialDemoId: string;\n}): KnapsackPattern {\n return {\n id,\n title,\n description: '',\n statuses: {\n main: 'ready',\n },\n templates: [\n {\n id: 'react',\n title: 'react',\n path: pkgPath,\n alias: importName,\n templateLanguageId: 'react',\n spec: {\n isInferred: true,\n },\n demoIds: [initialDemoId],\n blockIds: [],\n },\n ],\n tabs: [\n {\n type: 'template',\n id: 'react',\n },\n ],\n subPages: [],\n };\n}\n\nexport const createReactPattern = createCreator({\n id: 'react-patterns',\n title: 'React Ks Patterns',\n description: 'Adds React templates as Knapsack Patterns',\n getQuestions: async () => ({\n pkgPath: {\n type: 'text',\n title: 'Package path',\n },\n importPrefix: {\n type: 'text',\n title: 'Import Prefix to Remove',\n },\n }),\n getTasks: async ({ answers: { pkgPath, importPrefix = '' }, config }) => {\n const dataDir = config.dest;\n const currentPatterns = await readKsPatternConfigs({\n dataDir,\n });\n const currentReactPatternsImportNames = currentPatterns.reduce(\n (cur, pattern) => {\n const reactTemplates =\n pattern.templates?.filter((t) => t.templateLanguageId === 'react') ??\n [];\n cur.push(...reactTemplates.map((t) => t.alias));\n return cur;\n },\n [] as string[],\n );\n const { exports: allImports } = await getJsExportNames({\n path: pkgPath,\n });\n return [\n {\n title: 'Pick Imports to add',\n task: (_, task) =>\n tasks.runSubCreator({\n task,\n config,\n creator: createCreator({\n id: 'react-pattern-import-names',\n getQuestions: async () => ({\n importNames: {\n type: 'choices',\n choices: allImports\n .filter(\n (importName) =>\n startsWithCapitalLetter(importName) &&\n !currentReactPatternsImportNames.includes(importName),\n )\n .map((importName) => ({\n value: importName,\n })),\n },\n }),\n getTasks: async ({ answers: { importNames } }) => {\n const patterns = importNames.map((importName) => ({\n importName,\n patternId: importName.startsWith(importPrefix)\n ? importName.slice(importPrefix.length).toLowerCase()\n : importName.toLowerCase(),\n }));\n return [\n ...patterns.map(\n ({ importName, patternId }): Task => ({\n title: `Add ${importName} React Template`,\n task: async (__, subTask) => {\n const initialDemo: Demo = {\n type: 'data',\n id: makeShortId(),\n title: 'Main',\n patternId,\n templateId: 'react',\n data: {\n props: {},\n slots: {},\n },\n };\n const pattern = createPatternData({\n id: patternId,\n importName,\n pkgPath,\n initialDemoId: initialDemo.id,\n });\n\n await Promise.all([\n writeDemo({\n dataDir,\n demo: initialDemo,\n }),\n writeKsPatternConfig({\n dataDir,\n patternId,\n data: pattern,\n }),\n ]);\n },\n }),\n ),\n {\n title: `Updating Nav`,\n task: async (__, subTask) => {\n const { byId } = await readKsNavConfig({\n dataDir,\n });\n // attempt to find a nav group to put patterns under\n const componentsGroup = Object.values(byId).find(\n ({ path, name, id }) => {\n // we only want groups (i.e. not pages or patterns)\n if (path) return false;\n if (name.toLowerCase() === 'patterns') return true;\n if (name.toLowerCase() === 'components') return true;\n return false;\n },\n );\n await addKsNavItems({\n dataDir,\n navItems: patterns.map(({ patternId }) => ({\n navId: patternId,\n navPath: `/pattern/${patternId}`,\n navParent: componentsGroup?.id || 'root',\n })),\n });\n },\n },\n ];\n },\n }),\n }),\n },\n ];\n },\n});\n"],"mappings":"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","names":["log","getJsExportNames","readFile","formatCode","path","path","parse","path","log","formatCode","readFile","usage","path","alias","getJsExportNames"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knapsack/renderer-react",
|
|
3
3
|
"description": "Render React",
|
|
4
|
-
"version": "4.66.
|
|
4
|
+
"version": "4.66.10",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"author": "Knapsack",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@babel/preset-react": "^7.24.7",
|
|
34
|
-
"@knapsack/app": "4.66.
|
|
35
|
-
"@knapsack/creator-utils": "4.66.
|
|
36
|
-
"@knapsack/file-utils": "4.66.
|
|
37
|
-
"@knapsack/ks-file-utils": "4.66.
|
|
38
|
-
"@knapsack/renderer-webpack-base": "4.66.
|
|
39
|
-
"@knapsack/types": "4.66.
|
|
40
|
-
"@knapsack/utils": "4.66.
|
|
34
|
+
"@knapsack/app": "4.66.10",
|
|
35
|
+
"@knapsack/creator-utils": "4.66.10",
|
|
36
|
+
"@knapsack/file-utils": "4.66.10",
|
|
37
|
+
"@knapsack/ks-file-utils": "4.66.10",
|
|
38
|
+
"@knapsack/renderer-webpack-base": "4.66.10",
|
|
39
|
+
"@knapsack/types": "4.66.10",
|
|
40
|
+
"@knapsack/utils": "4.66.10",
|
|
41
41
|
"react": "^18.3.1",
|
|
42
42
|
"react-docgen": "^6.0.4",
|
|
43
43
|
"react-docgen-typescript": "^2.2.2",
|
|
@@ -46,10 +46,10 @@
|
|
|
46
46
|
"typescript": "^5.5.3"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@knapsack/eslint-config-starter": "4.66.
|
|
50
|
-
"@knapsack/sandbox-components": "4.66.
|
|
51
|
-
"@knapsack/test-ava": "4.66.
|
|
52
|
-
"@knapsack/typescript-config-starter": "4.66.
|
|
49
|
+
"@knapsack/eslint-config-starter": "4.66.10",
|
|
50
|
+
"@knapsack/sandbox-components": "4.66.10",
|
|
51
|
+
"@knapsack/test-ava": "4.66.10",
|
|
52
|
+
"@knapsack/typescript-config-starter": "4.66.10",
|
|
53
53
|
"@mui/material": "^5.15.18",
|
|
54
54
|
"@mui/x-data-grid": "^6.19.11",
|
|
55
55
|
"@types/node": "^20.12.12",
|
|
@@ -68,5 +68,5 @@
|
|
|
68
68
|
"directory": "apps/client/renderers/renderer-react",
|
|
69
69
|
"type": "git"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "852c14bcc2ab1d40b122aa67d656c033faee79a8"
|
|
72
72
|
}
|