@kubb/react-fabric 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Fabric-t9Xqe4Bx.d.ts → Fabric-7g9iQC3E.d.ts} +95 -46
- package/dist/{Fabric-BPUyMklG.d.cts → Fabric-DX0joaWR.d.cts} +95 -46
- package/dist/globals.d.cts +2 -2
- package/dist/globals.d.ts +2 -2
- package/dist/index.cjs +10 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -6
- package/dist/index.d.ts +28 -6
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.d.cts +3 -3
- package/dist/jsx-dev-runtime.d.ts +3 -3
- package/dist/{jsx-namespace-YR433DXc.d.cts → jsx-namespace-BrIMxQyM.d.cts} +2 -2
- package/dist/{jsx-namespace-PEMxmJ6z.d.ts → jsx-namespace-ChOBBWsr.d.ts} +2 -2
- package/dist/jsx-runtime.d.cts +3 -3
- package/dist/jsx-runtime.d.ts +3 -3
- package/dist/parsers.d.cts +1 -1
- package/dist/parsers.d.ts +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.d.cts +8 -12
- package/dist/plugins.d.ts +8 -12
- package/dist/plugins.js +1 -1
- package/dist/{reactPlugin-BmBx9cO3.js → reactPlugin-BKFEDZfC.js} +53 -39
- package/dist/reactPlugin-BKFEDZfC.js.map +1 -0
- package/dist/{reactPlugin-DmnHX7Uj.d.ts → reactPlugin-CNdpw8pN.d.ts} +6 -13
- package/dist/{reactPlugin-Dj5m_pqf.cjs → reactPlugin-CiFqRD0J.cjs} +53 -39
- package/dist/reactPlugin-CiFqRD0J.cjs.map +1 -0
- package/dist/{reactPlugin-DlGI8_Sh.d.cts → reactPlugin-DvAUyVTQ.d.cts} +6 -13
- package/dist/{types-wwcxhf6Y.d.ts → types-CGgYj2pZ.d.ts} +3 -8
- package/dist/{types-CsFxfaSV.d.cts → types-Xd33VuKS.d.cts} +3 -8
- package/dist/types.d.cts +3 -3
- package/dist/types.d.ts +3 -3
- package/package.json +2 -2
- package/src/Runtime.tsx +37 -21
- package/src/createReactFabric.ts +9 -4
- package/src/plugins/reactPlugin.ts +5 -15
- package/src/utils/processFiles.ts +30 -27
- package/dist/reactPlugin-BmBx9cO3.js.map +0 -1
- package/dist/reactPlugin-Dj5m_pqf.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactPlugin-BKFEDZfC.js","names":["onExit","node: TextNode","nodeNames: Array<ElementNames>","text","collected: Array<KubbFile.File>"],"sources":["../src/components/Root.tsx","../src/dom.ts","../src/Renderer.ts","../src/utils/squashExportNodes.ts","../src/utils/squashImportNodes.ts","../src/utils/squashTextNodes.ts","../src/utils/squashSourceNodes.ts","../src/utils/processFiles.ts","../src/Runtime.tsx","../src/plugins/reactPlugin.ts"],"sourcesContent":["import { Component, createContext } from 'react'\n\nimport type { KubbNode } from '../types.ts'\n\ntype ErrorBoundaryProps = {\n onError: (error: Error) => void\n children?: KubbNode\n}\n\nclass ErrorBoundary extends Component<{\n onError: ErrorBoundaryProps['onError']\n children?: KubbNode\n}> {\n state = { hasError: false }\n\n static displayName = 'KubbErrorBoundary'\n static getDerivedStateFromError(_error: Error) {\n return { hasError: true }\n }\n\n componentDidCatch(error: Error) {\n if (error) {\n this.props.onError(error)\n }\n }\n\n render() {\n if (this.state.hasError) {\n return null\n }\n return this.props.children\n }\n}\n\nexport type RootContextProps = {\n /**\n * Exit (unmount) the whole Ink app.\n */\n readonly exit: (error?: Error) => void\n}\n\nexport const RootContext = createContext<RootContextProps>({\n exit: () => {},\n})\n\ntype RootProps = {\n /**\n * Exit (unmount) hook\n */\n readonly onExit: (error?: Error) => void\n /**\n * Error hook\n */\n readonly onError: (error: Error) => void\n readonly children?: KubbNode\n}\n\nexport function Root({ onError, onExit, children }: RootProps) {\n try {\n return (\n <ErrorBoundary\n onError={(error) => {\n onError(error)\n }}\n >\n <RootContext.Provider value={{ exit: onExit }}>{children}</RootContext.Provider>\n </ErrorBoundary>\n )\n } catch (_e) {\n return null\n }\n}\n\nRoot.Context = RootContext\nRoot.displayName = 'KubbRoot'\n","import type { DOMElement, DOMNode, DOMNodeAttribute, ElementNames, TextNode } from './types.ts'\n\nexport const createNode = (nodeName: string): DOMElement => {\n const node: DOMElement = {\n nodeName: nodeName as DOMElement['nodeName'],\n attributes: {},\n childNodes: [],\n parentNode: undefined,\n }\n\n return node\n}\n\nexport const appendChildNode = (node: DOMNode, childNode: DOMElement | DOMNode): void => {\n if (childNode.parentNode) {\n removeChildNode(childNode.parentNode, childNode)\n }\n\n if (node.nodeName !== '#text') {\n childNode.parentNode = node\n node.childNodes.push(childNode)\n }\n}\n\nexport const insertBeforeNode = (node: DOMElement, newChildNode: DOMNode, beforeChildNode: DOMNode): void => {\n if (newChildNode.parentNode) {\n removeChildNode(newChildNode.parentNode, newChildNode)\n }\n\n newChildNode.parentNode = node\n\n const index = node.childNodes.indexOf(beforeChildNode)\n if (index >= 0) {\n node.childNodes.splice(index, 0, newChildNode)\n\n return\n }\n\n node.childNodes.push(newChildNode)\n}\n\nexport const removeChildNode = (node: DOMElement, removeNode: DOMNode): void => {\n removeNode.parentNode = undefined\n\n const index = node.childNodes.indexOf(removeNode)\n if (index >= 0) {\n node.childNodes.splice(index, 1)\n }\n}\n\nexport const setAttribute = (node: DOMElement, key: string, value: DOMNodeAttribute): void => {\n node.attributes[key] = value\n}\n\nexport const createTextNode = (text: string): TextNode => {\n const node: TextNode = {\n nodeName: '#text',\n nodeValue: text,\n parentNode: undefined,\n }\n\n setTextNodeValue(node, text)\n\n return node\n}\n\nexport const setTextNodeValue = (node: TextNode, text: string): void => {\n if (typeof text !== 'string') {\n text = String(text)\n }\n\n node.nodeValue = text\n}\n\nexport const nodeNames: Array<ElementNames> = ['kubb-export', 'kubb-file', 'kubb-source', 'kubb-import', 'kubb-text']\n","import { createContext } from 'react'\nimport Reconciler, { type ReactContext } from 'react-reconciler'\nimport { DefaultEventPriority, NoEventPriority } from 'react-reconciler/constants.js'\nimport { appendChildNode, createNode, createTextNode, insertBeforeNode, removeChildNode, setAttribute, setTextNodeValue } from './dom.ts'\nimport type { KubbNode } from './types'\nimport type { DOMElement, DOMNodeAttribute, ElementNames, TextNode } from './types.ts'\n\ndeclare module 'react-reconciler' {\n // @ts-expect-error custom override\n interface Reconciler {\n updateContainerSync(element: KubbNode, container: unknown, parentComponent: any, callback?: null | (() => void)): void\n flushSyncWork(): void\n createContainer(\n containerInfo: unknown,\n tag: Reconciler.RootTag,\n hydrationCallbacks: null | Reconciler.SuspenseHydrationCallbacks<any>,\n isStrictMode: boolean,\n concurrentUpdatesByDefaultOverride: null | boolean,\n identifierPrefix: string,\n onUncaughtError: (error: Error) => void,\n onCaughtError: (error: Error) => void,\n onRecoverableError: (error: Error) => void,\n transitionCallbacks: null | Reconciler.TransitionTracingCallbacks,\n ): Reconciler.OpaqueRoot\n }\n}\n\ntype Props = Record<string, unknown>\n\ntype HostContext = {\n type: ElementNames\n isFile: boolean\n isSource: boolean\n}\n\nlet currentUpdatePriority = NoEventPriority\n\n/**\n * @link https://www.npmjs.com/package/react-devtools-inline\n * @link https://github.com/nitin42/Making-a-custom-React-renderer/blob/master/part-one.md\n * @link https://github.com/facebook/react/tree/main/packages/react-reconciler#practical-examples\n * @link https://github.com/vadimdemedes/ink\n * @link https://github.com/pixijs/pixi-react/tree/main/packages\n * @link https://github.com/diegomura/react-pdf/blob/master/packages/reconciler/src/reconciler-31.ts\n */\nexport const Renderer = Reconciler({\n getRootHostContext: () => ({\n type: 'kubb-root',\n isFile: false,\n isSource: false,\n }),\n prepareForCommit: () => {\n return null\n },\n preparePortalMount: () => null,\n clearContainer: () => false,\n resetAfterCommit(rootNode: DOMElement) {\n if (typeof rootNode.onRender === 'function') {\n rootNode.onRender()\n }\n },\n getChildHostContext(parentHostContext: HostContext, type: ElementNames) {\n const isInsideText = type === 'kubb-text'\n const isFile = type === 'kubb-file' || parentHostContext.isFile\n const isSource = type === 'kubb-source' || parentHostContext.isSource\n\n return { isInsideText, isFile, isSource, type }\n },\n shouldSetTextContent: () => false,\n createInstance(originalType: ElementNames, newProps: Props, _root: DOMElement) {\n const node = createNode(originalType)\n\n for (const [key, value] of Object.entries(newProps)) {\n if (key === 'children') {\n continue\n }\n\n setAttribute(node, key, value as DOMNodeAttribute)\n }\n\n return node\n },\n createTextInstance(text: string, _root: DOMElement, hostContext: HostContext) {\n if (hostContext.isFile && !hostContext.isSource) {\n throw new Error(`[react] '${text}' should be part of <File.Source> component when using the <File/> component`)\n }\n\n return createTextNode(text)\n },\n resetTextContent() {},\n hideTextInstance(node: TextNode) {\n setTextNodeValue(node, '')\n },\n unhideTextInstance(node: TextNode, text: string) {\n setTextNodeValue(node, text)\n },\n getPublicInstance: (instance) => instance,\n appendInitialChild: appendChildNode,\n appendChild: appendChildNode,\n insertBefore: insertBeforeNode,\n finalizeInitialChildren(_node, _type, _props, _rootNode) {\n return false\n },\n supportsMutation: true,\n isPrimaryRenderer: true,\n supportsPersistence: false,\n supportsHydration: false,\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n beforeActiveInstanceBlur() {},\n afterActiveInstanceBlur() {},\n detachDeletedInstance() {},\n getInstanceFromNode: () => null,\n prepareScopeUpdate() {},\n getInstanceFromScope: () => null,\n appendChildToContainer: appendChildNode,\n insertInContainerBefore: insertBeforeNode,\n removeChildFromContainer(node: DOMElement, removeNode: TextNode) {\n removeChildNode(node, removeNode)\n },\n commitMount() {},\n commitUpdate(node: DOMElement, _payload, _type, _oldProps: Props, newProps: Props) {\n const { props } = newProps\n\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n setAttribute(node, key, value as DOMNodeAttribute)\n }\n }\n },\n commitTextUpdate(node: TextNode, _oldText, newText) {\n setTextNodeValue(node, newText)\n },\n removeChild(node: DOMElement, removeNode: TextNode) {\n removeChildNode(node, removeNode)\n },\n setCurrentUpdatePriority: (newPriority: number) => {\n currentUpdatePriority = newPriority\n },\n getCurrentUpdatePriority: () => currentUpdatePriority,\n resolveUpdatePriority() {\n if (currentUpdatePriority !== NoEventPriority) {\n return currentUpdatePriority\n }\n\n return DefaultEventPriority\n },\n maySuspendCommit() {\n return false\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n NotPendingTransition: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HostTransitionContext: createContext(null) as unknown as ReactContext<unknown>,\n resetFormInstance() {},\n requestPostPaintCallback() {},\n shouldAttemptEagerTransition() {\n return false\n },\n trackSchedulerEvent() {},\n resolveEventType() {\n return null\n },\n resolveEventTimeStamp() {\n return -1.1\n },\n preloadInstance() {\n return true\n },\n startSuspendingCommit() {},\n suspendInstance() {},\n waitForCommitToBeReady() {\n return null\n },\n})\n\nexport type { FiberRoot } from 'react-reconciler'\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashExportNodes(node: DOMElement): Set<KubbFile.ResolvedExport> {\n let exports = new Set<KubbFile.Export>()\n\n node.childNodes.filter(Boolean).forEach((childNode) => {\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n exports = new Set([...exports, ...squashExportNodes(childNode)])\n }\n\n if (childNode.nodeName === 'kubb-export') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Export>\n exports.add(attributes)\n }\n })\n\n return exports\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashImportNodes(node: DOMElement): Set<KubbFile.Import> {\n let imports = new Set<KubbFile.Import>()\n\n node.childNodes.filter(Boolean).forEach((childNode) => {\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n imports = new Set([...imports, ...squashImportNodes(childNode)])\n }\n\n if (childNode.nodeName === 'kubb-import') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Import>\n imports.add(attributes)\n }\n })\n\n return imports\n}\n","import { createExport, createImport, print } from '@kubb/fabric-core/parsers/typescript'\n\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashTextNodes(node: DOMElement): string {\n let text = ''\n\n for (const childNode of node.childNodes) {\n if (!childNode) {\n continue\n }\n\n let nodeText = ''\n\n const getPrintText = (text: string): string => {\n if (childNode.nodeName === 'kubb-import') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Import>\n\n return print([\n createImport({\n name: attributes.name,\n path: attributes.path,\n root: attributes.root,\n isTypeOnly: attributes.isTypeOnly,\n }),\n ])\n }\n\n if (childNode.nodeName === 'kubb-export') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Export>\n if (attributes.path) {\n return print([\n createExport({\n name: attributes.name,\n path: attributes.path,\n isTypeOnly: attributes.isTypeOnly,\n asAlias: attributes.asAlias,\n }),\n ])\n }\n }\n\n if (childNode.nodeName === 'kubb-source') {\n return text\n }\n\n return text\n }\n\n if (childNode.nodeName === '#text') {\n nodeText = childNode.nodeValue\n } else {\n if (['kubb-text', 'kubb-file', 'kubb-source'].includes(childNode.nodeName)) {\n nodeText = squashTextNodes(childNode)\n }\n\n nodeText = getPrintText(nodeText)\n\n if (childNode.nodeName === 'br') {\n nodeText = '\\n'\n }\n\n // no kubb element or br\n if (![...nodeNames, 'br'].includes(childNode.nodeName)) {\n const attributes = Object.entries(childNode.attributes).reduce((acc, [key, value]) => {\n if (typeof value === 'string') {\n return `${acc} ${key}=\"${value}\"`\n }\n\n return `${acc} ${key}={${value}}`\n }, '')\n nodeText = `<${childNode.nodeName}${attributes}>${squashTextNodes(childNode)}</${childNode.nodeName}>`\n }\n }\n\n text += nodeText\n }\n\n return text\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement, ElementNames } from '../types.ts'\nimport { squashTextNodes } from './squashTextNodes.ts'\n\nexport function squashSourceNodes(node: DOMElement, ignores: Array<ElementNames>): Set<KubbFile.Source> {\n let sources = new Set<KubbFile.Source>()\n\n for (const childNode of node.childNodes) {\n if (!childNode) {\n continue\n }\n\n if (childNode.nodeName !== '#text' && ignores.includes(childNode.nodeName)) {\n continue\n }\n\n if (childNode.nodeName === 'kubb-source') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Source>\n const value = squashTextNodes(childNode)\n\n sources.add({\n ...attributes,\n // remove end enter\n value: value.trim().replace(/^\\s+|\\s+$/g, ''),\n })\n\n continue\n }\n\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n sources = new Set([...sources, ...squashSourceNodes(childNode, ignores)])\n }\n }\n\n return sources\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\nimport { squashExportNodes } from './squashExportNodes.ts'\nimport { squashImportNodes } from './squashImportNodes.ts'\nimport { squashSourceNodes } from './squashSourceNodes.ts'\n\nexport async function processFiles(node: DOMElement): Promise<Array<KubbFile.File>> {\n const collected: Array<KubbFile.File> = []\n\n async function walk(current: DOMElement) {\n for (const childNode of current.childNodes) {\n if (!childNode) {\n continue\n }\n\n if (childNode.nodeName !== '#text' && childNode.nodeName !== 'kubb-file' && nodeNames.includes(childNode.nodeName)) {\n await walk(childNode)\n }\n\n if (childNode.nodeName === 'kubb-file') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File>\n\n if (attributes.baseName && attributes.path) {\n const sources = squashSourceNodes(childNode, ['kubb-export', 'kubb-import'])\n\n collected.push({\n baseName: attributes.baseName,\n path: attributes.path,\n sources: [...sources],\n exports: [...squashExportNodes(childNode)],\n imports: [...squashImportNodes(childNode)],\n meta: attributes.meta || {},\n footer: attributes.footer,\n banner: attributes.banner,\n })\n }\n }\n }\n }\n\n await walk(node)\n\n return collected\n}\n","import process from 'node:process'\nimport type { FileManager } from '@kubb/fabric-core'\nimport type { ReactNode } from 'react'\nimport { ConcurrentRoot } from 'react-reconciler/constants.js'\nimport { onExit } from 'signal-exit'\nimport { Root } from './components/Root.tsx'\nimport { createNode } from './dom.ts'\nimport type { FiberRoot } from './Renderer.ts'\nimport { Renderer } from './Renderer.ts'\nimport type { DOMElement } from './types.ts'\nimport { processFiles } from './utils/processFiles.ts'\nimport { squashTextNodes } from './utils/squashTextNodes.ts'\n\ntype Options = {\n fileManager: FileManager\n stdout?: NodeJS.WriteStream\n stdin?: NodeJS.ReadStream\n stderr?: NodeJS.WriteStream\n /**\n * Set this to true to always see the result of the render in the console(line per render)\n */\n debug?: boolean\n}\n\nexport class Runtime {\n readonly #options: Options\n // Ignore last render after unmounting a tree to prevent empty output before exit\n #isUnmounted: boolean\n\n exitPromise?: Promise<void>\n readonly #container: FiberRoot\n readonly #rootNode: DOMElement\n\n constructor(options: Options) {\n this.#options = options\n\n this.#rootNode = createNode('kubb-root')\n this.#rootNode.onRender = this.onRender\n this.#rootNode.onImmediateRender = this.onRender\n\n // Ignore last render after unmounting a tree to prevent empty output before exit\n this.#isUnmounted = false\n this.unmount.bind(this)\n\n const originalError = console.error\n console.error = (data: string | Error) => {\n const message = typeof data === 'string' ? data : data?.message\n\n if (message?.match(/Encountered two children with the same key/gi)) {\n return\n }\n if (message?.match(/React will try to recreat/gi)) {\n return\n }\n if (message?.match(/Each child in a list should have a unique/gi)) {\n return\n }\n if (message?.match(/The above error occurred in the <KubbErrorBoundary/gi)) {\n return\n }\n\n if (message?.match(/A React Element from an older version of React was render/gi)) {\n return\n }\n\n originalError(data)\n }\n\n // Report when an error was detected in a previous render\n // https://github.com/pmndrs/react-three-fiber/pull/2261\n const logRecoverableError =\n typeof reportError === 'function'\n ? // In modern browsers, reportError will dispatch an error event,\n // emulating an uncaught JavaScript error.\n reportError\n : // In older browsers and test environments, fallback to console.error.\n console.error\n\n const rootTag = ConcurrentRoot\n const hydrationCallbacks = null\n const isStrictMode = false\n const concurrentUpdatesByDefaultOverride = false\n const identifierPrefix = 'id'\n const onUncaughtError = logRecoverableError\n const onCaughtError = logRecoverableError\n const onRecoverableError = logRecoverableError\n const transitionCallbacks = null\n\n this.#container = Renderer.createContainer(\n this.#rootNode,\n rootTag,\n hydrationCallbacks,\n isStrictMode,\n concurrentUpdatesByDefaultOverride,\n identifierPrefix,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n transitionCallbacks,\n )\n\n // Unmount when process exits\n this.unsubscribeExit = onExit(\n (code) => {\n this.unmount(code)\n },\n { alwaysLast: false },\n ).bind(this)\n\n Renderer.injectIntoDevTools({\n bundleType: 1, // 0 for PROD, 1 for DEV\n version: '19.1.0', // should be React version and not Kubb's custom version\n rendererPackageName: 'kubb', // package name\n })\n }\n\n get fileManager() {\n return this.#options.fileManager\n }\n\n #renderPromise: Promise<void> = Promise.resolve()\n resolveExitPromise: () => void = () => {}\n rejectExitPromise: (reason?: Error) => void = () => {}\n unsubscribeExit: () => void = () => {}\n onRender: () => Promise<void> = () => {\n const previous = this.#renderPromise\n\n const task = previous\n .catch(() => {})\n .then(async () => {\n if (this.#isUnmounted) {\n return\n }\n\n const files = await processFiles(this.#rootNode)\n\n await this.fileManager.add(...files)\n\n if (!this.#options?.debug && !this.#options?.stdout) {\n return\n }\n\n const output = await this.#getOutput(this.#rootNode)\n\n if (this.#options?.debug) {\n console.log('Rendering: \\n')\n console.log(output)\n }\n\n if (this.#options?.stdout && process.env.NODE_ENV !== 'test') {\n this.#options.stdout.clearLine(0)\n this.#options.stdout.cursorTo(0)\n this.#options.stdout.write(output)\n }\n })\n\n this.#renderPromise = task.catch((error) => {\n this.onError(error as Error)\n throw error\n })\n\n return this.#renderPromise\n }\n onError(error: Error): void {\n if (process.env.NODE_ENV === 'test') {\n console.warn(error)\n }\n\n throw error\n }\n onExit(error?: Error): void {\n this.unmount(error)\n }\n\n async #getOutput(node: DOMElement): Promise<string> {\n const text = squashTextNodes(node)\n const files = this.fileManager.files\n\n return files.length\n ? [...files]\n .flatMap((file) => [...file.sources].map((item) => item.value))\n .filter(Boolean)\n .join('\\n\\n')\n : text\n }\n\n async render(node: ReactNode): Promise<void> {\n const element = (\n <Root onExit={this.onExit.bind(this)} onError={this.onError.bind(this)}>\n {node}\n </Root>\n )\n\n Renderer.updateContainerSync(element, this.#container, null, null)\n Renderer.flushSyncWork()\n await this.#renderPromise\n }\n\n async renderToString(node: ReactNode): Promise<string> {\n const element = (\n <Root onExit={this.onExit.bind(this)} onError={this.onError.bind(this)}>\n {node}\n </Root>\n )\n\n Renderer.updateContainerSync(element, this.#container, null, null)\n Renderer.flushSyncWork()\n\n await this.#renderPromise\n\n this.fileManager.clear()\n\n return this.#getOutput(this.#rootNode)\n }\n\n unmount(error?: Error | number | null): void {\n if (this.#isUnmounted) {\n return\n }\n\n if (this.#options?.debug) {\n console.log('Unmount', error)\n }\n\n this.onRender()\n this.unsubscribeExit()\n\n this.#isUnmounted = true\n\n Renderer.updateContainerSync(null, this.#container, null, null)\n\n if (error instanceof Error) {\n this.rejectExitPromise(error)\n\n return\n }\n\n this.resolveExitPromise()\n }\n\n async waitUntilExit(): Promise<void> {\n if (!this.exitPromise) {\n this.exitPromise = new Promise((resolve, reject) => {\n this.resolveExitPromise = resolve\n this.rejectExitPromise = reject\n })\n }\n\n return this.exitPromise\n }\n}\n","import { createPlugin } from '@kubb/fabric-core/plugins'\nimport { createElement, type ElementType } from 'react'\nimport { Runtime } from '../Runtime.tsx'\n\nexport type Options = {\n stdout?: NodeJS.WriteStream\n stdin?: NodeJS.ReadStream\n stderr?: NodeJS.WriteStream\n /**\n * Set this to true to always see the result of the render in the console(line per render)\n */\n debug?: boolean\n}\n\ntype ExtendOptions = {\n render(App: ElementType): Promise<void>\n renderToString(App: ElementType): Promise<string>\n waitUntilExit(): Promise<void>\n}\n\ndeclare global {\n namespace Kubb {\n interface Fabric {\n render(App: ElementType): Promise<void>\n renderToString(App: ElementType): Promise<string>\n waitUntilExit(): Promise<void>\n }\n }\n}\n\nexport const reactPlugin = createPlugin<Options, ExtendOptions>({\n name: 'react',\n install() {},\n inject(ctx, options = {}) {\n const runtime = new Runtime({ fileManager: ctx.fileManager, ...options })\n\n return {\n async render(App) {\n await runtime.render(createElement(App))\n await ctx.emit('start')\n },\n async renderToString(App) {\n await ctx.emit('start')\n return runtime.renderToString(createElement(App))\n },\n async waitUntilExit() {\n await runtime.waitUntilExit()\n\n await ctx.emit('end')\n },\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as Plugin } from "./Fabric-
|
|
1
|
+
import { o as Plugin } from "./Fabric-7g9iQC3E.js";
|
|
2
2
|
import { ElementType } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/plugins/reactPlugin.d.ts
|
|
@@ -12,22 +12,15 @@ type Options = {
|
|
|
12
12
|
debug?: boolean;
|
|
13
13
|
};
|
|
14
14
|
type ExtendOptions = {
|
|
15
|
-
render(App: ElementType): Promise<void
|
|
16
|
-
renderToString(App: ElementType): Promise<string
|
|
15
|
+
render(App: ElementType): Promise<void>;
|
|
16
|
+
renderToString(App: ElementType): Promise<string>;
|
|
17
17
|
waitUntilExit(): Promise<void>;
|
|
18
18
|
};
|
|
19
|
-
declare module '@kubb/fabric-core' {
|
|
20
|
-
interface Fabric {
|
|
21
|
-
render(App: ElementType): Promise<void> | void;
|
|
22
|
-
renderToString(App: ElementType): Promise<string> | string;
|
|
23
|
-
waitUntilExit(): Promise<void>;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
19
|
declare global {
|
|
27
20
|
namespace Kubb {
|
|
28
21
|
interface Fabric {
|
|
29
|
-
render(App: ElementType): Promise<void
|
|
30
|
-
renderToString(App: ElementType): Promise<string
|
|
22
|
+
render(App: ElementType): Promise<void>;
|
|
23
|
+
renderToString(App: ElementType): Promise<string>;
|
|
31
24
|
waitUntilExit(): Promise<void>;
|
|
32
25
|
}
|
|
33
26
|
}
|
|
@@ -35,4 +28,4 @@ declare global {
|
|
|
35
28
|
declare const reactPlugin: Plugin<Options, ExtendOptions>;
|
|
36
29
|
//#endregion
|
|
37
30
|
export { reactPlugin as n, Options as t };
|
|
38
|
-
//# sourceMappingURL=reactPlugin-
|
|
31
|
+
//# sourceMappingURL=reactPlugin-CNdpw8pN.d.ts.map
|
|
@@ -377,29 +377,32 @@ function squashSourceNodes(node, ignores) {
|
|
|
377
377
|
|
|
378
378
|
//#endregion
|
|
379
379
|
//#region src/utils/processFiles.ts
|
|
380
|
-
function processFiles(node
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
380
|
+
async function processFiles(node) {
|
|
381
|
+
const collected = [];
|
|
382
|
+
async function walk(current) {
|
|
383
|
+
for (const childNode of current.childNodes) {
|
|
384
|
+
if (!childNode) continue;
|
|
385
|
+
if (childNode.nodeName !== "#text" && childNode.nodeName !== "kubb-file" && nodeNames.includes(childNode.nodeName)) await walk(childNode);
|
|
386
|
+
if (childNode.nodeName === "kubb-file") {
|
|
387
|
+
const attributes = childNode.attributes;
|
|
388
|
+
if (attributes.baseName && attributes.path) {
|
|
389
|
+
const sources = squashSourceNodes(childNode, ["kubb-export", "kubb-import"]);
|
|
390
|
+
collected.push({
|
|
391
|
+
baseName: attributes.baseName,
|
|
392
|
+
path: attributes.path,
|
|
393
|
+
sources: [...sources],
|
|
394
|
+
exports: [...squashExportNodes(childNode)],
|
|
395
|
+
imports: [...squashImportNodes(childNode)],
|
|
396
|
+
meta: attributes.meta || {},
|
|
397
|
+
footer: attributes.footer,
|
|
398
|
+
banner: attributes.banner
|
|
399
|
+
});
|
|
400
|
+
}
|
|
400
401
|
}
|
|
401
402
|
}
|
|
402
403
|
}
|
|
404
|
+
await walk(node);
|
|
405
|
+
return collected;
|
|
403
406
|
}
|
|
404
407
|
|
|
405
408
|
//#endregion
|
|
@@ -445,6 +448,7 @@ var _options = /* @__PURE__ */ new WeakMap();
|
|
|
445
448
|
var _isUnmounted = /* @__PURE__ */ new WeakMap();
|
|
446
449
|
var _container = /* @__PURE__ */ new WeakMap();
|
|
447
450
|
var _rootNode = /* @__PURE__ */ new WeakMap();
|
|
451
|
+
var _renderPromise = /* @__PURE__ */ new WeakMap();
|
|
448
452
|
var _Runtime_brand = /* @__PURE__ */ new WeakSet();
|
|
449
453
|
var Runtime = class {
|
|
450
454
|
constructor(options) {
|
|
@@ -454,25 +458,33 @@ var Runtime = class {
|
|
|
454
458
|
_defineProperty(this, "exitPromise", void 0);
|
|
455
459
|
_classPrivateFieldInitSpec(this, _container, void 0);
|
|
456
460
|
_classPrivateFieldInitSpec(this, _rootNode, void 0);
|
|
461
|
+
_classPrivateFieldInitSpec(this, _renderPromise, Promise.resolve());
|
|
457
462
|
_defineProperty(this, "resolveExitPromise", () => {});
|
|
458
463
|
_defineProperty(this, "rejectExitPromise", () => {});
|
|
459
464
|
_defineProperty(this, "unsubscribeExit", () => {});
|
|
460
|
-
_defineProperty(this, "onRender",
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
_classPrivateFieldGet2(_options, this).stdout.
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
465
|
+
_defineProperty(this, "onRender", () => {
|
|
466
|
+
const task = _classPrivateFieldGet2(_renderPromise, this).catch(() => {}).then(async () => {
|
|
467
|
+
var _classPrivateFieldGet2$1, _classPrivateFieldGet3, _classPrivateFieldGet4, _classPrivateFieldGet5;
|
|
468
|
+
if (_classPrivateFieldGet2(_isUnmounted, this)) return;
|
|
469
|
+
const files = await processFiles(_classPrivateFieldGet2(_rootNode, this));
|
|
470
|
+
await this.fileManager.add(...files);
|
|
471
|
+
if (!((_classPrivateFieldGet2$1 = _classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet2$1 === void 0 ? void 0 : _classPrivateFieldGet2$1.debug) && !((_classPrivateFieldGet3 = _classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.stdout)) return;
|
|
472
|
+
const output = await _assertClassBrand(_Runtime_brand, this, _getOutput).call(this, _classPrivateFieldGet2(_rootNode, this));
|
|
473
|
+
if ((_classPrivateFieldGet4 = _classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.debug) {
|
|
474
|
+
console.log("Rendering: \n");
|
|
475
|
+
console.log(output);
|
|
476
|
+
}
|
|
477
|
+
if (((_classPrivateFieldGet5 = _classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.stdout) && node_process.default.env.NODE_ENV !== "test") {
|
|
478
|
+
_classPrivateFieldGet2(_options, this).stdout.clearLine(0);
|
|
479
|
+
_classPrivateFieldGet2(_options, this).stdout.cursorTo(0);
|
|
480
|
+
_classPrivateFieldGet2(_options, this).stdout.write(output);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
_classPrivateFieldSet2(_renderPromise, this, task.catch((error) => {
|
|
484
|
+
this.onError(error);
|
|
485
|
+
throw error;
|
|
486
|
+
}));
|
|
487
|
+
return _classPrivateFieldGet2(_renderPromise, this);
|
|
476
488
|
});
|
|
477
489
|
_classPrivateFieldSet2(_options, this, options);
|
|
478
490
|
_classPrivateFieldSet2(_rootNode, this, createNode("kubb-root"));
|
|
@@ -519,7 +531,7 @@ var Runtime = class {
|
|
|
519
531
|
onExit(error) {
|
|
520
532
|
this.unmount(error);
|
|
521
533
|
}
|
|
522
|
-
render(node) {
|
|
534
|
+
async render(node) {
|
|
523
535
|
const element = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Root, {
|
|
524
536
|
onExit: this.onExit.bind(this),
|
|
525
537
|
onError: this.onError.bind(this),
|
|
@@ -527,6 +539,7 @@ var Runtime = class {
|
|
|
527
539
|
});
|
|
528
540
|
Renderer.updateContainerSync(element, _classPrivateFieldGet2(_container, this), null, null);
|
|
529
541
|
Renderer.flushSyncWork();
|
|
542
|
+
await _classPrivateFieldGet2(_renderPromise, this);
|
|
530
543
|
}
|
|
531
544
|
async renderToString(node) {
|
|
532
545
|
const element = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Root, {
|
|
@@ -536,6 +549,7 @@ var Runtime = class {
|
|
|
536
549
|
});
|
|
537
550
|
Renderer.updateContainerSync(element, _classPrivateFieldGet2(_container, this), null, null);
|
|
538
551
|
Renderer.flushSyncWork();
|
|
552
|
+
await _classPrivateFieldGet2(_renderPromise, this);
|
|
539
553
|
this.fileManager.clear();
|
|
540
554
|
return _assertClassBrand(_Runtime_brand, this, _getOutput).call(this, _classPrivateFieldGet2(_rootNode, this));
|
|
541
555
|
}
|
|
@@ -579,7 +593,7 @@ const reactPlugin = (0, __kubb_fabric_core_plugins.createPlugin)({
|
|
|
579
593
|
});
|
|
580
594
|
return {
|
|
581
595
|
async render(App) {
|
|
582
|
-
runtime.render((0, react.createElement)(App));
|
|
596
|
+
await runtime.render((0, react.createElement)(App));
|
|
583
597
|
await ctx.emit("start");
|
|
584
598
|
},
|
|
585
599
|
async renderToString(App) {
|
|
@@ -637,4 +651,4 @@ Object.defineProperty(exports, 'reactPlugin', {
|
|
|
637
651
|
return reactPlugin;
|
|
638
652
|
}
|
|
639
653
|
});
|
|
640
|
-
//# sourceMappingURL=reactPlugin-
|
|
654
|
+
//# sourceMappingURL=reactPlugin-CiFqRD0J.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactPlugin-CiFqRD0J.cjs","names":["Component","onExit","node: TextNode","nodeNames: Array<ElementNames>","NoEventPriority","DefaultEventPriority","exports","text","collected: Array<KubbFile.File>","process","ConcurrentRoot"],"sources":["../src/components/Root.tsx","../src/dom.ts","../src/Renderer.ts","../src/utils/squashExportNodes.ts","../src/utils/squashImportNodes.ts","../src/utils/squashTextNodes.ts","../src/utils/squashSourceNodes.ts","../src/utils/processFiles.ts","../src/Runtime.tsx","../src/plugins/reactPlugin.ts"],"sourcesContent":["import { Component, createContext } from 'react'\n\nimport type { KubbNode } from '../types.ts'\n\ntype ErrorBoundaryProps = {\n onError: (error: Error) => void\n children?: KubbNode\n}\n\nclass ErrorBoundary extends Component<{\n onError: ErrorBoundaryProps['onError']\n children?: KubbNode\n}> {\n state = { hasError: false }\n\n static displayName = 'KubbErrorBoundary'\n static getDerivedStateFromError(_error: Error) {\n return { hasError: true }\n }\n\n componentDidCatch(error: Error) {\n if (error) {\n this.props.onError(error)\n }\n }\n\n render() {\n if (this.state.hasError) {\n return null\n }\n return this.props.children\n }\n}\n\nexport type RootContextProps = {\n /**\n * Exit (unmount) the whole Ink app.\n */\n readonly exit: (error?: Error) => void\n}\n\nexport const RootContext = createContext<RootContextProps>({\n exit: () => {},\n})\n\ntype RootProps = {\n /**\n * Exit (unmount) hook\n */\n readonly onExit: (error?: Error) => void\n /**\n * Error hook\n */\n readonly onError: (error: Error) => void\n readonly children?: KubbNode\n}\n\nexport function Root({ onError, onExit, children }: RootProps) {\n try {\n return (\n <ErrorBoundary\n onError={(error) => {\n onError(error)\n }}\n >\n <RootContext.Provider value={{ exit: onExit }}>{children}</RootContext.Provider>\n </ErrorBoundary>\n )\n } catch (_e) {\n return null\n }\n}\n\nRoot.Context = RootContext\nRoot.displayName = 'KubbRoot'\n","import type { DOMElement, DOMNode, DOMNodeAttribute, ElementNames, TextNode } from './types.ts'\n\nexport const createNode = (nodeName: string): DOMElement => {\n const node: DOMElement = {\n nodeName: nodeName as DOMElement['nodeName'],\n attributes: {},\n childNodes: [],\n parentNode: undefined,\n }\n\n return node\n}\n\nexport const appendChildNode = (node: DOMNode, childNode: DOMElement | DOMNode): void => {\n if (childNode.parentNode) {\n removeChildNode(childNode.parentNode, childNode)\n }\n\n if (node.nodeName !== '#text') {\n childNode.parentNode = node\n node.childNodes.push(childNode)\n }\n}\n\nexport const insertBeforeNode = (node: DOMElement, newChildNode: DOMNode, beforeChildNode: DOMNode): void => {\n if (newChildNode.parentNode) {\n removeChildNode(newChildNode.parentNode, newChildNode)\n }\n\n newChildNode.parentNode = node\n\n const index = node.childNodes.indexOf(beforeChildNode)\n if (index >= 0) {\n node.childNodes.splice(index, 0, newChildNode)\n\n return\n }\n\n node.childNodes.push(newChildNode)\n}\n\nexport const removeChildNode = (node: DOMElement, removeNode: DOMNode): void => {\n removeNode.parentNode = undefined\n\n const index = node.childNodes.indexOf(removeNode)\n if (index >= 0) {\n node.childNodes.splice(index, 1)\n }\n}\n\nexport const setAttribute = (node: DOMElement, key: string, value: DOMNodeAttribute): void => {\n node.attributes[key] = value\n}\n\nexport const createTextNode = (text: string): TextNode => {\n const node: TextNode = {\n nodeName: '#text',\n nodeValue: text,\n parentNode: undefined,\n }\n\n setTextNodeValue(node, text)\n\n return node\n}\n\nexport const setTextNodeValue = (node: TextNode, text: string): void => {\n if (typeof text !== 'string') {\n text = String(text)\n }\n\n node.nodeValue = text\n}\n\nexport const nodeNames: Array<ElementNames> = ['kubb-export', 'kubb-file', 'kubb-source', 'kubb-import', 'kubb-text']\n","import { createContext } from 'react'\nimport Reconciler, { type ReactContext } from 'react-reconciler'\nimport { DefaultEventPriority, NoEventPriority } from 'react-reconciler/constants.js'\nimport { appendChildNode, createNode, createTextNode, insertBeforeNode, removeChildNode, setAttribute, setTextNodeValue } from './dom.ts'\nimport type { KubbNode } from './types'\nimport type { DOMElement, DOMNodeAttribute, ElementNames, TextNode } from './types.ts'\n\ndeclare module 'react-reconciler' {\n // @ts-expect-error custom override\n interface Reconciler {\n updateContainerSync(element: KubbNode, container: unknown, parentComponent: any, callback?: null | (() => void)): void\n flushSyncWork(): void\n createContainer(\n containerInfo: unknown,\n tag: Reconciler.RootTag,\n hydrationCallbacks: null | Reconciler.SuspenseHydrationCallbacks<any>,\n isStrictMode: boolean,\n concurrentUpdatesByDefaultOverride: null | boolean,\n identifierPrefix: string,\n onUncaughtError: (error: Error) => void,\n onCaughtError: (error: Error) => void,\n onRecoverableError: (error: Error) => void,\n transitionCallbacks: null | Reconciler.TransitionTracingCallbacks,\n ): Reconciler.OpaqueRoot\n }\n}\n\ntype Props = Record<string, unknown>\n\ntype HostContext = {\n type: ElementNames\n isFile: boolean\n isSource: boolean\n}\n\nlet currentUpdatePriority = NoEventPriority\n\n/**\n * @link https://www.npmjs.com/package/react-devtools-inline\n * @link https://github.com/nitin42/Making-a-custom-React-renderer/blob/master/part-one.md\n * @link https://github.com/facebook/react/tree/main/packages/react-reconciler#practical-examples\n * @link https://github.com/vadimdemedes/ink\n * @link https://github.com/pixijs/pixi-react/tree/main/packages\n * @link https://github.com/diegomura/react-pdf/blob/master/packages/reconciler/src/reconciler-31.ts\n */\nexport const Renderer = Reconciler({\n getRootHostContext: () => ({\n type: 'kubb-root',\n isFile: false,\n isSource: false,\n }),\n prepareForCommit: () => {\n return null\n },\n preparePortalMount: () => null,\n clearContainer: () => false,\n resetAfterCommit(rootNode: DOMElement) {\n if (typeof rootNode.onRender === 'function') {\n rootNode.onRender()\n }\n },\n getChildHostContext(parentHostContext: HostContext, type: ElementNames) {\n const isInsideText = type === 'kubb-text'\n const isFile = type === 'kubb-file' || parentHostContext.isFile\n const isSource = type === 'kubb-source' || parentHostContext.isSource\n\n return { isInsideText, isFile, isSource, type }\n },\n shouldSetTextContent: () => false,\n createInstance(originalType: ElementNames, newProps: Props, _root: DOMElement) {\n const node = createNode(originalType)\n\n for (const [key, value] of Object.entries(newProps)) {\n if (key === 'children') {\n continue\n }\n\n setAttribute(node, key, value as DOMNodeAttribute)\n }\n\n return node\n },\n createTextInstance(text: string, _root: DOMElement, hostContext: HostContext) {\n if (hostContext.isFile && !hostContext.isSource) {\n throw new Error(`[react] '${text}' should be part of <File.Source> component when using the <File/> component`)\n }\n\n return createTextNode(text)\n },\n resetTextContent() {},\n hideTextInstance(node: TextNode) {\n setTextNodeValue(node, '')\n },\n unhideTextInstance(node: TextNode, text: string) {\n setTextNodeValue(node, text)\n },\n getPublicInstance: (instance) => instance,\n appendInitialChild: appendChildNode,\n appendChild: appendChildNode,\n insertBefore: insertBeforeNode,\n finalizeInitialChildren(_node, _type, _props, _rootNode) {\n return false\n },\n supportsMutation: true,\n isPrimaryRenderer: true,\n supportsPersistence: false,\n supportsHydration: false,\n scheduleTimeout: setTimeout,\n cancelTimeout: clearTimeout,\n noTimeout: -1,\n beforeActiveInstanceBlur() {},\n afterActiveInstanceBlur() {},\n detachDeletedInstance() {},\n getInstanceFromNode: () => null,\n prepareScopeUpdate() {},\n getInstanceFromScope: () => null,\n appendChildToContainer: appendChildNode,\n insertInContainerBefore: insertBeforeNode,\n removeChildFromContainer(node: DOMElement, removeNode: TextNode) {\n removeChildNode(node, removeNode)\n },\n commitMount() {},\n commitUpdate(node: DOMElement, _payload, _type, _oldProps: Props, newProps: Props) {\n const { props } = newProps\n\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n setAttribute(node, key, value as DOMNodeAttribute)\n }\n }\n },\n commitTextUpdate(node: TextNode, _oldText, newText) {\n setTextNodeValue(node, newText)\n },\n removeChild(node: DOMElement, removeNode: TextNode) {\n removeChildNode(node, removeNode)\n },\n setCurrentUpdatePriority: (newPriority: number) => {\n currentUpdatePriority = newPriority\n },\n getCurrentUpdatePriority: () => currentUpdatePriority,\n resolveUpdatePriority() {\n if (currentUpdatePriority !== NoEventPriority) {\n return currentUpdatePriority\n }\n\n return DefaultEventPriority\n },\n maySuspendCommit() {\n return false\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n NotPendingTransition: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HostTransitionContext: createContext(null) as unknown as ReactContext<unknown>,\n resetFormInstance() {},\n requestPostPaintCallback() {},\n shouldAttemptEagerTransition() {\n return false\n },\n trackSchedulerEvent() {},\n resolveEventType() {\n return null\n },\n resolveEventTimeStamp() {\n return -1.1\n },\n preloadInstance() {\n return true\n },\n startSuspendingCommit() {},\n suspendInstance() {},\n waitForCommitToBeReady() {\n return null\n },\n})\n\nexport type { FiberRoot } from 'react-reconciler'\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashExportNodes(node: DOMElement): Set<KubbFile.ResolvedExport> {\n let exports = new Set<KubbFile.Export>()\n\n node.childNodes.filter(Boolean).forEach((childNode) => {\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n exports = new Set([...exports, ...squashExportNodes(childNode)])\n }\n\n if (childNode.nodeName === 'kubb-export') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Export>\n exports.add(attributes)\n }\n })\n\n return exports\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashImportNodes(node: DOMElement): Set<KubbFile.Import> {\n let imports = new Set<KubbFile.Import>()\n\n node.childNodes.filter(Boolean).forEach((childNode) => {\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n imports = new Set([...imports, ...squashImportNodes(childNode)])\n }\n\n if (childNode.nodeName === 'kubb-import') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Import>\n imports.add(attributes)\n }\n })\n\n return imports\n}\n","import { createExport, createImport, print } from '@kubb/fabric-core/parsers/typescript'\n\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\n\nexport function squashTextNodes(node: DOMElement): string {\n let text = ''\n\n for (const childNode of node.childNodes) {\n if (!childNode) {\n continue\n }\n\n let nodeText = ''\n\n const getPrintText = (text: string): string => {\n if (childNode.nodeName === 'kubb-import') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Import>\n\n return print([\n createImport({\n name: attributes.name,\n path: attributes.path,\n root: attributes.root,\n isTypeOnly: attributes.isTypeOnly,\n }),\n ])\n }\n\n if (childNode.nodeName === 'kubb-export') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Export>\n if (attributes.path) {\n return print([\n createExport({\n name: attributes.name,\n path: attributes.path,\n isTypeOnly: attributes.isTypeOnly,\n asAlias: attributes.asAlias,\n }),\n ])\n }\n }\n\n if (childNode.nodeName === 'kubb-source') {\n return text\n }\n\n return text\n }\n\n if (childNode.nodeName === '#text') {\n nodeText = childNode.nodeValue\n } else {\n if (['kubb-text', 'kubb-file', 'kubb-source'].includes(childNode.nodeName)) {\n nodeText = squashTextNodes(childNode)\n }\n\n nodeText = getPrintText(nodeText)\n\n if (childNode.nodeName === 'br') {\n nodeText = '\\n'\n }\n\n // no kubb element or br\n if (![...nodeNames, 'br'].includes(childNode.nodeName)) {\n const attributes = Object.entries(childNode.attributes).reduce((acc, [key, value]) => {\n if (typeof value === 'string') {\n return `${acc} ${key}=\"${value}\"`\n }\n\n return `${acc} ${key}={${value}}`\n }, '')\n nodeText = `<${childNode.nodeName}${attributes}>${squashTextNodes(childNode)}</${childNode.nodeName}>`\n }\n }\n\n text += nodeText\n }\n\n return text\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement, ElementNames } from '../types.ts'\nimport { squashTextNodes } from './squashTextNodes.ts'\n\nexport function squashSourceNodes(node: DOMElement, ignores: Array<ElementNames>): Set<KubbFile.Source> {\n let sources = new Set<KubbFile.Source>()\n\n for (const childNode of node.childNodes) {\n if (!childNode) {\n continue\n }\n\n if (childNode.nodeName !== '#text' && ignores.includes(childNode.nodeName)) {\n continue\n }\n\n if (childNode.nodeName === 'kubb-source') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File.Source>\n const value = squashTextNodes(childNode)\n\n sources.add({\n ...attributes,\n // remove end enter\n value: value.trim().replace(/^\\s+|\\s+$/g, ''),\n })\n\n continue\n }\n\n if (childNode.nodeName !== '#text' && nodeNames.includes(childNode.nodeName)) {\n sources = new Set([...sources, ...squashSourceNodes(childNode, ignores)])\n }\n }\n\n return sources\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport type React from 'react'\nimport type { File } from '../components/File.tsx'\nimport { nodeNames } from '../dom.ts'\nimport type { DOMElement } from '../types.ts'\nimport { squashExportNodes } from './squashExportNodes.ts'\nimport { squashImportNodes } from './squashImportNodes.ts'\nimport { squashSourceNodes } from './squashSourceNodes.ts'\n\nexport async function processFiles(node: DOMElement): Promise<Array<KubbFile.File>> {\n const collected: Array<KubbFile.File> = []\n\n async function walk(current: DOMElement) {\n for (const childNode of current.childNodes) {\n if (!childNode) {\n continue\n }\n\n if (childNode.nodeName !== '#text' && childNode.nodeName !== 'kubb-file' && nodeNames.includes(childNode.nodeName)) {\n await walk(childNode)\n }\n\n if (childNode.nodeName === 'kubb-file') {\n const attributes = childNode.attributes as React.ComponentProps<typeof File>\n\n if (attributes.baseName && attributes.path) {\n const sources = squashSourceNodes(childNode, ['kubb-export', 'kubb-import'])\n\n collected.push({\n baseName: attributes.baseName,\n path: attributes.path,\n sources: [...sources],\n exports: [...squashExportNodes(childNode)],\n imports: [...squashImportNodes(childNode)],\n meta: attributes.meta || {},\n footer: attributes.footer,\n banner: attributes.banner,\n })\n }\n }\n }\n }\n\n await walk(node)\n\n return collected\n}\n","import process from 'node:process'\nimport type { FileManager } from '@kubb/fabric-core'\nimport type { ReactNode } from 'react'\nimport { ConcurrentRoot } from 'react-reconciler/constants.js'\nimport { onExit } from 'signal-exit'\nimport { Root } from './components/Root.tsx'\nimport { createNode } from './dom.ts'\nimport type { FiberRoot } from './Renderer.ts'\nimport { Renderer } from './Renderer.ts'\nimport type { DOMElement } from './types.ts'\nimport { processFiles } from './utils/processFiles.ts'\nimport { squashTextNodes } from './utils/squashTextNodes.ts'\n\ntype Options = {\n fileManager: FileManager\n stdout?: NodeJS.WriteStream\n stdin?: NodeJS.ReadStream\n stderr?: NodeJS.WriteStream\n /**\n * Set this to true to always see the result of the render in the console(line per render)\n */\n debug?: boolean\n}\n\nexport class Runtime {\n readonly #options: Options\n // Ignore last render after unmounting a tree to prevent empty output before exit\n #isUnmounted: boolean\n\n exitPromise?: Promise<void>\n readonly #container: FiberRoot\n readonly #rootNode: DOMElement\n\n constructor(options: Options) {\n this.#options = options\n\n this.#rootNode = createNode('kubb-root')\n this.#rootNode.onRender = this.onRender\n this.#rootNode.onImmediateRender = this.onRender\n\n // Ignore last render after unmounting a tree to prevent empty output before exit\n this.#isUnmounted = false\n this.unmount.bind(this)\n\n const originalError = console.error\n console.error = (data: string | Error) => {\n const message = typeof data === 'string' ? data : data?.message\n\n if (message?.match(/Encountered two children with the same key/gi)) {\n return\n }\n if (message?.match(/React will try to recreat/gi)) {\n return\n }\n if (message?.match(/Each child in a list should have a unique/gi)) {\n return\n }\n if (message?.match(/The above error occurred in the <KubbErrorBoundary/gi)) {\n return\n }\n\n if (message?.match(/A React Element from an older version of React was render/gi)) {\n return\n }\n\n originalError(data)\n }\n\n // Report when an error was detected in a previous render\n // https://github.com/pmndrs/react-three-fiber/pull/2261\n const logRecoverableError =\n typeof reportError === 'function'\n ? // In modern browsers, reportError will dispatch an error event,\n // emulating an uncaught JavaScript error.\n reportError\n : // In older browsers and test environments, fallback to console.error.\n console.error\n\n const rootTag = ConcurrentRoot\n const hydrationCallbacks = null\n const isStrictMode = false\n const concurrentUpdatesByDefaultOverride = false\n const identifierPrefix = 'id'\n const onUncaughtError = logRecoverableError\n const onCaughtError = logRecoverableError\n const onRecoverableError = logRecoverableError\n const transitionCallbacks = null\n\n this.#container = Renderer.createContainer(\n this.#rootNode,\n rootTag,\n hydrationCallbacks,\n isStrictMode,\n concurrentUpdatesByDefaultOverride,\n identifierPrefix,\n onUncaughtError,\n onCaughtError,\n onRecoverableError,\n transitionCallbacks,\n )\n\n // Unmount when process exits\n this.unsubscribeExit = onExit(\n (code) => {\n this.unmount(code)\n },\n { alwaysLast: false },\n ).bind(this)\n\n Renderer.injectIntoDevTools({\n bundleType: 1, // 0 for PROD, 1 for DEV\n version: '19.1.0', // should be React version and not Kubb's custom version\n rendererPackageName: 'kubb', // package name\n })\n }\n\n get fileManager() {\n return this.#options.fileManager\n }\n\n #renderPromise: Promise<void> = Promise.resolve()\n resolveExitPromise: () => void = () => {}\n rejectExitPromise: (reason?: Error) => void = () => {}\n unsubscribeExit: () => void = () => {}\n onRender: () => Promise<void> = () => {\n const previous = this.#renderPromise\n\n const task = previous\n .catch(() => {})\n .then(async () => {\n if (this.#isUnmounted) {\n return\n }\n\n const files = await processFiles(this.#rootNode)\n\n await this.fileManager.add(...files)\n\n if (!this.#options?.debug && !this.#options?.stdout) {\n return\n }\n\n const output = await this.#getOutput(this.#rootNode)\n\n if (this.#options?.debug) {\n console.log('Rendering: \\n')\n console.log(output)\n }\n\n if (this.#options?.stdout && process.env.NODE_ENV !== 'test') {\n this.#options.stdout.clearLine(0)\n this.#options.stdout.cursorTo(0)\n this.#options.stdout.write(output)\n }\n })\n\n this.#renderPromise = task.catch((error) => {\n this.onError(error as Error)\n throw error\n })\n\n return this.#renderPromise\n }\n onError(error: Error): void {\n if (process.env.NODE_ENV === 'test') {\n console.warn(error)\n }\n\n throw error\n }\n onExit(error?: Error): void {\n this.unmount(error)\n }\n\n async #getOutput(node: DOMElement): Promise<string> {\n const text = squashTextNodes(node)\n const files = this.fileManager.files\n\n return files.length\n ? [...files]\n .flatMap((file) => [...file.sources].map((item) => item.value))\n .filter(Boolean)\n .join('\\n\\n')\n : text\n }\n\n async render(node: ReactNode): Promise<void> {\n const element = (\n <Root onExit={this.onExit.bind(this)} onError={this.onError.bind(this)}>\n {node}\n </Root>\n )\n\n Renderer.updateContainerSync(element, this.#container, null, null)\n Renderer.flushSyncWork()\n await this.#renderPromise\n }\n\n async renderToString(node: ReactNode): Promise<string> {\n const element = (\n <Root onExit={this.onExit.bind(this)} onError={this.onError.bind(this)}>\n {node}\n </Root>\n )\n\n Renderer.updateContainerSync(element, this.#container, null, null)\n Renderer.flushSyncWork()\n\n await this.#renderPromise\n\n this.fileManager.clear()\n\n return this.#getOutput(this.#rootNode)\n }\n\n unmount(error?: Error | number | null): void {\n if (this.#isUnmounted) {\n return\n }\n\n if (this.#options?.debug) {\n console.log('Unmount', error)\n }\n\n this.onRender()\n this.unsubscribeExit()\n\n this.#isUnmounted = true\n\n Renderer.updateContainerSync(null, this.#container, null, null)\n\n if (error instanceof Error) {\n this.rejectExitPromise(error)\n\n return\n }\n\n this.resolveExitPromise()\n }\n\n async waitUntilExit(): Promise<void> {\n if (!this.exitPromise) {\n this.exitPromise = new Promise((resolve, reject) => {\n this.resolveExitPromise = resolve\n this.rejectExitPromise = reject\n })\n }\n\n return this.exitPromise\n }\n}\n","import { createPlugin } from '@kubb/fabric-core/plugins'\nimport { createElement, type ElementType } from 'react'\nimport { Runtime } from '../Runtime.tsx'\n\nexport type Options = {\n stdout?: NodeJS.WriteStream\n stdin?: NodeJS.ReadStream\n stderr?: NodeJS.WriteStream\n /**\n * Set this to true to always see the result of the render in the console(line per render)\n */\n debug?: boolean\n}\n\ntype ExtendOptions = {\n render(App: ElementType): Promise<void>\n renderToString(App: ElementType): Promise<string>\n waitUntilExit(): Promise<void>\n}\n\ndeclare global {\n namespace Kubb {\n interface Fabric {\n render(App: ElementType): Promise<void>\n renderToString(App: ElementType): Promise<string>\n waitUntilExit(): Promise<void>\n }\n }\n}\n\nexport const reactPlugin = createPlugin<Options, ExtendOptions>({\n name: 'react',\n install() {},\n inject(ctx, options = {}) {\n const runtime = new Runtime({ fileManager: ctx.fileManager, ...options })\n\n return {\n async render(App) {\n await runtime.render(createElement(App))\n await ctx.emit('start')\n },\n async renderToString(App) {\n await ctx.emit('start')\n return runtime.renderToString(createElement(App))\n },\n async waitUntilExit() {\n await runtime.waitUntilExit()\n\n await ctx.emit('end')\n },\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as Plugin } from "./Fabric-
|
|
1
|
+
import { o as Plugin } from "./Fabric-DX0joaWR.cjs";
|
|
2
2
|
import { ElementType } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/plugins/reactPlugin.d.ts
|
|
@@ -12,22 +12,15 @@ type Options = {
|
|
|
12
12
|
debug?: boolean;
|
|
13
13
|
};
|
|
14
14
|
type ExtendOptions = {
|
|
15
|
-
render(App: ElementType): Promise<void
|
|
16
|
-
renderToString(App: ElementType): Promise<string
|
|
15
|
+
render(App: ElementType): Promise<void>;
|
|
16
|
+
renderToString(App: ElementType): Promise<string>;
|
|
17
17
|
waitUntilExit(): Promise<void>;
|
|
18
18
|
};
|
|
19
|
-
declare module '@kubb/fabric-core' {
|
|
20
|
-
interface Fabric {
|
|
21
|
-
render(App: ElementType): Promise<void> | void;
|
|
22
|
-
renderToString(App: ElementType): Promise<string> | string;
|
|
23
|
-
waitUntilExit(): Promise<void>;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
19
|
declare global {
|
|
27
20
|
namespace Kubb {
|
|
28
21
|
interface Fabric {
|
|
29
|
-
render(App: ElementType): Promise<void
|
|
30
|
-
renderToString(App: ElementType): Promise<string
|
|
22
|
+
render(App: ElementType): Promise<void>;
|
|
23
|
+
renderToString(App: ElementType): Promise<string>;
|
|
31
24
|
waitUntilExit(): Promise<void>;
|
|
32
25
|
}
|
|
33
26
|
}
|
|
@@ -35,4 +28,4 @@ declare global {
|
|
|
35
28
|
declare const reactPlugin: Plugin<Options, ExtendOptions>;
|
|
36
29
|
//#endregion
|
|
37
30
|
export { reactPlugin as n, Options as t };
|
|
38
|
-
//# sourceMappingURL=reactPlugin-
|
|
31
|
+
//# sourceMappingURL=reactPlugin-DvAUyVTQ.d.cts.map
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b as Source, g as Import, h as File, p as Export } from "./Fabric-7g9iQC3E.js";
|
|
2
2
|
import React, { JSX, Key, ReactNode } from "react";
|
|
3
3
|
|
|
4
|
-
//#region ../fabric-core/src/defineFabric.d.ts
|
|
5
|
-
type RootRenderFunction<TOptions extends FabricOptions> = (fabric: Fabric<TOptions>) => void | Promise<void>;
|
|
6
|
-
type DefineFabric<TOptions extends FabricOptions> = (config?: FabricConfig<TOptions>) => Fabric<TOptions>;
|
|
7
|
-
declare function defineFabric<TOptions extends FabricOptions>(instance?: RootRenderFunction<TOptions>): DefineFabric<TOptions>;
|
|
8
|
-
//#endregion
|
|
9
4
|
//#region src/utils/getFunctionParams.d.ts
|
|
10
5
|
type Param = {
|
|
11
6
|
/**
|
|
@@ -105,5 +100,5 @@ type KubbImportProps = Import;
|
|
|
105
100
|
type KubbExportProps = Export;
|
|
106
101
|
type LineBreakProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLBRElement>, HTMLBRElement>;
|
|
107
102
|
//#endregion
|
|
108
|
-
export { Param as _, JSDoc as a,
|
|
109
|
-
//# sourceMappingURL=types-
|
|
103
|
+
export { Param as _, JSDoc as a, KubbExportProps as c, KubbNode as d, KubbSourceProps as f, FunctionParams as g, TextNode as h, ElementNames as i, KubbFileProps as l, LineBreakProps as m, DOMNode as n, Key as o, KubbTextProps as p, DOMNodeAttribute as r, KubbElement as s, DOMElement as t, KubbImportProps as u, Params as v, createFunctionParams as y };
|
|
104
|
+
//# sourceMappingURL=types-CGgYj2pZ.d.ts.map
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b as Source, g as Import, h as File, p as Export } from "./Fabric-DX0joaWR.cjs";
|
|
2
2
|
import React, { JSX, Key, ReactNode } from "react";
|
|
3
3
|
|
|
4
|
-
//#region ../fabric-core/src/defineFabric.d.ts
|
|
5
|
-
type RootRenderFunction<TOptions extends FabricOptions> = (fabric: Fabric<TOptions>) => void | Promise<void>;
|
|
6
|
-
type DefineFabric<TOptions extends FabricOptions> = (config?: FabricConfig<TOptions>) => Fabric<TOptions>;
|
|
7
|
-
declare function defineFabric<TOptions extends FabricOptions>(instance?: RootRenderFunction<TOptions>): DefineFabric<TOptions>;
|
|
8
|
-
//#endregion
|
|
9
4
|
//#region src/utils/getFunctionParams.d.ts
|
|
10
5
|
type Param = {
|
|
11
6
|
/**
|
|
@@ -105,5 +100,5 @@ type KubbImportProps = Import;
|
|
|
105
100
|
type KubbExportProps = Export;
|
|
106
101
|
type LineBreakProps = React.DetailedHTMLProps<React.HTMLAttributes<HTMLBRElement>, HTMLBRElement>;
|
|
107
102
|
//#endregion
|
|
108
|
-
export { Param as _, JSDoc as a,
|
|
109
|
-
//# sourceMappingURL=types-
|
|
103
|
+
export { Param as _, JSDoc as a, KubbExportProps as c, KubbNode as d, KubbSourceProps as f, FunctionParams as g, TextNode as h, ElementNames as i, KubbFileProps as l, LineBreakProps as m, DOMNode as n, Key as o, KubbTextProps as p, DOMNodeAttribute as r, KubbElement as s, DOMElement as t, KubbImportProps as u, Params as v, createFunctionParams as y };
|
|
104
|
+
//# sourceMappingURL=types-Xd33VuKS.d.cts.map
|
package/dist/types.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as KubbFile_d_exports, a as FabricOptions, i as FabricMode, n as FabricConfig, r as FabricContext } from "./Fabric-
|
|
2
|
-
import { _ as Param, a as JSDoc,
|
|
3
|
-
export { DOMElement, DOMNode, DOMNodeAttribute,
|
|
1
|
+
import { _ as KubbFile_d_exports, a as FabricOptions, i as FabricMode, n as FabricConfig, r as FabricContext } from "./Fabric-DX0joaWR.cjs";
|
|
2
|
+
import { _ as Param, a as JSDoc, c as KubbExportProps, d as KubbNode, f as KubbSourceProps, h as TextNode, i as ElementNames, l as KubbFileProps, m as LineBreakProps, n as DOMNode, o as Key, p as KubbTextProps, r as DOMNodeAttribute, s as KubbElement, t as DOMElement, u as KubbImportProps, v as Params } from "./types-Xd33VuKS.cjs";
|
|
3
|
+
export { DOMElement, DOMNode, DOMNodeAttribute, ElementNames, FabricConfig, FabricContext, FabricMode, FabricOptions, JSDoc, Key, KubbElement, KubbExportProps, KubbFile_d_exports as KubbFile, KubbFileProps, KubbImportProps, KubbNode, KubbSourceProps, KubbTextProps, LineBreakProps, Param, Params, TextNode };
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as KubbFile_d_exports, a as FabricOptions, i as FabricMode, n as FabricConfig, r as FabricContext } from "./Fabric-
|
|
2
|
-
import { _ as Param, a as JSDoc,
|
|
3
|
-
export { DOMElement, DOMNode, DOMNodeAttribute,
|
|
1
|
+
import { _ as KubbFile_d_exports, a as FabricOptions, i as FabricMode, n as FabricConfig, r as FabricContext } from "./Fabric-7g9iQC3E.js";
|
|
2
|
+
import { _ as Param, a as JSDoc, c as KubbExportProps, d as KubbNode, f as KubbSourceProps, h as TextNode, i as ElementNames, l as KubbFileProps, m as LineBreakProps, n as DOMNode, o as Key, p as KubbTextProps, r as DOMNodeAttribute, s as KubbElement, t as DOMElement, u as KubbImportProps, v as Params } from "./types-CGgYj2pZ.js";
|
|
3
|
+
export { DOMElement, DOMNode, DOMNodeAttribute, ElementNames, FabricConfig, FabricContext, FabricMode, FabricOptions, JSDoc, Key, KubbElement, KubbExportProps, KubbFile_d_exports as KubbFile, KubbFileProps, KubbImportProps, KubbNode, KubbSourceProps, KubbTextProps, LineBreakProps, Param, Params, TextNode };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/react-fabric",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.17",
|
|
4
4
|
"description": "React integration for Kubb, providing JSX runtime support and React component generation capabilities for code generation plugins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"react-reconciler": "0.32.0",
|
|
114
114
|
"signal-exit": "^4.1.0",
|
|
115
115
|
"ws": "8.18.0",
|
|
116
|
-
"@kubb/fabric-core": "0.2.
|
|
116
|
+
"@kubb/fabric-core": "0.2.17"
|
|
117
117
|
},
|
|
118
118
|
"devDependencies": {
|
|
119
119
|
"@types/react": "^19.2.2",
|
package/src/Runtime.tsx
CHANGED
|
@@ -118,35 +118,48 @@ export class Runtime {
|
|
|
118
118
|
return this.#options.fileManager
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
+
#renderPromise: Promise<void> = Promise.resolve()
|
|
121
122
|
resolveExitPromise: () => void = () => {}
|
|
122
123
|
rejectExitPromise: (reason?: Error) => void = () => {}
|
|
123
124
|
unsubscribeExit: () => void = () => {}
|
|
124
|
-
onRender: () => void =
|
|
125
|
-
|
|
126
|
-
return
|
|
127
|
-
}
|
|
125
|
+
onRender: () => Promise<void> = () => {
|
|
126
|
+
const previous = this.#renderPromise
|
|
128
127
|
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
const task = previous
|
|
129
|
+
.catch(() => {})
|
|
130
|
+
.then(async () => {
|
|
131
|
+
if (this.#isUnmounted) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
131
134
|
|
|
132
|
-
|
|
135
|
+
const files = await processFiles(this.#rootNode)
|
|
133
136
|
|
|
134
|
-
|
|
135
|
-
return
|
|
136
|
-
}
|
|
137
|
+
await this.fileManager.add(...files)
|
|
137
138
|
|
|
138
|
-
|
|
139
|
+
if (!this.#options?.debug && !this.#options?.stdout) {
|
|
140
|
+
return
|
|
141
|
+
}
|
|
139
142
|
|
|
140
|
-
|
|
141
|
-
console.log('Rendering: \n')
|
|
142
|
-
console.log(output)
|
|
143
|
-
}
|
|
143
|
+
const output = await this.#getOutput(this.#rootNode)
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
if (this.#options?.debug) {
|
|
146
|
+
console.log('Rendering: \n')
|
|
147
|
+
console.log(output)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (this.#options?.stdout && process.env.NODE_ENV !== 'test') {
|
|
151
|
+
this.#options.stdout.clearLine(0)
|
|
152
|
+
this.#options.stdout.cursorTo(0)
|
|
153
|
+
this.#options.stdout.write(output)
|
|
154
|
+
}
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
this.#renderPromise = task.catch((error) => {
|
|
158
|
+
this.onError(error as Error)
|
|
159
|
+
throw error
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
return this.#renderPromise
|
|
150
163
|
}
|
|
151
164
|
onError(error: Error): void {
|
|
152
165
|
if (process.env.NODE_ENV === 'test') {
|
|
@@ -171,7 +184,7 @@ export class Runtime {
|
|
|
171
184
|
: text
|
|
172
185
|
}
|
|
173
186
|
|
|
174
|
-
render(node: ReactNode): void {
|
|
187
|
+
async render(node: ReactNode): Promise<void> {
|
|
175
188
|
const element = (
|
|
176
189
|
<Root onExit={this.onExit.bind(this)} onError={this.onError.bind(this)}>
|
|
177
190
|
{node}
|
|
@@ -180,6 +193,7 @@ export class Runtime {
|
|
|
180
193
|
|
|
181
194
|
Renderer.updateContainerSync(element, this.#container, null, null)
|
|
182
195
|
Renderer.flushSyncWork()
|
|
196
|
+
await this.#renderPromise
|
|
183
197
|
}
|
|
184
198
|
|
|
185
199
|
async renderToString(node: ReactNode): Promise<string> {
|
|
@@ -192,6 +206,8 @@ export class Runtime {
|
|
|
192
206
|
Renderer.updateContainerSync(element, this.#container, null, null)
|
|
193
207
|
Renderer.flushSyncWork()
|
|
194
208
|
|
|
209
|
+
await this.#renderPromise
|
|
210
|
+
|
|
195
211
|
this.fileManager.clear()
|
|
196
212
|
|
|
197
213
|
return this.#getOutput(this.#rootNode)
|
package/src/createReactFabric.ts
CHANGED
|
@@ -6,15 +6,20 @@ import type { Options } from './plugins/reactPlugin.ts'
|
|
|
6
6
|
import { reactPlugin } from './plugins/reactPlugin.ts'
|
|
7
7
|
|
|
8
8
|
export function createReactFabric(
|
|
9
|
-
config
|
|
9
|
+
config: FabricConfig<Options & { mode?: FabricMode; devtools?: boolean }> = {},
|
|
10
10
|
): Fabric<Options & { mode?: FabricMode; devtools?: boolean }> {
|
|
11
|
-
const fabric = createFabric(config)
|
|
11
|
+
const fabric = createFabric({ mode: config.mode })
|
|
12
12
|
|
|
13
|
-
if (config
|
|
13
|
+
if (config.devtools) {
|
|
14
14
|
open()
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
fabric.use(reactPlugin,
|
|
17
|
+
fabric.use(reactPlugin, {
|
|
18
|
+
stdout: config.stdout,
|
|
19
|
+
stderr: config.stderr,
|
|
20
|
+
debug: config.debug,
|
|
21
|
+
stdin: config.stdin,
|
|
22
|
+
})
|
|
18
23
|
|
|
19
24
|
return fabric
|
|
20
25
|
}
|